diff --git a/sdk/keyvault/azure-keyvault-certificates/HISTORY.md b/sdk/keyvault/azure-keyvault-certificates/HISTORY.md new file mode 100644 index 000000000000..a706f9774c09 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/HISTORY.md @@ -0,0 +1,5 @@ +# Release History + +## 4.0.0b1 (2019-06-28) +For release notes and more information please visit +https://aka.ms/azure-sdk-preview1-python diff --git a/sdk/keyvault/azure-keyvault-certificates/MANIFEST.in b/sdk/keyvault/azure-keyvault-certificates/MANIFEST.in new file mode 100644 index 000000000000..7872cdc8cbae --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/MANIFEST.in @@ -0,0 +1,6 @@ +include *.md +include azure/__init__.py +include azure/keyvault/__init__.py +include azure/keyvault/certificates/__init__.py +include azure/keyvault/certificates/_generated/__init__.py +include azure/keyvault/certificates/aio/__init__.py diff --git a/sdk/keyvault/azure-keyvault-certificates/README.md b/sdk/keyvault/azure-keyvault-certificates/README.md new file mode 100644 index 000000000000..e75752458f9f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/README.md @@ -0,0 +1,233 @@ +# Azure Key Vault Certificates client library for Python +Azure Key Vault is a cloud service that provides a secure management of certificates, which are built on top of keys and secrets and adds an automated renewal feature. The certificate client library allows you securely store and manage the life-cycle of your certificate, be notified about certificate life-cycle events, and supports automatic renewal with selected issuers. This library offers operations to create, retrieve, update, delete, purge, backup, restore, and list the certificates and its versions, and offers CRUD operations for the certificate issuers, contacts, and management policies of the certificates.. + +[Source code][certificates_client_src] | [Package (PyPI)][pypi_package_certificates] | [API reference documentation][reference_docs] | [Product documentation][keyvault_docs] | [Samples][certificates_samples] +## Getting started +### Install the package +Install the Azure Key Vault client library for Python with [pip][pip]: + +```Bash +pip install azure-keyvault-certificates +``` + +### Prerequisites +* An [Azure subscription][azure_sub]. +* Python 2.7, 3.5.3, or later to use this package. +* An existing Key Vault. If you need to create a Key Vault, you can use the [Azure Cloud Shell][azure_cloud_shell] to create one with this Azure CLI command. Replace `` and `` with your own unique names: + + ```Bash + az keyvault create --resource-group --name + ``` + +### Authenticate the client +In order to interact with the Key Vault service, you'll need to create an instance of the [CertificateClient][certificate_client_docs] class. You would need a **vault url** and **client certificate credentials (client id, client secret, tenant id)** to instantiate a client object for using the `DefaultAzureCredential` examples in the README. `DefaultAzureCredential` authentication is achieved by providing client certificate credentials as seen in this getting started section, but you can find more ways to authenticate with [azure-identity][azure_identity]. + + #### Create/Get credentials +Use the [Azure Cloud Shell][azure_cloud_shell] snippet below to create/get client certificate credentials. + + * Create a service principal and configure its access to Azure resources: + ```Bash + az ad sp create-for-rbac -n --skip-assignment + ``` + Output: + ```json + { + "appId": "generated-app-ID", + "displayName": "dummy-app-name", + "name": "http://dummy-app-name", + "password": "random-password", + "tenant": "tenant-ID" + } + ``` +* Use the credentials returned above to set **AZURE_CLIENT_ID**(appId), **AZURE_CLIENT_SECRET**(password) and (password) and **AZURE_TENANT_ID**(tenant) environment variables. The following example shows a way to do this in Bash: + ```Bash + export AZURE_CLIENT_ID="generated-app-ID" + export AZURE_CLIENT_SECRET="random-password" + export AZURE_TENANT_ID="tenant-ID" + ``` + +* Grant the above mentioned application authorization to perform certificate operations on the keyvault: + ```Bash + az keyvault set-policy --name --spn $AZURE_CLIENT_ID --certificate-permissions backup create delete get import list purge recover restore update + ``` + > --certificate-permissions: + > Accepted values: backup, create, delete, deleteissuers, get, getissuers, import, list, listissuers, managecontacts, manageissuers, purge, recover, restore, setissuers, update + +* Use the above mentioned Key Vault name to retrieve details of your Vault which also contains your Key Vault URL: + ```Bash + az keyvault show --name + ``` + +#### Create Certificate client +Once you've populated the **AZURE_CLIENT_ID**, **AZURE_CLIENT_SECRET** and **AZURE_TENANT_ID** environment variables and replaced **your-vault-url** with the above returned URI, you can create the [CertificateClient][certificate_client_docs]: + +```python + from azure.identity import DefaultAzureCredential + from azure.keyvault.certificates import CertificateClient + + credential = DefaultAzureCredential() + + # Create a new certificate client using the default credential + certificate_client = CertificateClient(vault_url=, credential=credential) +``` +## Key concepts +### Certificate + A certificate is the fundamental resource within Azure KeyVault. From a developer's perspective, Key Vault APIs accept and return certificates as the Certificate type. In addition to the certificate data, the following attributes may be specified: +* expires: Identifies the expiration time on or after which the certificate data should not be retrieved. +* not_before: Identifies the time after which the certificate will be active. +* enabled: Specifies whether the certificate data can be retrieved. +* created: Indicates when this version of the certificate was created. +* updated: Indicates when this version of the certificate was updated. + +### Certificate Client: +The Certificate client performs the interactions with the Azure Key Vault service for getting, setting, updating, deleting, and listing certificates and their versions. An asynchronous and synchronous CertificateClient exists in the SDK allowing for selection of a client based on an application's use case. Once you've initialized a CertificateClient, you can interact with the primary resource types in Key Vault. + +## Examples +The following section provides several code snippets using the above created `certificate_client`, covering some of the most common Azure Key Vault Certificate service related tasks, including: +* [Create a Certificate](#create-a-certificate) +* [Retrieve a Certificate](#retrieve-a-certificate) +* [Update an existing Certificate](#update-an-existing-certificate) +* [Delete a Certificate](#delete-a-certificate) +* [List Certificates](#list-certificates) +* + +### Create a Certificate +`create_certificate` creates a Certificate to be stored in the Azure Key Vault. If a certificate with the same name already exists, then a new version of the certificate is created. +Before creating a certificate, a management policy for the certificate can be created or our default policy will be used. The `create_certificate` operation returns a long running operation poller in both the synchronous and asynchronous method. +```python + create_certificate_poller = certificate_client.create_certificate(name="cert-name") + + create_certificate_poller.wait() + print(create_certificate_poller.result()) +``` + +### Retrieve a Certificate +`get_certificate_with_policy` retrieves a certificate previously stored in the Key Vault without having to specify version. +```python + certificate = certificate_client.get_certificate_with_policy(name="cert-name") + + print(certificate.name) + print(certificate.version) +``` + +### Update an existing Certificate +`update_certificate` updates a certificate previously stored in the Key Vault. +```python + # You can specify additional application-specific metadata in the form of tags. + tags = {"foo": "updated tag"} + + updated_certificate= certificate_client.update_certificate(name="cert-name", tags=tags) + + print(updated_certificate.name) + print(updated_certificate.version) + print(updated_certificate.updated) + print(updated_certificate.tags) + +``` + +### Delete a Certificate +`delete_certificate` deletes a certificate previously stored in the Key Vault. When [soft-delete][soft_delete] is not enabled for the Key Vault, this operation permanently deletes the certificate. +```python + deleted_certificate = certificate_client.delete_certificate(name="cert-name") + + print(deleted_certificate.name) + print(deleted_certificate.deleted_date) +``` +### List Certificates +This example lists all the certificates in the specified Key Vault. +```python + certificates = certificate_client.list_certificates() + + for certificate in certificates: + # this list doesn't include versions of the certificates + print(certificate.name) +``` + +## Troubleshooting +### General +Key Vault clients raise exceptions defined in azure-core. For more detailed information about exceptions and how to deal with them, see [Azure Core exceptions][azure_core_exceptions]. + +For example, if you try to retrieve a certificate after it is deleted a `404` error is returned, indicating resource not found. In the following snippet, the error is handled gracefully by catching the exception and displaying additional information about the error. +```python +from azure.core.exceptions import ResourceNotFoundError +try: + certificate_client.get_certificate(name="deleted_certificate", version="deleted_certificate_version") +except ResourceNotFoundError as e: + print(e.message) + +Output: "certificate not found:deleted_certificate" +``` +### Logging +Network trace logging is disabled by default for this library. When enabled, this will be logged at DEBUG level. The logging policy is used to output the HTTP network trace to the configured logger. You can configure logging to print out debugging information to the stdout or write it to a file using the following example: + + ```python +import sys +import logging + # Create a logger for the 'azure' SDK +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + # Configure a console output +handler = logging.StreamHandler(stream=sys.stdout) +logger.addHandler(handler) + # Configure a file output +file_handler = logging.FileHandler(filename) +logger.addHandler(file_handler) + +# Enable network trace logging. This will be logged at DEBUG level. +# By default, network trace logging is disabled. +config = CertificateClient.create_config(credential=credential, logging_enable=True) +client = CertificateClient(vault_url=url, credential=credential, config=config) +``` +The logger can also be enabled per operation. + + ```python +certificate = certificate_client.get_certificate_with_policy(name="cert-name", logging_enable=True) +``` + +## Next steps +Several KeyVault Python SDK samples are available to you in the SDK's GitHub repository. These samples provide example code for additional scenarios commonly encountered while working with Key Vault: +* [test_examples_certificates.py][test_examples_certificates] - Contains the code snippets working with Key Vault certificates. +* [hello_world.py][hello_world_sample] and [hello_world_async.py][hello_world_async_sample] - Python code for working with Azure Key Vault, including: + * Create a new certificate + * Get an existing certificate + * Update an existing certificate + * Delete certificate +* [backup_restore_operations.py][backup_operations_sample] and [backup_restore_operations_async.py][backup_operations_async_sample] - Example code for working with Key Vault certficates backup and recovery, including: + * Create certificate + * Backup a certificate + * Delete the certificate + * Use backed up certificate bytes to restore the deleted certificate + + ### Additional Documentation +For more extensive documentation on Azure Key Vault, see the [API reference documentation][reference_docs]. + +## Contributing +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct][code_of_conduct]. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments. + + +[asyncio_package]: https://docs.python.org/3/library/asyncio.html +[azure_cloud_shell]: https://shell.azure.com/bash +[azure_core_exceptions]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/core/azure-core/docs/exceptions.md +[azure_identity]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/identity/azure-identity +[azure_sub]: https://azure.microsoft.com/free/ +[code_of_conduct]: https://opensource.microsoft.com/codeofconduct/ +[backup_operations_sample]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations.py +[backup_operations_async_sample]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations_async.py +[hello_world_sample]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/azure-keyvault-certificates/samples/hello_world.py +[hello_world_async_sample]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/azure-keyvault-certificates/samples/hello_world_async.py +[certificate_client_docs]: https://azure.github.io/azure-sdk-for-python/ref/azure.keyvault.certificates.html#azure.keyvault.certificates.CertificateClient +[keyvault_docs]: https://docs.microsoft.com/en-us/azure/key-vault/ +[list_operations_sample]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/azure-keyvault-certificates/samples/list_operations.py +[pip]: https://pypi.org/project/pip/ +[pypi_package_certificates]: https://pypi.org/project/azure-keyvault-certificates/ +[reference_docs]: https://azure.github.io/azure-sdk-for-python/ref/azure.keyvault.certificates.html +[certificates_client_src]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault/azure/keyvault/certificates +[certificates_samples]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates/samples +[soft_delete]: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete +[test_example_certificates]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/azure-keyvault-certificates/tests/test_example_certificates.py + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-python%2Fsdk%2Fkeyvault%2Fazure-keyvault-certificates%2FFREADME.png) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/__init__.py new file mode 100644 index 000000000000..125860bac907 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/__init__.py @@ -0,0 +1,6 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# pylint:disable=missing-docstring +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/__init__.py new file mode 100644 index 000000000000..125860bac907 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/__init__.py @@ -0,0 +1,6 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# pylint:disable=missing-docstring +__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py new file mode 100644 index 000000000000..db62571fe925 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py @@ -0,0 +1,27 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from .client import CertificateClient +from .enums import ActionType, JsonWebKeyCurveName, JsonWebKeyType, SecretContentType, KeyUsageType +from .models import ( + AdministratorDetails, + CertificatePolicy, + Contact, + KeyProperties, + LifetimeAction +) + +__all__ = [ + "ActionType", + "AdministratorDetails", + "CertificateClient", + "CertificatePolicy", + "Contact", + "JsonWebKeyCurveName", + "JsonWebKeyType", + "KeyProperties", + "KeyUsageType", + "LifetimeAction", + "SecretContentType" +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_polling.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_polling.py new file mode 100644 index 000000000000..e8ea5cd12318 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_polling.py @@ -0,0 +1,63 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import logging +import time + +from azure.core.exceptions import HttpResponseError +from azure.core.polling import PollingMethod +from azure.keyvault.certificates._shared import parse_vault_id + +logger = logging.getLogger(__name__) + + +class CreateCertificatePoller(PollingMethod): + def __init__(self, interval=5, unknown_issuer=False): + self._command = None + self._status = None + self._certificate_id = None + self.polling_interval = interval + self.unknown_issuer = unknown_issuer + + def _update_status(self): + # type: () -> None + pending_certificate = self._command() + self._status = pending_certificate.status.lower() + if not self._certificate_id: + self._certificate_id = parse_vault_id(pending_certificate.id) + + def initialize(self, client, initial_response, _): + # type: (Any, Any, Callable) -> None + self._command = client + self._status = initial_response + + def run(self): + # type: () -> None + try: + while not self.finished(): + self._update_status() + if self._status != 'completed' and self._status != 'inprogress' and self._status != 'cancelled': + raise HttpResponseError( + 'Unknown status \'{}\' for pending certificate {}'.format(self._status, self._certificate_id)) + time.sleep(self.polling_interval) + except Exception as e: + logger.warning(str(e)) + raise + + def finished(self): + # type: () -> bool + if self.unknown_issuer: + return True + return self._status != 'inprogress' + + def resource(self): + # type: () -> str + if not self.finished(): + self._update_status() + return self._status + + def status(self): + # type: () ->str + return self._status diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py new file mode 100644 index 000000000000..a8fd2a41d71f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py @@ -0,0 +1,57 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from collections import namedtuple + +try: + import urllib.parse as parse +except ImportError: + # pylint:disable=import-error + import urlparse as parse # type: ignore + +from .challenge_auth_policy import ChallengeAuthPolicy, ChallengeAuthPolicyBase +from .client_base import KeyVaultClientBase +from .http_challenge import HttpChallenge +from . import http_challenge_cache as HttpChallengeCache + +__all__ = [ + "ChallengeAuthPolicy", + "ChallengeAuthPolicyBase", + "HttpChallenge", + "HttpChallengeCache", + "KeyVaultClientBase", +] + +_VaultId = namedtuple("VaultId", ["vault_url", "collection", "name", "version"]) + + +def parse_vault_id(url): + try: + parsed_uri = parse.urlparse(url) + except Exception: # pylint: disable=broad-except + raise ValueError("'{}' is not not a valid url".format(url)) + if not (parsed_uri.scheme and parsed_uri.hostname): + raise ValueError("'{}' is not not a valid url".format(url)) + + path = list(filter(None, parsed_uri.path.split("/"))) + + if len(path) < 2 or len(path) > 3: + raise ValueError("'{}' is not not a valid vault url".format(url)) + + return _VaultId( + vault_url="{}://{}".format(parsed_uri.scheme, parsed_uri.hostname), + collection=path[0], + name=path[1], + version=path[2] if len(path) == 3 else None, + ) + + +try: + # pylint:disable=unused-import + from .async_challenge_auth_policy import AsyncChallengeAuthPolicy + from .async_client_base import AsyncKeyVaultClientBase + + __all__.extend(["AsyncChallengeAuthPolicy", "AsyncKeyVaultClientBase"]) +except (SyntaxError, ImportError): + pass diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/__init__.py new file mode 100644 index 000000000000..efc5f67755a2 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/__init__.py @@ -0,0 +1,7 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from .key_vault_client import KeyVaultClient + +__all__ = ["KeyVaultClient"] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/key_vault_client.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/key_vault_client.py new file mode 100644 index 000000000000..6221dd5e7bec --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/key_vault_client.py @@ -0,0 +1,199 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from azure.profiles import KnownProfiles, ProfileDefinition +from azure.profiles.multiapiclient import MultiApiClientMixin + +from .v7_0.version import VERSION as V7_0_VERSION +from .v2016_10_01.version import VERSION as V2016_10_01_VERSION + + +class KeyVaultClient(MultiApiClientMixin): + """The key vault client performs cryptographic key operations and vault operations against the Key Vault service. + Implementation depends on the API version: + + * 2016-10-01: :class:`v2016_10_01.KeyVaultClient` + * 7.0: :class:`v7_0.KeyVaultClient` + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + + :param str api_version: API version to use if no profile is provided, or if + missing in profile. + :param profile: A profile definition, from KnownProfiles to dict. + :type profile: azure.profiles.KnownProfiles + """ + + DEFAULT_API_VERSION = "7.0" + _PROFILE_TAG = "azure.keyvault.KeyVaultClient" + LATEST_PROFILE = ProfileDefinition({_PROFILE_TAG: {None: DEFAULT_API_VERSION}}, _PROFILE_TAG + " latest") + + _init_complete = False + + def __init__(self, credentials, pipeline=None, api_version=None, aio=False, profile=KnownProfiles.default): + self._client_impls = {} + self._pipeline = pipeline + self._entered = False + self._aio = aio + super(KeyVaultClient, self).__init__(api_version=api_version, profile=profile) + + self._credentials = credentials + self._init_complete = True + + @staticmethod + def get_configuration_class(api_version, aio=False): + """ + Get the versioned configuration implementation corresponding to the current profile. + :return: The versioned configuration implementation. + """ + if api_version == V7_0_VERSION: + if aio: + from .v7_0.aio._configuration_async import KeyVaultClientConfiguration as ImplConfig + else: + from .v7_0._configuration import KeyVaultClientConfiguration as ImplConfig + elif api_version == V2016_10_01_VERSION: + if aio: + from .v2016_10_01.aio._configuration_async import KeyVaultClientConfiguration as ImplConfig + else: + from .v2016_10_01._configuration import KeyVaultClientConfiguration as ImplConfig + else: + raise NotImplementedError("API version {} is not available".format(api_version)) + return ImplConfig + + @property + def models(self): + """Module depends on the API version: + * 2016-10-01: :mod:`v2016_10_01.models` + * 7.0: :mod:`v7_0.models` + """ + api_version = self._get_api_version(None) + + if api_version == V7_0_VERSION: + from .v7_0 import models as impl_models + elif api_version == V2016_10_01_VERSION: + from .v2016_10_01 import models as impl_models + else: + raise NotImplementedError("APIVersion {} is not available".format(api_version)) + return impl_models + + def _get_client_impl(self): + """ + Get the versioned client implementation corresponding to the current profile. + :return: The versioned client implementation. + """ + api_version = self._get_api_version(None) + if api_version not in self._client_impls: + self._create_client_impl(api_version) + return self._client_impls[api_version] + + def _create_client_impl(self, api_version): + """ + Creates the client implementation corresponding to the specified api_version. + :param api_version: + :return: + """ + if api_version == V7_0_VERSION: + if self._aio: + from .v7_0.aio import KeyVaultClient as ImplClient + else: + from .v7_0 import KeyVaultClient as ImplClient + elif api_version == V2016_10_01_VERSION: + if self._aio: + from .v2016_10_01.aio import KeyVaultClient as ImplClient + else: + from .v2016_10_01 import KeyVaultClient as ImplClient + else: + raise NotImplementedError("API version {} is not available".format(api_version)) + + impl = ImplClient(credentials=self._credentials, pipeline=self._pipeline) + + # if __enter__ has previously been called and the impl client has __enter__ defined we need to call it + if self._entered: + if hasattr(impl, "__enter__"): + impl.__enter__() + elif hasattr(impl, "__aenter__"): + impl.__aenter__() + + self._client_impls[api_version] = impl + return impl + + def __aenter__(self, *args, **kwargs): + """ + Calls __aenter__ on all client implementations which support it + :param args: positional arguments to relay to client implementations of __aenter__ + :param kwargs: keyword arguments to relay to client implementations of __aenter__ + :return: returns the current KeyVaultClient instance + """ + for _, impl in self._client_impls.items(): + if hasattr(impl, "__aenter__"): + impl.__aenter__(*args, **kwargs) + + # mark the current KeyVaultClient as _entered so that client implementations instantiated + # subsequently will also have __aenter__ called on them as appropriate + self._entered = True + return self + + def __enter__(self, *args, **kwargs): + """ + Calls __enter__ on all client implementations which support it + :param args: positional arguments to relay to client implementations of __enter__ + :param kwargs: keyword arguments to relay to client implementations of __enter__ + :return: returns the current KeyVaultClient instance + """ + for _, impl in self._client_impls.items(): + if hasattr(impl, "__enter__"): + impl.__enter__(*args, **kwargs) + + # mark the current KeyVaultClient as _entered so that client implementations instantiated + # subsequently will also have __enter__ called on them as appropriate + self._entered = True + return self + + def __aexit__(self, *args, **kwargs): + """ + Calls __aexit__ on all client implementations which support it + :param args: positional arguments to relay to client implementations of __aexit__ + :param kwargs: keyword arguments to relay to client implementations of __aexit__ + :return: returns the current KeyVaultClient instance + """ + for _, impl in self._client_impls.items(): + if hasattr(impl, "__aexit__"): + impl.__aexit__(*args, **kwargs) + return self + + def __exit__(self, *args, **kwargs): + """ + Calls __exit__ on all client implementations which support it + :param args: positional arguments to relay to client implementations of __enter__ + :param kwargs: keyword arguments to relay to client implementations of __enter__ + :return: returns the current KeyVaultClient instance + """ + for _, impl in self._client_impls.items(): + if hasattr(impl, "__exit__"): + impl.__exit__(*args, **kwargs) + return self + + def __getattr__(self, name): + """ + In the case that the attribute is not defined on the custom KeyVaultClient. Attempt to get + the attribute from the versioned client implementation corresponding to the current profile. + :param name: Name of the attribute retrieve from the current versioned client implementation + :return: The value of the specified attribute on the current client implementation. + """ + impl = self._get_client_impl() + return getattr(impl, name) + + def __setattr__(self, name, attr): + """ + Sets the specified attribute either on the custom KeyVaultClient or the current underlying implementation. + :param name: Name of the attribute to set + :param attr: Value of the attribute to set + :return: None + """ + if self._init_complete and not hasattr(self, name): + impl = self._get_client_impl() + setattr(impl, name, attr) + else: + super(KeyVaultClient, self).__setattr__(name, attr) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/__init__.py new file mode 100644 index 000000000000..e913d4cf6c46 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client import KeyVaultClient +__all__ = ['KeyVaultClient'] + +from .version import VERSION + +__version__ = VERSION + diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_configuration.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_configuration.py new file mode 100644 index 000000000000..28cf75e3d2b4 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_configuration.py @@ -0,0 +1,48 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from .version import VERSION + + +class KeyVaultClientConfiguration(Configuration): + """Configuration for KeyVaultClient + Note that all parameters used to create this instance are saved as instance + attributes. + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__(self, credentials, **kwargs): + + if credentials is None: + raise ValueError("Parameter 'credentials' must not be None.") + + super(KeyVaultClientConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azsdk-python-azure-keyvault/{}'.format(VERSION)) + self.generate_client_request_id = True + + self.credentials = credentials + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.RetryPolicy(**kwargs) + self.custom_hook_policy = policies.CustomHookPolicy(**kwargs) + self.redirect_policy = policies.RedirectPolicy(**kwargs) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_key_vault_client.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_key_vault_client.py new file mode 100644 index 000000000000..e3ec609b6cd3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/_key_vault_client.py @@ -0,0 +1,46 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core import PipelineClient +from msrest import Serializer, Deserializer + +from ._configuration import KeyVaultClientConfiguration +from .operations import KeyVaultClientOperationsMixin +from . import models + + +class KeyVaultClient(KeyVaultClientOperationsMixin): + """The key vault client performs cryptographic key operations and vault operations against the Key Vault service. + + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__( + self, credentials, **kwargs): + + base_url = '{vaultBaseUrl}' + self._config = KeyVaultClientConfiguration(credentials, **kwargs) + self._client = PipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '2016-10-01' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + + def __enter__(self): + self._client.__enter__() + return self + def __exit__(self, *exc_details): + self._client.__exit__(*exc_details) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/__init__.py new file mode 100644 index 000000000000..fb2e6c3866fd --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/__init__.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_async import KeyVaultClient +__all__ = ['KeyVaultClient'] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_configuration_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_configuration_async.py new file mode 100644 index 000000000000..a61d9eeff444 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_configuration_async.py @@ -0,0 +1,47 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from ..version import VERSION + + +class KeyVaultClientConfiguration(Configuration): + """Configuration for KeyVaultClient + Note that all parameters used to create this instance are saved as instance + attributes. + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__(self, credentials, **kwargs): + + if credentials is None: + raise ValueError("Parameter 'credentials' must not be None.") + + super(KeyVaultClientConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azsdk-python-azure-keyvault/{}'.format(VERSION)) + self.generate_client_request_id = True + + self.credentials = credentials + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.AsyncRetryPolicy(**kwargs) + self.redirect_policy = policies.AsyncRedirectPolicy(**kwargs) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_key_vault_client_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_key_vault_client_async.py new file mode 100644 index 000000000000..ad4b8a97754f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/_key_vault_client_async.py @@ -0,0 +1,46 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core import AsyncPipelineClient +from msrest import Serializer, Deserializer + +from ._configuration_async import KeyVaultClientConfiguration +from .operations_async import KeyVaultClientOperationsMixin +from .. import models + + +class KeyVaultClient(KeyVaultClientOperationsMixin): + """The key vault client performs cryptographic key operations and vault operations against the Key Vault service. + + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__( + self, credentials, **kwargs): + + base_url = '{vaultBaseUrl}' + self._config = KeyVaultClientConfiguration(credentials, **kwargs) + self._client = AsyncPipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '2016-10-01' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + + async def __aenter__(self): + await self._client.__aenter__() + return self + async def __aexit__(self, *exc_details): + await self._client.__aexit__(*exc_details) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/__init__.py new file mode 100644 index 000000000000..771a17ceb80d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_operations_async import KeyVaultClientOperationsMixin + +__all__ = [ + 'KeyVaultClientOperationsMixin', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/_key_vault_client_operations_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/_key_vault_client_operations_async.py new file mode 100644 index 000000000000..b5cc965119ed --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/aio/operations_async/_key_vault_client_operations_async.py @@ -0,0 +1,4475 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core.exceptions import map_error +from azure.core.async_paging import AsyncItemPaged, AsyncList +from ... import models +import uuid + + +class KeyVaultClientOperationsMixin: + + async def create_key(self, vault_base_url, key_name, kty, key_size=None, key_ops=None, key_attributes=None, tags=None, curve=None, *, cls=None, **kwargs): + """Creates a new key, stores it, then returns key parameters and + attributes to the client. + + The create key operation can be used to create any key type in Azure + Key Vault. If the named key already exists, Azure Key Vault creates a + new version of the key. It requires the keys/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name for the new key. The system will generate + the version name for the new key. + :type key_name: str + :param kty: The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', + 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or + 4096 for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', + 'P-521', 'SECP256K1' + :type curve: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyCreateParameters(kty=kty, key_size=key_size, key_ops=key_ops, key_attributes=key_attributes, tags=tags, curve=curve) + + # Construct URL + url = self.create_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_key.metadata = {'url': '/keys/{key-name}/create'} + + async def import_key(self, vault_base_url, key_name, key, hsm=None, key_attributes=None, tags=None, *, cls=None, **kwargs): + """Imports an externally created key, stores it, and returns key + parameters and attributes to the client. + + The import key operation may be used to import any key type into an + Azure Key Vault. If the named key already exists, Azure Key Vault + creates a new version of the key. This operation requires the + keys/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: Name for the imported key. + :type key_name: str + :param key: The Json web key + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyImportParameters(hsm=hsm, key=key, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.import_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyImportParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_key.metadata = {'url': '/keys/{key-name}'} + + async def delete_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Deletes a key of any type from storage in Azure Key Vault. + + The delete key operation cannot be used to remove individual versions + of a key. This operation removes the cryptographic material associated + with the key, which means the key is not usable for Sign/Verify, + Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the + keys/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to delete. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_key.metadata = {'url': '/keys/{key-name}'} + + async def update_key(self, vault_base_url, key_name, key_version, key_ops=None, key_attributes=None, tags=None, *, cls=None, **kwargs): + """The update key operation changes specified attributes of a stored key + and can be applied to any key type and key version stored in Azure Key + Vault. + + In order to perform this operation, the key must already exist in the + Key Vault. Note: The cryptographic material of a key itself cannot be + changed. This operation requires the keys/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of key to update. + :type key_name: str + :param key_version: The version of the key to update. + :type key_version: str + :param key_ops: Json web key operations. For more information on + possible key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyUpdateParameters(key_ops=key_ops, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.update_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + async def get_key(self, vault_base_url, key_name, key_version, *, cls=None, **kwargs): + """Gets the public part of a stored key. + + The get key operation is applicable to all key types. If the requested + key is symmetric, then no key material is released in the response. + This operation requires the keys/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to get. + :type key_name: str + :param key_version: Adding the version parameter retrieves a specific + version of a key. + :type key_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key_versions( + self, vault_base_url, key_name, maxresults=None, *, cls=None, **kwargs): + """Retrieves a list of individual key versions with the same key name. + + The full key identifier, attributes, and tags are provided in the + response. This operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_key_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_key_versions.metadata = {'url': '/keys/{key-name}/versions'} + + def get_keys( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a stored key. The LIST + operation is applicable to all key types, however only the base key + identifier, attributes, and tags are provided in the response. + Individual versions of a key are not listed in the response. This + operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_keys.metadata = {'url': '/keys'} + + async def backup_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Requests that a backup of the specified key be downloaded to the + client. + + The Key Backup operation exports a key from Azure Key Vault in a + protected form. Note that this operation does NOT return key material + in a form that can be used outside the Azure Key Vault system, the + returned key material is either protected to a Azure Key Vault HSM or + to Azure Key Vault itself. The intent of this operation is to allow a + client to GENERATE a key in one Azure Key Vault instance, BACKUP the + key, and then RESTORE it into another Azure Key Vault instance. The + BACKUP operation may be used to export, in protected form, any key type + from Azure Key Vault. Individual versions of a key cannot be backed up. + BACKUP / RESTORE can be performed within geographical boundaries only; + meaning that a BACKUP from one geographical area cannot be restored to + another geographical area. For example, a backup from the US + geographical area cannot be restored in an EU geographical area. This + operation requires the key/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupKeyResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.BackupKeyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupKeyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_key.metadata = {'url': '/keys/{key-name}/backup'} + + async def restore_key(self, vault_base_url, key_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up key to a vault. + + Imports a previously backed up key into Azure Key Vault, restoring the + key, its key identifier, attributes and access control policies. The + RESTORE operation may be used to import a previously backed up key. + Individual versions of a key cannot be restored. The key is restored in + its entirety with the same key name as it had when it was backed up. If + the key name is not available in the target Key Vault, the RESTORE + operation will be rejected. While the key name is retained during + restore, the final key identifier will change if the key is restored to + a different vault. Restore will restore all versions and preserve + version identifiers. The RESTORE operation is subject to security + constraints: The target Key Vault must be owned by the same Microsoft + Azure Subscription as the source Key Vault The user must have RESTORE + permission in the target Key Vault. This operation requires the + keys/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_bundle_backup: The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyRestoreParameters(key_bundle_backup=key_bundle_backup) + + # Construct URL + url = self.restore_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_key.metadata = {'url': '/keys/restore'} + + async def encrypt(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Encrypts an arbitrary sequence of bytes using an encryption key that is + stored in a key vault. + + The ENCRYPT operation encrypts an arbitrary sequence of bytes using an + encryption key that is stored in Azure Key Vault. Note that the ENCRYPT + operation only supports a single block of data, the size of which is + dependent on the target key and the encryption algorithm to be used. + The ENCRYPT operation is only strictly necessary for symmetric keys + stored in Azure Key Vault since protection with an asymmetric key can + be performed using public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/encrypt permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.encrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + encrypt.metadata = {'url': '/keys/{key-name}/{key-version}/encrypt'} + + async def decrypt(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Decrypts a single block of encrypted data. + + The DECRYPT operation decrypts a well-formed block of ciphertext using + the target encryption key and specified algorithm. This operation is + the reverse of the ENCRYPT operation; only a single block of data may + be decrypted, the size of this block is dependent on the target key and + the algorithm to be used. The DECRYPT operation applies to asymmetric + and symmetric keys stored in Azure Key Vault since it uses the private + portion of the key. This operation requires the keys/decrypt + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.decrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + decrypt.metadata = {'url': '/keys/{key-name}/{key-version}/decrypt'} + + async def sign(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Creates a signature from a digest using the specified key. + + The SIGN operation is applicable to asymmetric and symmetric keys + stored in Azure Key Vault since this operation uses the private portion + of the key. This operation requires the keys/sign permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm identifier. For + more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeySignParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.sign.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeySignParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + sign.metadata = {'url': '/keys/{key-name}/{key-version}/sign'} + + async def verify(self, vault_base_url, key_name, key_version, algorithm, digest, signature, *, cls=None, **kwargs): + """Verifies a signature using a specified key. + + The VERIFY operation is applicable to symmetric keys stored in Azure + Key Vault. VERIFY is not strictly necessary for asymmetric keys stored + in Azure Key Vault since signature verification can be performed using + the public portion of the key but this operation is supported as a + convenience for callers that only have a key-reference and not the + public portion of the key. This operation requires the keys/verify + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm. For more + information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param digest: The digest used for signing. + :type digest: bytes + :param signature: The signature to be verified. + :type signature: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyVerifyResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyVerifyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyVerifyParameters(algorithm=algorithm, digest=digest, signature=signature) + + # Construct URL + url = self.verify.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyVerifyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyVerifyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + verify.metadata = {'url': '/keys/{key-name}/{key-version}/verify'} + + async def wrap_key(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Wraps a symmetric key using a specified key. + + The WRAP operation supports encryption of a symmetric key using a key + encryption key that has previously been stored in an Azure Key Vault. + The WRAP operation is only strictly necessary for symmetric keys stored + in Azure Key Vault since protection with an asymmetric key can be + performed using the public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/wrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.wrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + wrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/wrapkey'} + + async def unwrap_key(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Unwraps a symmetric key using the specified key that was initially used + for wrapping that key. + + The UNWRAP operation supports decryption of a symmetric key using the + target key encryption key. This operation is the reverse of the WRAP + operation. The UNWRAP operation applies to asymmetric and symmetric + keys stored in Azure Key Vault since it uses the private portion of the + key. This operation requires the keys/unwrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.unwrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + unwrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/unwrapkey'} + + def get_deleted_keys( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists the deleted keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a deleted key. This + operation includes deletion-specific information. The Get Deleted Keys + operation is applicable for vaults enabled for soft-delete. While the + operation can be invoked on any vault, it will return an error if + invoked on a non soft-delete enabled vault. This operation requires the + keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedKeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.DeletedKeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedKeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_keys.metadata = {'url': '/deletedkeys'} + + async def get_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Gets the public part of a deleted key. + + The Get Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/get permission. . + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + async def purge_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Permanently deletes the specified key. + + The Purge Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + async def recover_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Recovers the deleted key to its latest version. + + The Recover Deleted Key operation is applicable for deleted keys in + soft-delete enabled vaults. It recovers the deleted key back to its + latest version under /keys. An attempt to recover an non-deleted key + will return an error. Consider this the inverse of the delete operation + on soft-delete enabled vaults. This operation requires the keys/recover + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the deleted key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_key.metadata = {'url': '/deletedkeys/{key-name}/recover'} + + async def set_secret(self, vault_base_url, secret_name, value, tags=None, content_type=None, secret_attributes=None, *, cls=None, **kwargs): + """Sets a secret in a specified key vault. + + The SET operation adds a secret to the Azure Key Vault. If the named + secret already exists, Azure Key Vault creates a new version of that + secret. This operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param value: The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretSetParameters(value=value, tags=tags, content_type=content_type, secret_attributes=secret_attributes) + + # Construct URL + url = self.set_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_secret.metadata = {'url': '/secrets/{secret-name}'} + + async def delete_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Deletes a secret from a specified key vault. + + The DELETE operation applies to any secret stored in Azure Key Vault. + DELETE cannot be applied to an individual version of a secret. This + operation requires the secrets/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_secret.metadata = {'url': '/secrets/{secret-name}'} + + async def update_secret(self, vault_base_url, secret_name, secret_version, content_type=None, secret_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the attributes associated with a specified secret in a given + key vault. + + The UPDATE operation changes specified attributes of an existing stored + secret. Attributes that are not specified in the request are left + unchanged. The value of a secret itself cannot be changed. This + operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretUpdateParameters(content_type=content_type, secret_attributes=secret_attributes, tags=tags) + + # Construct URL + url = self.update_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + async def get_secret(self, vault_base_url, secret_name, secret_version, *, cls=None, **kwargs): + """Get a specified secret from a given key vault. + + The GET operation is applicable to any secret stored in Azure Key + Vault. This operation requires the secrets/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secrets( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List secrets in a specified key vault. + + The Get Secrets operation is applicable to the entire vault. However, + only the base secret identifier and its attributes are provided in the + response. Individual secret versions are not listed in the response. + This operation requires the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_secrets.metadata = {'url': '/secrets'} + + def get_secret_versions( + self, vault_base_url, secret_name, maxresults=None, *, cls=None, **kwargs): + """List all versions of the specified secret. + + The full secret identifier and attributes are provided in the response. + No values are returned for the secrets. This operations requires the + secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secret_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_secret_versions.metadata = {'url': '/secrets/{secret-name}/versions'} + + def get_deleted_secrets( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists deleted secrets for the specified vault. + + The Get Deleted Secrets operation returns the secrets that have been + deleted for a vault enabled for soft-delete. This operation requires + the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.DeletedSecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedSecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_secrets.metadata = {'url': '/deletedsecrets'} + + async def get_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Gets the specified deleted secret. + + The Get Deleted Secret operation returns the specified deleted secret + along with its attributes. This operation requires the secrets/get + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + async def purge_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Permanently deletes the specified secret. + + The purge deleted secret operation removes the secret permanently, + without the possibility of recovery. This operation can only be enabled + on a soft-delete enabled vault. This operation requires the + secrets/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + async def recover_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Recovers the deleted secret to the latest version. + + Recovers the deleted secret in the specified vault. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the secrets/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the deleted secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}/recover'} + + async def backup_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Backs up the specified secret. + + Requests that a backup of the specified secret be downloaded to the + client. All versions of the secret will be downloaded. This operation + requires the secrets/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupSecretResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.BackupSecretResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupSecretResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_secret.metadata = {'url': '/secrets/{secret-name}/backup'} + + async def restore_secret(self, vault_base_url, secret_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up secret to a vault. + + Restores a backed up secret, and all its versions, to a vault. This + operation requires the secrets/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_bundle_backup: The backup blob associated with a secret + bundle. + :type secret_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretRestoreParameters(secret_bundle_backup=secret_bundle_backup) + + # Construct URL + url = self.restore_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_secret.metadata = {'url': '/secrets/restore'} + + def get_certificates( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List certificates in a specified key vault. + + The GetCertificates operation returns the set of certificates resources + in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificates.metadata = {'url': '/certificates'} + + async def delete_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Deletes a certificate from a specified key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate.metadata = {'url': '/certificates/{certificate-name}'} + + async def set_certificate_contacts(self, vault_base_url, contact_list=None, *, cls=None, **kwargs): + """Sets the certificate contacts for the specified key vault. + + Sets the certificate contacts for the specified key vault. This + operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v2016_10_01.models.Contact] + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + contacts = models.Contacts(contact_list=contact_list) + + # Construct URL + url = self.set_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(contacts, 'Contacts') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + async def get_certificate_contacts(self, vault_base_url, *, cls=None, **kwargs): + """Lists the certificate contacts for a specified key vault. + + The GetCertificateContacts operation returns the set of certificate + contact resources in the specified key vault. This operation requires + the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + async def delete_certificate_contacts(self, vault_base_url, *, cls=None, **kwargs): + """Deletes the certificate contacts for a specified key vault. + + Deletes the certificate contacts for a specified key vault certificate. + This operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_issuers( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List certificate issuers for a specified key vault. + + The GetCertificateIssuers operation returns the set of certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateIssuerItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.CertificateIssuerItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_issuers.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateIssuerListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificate_issuers.metadata = {'url': '/certificates/issuers'} + + async def set_certificate_issuer(self, vault_base_url, issuer_name, provider, credentials=None, organization_details=None, attributes=None, *, cls=None, **kwargs): + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: + ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerSetParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.set_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def update_certificate_issuer(self, vault_base_url, issuer_name, provider=None, credentials=None, organization_details=None, attributes=None, *, cls=None, **kwargs): + """Updates the specified certificate issuer. + + The UpdateCertificateIssuer operation performs an update on the + specified certificate issuer entity. This operation requires the + certificates/setissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: + ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerUpdateParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.update_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def get_certificate_issuer(self, vault_base_url, issuer_name, *, cls=None, **kwargs): + """Lists the specified certificate issuer. + + The GetCertificateIssuer operation returns the specified certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def delete_certificate_issuer(self, vault_base_url, issuer_name, *, cls=None, **kwargs): + """Deletes the specified certificate issuer. + + The DeleteCertificateIssuer operation permanently removes the specified + certificate issuer from the vault. This operation requires the + certificates/manageissuers/deleteissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def create_certificate(self, vault_base_url, certificate_name, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateCreateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.create_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [202]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 202: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_certificate.metadata = {'url': '/certificates/{certificate-name}/create'} + + async def import_certificate(self, vault_base_url, certificate_name, base64_encoded_certificate, password=None, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param base64_encoded_certificate: Base64 encoded representation of + the certificate object to import. This certificate needs to contain + the private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateImportParameters(base64_encoded_certificate=base64_encoded_certificate, password=password, certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.import_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateImportParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_certificate.metadata = {'url': '/certificates/{certificate-name}/import'} + + def get_certificate_versions( + self, vault_base_url, certificate_name, maxresults=None, *, cls=None, **kwargs): + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificate_versions.metadata = {'url': '/certificates/{certificate-name}/versions'} + + async def get_certificate_policy(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Lists the policy for a certificate. + + The GetCertificatePolicy operation returns the specified certificate + policy resources in the specified key vault. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in a given key + vault. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + async def update_certificate_policy(self, vault_base_url, certificate_name, certificate_policy, *, cls=None, **kwargs): + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leave others as null. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_policy: The policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.update_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_policy, 'CertificatePolicy') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + async def update_certificate(self, vault_base_url, certificate_name, certificate_version, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given key + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateUpdateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.update_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + async def get_certificate(self, vault_base_url, certificate_name, certificate_version, *, cls=None, **kwargs): + """Gets information about a certificate. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + async def update_certificate_operation(self, vault_base_url, certificate_name, cancellation_requested, *, cls=None, **kwargs): + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param cancellation_requested: Indicates if cancellation was requested + on the certificate operation. + :type cancellation_requested: bool + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + certificate_operation = models.CertificateOperationUpdateParameter(cancellation_requested=cancellation_requested) + + # Construct URL + url = self.update_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_operation, 'CertificateOperationUpdateParameter') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def get_certificate_operation(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def delete_certificate_operation(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def merge_certificate(self, vault_base_url, certificate_name, x509_certificates, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Merges a certificate or a certificate chain with a key pair existing on + the server. + + The MergeCertificate operation performs the merging of a certificate or + certificate chain with a key pair currently available in the service. + This operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param x509_certificates: The certificate or the certificate chain to + merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateMergeParameters(x509_certificates=x509_certificates, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.merge_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateMergeParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [201]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 201: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + merge_certificate.metadata = {'url': '/certificates/{certificate-name}/pending/merge'} + + def get_deleted_certificates( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists the deleted certificates in the specified vault currently + available for recovery. + + The GetDeletedCertificates operation retrieves the certificates in the + current vault which are in a deleted state and ready for recovery or + purging. This operation includes deletion-specific information. This + operation requires the certificates/get/list permission. This operation + can only be enabled on soft-delete enabled vaults. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedCertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.DeletedCertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedCertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_certificates.metadata = {'url': '/deletedcertificates'} + + async def get_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Retrieves information about the specified deleted certificate. + + The GetDeletedCertificate operation retrieves the deleted certificate + information plus its attributes, such as retention interval, scheduled + permanent deletion and the current deletion recovery level. This + operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + async def purge_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Permanently deletes the specified deleted certificate. + + The PurgeDeletedCertificate operation performs an irreversible deletion + of the specified certificate, without possibility for recovery. The + operation is not available if the recovery level does not specify + 'Purgeable'. This operation requires the certificate/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + async def recover_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Recovers the deleted certificate back to its current version under + /certificates. + + The RecoverDeletedCertificate operation performs the reversal of the + Delete operation. The operation is applicable in vaults enabled for + soft-delete, and must be issued during the retention interval + (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the deleted certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}/recover'} + + def get_storage_accounts( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List storage accounts managed by the specified key vault. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of StorageAccountItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.StorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('StorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_storage_accounts.metadata = {'url': '/storage'} + + async def delete_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Deletes a storage account. This operation requires the storage/delete + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def get_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Gets information about a specified storage account. This operation + requires the storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def set_storage_account(self, vault_base_url, storage_account_name, resource_id, active_key_name, auto_regenerate_key, regeneration_period=None, storage_account_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates or updates a new storage account. This operation requires the + storage/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param resource_id: Storage account resource id. + :type resource_id: str + :param active_key_name: Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountCreateParameters(resource_id=resource_id, active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.set_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def update_storage_account(self, vault_base_url, storage_account_name, active_key_name=None, auto_regenerate_key=None, regeneration_period=None, storage_account_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given storage + account. This operation requires the storage/set/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountUpdateParameters(active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.update_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def regenerate_storage_account_key(self, vault_base_url, storage_account_name, key_name, *, cls=None, **kwargs): + """Regenerates the specified key value for the given storage account. This + operation requires the storage/regeneratekey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param key_name: The storage account key name. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountRegenerteKeyParameters(key_name=key_name) + + # Construct URL + url = self.regenerate_storage_account_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountRegenerteKeyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + regenerate_storage_account_key.metadata = {'url': '/storage/{storage-account-name}/regeneratekey'} + + def get_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, *, cls=None, **kwargs): + """List storage SAS definitions for the given storage account. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SasDefinitionItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v2016_10_01.models.SasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_sas_definitions.metadata = {'url': '/storage/{storage-account-name}/sas'} + + async def delete_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Deletes a SAS definition from a specified storage account. This + operation requires the storage/deletesas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def get_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Gets information about a SAS definition for the specified storage + account. This operation requires the storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def set_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, parameters, sas_definition_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates or updates a new SAS definition for the specified storage + account. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param parameters: Sas definition creation metadata in the form of + key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters1 = models.SasDefinitionCreateParameters(parameters=parameters, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.set_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters1, 'SasDefinitionCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def update_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, parameters=None, sas_definition_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given SAS + definition. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param parameters: Sas definition update metadata in the form of + key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters1 = models.SasDefinitionUpdateParameters(parameters=parameters, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.update_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters1, 'SasDefinitionUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/__init__.py new file mode 100644 index 000000000000..6f134becdbd3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/__init__.py @@ -0,0 +1,271 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +try: + from ._models_py3 import Action + from ._models_py3 import AdministratorDetails + from ._models_py3 import Attributes + from ._models_py3 import BackupKeyResult + from ._models_py3 import BackupSecretResult + from ._models_py3 import CertificateAttributes + from ._models_py3 import CertificateBundle + from ._models_py3 import CertificateCreateParameters + from ._models_py3 import CertificateImportParameters + from ._models_py3 import CertificateIssuerItem + from ._models_py3 import CertificateIssuerListResult + from ._models_py3 import CertificateIssuerSetParameters + from ._models_py3 import CertificateIssuerUpdateParameters + from ._models_py3 import CertificateItem + from ._models_py3 import CertificateListResult + from ._models_py3 import CertificateMergeParameters + from ._models_py3 import CertificateOperation + from ._models_py3 import CertificateOperationUpdateParameter + from ._models_py3 import CertificatePolicy + from ._models_py3 import CertificateUpdateParameters + from ._models_py3 import Contact + from ._models_py3 import Contacts + from ._models_py3 import DeletedCertificateBundle + from ._models_py3 import DeletedCertificateItem + from ._models_py3 import DeletedCertificateListResult + from ._models_py3 import DeletedKeyBundle + from ._models_py3 import DeletedKeyItem + from ._models_py3 import DeletedKeyListResult + from ._models_py3 import DeletedSecretBundle + from ._models_py3 import DeletedSecretItem + from ._models_py3 import DeletedSecretListResult + from ._models_py3 import Error + from ._models_py3 import IssuerAttributes + from ._models_py3 import IssuerBundle + from ._models_py3 import IssuerCredentials + from ._models_py3 import IssuerParameters + from ._models_py3 import JsonWebKey + from ._models_py3 import KeyAttributes + from ._models_py3 import KeyBundle + from ._models_py3 import KeyCreateParameters + from ._models_py3 import KeyImportParameters + from ._models_py3 import KeyItem + from ._models_py3 import KeyListResult + from ._models_py3 import KeyOperationResult + from ._models_py3 import KeyOperationsParameters + from ._models_py3 import KeyProperties + from ._models_py3 import KeyRestoreParameters + from ._models_py3 import KeySignParameters + from ._models_py3 import KeyUpdateParameters + from ._models_py3 import KeyVaultError, KeyVaultErrorException + from ._models_py3 import KeyVerifyParameters + from ._models_py3 import KeyVerifyResult + from ._models_py3 import LifetimeAction + from ._models_py3 import OrganizationDetails + from ._models_py3 import PendingCertificateSigningRequestResult + from ._models_py3 import SasDefinitionAttributes + from ._models_py3 import SasDefinitionBundle + from ._models_py3 import SasDefinitionCreateParameters + from ._models_py3 import SasDefinitionItem + from ._models_py3 import SasDefinitionListResult + from ._models_py3 import SasDefinitionUpdateParameters + from ._models_py3 import SecretAttributes + from ._models_py3 import SecretBundle + from ._models_py3 import SecretItem + from ._models_py3 import SecretListResult + from ._models_py3 import SecretProperties + from ._models_py3 import SecretRestoreParameters + from ._models_py3 import SecretSetParameters + from ._models_py3 import SecretUpdateParameters + from ._models_py3 import StorageAccountAttributes + from ._models_py3 import StorageAccountCreateParameters + from ._models_py3 import StorageAccountItem + from ._models_py3 import StorageAccountRegenerteKeyParameters + from ._models_py3 import StorageAccountUpdateParameters + from ._models_py3 import StorageBundle + from ._models_py3 import StorageListResult + from ._models_py3 import SubjectAlternativeNames + from ._models_py3 import Trigger + from ._models_py3 import X509CertificateProperties +except (SyntaxError, ImportError): + from ._models import Action + from ._models import AdministratorDetails + from ._models import Attributes + from ._models import BackupKeyResult + from ._models import BackupSecretResult + from ._models import CertificateAttributes + from ._models import CertificateBundle + from ._models import CertificateCreateParameters + from ._models import CertificateImportParameters + from ._models import CertificateIssuerItem + from ._models import CertificateIssuerListResult + from ._models import CertificateIssuerSetParameters + from ._models import CertificateIssuerUpdateParameters + from ._models import CertificateItem + from ._models import CertificateListResult + from ._models import CertificateMergeParameters + from ._models import CertificateOperation + from ._models import CertificateOperationUpdateParameter + from ._models import CertificatePolicy + from ._models import CertificateUpdateParameters + from ._models import Contact + from ._models import Contacts + from ._models import DeletedCertificateBundle + from ._models import DeletedCertificateItem + from ._models import DeletedCertificateListResult + from ._models import DeletedKeyBundle + from ._models import DeletedKeyItem + from ._models import DeletedKeyListResult + from ._models import DeletedSecretBundle + from ._models import DeletedSecretItem + from ._models import DeletedSecretListResult + from ._models import Error + from ._models import IssuerAttributes + from ._models import IssuerBundle + from ._models import IssuerCredentials + from ._models import IssuerParameters + from ._models import JsonWebKey + from ._models import KeyAttributes + from ._models import KeyBundle + from ._models import KeyCreateParameters + from ._models import KeyImportParameters + from ._models import KeyItem + from ._models import KeyListResult + from ._models import KeyOperationResult + from ._models import KeyOperationsParameters + from ._models import KeyProperties + from ._models import KeyRestoreParameters + from ._models import KeySignParameters + from ._models import KeyUpdateParameters + from ._models import KeyVaultError, KeyVaultErrorException + from ._models import KeyVerifyParameters + from ._models import KeyVerifyResult + from ._models import LifetimeAction + from ._models import OrganizationDetails + from ._models import PendingCertificateSigningRequestResult + from ._models import SasDefinitionAttributes + from ._models import SasDefinitionBundle + from ._models import SasDefinitionCreateParameters + from ._models import SasDefinitionItem + from ._models import SasDefinitionListResult + from ._models import SasDefinitionUpdateParameters + from ._models import SecretAttributes + from ._models import SecretBundle + from ._models import SecretItem + from ._models import SecretListResult + from ._models import SecretProperties + from ._models import SecretRestoreParameters + from ._models import SecretSetParameters + from ._models import SecretUpdateParameters + from ._models import StorageAccountAttributes + from ._models import StorageAccountCreateParameters + from ._models import StorageAccountItem + from ._models import StorageAccountRegenerteKeyParameters + from ._models import StorageAccountUpdateParameters + from ._models import StorageBundle + from ._models import StorageListResult + from ._models import SubjectAlternativeNames + from ._models import Trigger + from ._models import X509CertificateProperties +from ._key_vault_client_enums import ( + JsonWebKeyType, + JsonWebKeyCurveName, + DeletionRecoveryLevel, + KeyUsageType, + ActionType, + JsonWebKeyOperation, + JsonWebKeyEncryptionAlgorithm, + JsonWebKeySignatureAlgorithm, +) + +__all__ = [ + 'Action', + 'AdministratorDetails', + 'Attributes', + 'BackupKeyResult', + 'BackupSecretResult', + 'CertificateAttributes', + 'CertificateBundle', + 'CertificateCreateParameters', + 'CertificateImportParameters', + 'CertificateIssuerItem', + 'CertificateIssuerListResult', + 'CertificateIssuerSetParameters', + 'CertificateIssuerUpdateParameters', + 'CertificateItem', + 'CertificateListResult', + 'CertificateMergeParameters', + 'CertificateOperation', + 'CertificateOperationUpdateParameter', + 'CertificatePolicy', + 'CertificateUpdateParameters', + 'Contact', + 'Contacts', + 'DeletedCertificateBundle', + 'DeletedCertificateItem', + 'DeletedCertificateListResult', + 'DeletedKeyBundle', + 'DeletedKeyItem', + 'DeletedKeyListResult', + 'DeletedSecretBundle', + 'DeletedSecretItem', + 'DeletedSecretListResult', + 'Error', + 'IssuerAttributes', + 'IssuerBundle', + 'IssuerCredentials', + 'IssuerParameters', + 'JsonWebKey', + 'KeyAttributes', + 'KeyBundle', + 'KeyCreateParameters', + 'KeyImportParameters', + 'KeyItem', + 'KeyListResult', + 'KeyOperationResult', + 'KeyOperationsParameters', + 'KeyProperties', + 'KeyRestoreParameters', + 'KeySignParameters', + 'KeyUpdateParameters', + 'KeyVaultError', 'KeyVaultErrorException', + 'KeyVerifyParameters', + 'KeyVerifyResult', + 'LifetimeAction', + 'OrganizationDetails', + 'PendingCertificateSigningRequestResult', + 'SasDefinitionAttributes', + 'SasDefinitionBundle', + 'SasDefinitionCreateParameters', + 'SasDefinitionItem', + 'SasDefinitionListResult', + 'SasDefinitionUpdateParameters', + 'SecretAttributes', + 'SecretBundle', + 'SecretItem', + 'SecretListResult', + 'SecretProperties', + 'SecretRestoreParameters', + 'SecretSetParameters', + 'SecretUpdateParameters', + 'StorageAccountAttributes', + 'StorageAccountCreateParameters', + 'StorageAccountItem', + 'StorageAccountRegenerteKeyParameters', + 'StorageAccountUpdateParameters', + 'StorageBundle', + 'StorageListResult', + 'SubjectAlternativeNames', + 'Trigger', + 'X509CertificateProperties', + 'JsonWebKeyType', + 'JsonWebKeyCurveName', + 'DeletionRecoveryLevel', + 'KeyUsageType', + 'ActionType', + 'JsonWebKeyOperation', + 'JsonWebKeyEncryptionAlgorithm', + 'JsonWebKeySignatureAlgorithm', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_key_vault_client_enums.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_key_vault_client_enums.py new file mode 100644 index 000000000000..c9bb22cda150 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_key_vault_client_enums.py @@ -0,0 +1,88 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from enum import Enum + + +class JsonWebKeyType(str, Enum): + + ec = "EC" + ec_hsm = "EC-HSM" + rsa = "RSA" + rsa_hsm = "RSA-HSM" + oct = "oct" + + +class JsonWebKeyCurveName(str, Enum): + + p_256 = "P-256" #: The NIST P-256 elliptic curve, AKA SECG curve SECP256R1. + p_384 = "P-384" #: The NIST P-384 elliptic curve, AKA SECG curve SECP384R1. + p_521 = "P-521" #: The NIST P-521 elliptic curve, AKA SECG curve SECP521R1. + secp256_k1 = "SECP256K1" #: The SECG SECP256K1 elliptic curve. + + +class DeletionRecoveryLevel(str, Enum): + + purgeable = "Purgeable" #: Soft-delete is not enabled for this vault. A DELETE operation results in immediate and irreversible data loss. + recoverable_purgeable = "Recoverable+Purgeable" #: Soft-delete is enabled for this vault; A privileged user may trigger an immediate, irreversible deletion(purge) of a deleted entity. + recoverable = "Recoverable" #: Soft-delete is enabled for this vault and purge has been disabled. A deleted entity will remain in this state until recovered, or the end of the retention interval. + recoverable_protected_subscription = "Recoverable+ProtectedSubscription" #: Soft-delete is enabled for this vault, and the subscription is protected against immediate deletion. + + +class KeyUsageType(str, Enum): + + digital_signature = "digitalSignature" + non_repudiation = "nonRepudiation" + key_encipherment = "keyEncipherment" + data_encipherment = "dataEncipherment" + key_agreement = "keyAgreement" + key_cert_sign = "keyCertSign" + c_rl_sign = "cRLSign" + encipher_only = "encipherOnly" + decipher_only = "decipherOnly" + + +class ActionType(str, Enum): + + email_contacts = "EmailContacts" + auto_renew = "AutoRenew" + + +class JsonWebKeyOperation(str, Enum): + + encrypt = "encrypt" + decrypt = "decrypt" + sign = "sign" + verify = "verify" + wrap_key = "wrapKey" + unwrap_key = "unwrapKey" + + +class JsonWebKeyEncryptionAlgorithm(str, Enum): + + rsa_oaep = "RSA-OAEP" + rsa_oaep_256 = "RSA-OAEP-256" + rsa1_5 = "RSA1_5" + + +class JsonWebKeySignatureAlgorithm(str, Enum): + + ps256 = "PS256" + ps384 = "PS384" + ps512 = "PS512" + rs256 = "RS256" + rs384 = "RS384" + rs512 = "RS512" + rsnull = "RSNULL" + es256 = "ES256" + es384 = "ES384" + es512 = "ES512" + ecdsa256 = "ECDSA256" diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models.py new file mode 100644 index 000000000000..d1b025916b46 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models.py @@ -0,0 +1,2764 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from msrest.serialization import Model +from azure.core import HttpResponseError + + +class Action(Model): + """The action that will be executed. + + :param action_type: The type of the action. Possible values include: + 'EmailContacts', 'AutoRenew' + :type action_type: str or ~azure.keyvault.v2016_10_01.models.ActionType + """ + + _attribute_map = { + 'action_type': {'key': 'action_type', 'type': 'ActionType'}, + } + + def __init__(self, **kwargs): + super(Action, self).__init__(**kwargs) + self.action_type = kwargs.get('action_type', None) + + +class AdministratorDetails(Model): + """Details of the organization administrator of the certificate issuer. + + :param first_name: First name. + :type first_name: str + :param last_name: Last name. + :type last_name: str + :param email_address: Email address. + :type email_address: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'first_name': {'key': 'first_name', 'type': 'str'}, + 'last_name': {'key': 'last_name', 'type': 'str'}, + 'email_address': {'key': 'email', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(AdministratorDetails, self).__init__(**kwargs) + self.first_name = kwargs.get('first_name', None) + self.last_name = kwargs.get('last_name', None) + self.email_address = kwargs.get('email_address', None) + self.phone = kwargs.get('phone', None) + + +class Attributes(Model): + """The object attributes managed by the KeyVault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(Attributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.not_before = kwargs.get('not_before', None) + self.expires = kwargs.get('expires', None) + self.created = None + self.updated = None + + +class BackupKeyResult(Model): + """The backup key result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up key. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupKeyResult, self).__init__(**kwargs) + self.value = None + + +class BackupSecretResult(Model): + """The backup secret result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up secret. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupSecretResult, self).__init__(**kwargs) + self.value = None + + +class CertificateAttributes(Attributes): + """The certificate management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for certificates in the current vault. If it contains 'Purgeable', + the certificate can be permanently deleted by a privileged user; + otherwise, only the system can purge the certificate, at the end of the + retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class CertificateBundle(Model): + """A certificate bundle consists of a certificate (X509) plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateBundle, self).__init__(**kwargs) + self.id = None + self.kid = None + self.sid = None + self.x509_thumbprint = None + self.policy = None + self.cer = kwargs.get('cer', None) + self.content_type = kwargs.get('content_type', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateCreateParameters(Model): + """The certificate create parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateCreateParameters, self).__init__(**kwargs) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateImportParameters(Model): + """The certificate import parameters. + + All required parameters must be populated in order to send to Azure. + + :param base64_encoded_certificate: Required. Base64 encoded representation + of the certificate object to import. This certificate needs to contain the + private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'base64_encoded_certificate': {'required': True}, + } + + _attribute_map = { + 'base64_encoded_certificate': {'key': 'value', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateImportParameters, self).__init__(**kwargs) + self.base64_encoded_certificate = kwargs.get('base64_encoded_certificate', None) + self.password = kwargs.get('password', None) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateIssuerItem(Model): + """The certificate issuer item containing certificate issuer metadata. + + :param id: Certificate Identifier. + :type id: str + :param provider: The issuer provider. + :type provider: str + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.provider = kwargs.get('provider', None) + + +class CertificateIssuerListResult(Model): + """The certificate issuer list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificate issuers + in the key vault along with a link to the next page of certificate + issuers. + :vartype value: + list[~azure.keyvault.v2016_10_01.models.CertificateIssuerItem] + :ivar next_link: The URL to get the next set of certificate issuers. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateIssuerItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateIssuerSetParameters(Model): + """The certificate issuer set parameters. + + All required parameters must be populated in order to send to Azure. + + :param provider: Required. The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _validation = { + 'provider': {'required': True}, + } + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerSetParameters, self).__init__(**kwargs) + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateIssuerUpdateParameters(Model): + """The certificate issuer update parameters. + + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerUpdateParameters, self).__init__(**kwargs) + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateItem(Model): + """The certificate item containing certificate metadata. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(CertificateItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.x509_thumbprint = kwargs.get('x509_thumbprint', None) + + +class CertificateListResult(Model): + """The certificate list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificates in the + key vault along with a link to the next page of certificates. + :vartype value: list[~azure.keyvault.v2016_10_01.models.CertificateItem] + :ivar next_link: The URL to get the next set of certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateMergeParameters(Model): + """The certificate merge parameters. + + All required parameters must be populated in order to send to Azure. + + :param x509_certificates: Required. The certificate or the certificate + chain to merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'x509_certificates': {'required': True}, + } + + _attribute_map = { + 'x509_certificates': {'key': 'x5c', 'type': '[bytearray]'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateMergeParameters, self).__init__(**kwargs) + self.x509_certificates = kwargs.get('x509_certificates', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateOperation(Model): + """A certificate operation is returned in case of asynchronous requests. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: + ~azure.keyvault.v2016_10_01.models.IssuerParameters + :param csr: The certificate signing request (CSR) that is being used in + the certificate operation. + :type csr: bytearray + :param cancellation_requested: Indicates if cancellation was requested on + the certificate operation. + :type cancellation_requested: bool + :param status: Status of the certificate operation. + :type status: str + :param status_details: The status details of the certificate operation. + :type status_details: str + :param error: Error encountered, if any, during the certificate operation. + :type error: ~azure.keyvault.v2016_10_01.models.Error + :param target: Location which contains the result of the certificate + operation. + :type target: str + :param request_id: Identifier for the certificate operation. + :type request_id: str + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'csr': {'key': 'csr', 'type': 'bytearray'}, + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + 'status': {'key': 'status', 'type': 'str'}, + 'status_details': {'key': 'status_details', 'type': 'str'}, + 'error': {'key': 'error', 'type': 'Error'}, + 'target': {'key': 'target', 'type': 'str'}, + 'request_id': {'key': 'request_id', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateOperation, self).__init__(**kwargs) + self.id = None + self.issuer_parameters = kwargs.get('issuer_parameters', None) + self.csr = kwargs.get('csr', None) + self.cancellation_requested = kwargs.get('cancellation_requested', None) + self.status = kwargs.get('status', None) + self.status_details = kwargs.get('status_details', None) + self.error = kwargs.get('error', None) + self.target = kwargs.get('target', None) + self.request_id = kwargs.get('request_id', None) + + +class CertificateOperationUpdateParameter(Model): + """The certificate operation update parameters. + + All required parameters must be populated in order to send to Azure. + + :param cancellation_requested: Required. Indicates if cancellation was + requested on the certificate operation. + :type cancellation_requested: bool + """ + + _validation = { + 'cancellation_requested': {'required': True}, + } + + _attribute_map = { + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(CertificateOperationUpdateParameter, self).__init__(**kwargs) + self.cancellation_requested = kwargs.get('cancellation_requested', None) + + +class CertificatePolicy(Model): + """Management policy for a certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param key_properties: Properties of the key backing a certificate. + :type key_properties: ~azure.keyvault.v2016_10_01.models.KeyProperties + :param secret_properties: Properties of the secret backing a certificate. + :type secret_properties: + ~azure.keyvault.v2016_10_01.models.SecretProperties + :param x509_certificate_properties: Properties of the X509 component of a + certificate. + :type x509_certificate_properties: + ~azure.keyvault.v2016_10_01.models.X509CertificateProperties + :param lifetime_actions: Actions that will be performed by Key Vault over + the lifetime of a certificate. + :type lifetime_actions: + list[~azure.keyvault.v2016_10_01.models.LifetimeAction] + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: + ~azure.keyvault.v2016_10_01.models.IssuerParameters + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'key_properties': {'key': 'key_props', 'type': 'KeyProperties'}, + 'secret_properties': {'key': 'secret_props', 'type': 'SecretProperties'}, + 'x509_certificate_properties': {'key': 'x509_props', 'type': 'X509CertificateProperties'}, + 'lifetime_actions': {'key': 'lifetime_actions', 'type': '[LifetimeAction]'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificatePolicy, self).__init__(**kwargs) + self.id = None + self.key_properties = kwargs.get('key_properties', None) + self.secret_properties = kwargs.get('secret_properties', None) + self.x509_certificate_properties = kwargs.get('x509_certificate_properties', None) + self.lifetime_actions = kwargs.get('lifetime_actions', None) + self.issuer_parameters = kwargs.get('issuer_parameters', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateUpdateParameters(Model): + """The certificate update parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateUpdateParameters, self).__init__(**kwargs) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class Contact(Model): + """The contact information for the vault certificates. + + :param email_address: Email address. + :type email_address: str + :param name: Name. + :type name: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'email_address': {'key': 'email', 'type': 'str'}, + 'name': {'key': 'name', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(Contact, self).__init__(**kwargs) + self.email_address = kwargs.get('email_address', None) + self.name = kwargs.get('name', None) + self.phone = kwargs.get('phone', None) + + +class Contacts(Model): + """The contacts for the vault certificates. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the contacts collection. + :vartype id: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v2016_10_01.models.Contact] + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'contact_list': {'key': 'contacts', 'type': '[Contact]'}, + } + + def __init__(self, **kwargs): + super(Contacts, self).__init__(**kwargs) + self.id = None + self.contact_list = kwargs.get('contact_list', None) + + +class DeletedCertificateBundle(CertificateBundle): + """A Deleted Certificate consisting of its previous id, attributes and its + tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateItem(CertificateItem): + """The deleted certificate item containing metadata about the deleted + certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateListResult(Model): + """A list of certificates that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted certificates + in the vault along with a link to the next page of deleted certificates + :vartype value: + list[~azure.keyvault.v2016_10_01.models.DeletedCertificateItem] + :ivar next_link: The URL to get the next set of deleted certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedCertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyBundle(Model): + """A KeyBundle consisting of a WebKey plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyBundle, self).__init__(**kwargs) + self.key = kwargs.get('key', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.managed = None + + +class DeletedKeyBundle(KeyBundle): + """A DeletedKeyBundle consisting of a WebKey plus its Attributes and deletion + info. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class KeyItem(Model): + """The key item containing key metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyItem, self).__init__(**kwargs) + self.kid = kwargs.get('kid', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.managed = None + + +class DeletedKeyItem(KeyItem): + """The deleted key item containing the deleted key metadata and information + about deletion. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedKeyListResult(Model): + """A list of keys that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted keys in the + vault along with a link to the next page of deleted keys + :vartype value: list[~azure.keyvault.v2016_10_01.models.DeletedKeyItem] + :ivar next_link: The URL to get the next set of deleted keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedKeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretBundle(Model): + """A secret consisting of a value, id and its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(SecretBundle, self).__init__(**kwargs) + self.value = kwargs.get('value', None) + self.id = kwargs.get('id', None) + self.content_type = kwargs.get('content_type', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.kid = None + self.managed = None + + +class DeletedSecretBundle(SecretBundle): + """A Deleted Secret consisting of its previous id, attributes and its tags, as + well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class SecretItem(Model): + """The secret item containing secret metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(SecretItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.content_type = kwargs.get('content_type', None) + self.managed = None + + +class DeletedSecretItem(SecretItem): + """The deleted secret item containing metadata about the deleted secret. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSecretListResult(Model): + """The deleted secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted secrets + in the vault along with a link to the next page of deleted secrets + :vartype value: list[~azure.keyvault.v2016_10_01.models.DeletedSecretItem] + :ivar next_link: The URL to get the next set of deleted secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class Error(Model): + """The key vault server error. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar code: The error code. + :vartype code: str + :ivar message: The error message. + :vartype message: str + :ivar inner_error: + :vartype inner_error: ~azure.keyvault.v2016_10_01.models.Error + """ + + _validation = { + 'code': {'readonly': True}, + 'message': {'readonly': True}, + 'inner_error': {'readonly': True}, + } + + _attribute_map = { + 'code': {'key': 'code', 'type': 'str'}, + 'message': {'key': 'message', 'type': 'str'}, + 'inner_error': {'key': 'innererror', 'type': 'Error'}, + } + + def __init__(self, **kwargs): + super(Error, self).__init__(**kwargs) + self.code = None + self.message = None + self.inner_error = None + + +class IssuerAttributes(Model): + """The attributes of an issuer managed by the Key Vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(IssuerAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + + +class IssuerBundle(Model): + """The issuer for Key Vault certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the issuer object. + :vartype id: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(IssuerBundle, self).__init__(**kwargs) + self.id = None + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class IssuerCredentials(Model): + """The credentials to be used for the certificate issuer. + + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + """ + + _attribute_map = { + 'account_id': {'key': 'account_id', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(IssuerCredentials, self).__init__(**kwargs) + self.account_id = kwargs.get('account_id', None) + self.password = kwargs.get('password', None) + + +class IssuerParameters(Model): + """Parameters for the issuer of the X509 component of a certificate. + + :param name: Name of the referenced issuer object or reserved names; for + example, 'Self' or 'Unknown'. + :type name: str + :param certificate_type: Type of certificate to be requested from the + issuer provider. + :type certificate_type: str + """ + + _attribute_map = { + 'name': {'key': 'name', 'type': 'str'}, + 'certificate_type': {'key': 'cty', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(IssuerParameters, self).__init__(**kwargs) + self.name = kwargs.get('name', None) + self.certificate_type = kwargs.get('certificate_type', None) + + +class JsonWebKey(Model): + """As of http://tools.ietf.org/html/draft-ietf-jose-json-web-key-18. + + :param kid: Key identifier. + :type kid: str + :param kty: JsonWebKey key type (kty). Possible values include: 'EC', + 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_ops: + :type key_ops: list[str] + :param n: RSA modulus. + :type n: bytes + :param e: RSA public exponent. + :type e: bytes + :param d: RSA private exponent, or the D component of an EC private key. + :type d: bytes + :param dp: RSA private key parameter. + :type dp: bytes + :param dq: RSA private key parameter. + :type dq: bytes + :param qi: RSA private key parameter. + :type qi: bytes + :param p: RSA secret prime. + :type p: bytes + :param q: RSA secret prime, with p < q. + :type q: bytes + :param k: Symmetric key. + :type k: bytes + :param t: HSM Token, used with 'Bring Your Own Key'. + :type t: bytes + :param crv: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'SECP256K1' + :type crv: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + :param x: X component of an EC public key. + :type x: bytes + :param y: Y component of an EC public key. + :type y: bytes + """ + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'n': {'key': 'n', 'type': 'base64'}, + 'e': {'key': 'e', 'type': 'base64'}, + 'd': {'key': 'd', 'type': 'base64'}, + 'dp': {'key': 'dp', 'type': 'base64'}, + 'dq': {'key': 'dq', 'type': 'base64'}, + 'qi': {'key': 'qi', 'type': 'base64'}, + 'p': {'key': 'p', 'type': 'base64'}, + 'q': {'key': 'q', 'type': 'base64'}, + 'k': {'key': 'k', 'type': 'base64'}, + 't': {'key': 'key_hsm', 'type': 'base64'}, + 'crv': {'key': 'crv', 'type': 'str'}, + 'x': {'key': 'x', 'type': 'base64'}, + 'y': {'key': 'y', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(JsonWebKey, self).__init__(**kwargs) + self.kid = kwargs.get('kid', None) + self.kty = kwargs.get('kty', None) + self.key_ops = kwargs.get('key_ops', None) + self.n = kwargs.get('n', None) + self.e = kwargs.get('e', None) + self.d = kwargs.get('d', None) + self.dp = kwargs.get('dp', None) + self.dq = kwargs.get('dq', None) + self.qi = kwargs.get('qi', None) + self.p = kwargs.get('p', None) + self.q = kwargs.get('q', None) + self.k = kwargs.get('k', None) + self.t = kwargs.get('t', None) + self.crv = kwargs.get('crv', None) + self.x = kwargs.get('x', None) + self.y = kwargs.get('y', None) + + +class KeyAttributes(Attributes): + """The attributes of a key managed by the key vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for keys in the current vault. If it contains 'Purgeable' the key + can be permanently deleted by a privileged user; otherwise, only the + system can purge the key, at the end of the retention interval. Possible + values include: 'Purgeable', 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class KeyCreateParameters(Model): + """The key create parameters. + + All required parameters must be populated in order to send to Azure. + + :param kty: Required. The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', + 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'SECP256K1' + :type curve: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + """ + + _validation = { + 'kty': {'required': True, 'min_length': 1}, + } + + _attribute_map = { + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyCreateParameters, self).__init__(**kwargs) + self.kty = kwargs.get('kty', None) + self.key_size = kwargs.get('key_size', None) + self.key_ops = kwargs.get('key_ops', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + self.curve = kwargs.get('curve', None) + + +class KeyImportParameters(Model): + """The key import parameters. + + All required parameters must be populated in order to send to Azure. + + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key: Required. The Json web key + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'key': {'required': True}, + } + + _attribute_map = { + 'hsm': {'key': 'Hsm', 'type': 'bool'}, + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(KeyImportParameters, self).__init__(**kwargs) + self.hsm = kwargs.get('hsm', None) + self.key = kwargs.get('key', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + + +class KeyListResult(Model): + """The key list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of keys in the key vault + along with a link to the next page of keys. + :vartype value: list[~azure.keyvault.v2016_10_01.models.KeyItem] + :ivar next_link: The URL to get the next set of keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[KeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyOperationResult(Model): + """The key operation result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar kid: Key identifier + :vartype kid: str + :ivar result: + :vartype result: bytes + """ + + _validation = { + 'kid': {'readonly': True}, + 'result': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'result': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyOperationResult, self).__init__(**kwargs) + self.kid = None + self.result = None + + +class KeyOperationsParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyOperationsParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.value = kwargs.get('value', None) + + +class KeyProperties(Model): + """Properties of the key pair backing a certificate. + + :param exportable: Indicates if the private key can be exported. + :type exportable: bool + :param key_type: The key type. + :type key_type: str + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param reuse_key: Indicates if the same key pair will be used on + certificate renewal. + :type reuse_key: bool + """ + + _attribute_map = { + 'exportable': {'key': 'exportable', 'type': 'bool'}, + 'key_type': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'reuse_key': {'key': 'reuse_key', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyProperties, self).__init__(**kwargs) + self.exportable = kwargs.get('exportable', None) + self.key_type = kwargs.get('key_type', None) + self.key_size = kwargs.get('key_size', None) + self.reuse_key = kwargs.get('reuse_key', None) + + +class KeyRestoreParameters(Model): + """The key restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_bundle_backup: Required. The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + """ + + _validation = { + 'key_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'key_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyRestoreParameters, self).__init__(**kwargs) + self.key_bundle_backup = kwargs.get('key_bundle_backup', None) + + +class KeySignParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm identifier. + For more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', 'PS384', + 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', + 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeySignParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.value = kwargs.get('value', None) + + +class KeyUpdateParameters(Model): + """The key update parameters. + + :param key_ops: Json web key operations. For more information on possible + key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(KeyUpdateParameters, self).__init__(**kwargs) + self.key_ops = kwargs.get('key_ops', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + + +class KeyVaultError(Model): + """The key vault error exception. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar error: + :vartype error: ~azure.keyvault.v2016_10_01.models.Error + """ + + _validation = { + 'error': {'readonly': True}, + } + + _attribute_map = { + 'error': {'key': 'error', 'type': 'Error'}, + } + + def __init__(self, **kwargs): + super(KeyVaultError, self).__init__(**kwargs) + self.error = None + + +class KeyVaultErrorException(HttpResponseError): + """Server responsed with exception of type: 'KeyVaultError'. + + :param deserialize: A deserializer + :param response: Server response to be deserialized. + """ + + def __init__(self, response, deserialize, *args): + + model_name = 'KeyVaultError' + self.error = deserialize(model_name, response) + if self.error is None: + self.error = deserialize.dependencies[model_name]() + super(KeyVaultErrorException, self).__init__(response=response) + + +class KeyVerifyParameters(Model): + """The key verify parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm. For more + information on possible algorithm types, see JsonWebKeySignatureAlgorithm. + Possible values include: 'PS256', 'PS384', 'PS512', 'RS256', 'RS384', + 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param digest: Required. The digest used for signing. + :type digest: bytes + :param signature: Required. The signature to be verified. + :type signature: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'digest': {'required': True}, + 'signature': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'digest': {'key': 'digest', 'type': 'base64'}, + 'signature': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyVerifyParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.digest = kwargs.get('digest', None) + self.signature = kwargs.get('signature', None) + + +class KeyVerifyResult(Model): + """The key verify result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: True if the signature is verified, otherwise false. + :vartype value: bool + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyVerifyResult, self).__init__(**kwargs) + self.value = None + + +class LifetimeAction(Model): + """Action and its trigger that will be performed by Key Vault over the + lifetime of a certificate. + + :param trigger: The condition that will execute the action. + :type trigger: ~azure.keyvault.v2016_10_01.models.Trigger + :param action: The action that will be executed. + :type action: ~azure.keyvault.v2016_10_01.models.Action + """ + + _attribute_map = { + 'trigger': {'key': 'trigger', 'type': 'Trigger'}, + 'action': {'key': 'action', 'type': 'Action'}, + } + + def __init__(self, **kwargs): + super(LifetimeAction, self).__init__(**kwargs) + self.trigger = kwargs.get('trigger', None) + self.action = kwargs.get('action', None) + + +class OrganizationDetails(Model): + """Details of the organization of the certificate issuer. + + :param id: Id of the organization. + :type id: str + :param admin_details: Details of the organization administrator. + :type admin_details: + list[~azure.keyvault.v2016_10_01.models.AdministratorDetails] + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'admin_details': {'key': 'admin_details', 'type': '[AdministratorDetails]'}, + } + + def __init__(self, **kwargs): + super(OrganizationDetails, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.admin_details = kwargs.get('admin_details', None) + + +class PendingCertificateSigningRequestResult(Model): + """The pending certificate signing request result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The pending certificate signing request as Base64 encoded + string. + :vartype value: str + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(PendingCertificateSigningRequestResult, self).__init__(**kwargs) + self.value = None + + +class SasDefinitionAttributes(Model): + """The SAS definition management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + + +class SasDefinitionBundle(Model): + """A SAS definition bundle consists of key vault SAS definition details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar parameters: The SAS definition metadata in the form of key-value + pairs. + :vartype parameters: dict[str, str] + :ivar attributes: The SAS definition attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'parameters': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionBundle, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.parameters = None + self.attributes = None + self.tags = None + + +class SasDefinitionCreateParameters(Model): + """The SAS definition create parameters. + + All required parameters must be populated in order to send to Azure. + + :param parameters: Required. Sas definition creation metadata in the form + of key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'parameters': {'required': True}, + } + + _attribute_map = { + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionCreateParameters, self).__init__(**kwargs) + self.parameters = kwargs.get('parameters', None) + self.sas_definition_attributes = kwargs.get('sas_definition_attributes', None) + self.tags = kwargs.get('tags', None) + + +class SasDefinitionItem(Model): + """The SAS definition item containing storage SAS definition metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionItem, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.attributes = None + self.tags = None + + +class SasDefinitionListResult(Model): + """The storage account SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of SAS definitions along + with a link to the next page of SAS definitions. + :vartype value: list[~azure.keyvault.v2016_10_01.models.SasDefinitionItem] + :ivar next_link: The URL to get the next set of SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionUpdateParameters(Model): + """The SAS definition update parameters. + + :param parameters: Sas definition update metadata in the form of key-value + pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionUpdateParameters, self).__init__(**kwargs) + self.parameters = kwargs.get('parameters', None) + self.sas_definition_attributes = kwargs.get('sas_definition_attributes', None) + self.tags = kwargs.get('tags', None) + + +class SecretAttributes(Attributes): + """The secret management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for secrets in the current vault. If it contains 'Purgeable', the + secret can be permanently deleted by a privileged user; otherwise, only + the system can purge the secret, at the end of the retention interval. + Possible values include: 'Purgeable', 'Recoverable+Purgeable', + 'Recoverable', 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class SecretListResult(Model): + """The secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of secrets in the key + vault along with a link to the next page of secrets. + :vartype value: list[~azure.keyvault.v2016_10_01.models.SecretItem] + :ivar next_link: The URL to get the next set of secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretProperties(Model): + """Properties of the key backing a certificate. + + :param content_type: The media type (MIME type). + :type content_type: str + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretProperties, self).__init__(**kwargs) + self.content_type = kwargs.get('content_type', None) + + +class SecretRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param secret_bundle_backup: Required. The backup blob associated with a + secret bundle. + :type secret_bundle_backup: bytes + """ + + _validation = { + 'secret_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'secret_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(SecretRestoreParameters, self).__init__(**kwargs) + self.secret_bundle_backup = kwargs.get('secret_bundle_backup', None) + + +class SecretSetParameters(Model): + """The secret set parameters. + + All required parameters must be populated in order to send to Azure. + + :param value: Required. The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + """ + + _validation = { + 'value': {'required': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + } + + def __init__(self, **kwargs): + super(SecretSetParameters, self).__init__(**kwargs) + self.value = kwargs.get('value', None) + self.tags = kwargs.get('tags', None) + self.content_type = kwargs.get('content_type', None) + self.secret_attributes = kwargs.get('secret_attributes', None) + + +class SecretUpdateParameters(Model): + """The secret update parameters. + + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SecretUpdateParameters, self).__init__(**kwargs) + self.content_type = kwargs.get('content_type', None) + self.secret_attributes = kwargs.get('secret_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageAccountAttributes(Model): + """The storage account management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(StorageAccountAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + + +class StorageAccountCreateParameters(Model): + """The storage account create parameters. + + All required parameters must be populated in order to send to Azure. + + :param resource_id: Required. Storage account resource id. + :type resource_id: str + :param active_key_name: Required. Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: Required. whether keyvault should manage the + storage account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'resource_id': {'required': True}, + 'active_key_name': {'required': True}, + 'auto_regenerate_key': {'required': True}, + } + + _attribute_map = { + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountCreateParameters, self).__init__(**kwargs) + self.resource_id = kwargs.get('resource_id', None) + self.active_key_name = kwargs.get('active_key_name', None) + self.auto_regenerate_key = kwargs.get('auto_regenerate_key', None) + self.regeneration_period = kwargs.get('regeneration_period', None) + self.storage_account_attributes = kwargs.get('storage_account_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageAccountItem(Model): + """The storage account item containing storage account metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountItem, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.attributes = None + self.tags = None + + +class StorageAccountRegenerteKeyParameters(Model): + """The storage account key regenerate parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_name: Required. The storage account key name. + :type key_name: str + """ + + _validation = { + 'key_name': {'required': True}, + } + + _attribute_map = { + 'key_name': {'key': 'keyName', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(StorageAccountRegenerteKeyParameters, self).__init__(**kwargs) + self.key_name = kwargs.get('key_name', None) + + +class StorageAccountUpdateParameters(Model): + """The storage account update parameters. + + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountUpdateParameters, self).__init__(**kwargs) + self.active_key_name = kwargs.get('active_key_name', None) + self.auto_regenerate_key = kwargs.get('auto_regenerate_key', None) + self.regeneration_period = kwargs.get('regeneration_period', None) + self.storage_account_attributes = kwargs.get('storage_account_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageBundle(Model): + """A Storage account bundle consists of key vault storage account details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageBundle, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.active_key_name = None + self.auto_regenerate_key = None + self.regeneration_period = None + self.attributes = None + self.tags = None + + +class StorageListResult(Model): + """The storage accounts list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of storage accounts in + the key vault along with a link to the next page of storage accounts. + :vartype value: + list[~azure.keyvault.v2016_10_01.models.StorageAccountItem] + :ivar next_link: The URL to get the next set of storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[StorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(StorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SubjectAlternativeNames(Model): + """The subject alternate names of a X509 object. + + :param emails: Email addresses. + :type emails: list[str] + :param dns_names: Domain names. + :type dns_names: list[str] + :param upns: User principal names. + :type upns: list[str] + """ + + _attribute_map = { + 'emails': {'key': 'emails', 'type': '[str]'}, + 'dns_names': {'key': 'dns_names', 'type': '[str]'}, + 'upns': {'key': 'upns', 'type': '[str]'}, + } + + def __init__(self, **kwargs): + super(SubjectAlternativeNames, self).__init__(**kwargs) + self.emails = kwargs.get('emails', None) + self.dns_names = kwargs.get('dns_names', None) + self.upns = kwargs.get('upns', None) + + +class Trigger(Model): + """A condition to be satisfied for an action to be executed. + + :param lifetime_percentage: Percentage of lifetime at which to trigger. + Value should be between 1 and 99. + :type lifetime_percentage: int + :param days_before_expiry: Days before expiry to attempt renewal. Value + should be between 1 and validity_in_months multiplied by 27. If + validity_in_months is 36, then value should be between 1 and 972 (36 * + 27). + :type days_before_expiry: int + """ + + _validation = { + 'lifetime_percentage': {'maximum': 99, 'minimum': 1}, + } + + _attribute_map = { + 'lifetime_percentage': {'key': 'lifetime_percentage', 'type': 'int'}, + 'days_before_expiry': {'key': 'days_before_expiry', 'type': 'int'}, + } + + def __init__(self, **kwargs): + super(Trigger, self).__init__(**kwargs) + self.lifetime_percentage = kwargs.get('lifetime_percentage', None) + self.days_before_expiry = kwargs.get('days_before_expiry', None) + + +class X509CertificateProperties(Model): + """Properties of the X509 component of a certificate. + + :param subject: The subject name. Should be a valid X509 distinguished + Name. + :type subject: str + :param ekus: The enhanced key usage. + :type ekus: list[str] + :param subject_alternative_names: The subject alternative names. + :type subject_alternative_names: + ~azure.keyvault.v2016_10_01.models.SubjectAlternativeNames + :param key_usage: List of key usages. + :type key_usage: list[str or + ~azure.keyvault.v2016_10_01.models.KeyUsageType] + :param validity_in_months: The duration that the certificate is valid in + months. + :type validity_in_months: int + """ + + _validation = { + 'validity_in_months': {'minimum': 0}, + } + + _attribute_map = { + 'subject': {'key': 'subject', 'type': 'str'}, + 'ekus': {'key': 'ekus', 'type': '[str]'}, + 'subject_alternative_names': {'key': 'sans', 'type': 'SubjectAlternativeNames'}, + 'key_usage': {'key': 'key_usage', 'type': '[str]'}, + 'validity_in_months': {'key': 'validity_months', 'type': 'int'}, + } + + def __init__(self, **kwargs): + super(X509CertificateProperties, self).__init__(**kwargs) + self.subject = kwargs.get('subject', None) + self.ekus = kwargs.get('ekus', None) + self.subject_alternative_names = kwargs.get('subject_alternative_names', None) + self.key_usage = kwargs.get('key_usage', None) + self.validity_in_months = kwargs.get('validity_in_months', None) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models_py3.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models_py3.py new file mode 100644 index 000000000000..94ec3b96083e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/models/_models_py3.py @@ -0,0 +1,2764 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from msrest.serialization import Model +from azure.core import HttpResponseError + + +class Action(Model): + """The action that will be executed. + + :param action_type: The type of the action. Possible values include: + 'EmailContacts', 'AutoRenew' + :type action_type: str or ~azure.keyvault.v2016_10_01.models.ActionType + """ + + _attribute_map = { + 'action_type': {'key': 'action_type', 'type': 'ActionType'}, + } + + def __init__(self, *, action_type=None, **kwargs) -> None: + super(Action, self).__init__(**kwargs) + self.action_type = action_type + + +class AdministratorDetails(Model): + """Details of the organization administrator of the certificate issuer. + + :param first_name: First name. + :type first_name: str + :param last_name: Last name. + :type last_name: str + :param email_address: Email address. + :type email_address: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'first_name': {'key': 'first_name', 'type': 'str'}, + 'last_name': {'key': 'last_name', 'type': 'str'}, + 'email_address': {'key': 'email', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, *, first_name: str=None, last_name: str=None, email_address: str=None, phone: str=None, **kwargs) -> None: + super(AdministratorDetails, self).__init__(**kwargs) + self.first_name = first_name + self.last_name = last_name + self.email_address = email_address + self.phone = phone + + +class Attributes(Model): + """The object attributes managed by the KeyVault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(Attributes, self).__init__(**kwargs) + self.enabled = enabled + self.not_before = not_before + self.expires = expires + self.created = None + self.updated = None + + +class BackupKeyResult(Model): + """The backup key result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up key. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupKeyResult, self).__init__(**kwargs) + self.value = None + + +class BackupSecretResult(Model): + """The backup secret result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up secret. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupSecretResult, self).__init__(**kwargs) + self.value = None + + +class CertificateAttributes(Attributes): + """The certificate management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for certificates in the current vault. If it contains 'Purgeable', + the certificate can be permanently deleted by a privileged user; + otherwise, only the system can purge the certificate, at the end of the + retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(CertificateAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class CertificateBundle(Model): + """A certificate bundle consists of a certificate (X509) plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, cer: bytearray=None, content_type: str=None, attributes=None, tags=None, **kwargs) -> None: + super(CertificateBundle, self).__init__(**kwargs) + self.id = None + self.kid = None + self.sid = None + self.x509_thumbprint = None + self.policy = None + self.cer = cer + self.content_type = content_type + self.attributes = attributes + self.tags = tags + + +class CertificateCreateParameters(Model): + """The certificate create parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateCreateParameters, self).__init__(**kwargs) + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateImportParameters(Model): + """The certificate import parameters. + + All required parameters must be populated in order to send to Azure. + + :param base64_encoded_certificate: Required. Base64 encoded representation + of the certificate object to import. This certificate needs to contain the + private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'base64_encoded_certificate': {'required': True}, + } + + _attribute_map = { + 'base64_encoded_certificate': {'key': 'value', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, base64_encoded_certificate: str, password: str=None, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateImportParameters, self).__init__(**kwargs) + self.base64_encoded_certificate = base64_encoded_certificate + self.password = password + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateIssuerItem(Model): + """The certificate issuer item containing certificate issuer metadata. + + :param id: Certificate Identifier. + :type id: str + :param provider: The issuer provider. + :type provider: str + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + } + + def __init__(self, *, id: str=None, provider: str=None, **kwargs) -> None: + super(CertificateIssuerItem, self).__init__(**kwargs) + self.id = id + self.provider = provider + + +class CertificateIssuerListResult(Model): + """The certificate issuer list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificate issuers + in the key vault along with a link to the next page of certificate + issuers. + :vartype value: + list[~azure.keyvault.v2016_10_01.models.CertificateIssuerItem] + :ivar next_link: The URL to get the next set of certificate issuers. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateIssuerItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(CertificateIssuerListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateIssuerSetParameters(Model): + """The certificate issuer set parameters. + + All required parameters must be populated in order to send to Azure. + + :param provider: Required. The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _validation = { + 'provider': {'required': True}, + } + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(CertificateIssuerSetParameters, self).__init__(**kwargs) + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class CertificateIssuerUpdateParameters(Model): + """The certificate issuer update parameters. + + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str=None, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(CertificateIssuerUpdateParameters, self).__init__(**kwargs) + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class CertificateItem(Model): + """The certificate item containing certificate metadata. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, x509_thumbprint: bytes=None, **kwargs) -> None: + super(CertificateItem, self).__init__(**kwargs) + self.id = id + self.attributes = attributes + self.tags = tags + self.x509_thumbprint = x509_thumbprint + + +class CertificateListResult(Model): + """The certificate list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificates in the + key vault along with a link to the next page of certificates. + :vartype value: list[~azure.keyvault.v2016_10_01.models.CertificateItem] + :ivar next_link: The URL to get the next set of certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(CertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateMergeParameters(Model): + """The certificate merge parameters. + + All required parameters must be populated in order to send to Azure. + + :param x509_certificates: Required. The certificate or the certificate + chain to merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'x509_certificates': {'required': True}, + } + + _attribute_map = { + 'x509_certificates': {'key': 'x5c', 'type': '[bytearray]'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, x509_certificates, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateMergeParameters, self).__init__(**kwargs) + self.x509_certificates = x509_certificates + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateOperation(Model): + """A certificate operation is returned in case of asynchronous requests. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: + ~azure.keyvault.v2016_10_01.models.IssuerParameters + :param csr: The certificate signing request (CSR) that is being used in + the certificate operation. + :type csr: bytearray + :param cancellation_requested: Indicates if cancellation was requested on + the certificate operation. + :type cancellation_requested: bool + :param status: Status of the certificate operation. + :type status: str + :param status_details: The status details of the certificate operation. + :type status_details: str + :param error: Error encountered, if any, during the certificate operation. + :type error: ~azure.keyvault.v2016_10_01.models.Error + :param target: Location which contains the result of the certificate + operation. + :type target: str + :param request_id: Identifier for the certificate operation. + :type request_id: str + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'csr': {'key': 'csr', 'type': 'bytearray'}, + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + 'status': {'key': 'status', 'type': 'str'}, + 'status_details': {'key': 'status_details', 'type': 'str'}, + 'error': {'key': 'error', 'type': 'Error'}, + 'target': {'key': 'target', 'type': 'str'}, + 'request_id': {'key': 'request_id', 'type': 'str'}, + } + + def __init__(self, *, issuer_parameters=None, csr: bytearray=None, cancellation_requested: bool=None, status: str=None, status_details: str=None, error=None, target: str=None, request_id: str=None, **kwargs) -> None: + super(CertificateOperation, self).__init__(**kwargs) + self.id = None + self.issuer_parameters = issuer_parameters + self.csr = csr + self.cancellation_requested = cancellation_requested + self.status = status + self.status_details = status_details + self.error = error + self.target = target + self.request_id = request_id + + +class CertificateOperationUpdateParameter(Model): + """The certificate operation update parameters. + + All required parameters must be populated in order to send to Azure. + + :param cancellation_requested: Required. Indicates if cancellation was + requested on the certificate operation. + :type cancellation_requested: bool + """ + + _validation = { + 'cancellation_requested': {'required': True}, + } + + _attribute_map = { + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + } + + def __init__(self, *, cancellation_requested: bool, **kwargs) -> None: + super(CertificateOperationUpdateParameter, self).__init__(**kwargs) + self.cancellation_requested = cancellation_requested + + +class CertificatePolicy(Model): + """Management policy for a certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param key_properties: Properties of the key backing a certificate. + :type key_properties: ~azure.keyvault.v2016_10_01.models.KeyProperties + :param secret_properties: Properties of the secret backing a certificate. + :type secret_properties: + ~azure.keyvault.v2016_10_01.models.SecretProperties + :param x509_certificate_properties: Properties of the X509 component of a + certificate. + :type x509_certificate_properties: + ~azure.keyvault.v2016_10_01.models.X509CertificateProperties + :param lifetime_actions: Actions that will be performed by Key Vault over + the lifetime of a certificate. + :type lifetime_actions: + list[~azure.keyvault.v2016_10_01.models.LifetimeAction] + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: + ~azure.keyvault.v2016_10_01.models.IssuerParameters + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'key_properties': {'key': 'key_props', 'type': 'KeyProperties'}, + 'secret_properties': {'key': 'secret_props', 'type': 'SecretProperties'}, + 'x509_certificate_properties': {'key': 'x509_props', 'type': 'X509CertificateProperties'}, + 'lifetime_actions': {'key': 'lifetime_actions', 'type': '[LifetimeAction]'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + } + + def __init__(self, *, key_properties=None, secret_properties=None, x509_certificate_properties=None, lifetime_actions=None, issuer_parameters=None, attributes=None, **kwargs) -> None: + super(CertificatePolicy, self).__init__(**kwargs) + self.id = None + self.key_properties = key_properties + self.secret_properties = secret_properties + self.x509_certificate_properties = x509_certificate_properties + self.lifetime_actions = lifetime_actions + self.issuer_parameters = issuer_parameters + self.attributes = attributes + + +class CertificateUpdateParameters(Model): + """The certificate update parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateUpdateParameters, self).__init__(**kwargs) + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class Contact(Model): + """The contact information for the vault certificates. + + :param email_address: Email address. + :type email_address: str + :param name: Name. + :type name: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'email_address': {'key': 'email', 'type': 'str'}, + 'name': {'key': 'name', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, *, email_address: str=None, name: str=None, phone: str=None, **kwargs) -> None: + super(Contact, self).__init__(**kwargs) + self.email_address = email_address + self.name = name + self.phone = phone + + +class Contacts(Model): + """The contacts for the vault certificates. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the contacts collection. + :vartype id: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v2016_10_01.models.Contact] + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'contact_list': {'key': 'contacts', 'type': '[Contact]'}, + } + + def __init__(self, *, contact_list=None, **kwargs) -> None: + super(Contacts, self).__init__(**kwargs) + self.id = None + self.contact_list = contact_list + + +class DeletedCertificateBundle(CertificateBundle): + """A Deleted Certificate consisting of its previous id, attributes and its + tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, cer: bytearray=None, content_type: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedCertificateBundle, self).__init__(cer=cer, content_type=content_type, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateItem(CertificateItem): + """The deleted certificate item containing metadata about the deleted + certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, x509_thumbprint: bytes=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedCertificateItem, self).__init__(id=id, attributes=attributes, tags=tags, x509_thumbprint=x509_thumbprint, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateListResult(Model): + """A list of certificates that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted certificates + in the vault along with a link to the next page of deleted certificates + :vartype value: + list[~azure.keyvault.v2016_10_01.models.DeletedCertificateItem] + :ivar next_link: The URL to get the next set of deleted certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedCertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedCertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyBundle(Model): + """A KeyBundle consisting of a WebKey plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, key=None, attributes=None, tags=None, **kwargs) -> None: + super(KeyBundle, self).__init__(**kwargs) + self.key = key + self.attributes = attributes + self.tags = tags + self.managed = None + + +class DeletedKeyBundle(KeyBundle): + """A DeletedKeyBundle consisting of a WebKey plus its Attributes and deletion + info. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, key=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedKeyBundle, self).__init__(key=key, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class KeyItem(Model): + """The key item containing key metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, kid: str=None, attributes=None, tags=None, **kwargs) -> None: + super(KeyItem, self).__init__(**kwargs) + self.kid = kid + self.attributes = attributes + self.tags = tags + self.managed = None + + +class DeletedKeyItem(KeyItem): + """The deleted key item containing the deleted key metadata and information + about deletion. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, kid: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedKeyItem, self).__init__(kid=kid, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedKeyListResult(Model): + """A list of keys that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted keys in the + vault along with a link to the next page of deleted keys + :vartype value: list[~azure.keyvault.v2016_10_01.models.DeletedKeyItem] + :ivar next_link: The URL to get the next set of deleted keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedKeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedKeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretBundle(Model): + """A secret consisting of a value, id and its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, value: str=None, id: str=None, content_type: str=None, attributes=None, tags=None, **kwargs) -> None: + super(SecretBundle, self).__init__(**kwargs) + self.value = value + self.id = id + self.content_type = content_type + self.attributes = attributes + self.tags = tags + self.kid = None + self.managed = None + + +class DeletedSecretBundle(SecretBundle): + """A Deleted Secret consisting of its previous id, attributes and its tags, as + well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, value: str=None, id: str=None, content_type: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedSecretBundle, self).__init__(value=value, id=id, content_type=content_type, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class SecretItem(Model): + """The secret item containing secret metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, content_type: str=None, **kwargs) -> None: + super(SecretItem, self).__init__(**kwargs) + self.id = id + self.attributes = attributes + self.tags = tags + self.content_type = content_type + self.managed = None + + +class DeletedSecretItem(SecretItem): + """The deleted secret item containing metadata about the deleted secret. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, content_type: str=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedSecretItem, self).__init__(id=id, attributes=attributes, tags=tags, content_type=content_type, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSecretListResult(Model): + """The deleted secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted secrets + in the vault along with a link to the next page of deleted secrets + :vartype value: list[~azure.keyvault.v2016_10_01.models.DeletedSecretItem] + :ivar next_link: The URL to get the next set of deleted secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedSecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class Error(Model): + """The key vault server error. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar code: The error code. + :vartype code: str + :ivar message: The error message. + :vartype message: str + :ivar inner_error: + :vartype inner_error: ~azure.keyvault.v2016_10_01.models.Error + """ + + _validation = { + 'code': {'readonly': True}, + 'message': {'readonly': True}, + 'inner_error': {'readonly': True}, + } + + _attribute_map = { + 'code': {'key': 'code', 'type': 'str'}, + 'message': {'key': 'message', 'type': 'str'}, + 'inner_error': {'key': 'innererror', 'type': 'Error'}, + } + + def __init__(self, **kwargs) -> None: + super(Error, self).__init__(**kwargs) + self.code = None + self.message = None + self.inner_error = None + + +class IssuerAttributes(Model): + """The attributes of an issuer managed by the Key Vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(IssuerAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + + +class IssuerBundle(Model): + """The issuer for Key Vault certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the issuer object. + :vartype id: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str=None, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(IssuerBundle, self).__init__(**kwargs) + self.id = None + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class IssuerCredentials(Model): + """The credentials to be used for the certificate issuer. + + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + """ + + _attribute_map = { + 'account_id': {'key': 'account_id', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + } + + def __init__(self, *, account_id: str=None, password: str=None, **kwargs) -> None: + super(IssuerCredentials, self).__init__(**kwargs) + self.account_id = account_id + self.password = password + + +class IssuerParameters(Model): + """Parameters for the issuer of the X509 component of a certificate. + + :param name: Name of the referenced issuer object or reserved names; for + example, 'Self' or 'Unknown'. + :type name: str + :param certificate_type: Type of certificate to be requested from the + issuer provider. + :type certificate_type: str + """ + + _attribute_map = { + 'name': {'key': 'name', 'type': 'str'}, + 'certificate_type': {'key': 'cty', 'type': 'str'}, + } + + def __init__(self, *, name: str=None, certificate_type: str=None, **kwargs) -> None: + super(IssuerParameters, self).__init__(**kwargs) + self.name = name + self.certificate_type = certificate_type + + +class JsonWebKey(Model): + """As of http://tools.ietf.org/html/draft-ietf-jose-json-web-key-18. + + :param kid: Key identifier. + :type kid: str + :param kty: JsonWebKey key type (kty). Possible values include: 'EC', + 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_ops: + :type key_ops: list[str] + :param n: RSA modulus. + :type n: bytes + :param e: RSA public exponent. + :type e: bytes + :param d: RSA private exponent, or the D component of an EC private key. + :type d: bytes + :param dp: RSA private key parameter. + :type dp: bytes + :param dq: RSA private key parameter. + :type dq: bytes + :param qi: RSA private key parameter. + :type qi: bytes + :param p: RSA secret prime. + :type p: bytes + :param q: RSA secret prime, with p < q. + :type q: bytes + :param k: Symmetric key. + :type k: bytes + :param t: HSM Token, used with 'Bring Your Own Key'. + :type t: bytes + :param crv: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'SECP256K1' + :type crv: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + :param x: X component of an EC public key. + :type x: bytes + :param y: Y component of an EC public key. + :type y: bytes + """ + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'n': {'key': 'n', 'type': 'base64'}, + 'e': {'key': 'e', 'type': 'base64'}, + 'd': {'key': 'd', 'type': 'base64'}, + 'dp': {'key': 'dp', 'type': 'base64'}, + 'dq': {'key': 'dq', 'type': 'base64'}, + 'qi': {'key': 'qi', 'type': 'base64'}, + 'p': {'key': 'p', 'type': 'base64'}, + 'q': {'key': 'q', 'type': 'base64'}, + 'k': {'key': 'k', 'type': 'base64'}, + 't': {'key': 'key_hsm', 'type': 'base64'}, + 'crv': {'key': 'crv', 'type': 'str'}, + 'x': {'key': 'x', 'type': 'base64'}, + 'y': {'key': 'y', 'type': 'base64'}, + } + + def __init__(self, *, kid: str=None, kty=None, key_ops=None, n: bytes=None, e: bytes=None, d: bytes=None, dp: bytes=None, dq: bytes=None, qi: bytes=None, p: bytes=None, q: bytes=None, k: bytes=None, t: bytes=None, crv=None, x: bytes=None, y: bytes=None, **kwargs) -> None: + super(JsonWebKey, self).__init__(**kwargs) + self.kid = kid + self.kty = kty + self.key_ops = key_ops + self.n = n + self.e = e + self.d = d + self.dp = dp + self.dq = dq + self.qi = qi + self.p = p + self.q = q + self.k = k + self.t = t + self.crv = crv + self.x = x + self.y = y + + +class KeyAttributes(Attributes): + """The attributes of a key managed by the key vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for keys in the current vault. If it contains 'Purgeable' the key + can be permanently deleted by a privileged user; otherwise, only the + system can purge the key, at the end of the retention interval. Possible + values include: 'Purgeable', 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(KeyAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class KeyCreateParameters(Model): + """The key create parameters. + + All required parameters must be populated in order to send to Azure. + + :param kty: Required. The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', + 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'SECP256K1' + :type curve: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + """ + + _validation = { + 'kty': {'required': True, 'min_length': 1}, + } + + _attribute_map = { + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, *, kty, key_size: int=None, key_ops=None, key_attributes=None, tags=None, curve=None, **kwargs) -> None: + super(KeyCreateParameters, self).__init__(**kwargs) + self.kty = kty + self.key_size = key_size + self.key_ops = key_ops + self.key_attributes = key_attributes + self.tags = tags + self.curve = curve + + +class KeyImportParameters(Model): + """The key import parameters. + + All required parameters must be populated in order to send to Azure. + + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key: Required. The Json web key + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'key': {'required': True}, + } + + _attribute_map = { + 'hsm': {'key': 'Hsm', 'type': 'bool'}, + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, key, hsm: bool=None, key_attributes=None, tags=None, **kwargs) -> None: + super(KeyImportParameters, self).__init__(**kwargs) + self.hsm = hsm + self.key = key + self.key_attributes = key_attributes + self.tags = tags + + +class KeyListResult(Model): + """The key list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of keys in the key vault + along with a link to the next page of keys. + :vartype value: list[~azure.keyvault.v2016_10_01.models.KeyItem] + :ivar next_link: The URL to get the next set of keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[KeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyOperationResult(Model): + """The key operation result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar kid: Key identifier + :vartype kid: str + :ivar result: + :vartype result: bytes + """ + + _validation = { + 'kid': {'readonly': True}, + 'result': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'result': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyOperationResult, self).__init__(**kwargs) + self.kid = None + self.result = None + + +class KeyOperationsParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, value: bytes, **kwargs) -> None: + super(KeyOperationsParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.value = value + + +class KeyProperties(Model): + """Properties of the key pair backing a certificate. + + :param exportable: Indicates if the private key can be exported. + :type exportable: bool + :param key_type: The key type. + :type key_type: str + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param reuse_key: Indicates if the same key pair will be used on + certificate renewal. + :type reuse_key: bool + """ + + _attribute_map = { + 'exportable': {'key': 'exportable', 'type': 'bool'}, + 'key_type': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'reuse_key': {'key': 'reuse_key', 'type': 'bool'}, + } + + def __init__(self, *, exportable: bool=None, key_type: str=None, key_size: int=None, reuse_key: bool=None, **kwargs) -> None: + super(KeyProperties, self).__init__(**kwargs) + self.exportable = exportable + self.key_type = key_type + self.key_size = key_size + self.reuse_key = reuse_key + + +class KeyRestoreParameters(Model): + """The key restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_bundle_backup: Required. The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + """ + + _validation = { + 'key_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'key_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, key_bundle_backup: bytes, **kwargs) -> None: + super(KeyRestoreParameters, self).__init__(**kwargs) + self.key_bundle_backup = key_bundle_backup + + +class KeySignParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm identifier. + For more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', 'PS384', + 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', + 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, value: bytes, **kwargs) -> None: + super(KeySignParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.value = value + + +class KeyUpdateParameters(Model): + """The key update parameters. + + :param key_ops: Json web key operations. For more information on possible + key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, key_ops=None, key_attributes=None, tags=None, **kwargs) -> None: + super(KeyUpdateParameters, self).__init__(**kwargs) + self.key_ops = key_ops + self.key_attributes = key_attributes + self.tags = tags + + +class KeyVaultError(Model): + """The key vault error exception. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar error: + :vartype error: ~azure.keyvault.v2016_10_01.models.Error + """ + + _validation = { + 'error': {'readonly': True}, + } + + _attribute_map = { + 'error': {'key': 'error', 'type': 'Error'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyVaultError, self).__init__(**kwargs) + self.error = None + + +class KeyVaultErrorException(HttpResponseError): + """Server responsed with exception of type: 'KeyVaultError'. + + :param deserialize: A deserializer + :param response: Server response to be deserialized. + """ + + def __init__(self, response, deserialize, *args): + + model_name = 'KeyVaultError' + self.error = deserialize(model_name, response) + if self.error is None: + self.error = deserialize.dependencies[model_name]() + super(KeyVaultErrorException, self).__init__(response=response) + + +class KeyVerifyParameters(Model): + """The key verify parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm. For more + information on possible algorithm types, see JsonWebKeySignatureAlgorithm. + Possible values include: 'PS256', 'PS384', 'PS512', 'RS256', 'RS384', + 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param digest: Required. The digest used for signing. + :type digest: bytes + :param signature: Required. The signature to be verified. + :type signature: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'digest': {'required': True}, + 'signature': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'digest': {'key': 'digest', 'type': 'base64'}, + 'signature': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, digest: bytes, signature: bytes, **kwargs) -> None: + super(KeyVerifyParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.digest = digest + self.signature = signature + + +class KeyVerifyResult(Model): + """The key verify result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: True if the signature is verified, otherwise false. + :vartype value: bool + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'bool'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyVerifyResult, self).__init__(**kwargs) + self.value = None + + +class LifetimeAction(Model): + """Action and its trigger that will be performed by Key Vault over the + lifetime of a certificate. + + :param trigger: The condition that will execute the action. + :type trigger: ~azure.keyvault.v2016_10_01.models.Trigger + :param action: The action that will be executed. + :type action: ~azure.keyvault.v2016_10_01.models.Action + """ + + _attribute_map = { + 'trigger': {'key': 'trigger', 'type': 'Trigger'}, + 'action': {'key': 'action', 'type': 'Action'}, + } + + def __init__(self, *, trigger=None, action=None, **kwargs) -> None: + super(LifetimeAction, self).__init__(**kwargs) + self.trigger = trigger + self.action = action + + +class OrganizationDetails(Model): + """Details of the organization of the certificate issuer. + + :param id: Id of the organization. + :type id: str + :param admin_details: Details of the organization administrator. + :type admin_details: + list[~azure.keyvault.v2016_10_01.models.AdministratorDetails] + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'admin_details': {'key': 'admin_details', 'type': '[AdministratorDetails]'}, + } + + def __init__(self, *, id: str=None, admin_details=None, **kwargs) -> None: + super(OrganizationDetails, self).__init__(**kwargs) + self.id = id + self.admin_details = admin_details + + +class PendingCertificateSigningRequestResult(Model): + """The pending certificate signing request result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The pending certificate signing request as Base64 encoded + string. + :vartype value: str + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(PendingCertificateSigningRequestResult, self).__init__(**kwargs) + self.value = None + + +class SasDefinitionAttributes(Model): + """The SAS definition management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(SasDefinitionAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + + +class SasDefinitionBundle(Model): + """A SAS definition bundle consists of key vault SAS definition details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar parameters: The SAS definition metadata in the form of key-value + pairs. + :vartype parameters: dict[str, str] + :ivar attributes: The SAS definition attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'parameters': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionBundle, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.parameters = None + self.attributes = None + self.tags = None + + +class SasDefinitionCreateParameters(Model): + """The SAS definition create parameters. + + All required parameters must be populated in order to send to Azure. + + :param parameters: Required. Sas definition creation metadata in the form + of key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'parameters': {'required': True}, + } + + _attribute_map = { + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, parameters, sas_definition_attributes=None, tags=None, **kwargs) -> None: + super(SasDefinitionCreateParameters, self).__init__(**kwargs) + self.parameters = parameters + self.sas_definition_attributes = sas_definition_attributes + self.tags = tags + + +class SasDefinitionItem(Model): + """The SAS definition item containing storage SAS definition metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionItem, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.attributes = None + self.tags = None + + +class SasDefinitionListResult(Model): + """The storage account SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of SAS definitions along + with a link to the next page of SAS definitions. + :vartype value: list[~azure.keyvault.v2016_10_01.models.SasDefinitionItem] + :ivar next_link: The URL to get the next set of SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionUpdateParameters(Model): + """The SAS definition update parameters. + + :param parameters: Sas definition update metadata in the form of key-value + pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'parameters': {'key': 'parameters', 'type': '{str}'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, parameters=None, sas_definition_attributes=None, tags=None, **kwargs) -> None: + super(SasDefinitionUpdateParameters, self).__init__(**kwargs) + self.parameters = parameters + self.sas_definition_attributes = sas_definition_attributes + self.tags = tags + + +class SecretAttributes(Attributes): + """The secret management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for secrets in the current vault. If it contains 'Purgeable', the + secret can be permanently deleted by a privileged user; otherwise, only + the system can purge the secret, at the end of the retention interval. + Possible values include: 'Purgeable', 'Recoverable+Purgeable', + 'Recoverable', 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v2016_10_01.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(SecretAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class SecretListResult(Model): + """The secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of secrets in the key + vault along with a link to the next page of secrets. + :vartype value: list[~azure.keyvault.v2016_10_01.models.SecretItem] + :ivar next_link: The URL to get the next set of secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(SecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretProperties(Model): + """Properties of the key backing a certificate. + + :param content_type: The media type (MIME type). + :type content_type: str + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + } + + def __init__(self, *, content_type: str=None, **kwargs) -> None: + super(SecretProperties, self).__init__(**kwargs) + self.content_type = content_type + + +class SecretRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param secret_bundle_backup: Required. The backup blob associated with a + secret bundle. + :type secret_bundle_backup: bytes + """ + + _validation = { + 'secret_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'secret_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, secret_bundle_backup: bytes, **kwargs) -> None: + super(SecretRestoreParameters, self).__init__(**kwargs) + self.secret_bundle_backup = secret_bundle_backup + + +class SecretSetParameters(Model): + """The secret set parameters. + + All required parameters must be populated in order to send to Azure. + + :param value: Required. The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + """ + + _validation = { + 'value': {'required': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + } + + def __init__(self, *, value: str, tags=None, content_type: str=None, secret_attributes=None, **kwargs) -> None: + super(SecretSetParameters, self).__init__(**kwargs) + self.value = value + self.tags = tags + self.content_type = content_type + self.secret_attributes = secret_attributes + + +class SecretUpdateParameters(Model): + """The secret update parameters. + + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, content_type: str=None, secret_attributes=None, tags=None, **kwargs) -> None: + super(SecretUpdateParameters, self).__init__(**kwargs) + self.content_type = content_type + self.secret_attributes = secret_attributes + self.tags = tags + + +class StorageAccountAttributes(Model): + """The storage account management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(StorageAccountAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + + +class StorageAccountCreateParameters(Model): + """The storage account create parameters. + + All required parameters must be populated in order to send to Azure. + + :param resource_id: Required. Storage account resource id. + :type resource_id: str + :param active_key_name: Required. Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: Required. whether keyvault should manage the + storage account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'resource_id': {'required': True}, + 'active_key_name': {'required': True}, + 'auto_regenerate_key': {'required': True}, + } + + _attribute_map = { + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, resource_id: str, active_key_name: str, auto_regenerate_key: bool, regeneration_period: str=None, storage_account_attributes=None, tags=None, **kwargs) -> None: + super(StorageAccountCreateParameters, self).__init__(**kwargs) + self.resource_id = resource_id + self.active_key_name = active_key_name + self.auto_regenerate_key = auto_regenerate_key + self.regeneration_period = regeneration_period + self.storage_account_attributes = storage_account_attributes + self.tags = tags + + +class StorageAccountItem(Model): + """The storage account item containing storage account metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageAccountItem, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.attributes = None + self.tags = None + + +class StorageAccountRegenerteKeyParameters(Model): + """The storage account key regenerate parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_name: Required. The storage account key name. + :type key_name: str + """ + + _validation = { + 'key_name': {'required': True}, + } + + _attribute_map = { + 'key_name': {'key': 'keyName', 'type': 'str'}, + } + + def __init__(self, *, key_name: str, **kwargs) -> None: + super(StorageAccountRegenerteKeyParameters, self).__init__(**kwargs) + self.key_name = key_name + + +class StorageAccountUpdateParameters(Model): + """The storage account update parameters. + + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, active_key_name: str=None, auto_regenerate_key: bool=None, regeneration_period: str=None, storage_account_attributes=None, tags=None, **kwargs) -> None: + super(StorageAccountUpdateParameters, self).__init__(**kwargs) + self.active_key_name = active_key_name + self.auto_regenerate_key = auto_regenerate_key + self.regeneration_period = regeneration_period + self.storage_account_attributes = storage_account_attributes + self.tags = tags + + +class StorageBundle(Model): + """A Storage account bundle consists of key vault storage account details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageBundle, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.active_key_name = None + self.auto_regenerate_key = None + self.regeneration_period = None + self.attributes = None + self.tags = None + + +class StorageListResult(Model): + """The storage accounts list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of storage accounts in + the key vault along with a link to the next page of storage accounts. + :vartype value: + list[~azure.keyvault.v2016_10_01.models.StorageAccountItem] + :ivar next_link: The URL to get the next set of storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[StorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SubjectAlternativeNames(Model): + """The subject alternate names of a X509 object. + + :param emails: Email addresses. + :type emails: list[str] + :param dns_names: Domain names. + :type dns_names: list[str] + :param upns: User principal names. + :type upns: list[str] + """ + + _attribute_map = { + 'emails': {'key': 'emails', 'type': '[str]'}, + 'dns_names': {'key': 'dns_names', 'type': '[str]'}, + 'upns': {'key': 'upns', 'type': '[str]'}, + } + + def __init__(self, *, emails=None, dns_names=None, upns=None, **kwargs) -> None: + super(SubjectAlternativeNames, self).__init__(**kwargs) + self.emails = emails + self.dns_names = dns_names + self.upns = upns + + +class Trigger(Model): + """A condition to be satisfied for an action to be executed. + + :param lifetime_percentage: Percentage of lifetime at which to trigger. + Value should be between 1 and 99. + :type lifetime_percentage: int + :param days_before_expiry: Days before expiry to attempt renewal. Value + should be between 1 and validity_in_months multiplied by 27. If + validity_in_months is 36, then value should be between 1 and 972 (36 * + 27). + :type days_before_expiry: int + """ + + _validation = { + 'lifetime_percentage': {'maximum': 99, 'minimum': 1}, + } + + _attribute_map = { + 'lifetime_percentage': {'key': 'lifetime_percentage', 'type': 'int'}, + 'days_before_expiry': {'key': 'days_before_expiry', 'type': 'int'}, + } + + def __init__(self, *, lifetime_percentage: int=None, days_before_expiry: int=None, **kwargs) -> None: + super(Trigger, self).__init__(**kwargs) + self.lifetime_percentage = lifetime_percentage + self.days_before_expiry = days_before_expiry + + +class X509CertificateProperties(Model): + """Properties of the X509 component of a certificate. + + :param subject: The subject name. Should be a valid X509 distinguished + Name. + :type subject: str + :param ekus: The enhanced key usage. + :type ekus: list[str] + :param subject_alternative_names: The subject alternative names. + :type subject_alternative_names: + ~azure.keyvault.v2016_10_01.models.SubjectAlternativeNames + :param key_usage: List of key usages. + :type key_usage: list[str or + ~azure.keyvault.v2016_10_01.models.KeyUsageType] + :param validity_in_months: The duration that the certificate is valid in + months. + :type validity_in_months: int + """ + + _validation = { + 'validity_in_months': {'minimum': 0}, + } + + _attribute_map = { + 'subject': {'key': 'subject', 'type': 'str'}, + 'ekus': {'key': 'ekus', 'type': '[str]'}, + 'subject_alternative_names': {'key': 'sans', 'type': 'SubjectAlternativeNames'}, + 'key_usage': {'key': 'key_usage', 'type': '[str]'}, + 'validity_in_months': {'key': 'validity_months', 'type': 'int'}, + } + + def __init__(self, *, subject: str=None, ekus=None, subject_alternative_names=None, key_usage=None, validity_in_months: int=None, **kwargs) -> None: + super(X509CertificateProperties, self).__init__(**kwargs) + self.subject = subject + self.ekus = ekus + self.subject_alternative_names = subject_alternative_names + self.key_usage = key_usage + self.validity_in_months = validity_in_months diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/__init__.py new file mode 100644 index 000000000000..603e37d3ee07 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_operations import KeyVaultClientOperationsMixin + +__all__ = [ + 'KeyVaultClientOperationsMixin', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/_key_vault_client_operations.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/_key_vault_client_operations.py new file mode 100644 index 000000000000..0ae7fd5fb025 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/operations/_key_vault_client_operations.py @@ -0,0 +1,4475 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core.exceptions import map_error +from azure.core.paging import ItemPaged +from .. import models +import uuid + + +class KeyVaultClientOperationsMixin(object): + + def create_key(self, vault_base_url, key_name, kty, key_size=None, key_ops=None, key_attributes=None, tags=None, curve=None, cls=None, **kwargs): + """Creates a new key, stores it, then returns key parameters and + attributes to the client. + + The create key operation can be used to create any key type in Azure + Key Vault. If the named key already exists, Azure Key Vault creates a + new version of the key. It requires the keys/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name for the new key. The system will generate + the version name for the new key. + :type key_name: str + :param kty: The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', + 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v2016_10_01.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or + 4096 for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', + 'P-521', 'SECP256K1' + :type curve: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyCurveName + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyCreateParameters(kty=kty, key_size=key_size, key_ops=key_ops, key_attributes=key_attributes, tags=tags, curve=curve) + + # Construct URL + url = self.create_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_key.metadata = {'url': '/keys/{key-name}/create'} + + def import_key(self, vault_base_url, key_name, key, hsm=None, key_attributes=None, tags=None, cls=None, **kwargs): + """Imports an externally created key, stores it, and returns key + parameters and attributes to the client. + + The import key operation may be used to import any key type into an + Azure Key Vault. If the named key already exists, Azure Key Vault + creates a new version of the key. This operation requires the + keys/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: Name for the imported key. + :type key_name: str + :param key: The Json web key + :type key: ~azure.keyvault.v2016_10_01.models.JsonWebKey + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyImportParameters(hsm=hsm, key=key, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.import_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyImportParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_key.metadata = {'url': '/keys/{key-name}'} + + def delete_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Deletes a key of any type from storage in Azure Key Vault. + + The delete key operation cannot be used to remove individual versions + of a key. This operation removes the cryptographic material associated + with the key, which means the key is not usable for Sign/Verify, + Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the + keys/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to delete. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_key.metadata = {'url': '/keys/{key-name}'} + + def update_key(self, vault_base_url, key_name, key_version, key_ops=None, key_attributes=None, tags=None, cls=None, **kwargs): + """The update key operation changes specified attributes of a stored key + and can be applied to any key type and key version stored in Azure Key + Vault. + + In order to perform this operation, the key must already exist in the + Key Vault. Note: The cryptographic material of a key itself cannot be + changed. This operation requires the keys/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of key to update. + :type key_name: str + :param key_version: The version of the key to update. + :type key_version: str + :param key_ops: Json web key operations. For more information on + possible key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v2016_10_01.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyUpdateParameters(key_ops=key_ops, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.update_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key(self, vault_base_url, key_name, key_version, cls=None, **kwargs): + """Gets the public part of a stored key. + + The get key operation is applicable to all key types. If the requested + key is symmetric, then no key material is released in the response. + This operation requires the keys/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to get. + :type key_name: str + :param key_version: Adding the version parameter retrieves a specific + version of a key. + :type key_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key_versions( + self, vault_base_url, key_name, maxresults=None, cls=None, **kwargs): + """Retrieves a list of individual key versions with the same key name. + + The full key identifier, attributes, and tags are provided in the + response. This operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_key_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_key_versions.metadata = {'url': '/keys/{key-name}/versions'} + + def get_keys( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a stored key. The LIST + operation is applicable to all key types, however only the base key + identifier, attributes, and tags are provided in the response. + Individual versions of a key are not listed in the response. This + operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_keys.metadata = {'url': '/keys'} + + def backup_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Requests that a backup of the specified key be downloaded to the + client. + + The Key Backup operation exports a key from Azure Key Vault in a + protected form. Note that this operation does NOT return key material + in a form that can be used outside the Azure Key Vault system, the + returned key material is either protected to a Azure Key Vault HSM or + to Azure Key Vault itself. The intent of this operation is to allow a + client to GENERATE a key in one Azure Key Vault instance, BACKUP the + key, and then RESTORE it into another Azure Key Vault instance. The + BACKUP operation may be used to export, in protected form, any key type + from Azure Key Vault. Individual versions of a key cannot be backed up. + BACKUP / RESTORE can be performed within geographical boundaries only; + meaning that a BACKUP from one geographical area cannot be restored to + another geographical area. For example, a backup from the US + geographical area cannot be restored in an EU geographical area. This + operation requires the key/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupKeyResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.BackupKeyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupKeyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_key.metadata = {'url': '/keys/{key-name}/backup'} + + def restore_key(self, vault_base_url, key_bundle_backup, cls=None, **kwargs): + """Restores a backed up key to a vault. + + Imports a previously backed up key into Azure Key Vault, restoring the + key, its key identifier, attributes and access control policies. The + RESTORE operation may be used to import a previously backed up key. + Individual versions of a key cannot be restored. The key is restored in + its entirety with the same key name as it had when it was backed up. If + the key name is not available in the target Key Vault, the RESTORE + operation will be rejected. While the key name is retained during + restore, the final key identifier will change if the key is restored to + a different vault. Restore will restore all versions and preserve + version identifiers. The RESTORE operation is subject to security + constraints: The target Key Vault must be owned by the same Microsoft + Azure Subscription as the source Key Vault The user must have RESTORE + permission in the target Key Vault. This operation requires the + keys/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_bundle_backup: The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyRestoreParameters(key_bundle_backup=key_bundle_backup) + + # Construct URL + url = self.restore_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_key.metadata = {'url': '/keys/restore'} + + def encrypt(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Encrypts an arbitrary sequence of bytes using an encryption key that is + stored in a key vault. + + The ENCRYPT operation encrypts an arbitrary sequence of bytes using an + encryption key that is stored in Azure Key Vault. Note that the ENCRYPT + operation only supports a single block of data, the size of which is + dependent on the target key and the encryption algorithm to be used. + The ENCRYPT operation is only strictly necessary for symmetric keys + stored in Azure Key Vault since protection with an asymmetric key can + be performed using public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/encrypt permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.encrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + encrypt.metadata = {'url': '/keys/{key-name}/{key-version}/encrypt'} + + def decrypt(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Decrypts a single block of encrypted data. + + The DECRYPT operation decrypts a well-formed block of ciphertext using + the target encryption key and specified algorithm. This operation is + the reverse of the ENCRYPT operation; only a single block of data may + be decrypted, the size of this block is dependent on the target key and + the algorithm to be used. The DECRYPT operation applies to asymmetric + and symmetric keys stored in Azure Key Vault since it uses the private + portion of the key. This operation requires the keys/decrypt + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.decrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + decrypt.metadata = {'url': '/keys/{key-name}/{key-version}/decrypt'} + + def sign(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Creates a signature from a digest using the specified key. + + The SIGN operation is applicable to asymmetric and symmetric keys + stored in Azure Key Vault since this operation uses the private portion + of the key. This operation requires the keys/sign permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm identifier. For + more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeySignParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.sign.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeySignParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + sign.metadata = {'url': '/keys/{key-name}/{key-version}/sign'} + + def verify(self, vault_base_url, key_name, key_version, algorithm, digest, signature, cls=None, **kwargs): + """Verifies a signature using a specified key. + + The VERIFY operation is applicable to symmetric keys stored in Azure + Key Vault. VERIFY is not strictly necessary for asymmetric keys stored + in Azure Key Vault since signature verification can be performed using + the public portion of the key but this operation is supported as a + convenience for callers that only have a key-reference and not the + public portion of the key. This operation requires the keys/verify + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm. For more + information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ECDSA256' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeySignatureAlgorithm + :param digest: The digest used for signing. + :type digest: bytes + :param signature: The signature to be verified. + :type signature: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyVerifyResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyVerifyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyVerifyParameters(algorithm=algorithm, digest=digest, signature=signature) + + # Construct URL + url = self.verify.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyVerifyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyVerifyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + verify.metadata = {'url': '/keys/{key-name}/{key-version}/verify'} + + def wrap_key(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Wraps a symmetric key using a specified key. + + The WRAP operation supports encryption of a symmetric key using a key + encryption key that has previously been stored in an Azure Key Vault. + The WRAP operation is only strictly necessary for symmetric keys stored + in Azure Key Vault since protection with an asymmetric key can be + performed using the public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/wrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.wrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + wrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/wrapkey'} + + def unwrap_key(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Unwraps a symmetric key using the specified key that was initially used + for wrapping that key. + + The UNWRAP operation supports decryption of a symmetric key using the + target key encryption key. This operation is the reverse of the WRAP + operation. The UNWRAP operation applies to asymmetric and symmetric + keys stored in Azure Key Vault since it uses the private portion of the + key. This operation requires the keys/unwrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v2016_10_01.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.unwrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + unwrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/unwrapkey'} + + def get_deleted_keys( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists the deleted keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a deleted key. This + operation includes deletion-specific information. The Get Deleted Keys + operation is applicable for vaults enabled for soft-delete. While the + operation can be invoked on any vault, it will return an error if + invoked on a non soft-delete enabled vault. This operation requires the + keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedKeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.DeletedKeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedKeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_keys.metadata = {'url': '/deletedkeys'} + + def get_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Gets the public part of a deleted key. + + The Get Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/get permission. . + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + def purge_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Permanently deletes the specified key. + + The Purge Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + def recover_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Recovers the deleted key to its latest version. + + The Recover Deleted Key operation is applicable for deleted keys in + soft-delete enabled vaults. It recovers the deleted key back to its + latest version under /keys. An attempt to recover an non-deleted key + will return an error. Consider this the inverse of the delete operation + on soft-delete enabled vaults. This operation requires the keys/recover + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the deleted key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_key.metadata = {'url': '/deletedkeys/{key-name}/recover'} + + def set_secret(self, vault_base_url, secret_name, value, tags=None, content_type=None, secret_attributes=None, cls=None, **kwargs): + """Sets a secret in a specified key vault. + + The SET operation adds a secret to the Azure Key Vault. If the named + secret already exists, Azure Key Vault creates a new version of that + secret. This operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param value: The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretSetParameters(value=value, tags=tags, content_type=content_type, secret_attributes=secret_attributes) + + # Construct URL + url = self.set_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_secret.metadata = {'url': '/secrets/{secret-name}'} + + def delete_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Deletes a secret from a specified key vault. + + The DELETE operation applies to any secret stored in Azure Key Vault. + DELETE cannot be applied to an individual version of a secret. This + operation requires the secrets/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_secret.metadata = {'url': '/secrets/{secret-name}'} + + def update_secret(self, vault_base_url, secret_name, secret_version, content_type=None, secret_attributes=None, tags=None, cls=None, **kwargs): + """Updates the attributes associated with a specified secret in a given + key vault. + + The UPDATE operation changes specified attributes of an existing stored + secret. Attributes that are not specified in the request are left + unchanged. The value of a secret itself cannot be changed. This + operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: + ~azure.keyvault.v2016_10_01.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretUpdateParameters(content_type=content_type, secret_attributes=secret_attributes, tags=tags) + + # Construct URL + url = self.update_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secret(self, vault_base_url, secret_name, secret_version, cls=None, **kwargs): + """Get a specified secret from a given key vault. + + The GET operation is applicable to any secret stored in Azure Key + Vault. This operation requires the secrets/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secrets( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List secrets in a specified key vault. + + The Get Secrets operation is applicable to the entire vault. However, + only the base secret identifier and its attributes are provided in the + response. Individual secret versions are not listed in the response. + This operation requires the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_secrets.metadata = {'url': '/secrets'} + + def get_secret_versions( + self, vault_base_url, secret_name, maxresults=None, cls=None, **kwargs): + """List all versions of the specified secret. + + The full secret identifier and attributes are provided in the response. + No values are returned for the secrets. This operations requires the + secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secret_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_secret_versions.metadata = {'url': '/secrets/{secret-name}/versions'} + + def get_deleted_secrets( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists deleted secrets for the specified vault. + + The Get Deleted Secrets operation returns the secrets that have been + deleted for a vault enabled for soft-delete. This operation requires + the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.DeletedSecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedSecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_secrets.metadata = {'url': '/deletedsecrets'} + + def get_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Gets the specified deleted secret. + + The Get Deleted Secret operation returns the specified deleted secret + along with its attributes. This operation requires the secrets/get + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + def purge_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Permanently deletes the specified secret. + + The purge deleted secret operation removes the secret permanently, + without the possibility of recovery. This operation can only be enabled + on a soft-delete enabled vault. This operation requires the + secrets/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + def recover_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Recovers the deleted secret to the latest version. + + Recovers the deleted secret in the specified vault. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the secrets/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the deleted secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}/recover'} + + def backup_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Backs up the specified secret. + + Requests that a backup of the specified secret be downloaded to the + client. All versions of the secret will be downloaded. This operation + requires the secrets/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupSecretResult or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.BackupSecretResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupSecretResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_secret.metadata = {'url': '/secrets/{secret-name}/backup'} + + def restore_secret(self, vault_base_url, secret_bundle_backup, cls=None, **kwargs): + """Restores a backed up secret to a vault. + + Restores a backed up secret, and all its versions, to a vault. This + operation requires the secrets/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_bundle_backup: The backup blob associated with a secret + bundle. + :type secret_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretRestoreParameters(secret_bundle_backup=secret_bundle_backup) + + # Construct URL + url = self.restore_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_secret.metadata = {'url': '/secrets/restore'} + + def get_certificates( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List certificates in a specified key vault. + + The GetCertificates operation returns the set of certificates resources + in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificates.metadata = {'url': '/certificates'} + + def delete_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Deletes a certificate from a specified key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate.metadata = {'url': '/certificates/{certificate-name}'} + + def set_certificate_contacts(self, vault_base_url, contact_list=None, cls=None, **kwargs): + """Sets the certificate contacts for the specified key vault. + + Sets the certificate contacts for the specified key vault. This + operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v2016_10_01.models.Contact] + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + contacts = models.Contacts(contact_list=contact_list) + + # Construct URL + url = self.set_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(contacts, 'Contacts') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_contacts(self, vault_base_url, cls=None, **kwargs): + """Lists the certificate contacts for a specified key vault. + + The GetCertificateContacts operation returns the set of certificate + contact resources in the specified key vault. This operation requires + the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def delete_certificate_contacts(self, vault_base_url, cls=None, **kwargs): + """Deletes the certificate contacts for a specified key vault. + + Deletes the certificate contacts for a specified key vault certificate. + This operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_issuers( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List certificate issuers for a specified key vault. + + The GetCertificateIssuers operation returns the set of certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateIssuerItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.CertificateIssuerItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_issuers.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateIssuerListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificate_issuers.metadata = {'url': '/certificates/issuers'} + + def set_certificate_issuer(self, vault_base_url, issuer_name, provider, credentials=None, organization_details=None, attributes=None, cls=None, **kwargs): + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: + ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerSetParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.set_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def update_certificate_issuer(self, vault_base_url, issuer_name, provider=None, credentials=None, organization_details=None, attributes=None, cls=None, **kwargs): + """Updates the specified certificate issuer. + + The UpdateCertificateIssuer operation performs an update on the + specified certificate issuer entity. This operation requires the + certificates/setissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: + ~azure.keyvault.v2016_10_01.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v2016_10_01.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v2016_10_01.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerUpdateParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.update_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def get_certificate_issuer(self, vault_base_url, issuer_name, cls=None, **kwargs): + """Lists the specified certificate issuer. + + The GetCertificateIssuer operation returns the specified certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def delete_certificate_issuer(self, vault_base_url, issuer_name, cls=None, **kwargs): + """Deletes the specified certificate issuer. + + The DeleteCertificateIssuer operation permanently removes the specified + certificate issuer from the vault. This operation requires the + certificates/manageissuers/deleteissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def create_certificate(self, vault_base_url, certificate_name, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateCreateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.create_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [202]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 202: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_certificate.metadata = {'url': '/certificates/{certificate-name}/create'} + + def import_certificate(self, vault_base_url, certificate_name, base64_encoded_certificate, password=None, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param base64_encoded_certificate: Base64 encoded representation of + the certificate object to import. This certificate needs to contain + the private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateImportParameters(base64_encoded_certificate=base64_encoded_certificate, password=password, certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.import_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateImportParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_certificate.metadata = {'url': '/certificates/{certificate-name}/import'} + + def get_certificate_versions( + self, vault_base_url, certificate_name, maxresults=None, cls=None, **kwargs): + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificate_versions.metadata = {'url': '/certificates/{certificate-name}/versions'} + + def get_certificate_policy(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Lists the policy for a certificate. + + The GetCertificatePolicy operation returns the specified certificate + policy resources in the specified key vault. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in a given key + vault. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + def update_certificate_policy(self, vault_base_url, certificate_name, certificate_policy, cls=None, **kwargs): + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leave others as null. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_policy: The policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.update_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_policy, 'CertificatePolicy') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + def update_certificate(self, vault_base_url, certificate_name, certificate_version, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given key + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v2016_10_01.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateUpdateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.update_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + def get_certificate(self, vault_base_url, certificate_name, certificate_version, cls=None, **kwargs): + """Gets information about a certificate. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + def update_certificate_operation(self, vault_base_url, certificate_name, cancellation_requested, cls=None, **kwargs): + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param cancellation_requested: Indicates if cancellation was requested + on the certificate operation. + :type cancellation_requested: bool + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + certificate_operation = models.CertificateOperationUpdateParameter(cancellation_requested=cancellation_requested) + + # Construct URL + url = self.update_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_operation, 'CertificateOperationUpdateParameter') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def get_certificate_operation(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def delete_certificate_operation(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def merge_certificate(self, vault_base_url, certificate_name, x509_certificates, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Merges a certificate or a certificate chain with a key pair existing on + the server. + + The MergeCertificate operation performs the merging of a certificate or + certificate chain with a key pair currently available in the service. + This operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param x509_certificates: The certificate or the certificate chain to + merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v2016_10_01.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateMergeParameters(x509_certificates=x509_certificates, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.merge_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateMergeParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [201]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 201: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + merge_certificate.metadata = {'url': '/certificates/{certificate-name}/pending/merge'} + + def get_deleted_certificates( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists the deleted certificates in the specified vault currently + available for recovery. + + The GetDeletedCertificates operation retrieves the certificates in the + current vault which are in a deleted state and ready for recovery or + purging. This operation includes deletion-specific information. This + operation requires the certificates/get/list permission. This operation + can only be enabled on soft-delete enabled vaults. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedCertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.DeletedCertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedCertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_certificates.metadata = {'url': '/deletedcertificates'} + + def get_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Retrieves information about the specified deleted certificate. + + The GetDeletedCertificate operation retrieves the deleted certificate + information plus its attributes, such as retention interval, scheduled + permanent deletion and the current deletion recovery level. This + operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + def purge_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Permanently deletes the specified deleted certificate. + + The PurgeDeletedCertificate operation performs an irreversible deletion + of the specified certificate, without possibility for recovery. The + operation is not available if the recovery level does not specify + 'Purgeable'. This operation requires the certificate/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + def recover_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Recovers the deleted certificate back to its current version under + /certificates. + + The RecoverDeletedCertificate operation performs the reversal of the + Delete operation. The operation is applicable in vaults enabled for + soft-delete, and must be issued during the retention interval + (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the deleted certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}/recover'} + + def get_storage_accounts( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List storage accounts managed by the specified key vault. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of StorageAccountItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.StorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('StorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_storage_accounts.metadata = {'url': '/storage'} + + def delete_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Deletes a storage account. This operation requires the storage/delete + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def get_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Gets information about a specified storage account. This operation + requires the storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def set_storage_account(self, vault_base_url, storage_account_name, resource_id, active_key_name, auto_regenerate_key, regeneration_period=None, storage_account_attributes=None, tags=None, cls=None, **kwargs): + """Creates or updates a new storage account. This operation requires the + storage/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param resource_id: Storage account resource id. + :type resource_id: str + :param active_key_name: Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountCreateParameters(resource_id=resource_id, active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.set_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def update_storage_account(self, vault_base_url, storage_account_name, active_key_name=None, auto_regenerate_key=None, regeneration_period=None, storage_account_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given storage + account. This operation requires the storage/set/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v2016_10_01.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountUpdateParameters(active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.update_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def regenerate_storage_account_key(self, vault_base_url, storage_account_name, key_name, cls=None, **kwargs): + """Regenerates the specified key value for the given storage account. This + operation requires the storage/regeneratekey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param key_name: The storage account key name. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountRegenerteKeyParameters(key_name=key_name) + + # Construct URL + url = self.regenerate_storage_account_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountRegenerteKeyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + regenerate_storage_account_key.metadata = {'url': '/storage/{storage-account-name}/regeneratekey'} + + def get_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, cls=None, **kwargs): + """List storage SAS definitions for the given storage account. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SasDefinitionItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v2016_10_01.models.SasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_sas_definitions.metadata = {'url': '/storage/{storage-account-name}/sas'} + + def delete_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Deletes a SAS definition from a specified storage account. This + operation requires the storage/deletesas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def get_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Gets information about a SAS definition for the specified storage + account. This operation requires the storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def set_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, parameters, sas_definition_attributes=None, tags=None, cls=None, **kwargs): + """Creates or updates a new SAS definition for the specified storage + account. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param parameters: Sas definition creation metadata in the form of + key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters1 = models.SasDefinitionCreateParameters(parameters=parameters, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.set_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters1, 'SasDefinitionCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def update_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, parameters=None, sas_definition_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given SAS + definition. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param parameters: Sas definition update metadata in the form of + key-value pairs. + :type parameters: dict[str, str] + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v2016_10_01.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v2016_10_01.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters1 = models.SasDefinitionUpdateParameters(parameters=parameters, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.update_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters1, 'SasDefinitionUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/version.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/version.py new file mode 100644 index 000000000000..20ba78005d47 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v2016_10_01/version.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +VERSION = "2016-10-01" + diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/__init__.py new file mode 100644 index 000000000000..e913d4cf6c46 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/__init__.py @@ -0,0 +1,18 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client import KeyVaultClient +__all__ = ['KeyVaultClient'] + +from .version import VERSION + +__version__ = VERSION + diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_configuration.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_configuration.py new file mode 100644 index 000000000000..28cf75e3d2b4 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_configuration.py @@ -0,0 +1,48 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from .version import VERSION + + +class KeyVaultClientConfiguration(Configuration): + """Configuration for KeyVaultClient + Note that all parameters used to create this instance are saved as instance + attributes. + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__(self, credentials, **kwargs): + + if credentials is None: + raise ValueError("Parameter 'credentials' must not be None.") + + super(KeyVaultClientConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azsdk-python-azure-keyvault/{}'.format(VERSION)) + self.generate_client_request_id = True + + self.credentials = credentials + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.RetryPolicy(**kwargs) + self.custom_hook_policy = policies.CustomHookPolicy(**kwargs) + self.redirect_policy = policies.RedirectPolicy(**kwargs) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_key_vault_client.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_key_vault_client.py new file mode 100644 index 000000000000..a1a1eb19328b --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/_key_vault_client.py @@ -0,0 +1,46 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core import PipelineClient +from msrest import Serializer, Deserializer + +from ._configuration import KeyVaultClientConfiguration +from .operations import KeyVaultClientOperationsMixin +from . import models + + +class KeyVaultClient(KeyVaultClientOperationsMixin): + """The key vault client performs cryptographic key operations and vault operations against the Key Vault service. + + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__( + self, credentials, **kwargs): + + base_url = '{vaultBaseUrl}' + self._config = KeyVaultClientConfiguration(credentials, **kwargs) + self._client = PipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '7.0' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + + def __enter__(self): + self._client.__enter__() + return self + def __exit__(self, *exc_details): + self._client.__exit__(*exc_details) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/__init__.py new file mode 100644 index 000000000000..fb2e6c3866fd --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/__init__.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_async import KeyVaultClient +__all__ = ['KeyVaultClient'] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_configuration_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_configuration_async.py new file mode 100644 index 000000000000..a61d9eeff444 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_configuration_async.py @@ -0,0 +1,47 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from ..version import VERSION + + +class KeyVaultClientConfiguration(Configuration): + """Configuration for KeyVaultClient + Note that all parameters used to create this instance are saved as instance + attributes. + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__(self, credentials, **kwargs): + + if credentials is None: + raise ValueError("Parameter 'credentials' must not be None.") + + super(KeyVaultClientConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azsdk-python-azure-keyvault/{}'.format(VERSION)) + self.generate_client_request_id = True + + self.credentials = credentials + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.AsyncRetryPolicy(**kwargs) + self.redirect_policy = policies.AsyncRedirectPolicy(**kwargs) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_key_vault_client_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_key_vault_client_async.py new file mode 100644 index 000000000000..482d6336ab1a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/_key_vault_client_async.py @@ -0,0 +1,46 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core import AsyncPipelineClient +from msrest import Serializer, Deserializer + +from ._configuration_async import KeyVaultClientConfiguration +from .operations_async import KeyVaultClientOperationsMixin +from .. import models + + +class KeyVaultClient(KeyVaultClientOperationsMixin): + """The key vault client performs cryptographic key operations and vault operations against the Key Vault service. + + + :param credentials: Credentials needed for the client to connect to Azure. + :type credentials: :mod:`A msrestazure Credentials + object` + """ + + def __init__( + self, credentials, **kwargs): + + base_url = '{vaultBaseUrl}' + self._config = KeyVaultClientConfiguration(credentials, **kwargs) + self._client = AsyncPipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '7.0' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + + async def __aenter__(self): + await self._client.__aenter__() + return self + async def __aexit__(self, *exc_details): + await self._client.__aexit__(*exc_details) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/__init__.py new file mode 100644 index 000000000000..771a17ceb80d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_operations_async import KeyVaultClientOperationsMixin + +__all__ = [ + 'KeyVaultClientOperationsMixin', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/_key_vault_client_operations_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/_key_vault_client_operations_async.py new file mode 100644 index 000000000000..08e45c2b44a7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/aio/operations_async/_key_vault_client_operations_async.py @@ -0,0 +1,5163 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core.exceptions import map_error +from azure.core.async_paging import AsyncItemPaged, AsyncList +from ... import models +import uuid + + +class KeyVaultClientOperationsMixin: + + async def create_key(self, vault_base_url, key_name, kty, key_size=None, key_ops=None, key_attributes=None, tags=None, curve=None, *, cls=None, **kwargs): + """Creates a new key, stores it, then returns key parameters and + attributes to the client. + + The create key operation can be used to create any key type in Azure + Key Vault. If the named key already exists, Azure Key Vault creates a + new version of the key. It requires the keys/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name for the new key. The system will generate + the version name for the new key. + :type key_name: str + :param kty: The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', + 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or + 4096 for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', + 'P-521', 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyCreateParameters(kty=kty, key_size=key_size, key_ops=key_ops, key_attributes=key_attributes, tags=tags, curve=curve) + + # Construct URL + url = self.create_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_key.metadata = {'url': '/keys/{key-name}/create'} + + async def import_key(self, vault_base_url, key_name, key, hsm=None, key_attributes=None, tags=None, *, cls=None, **kwargs): + """Imports an externally created key, stores it, and returns key + parameters and attributes to the client. + + The import key operation may be used to import any key type into an + Azure Key Vault. If the named key already exists, Azure Key Vault + creates a new version of the key. This operation requires the + keys/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: Name for the imported key. + :type key_name: str + :param key: The Json web key + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyImportParameters(hsm=hsm, key=key, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.import_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyImportParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_key.metadata = {'url': '/keys/{key-name}'} + + async def delete_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Deletes a key of any type from storage in Azure Key Vault. + + The delete key operation cannot be used to remove individual versions + of a key. This operation removes the cryptographic material associated + with the key, which means the key is not usable for Sign/Verify, + Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the + keys/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to delete. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_key.metadata = {'url': '/keys/{key-name}'} + + async def update_key(self, vault_base_url, key_name, key_version, key_ops=None, key_attributes=None, tags=None, *, cls=None, **kwargs): + """The update key operation changes specified attributes of a stored key + and can be applied to any key type and key version stored in Azure Key + Vault. + + In order to perform this operation, the key must already exist in the + Key Vault. Note: The cryptographic material of a key itself cannot be + changed. This operation requires the keys/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of key to update. + :type key_name: str + :param key_version: The version of the key to update. + :type key_version: str + :param key_ops: Json web key operations. For more information on + possible key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyUpdateParameters(key_ops=key_ops, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.update_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + async def get_key(self, vault_base_url, key_name, key_version, *, cls=None, **kwargs): + """Gets the public part of a stored key. + + The get key operation is applicable to all key types. If the requested + key is symmetric, then no key material is released in the response. + This operation requires the keys/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to get. + :type key_name: str + :param key_version: Adding the version parameter retrieves a specific + version of a key. + :type key_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key_versions( + self, vault_base_url, key_name, maxresults=None, *, cls=None, **kwargs): + """Retrieves a list of individual key versions with the same key name. + + The full key identifier, attributes, and tags are provided in the + response. This operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_key_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_key_versions.metadata = {'url': '/keys/{key-name}/versions'} + + def get_keys( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a stored key. The LIST + operation is applicable to all key types, however only the base key + identifier, attributes, and tags are provided in the response. + Individual versions of a key are not listed in the response. This + operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_keys.metadata = {'url': '/keys'} + + async def backup_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Requests that a backup of the specified key be downloaded to the + client. + + The Key Backup operation exports a key from Azure Key Vault in a + protected form. Note that this operation does NOT return key material + in a form that can be used outside the Azure Key Vault system, the + returned key material is either protected to a Azure Key Vault HSM or + to Azure Key Vault itself. The intent of this operation is to allow a + client to GENERATE a key in one Azure Key Vault instance, BACKUP the + key, and then RESTORE it into another Azure Key Vault instance. The + BACKUP operation may be used to export, in protected form, any key type + from Azure Key Vault. Individual versions of a key cannot be backed up. + BACKUP / RESTORE can be performed within geographical boundaries only; + meaning that a BACKUP from one geographical area cannot be restored to + another geographical area. For example, a backup from the US + geographical area cannot be restored in an EU geographical area. This + operation requires the key/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupKeyResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupKeyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupKeyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_key.metadata = {'url': '/keys/{key-name}/backup'} + + async def restore_key(self, vault_base_url, key_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up key to a vault. + + Imports a previously backed up key into Azure Key Vault, restoring the + key, its key identifier, attributes and access control policies. The + RESTORE operation may be used to import a previously backed up key. + Individual versions of a key cannot be restored. The key is restored in + its entirety with the same key name as it had when it was backed up. If + the key name is not available in the target Key Vault, the RESTORE + operation will be rejected. While the key name is retained during + restore, the final key identifier will change if the key is restored to + a different vault. Restore will restore all versions and preserve + version identifiers. The RESTORE operation is subject to security + constraints: The target Key Vault must be owned by the same Microsoft + Azure Subscription as the source Key Vault The user must have RESTORE + permission in the target Key Vault. This operation requires the + keys/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_bundle_backup: The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyRestoreParameters(key_bundle_backup=key_bundle_backup) + + # Construct URL + url = self.restore_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_key.metadata = {'url': '/keys/restore'} + + async def encrypt(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Encrypts an arbitrary sequence of bytes using an encryption key that is + stored in a key vault. + + The ENCRYPT operation encrypts an arbitrary sequence of bytes using an + encryption key that is stored in Azure Key Vault. Note that the ENCRYPT + operation only supports a single block of data, the size of which is + dependent on the target key and the encryption algorithm to be used. + The ENCRYPT operation is only strictly necessary for symmetric keys + stored in Azure Key Vault since protection with an asymmetric key can + be performed using public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/encrypt permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.encrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + encrypt.metadata = {'url': '/keys/{key-name}/{key-version}/encrypt'} + + async def decrypt(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Decrypts a single block of encrypted data. + + The DECRYPT operation decrypts a well-formed block of ciphertext using + the target encryption key and specified algorithm. This operation is + the reverse of the ENCRYPT operation; only a single block of data may + be decrypted, the size of this block is dependent on the target key and + the algorithm to be used. The DECRYPT operation applies to asymmetric + and symmetric keys stored in Azure Key Vault since it uses the private + portion of the key. This operation requires the keys/decrypt + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.decrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + decrypt.metadata = {'url': '/keys/{key-name}/{key-version}/decrypt'} + + async def sign(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Creates a signature from a digest using the specified key. + + The SIGN operation is applicable to asymmetric and symmetric keys + stored in Azure Key Vault since this operation uses the private portion + of the key. This operation requires the keys/sign permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm identifier. For + more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeySignParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.sign.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeySignParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + sign.metadata = {'url': '/keys/{key-name}/{key-version}/sign'} + + async def verify(self, vault_base_url, key_name, key_version, algorithm, digest, signature, *, cls=None, **kwargs): + """Verifies a signature using a specified key. + + The VERIFY operation is applicable to symmetric keys stored in Azure + Key Vault. VERIFY is not strictly necessary for asymmetric keys stored + in Azure Key Vault since signature verification can be performed using + the public portion of the key but this operation is supported as a + convenience for callers that only have a key-reference and not the + public portion of the key. This operation requires the keys/verify + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm. For more + information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param digest: The digest used for signing. + :type digest: bytes + :param signature: The signature to be verified. + :type signature: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyVerifyResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyVerifyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyVerifyParameters(algorithm=algorithm, digest=digest, signature=signature) + + # Construct URL + url = self.verify.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyVerifyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyVerifyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + verify.metadata = {'url': '/keys/{key-name}/{key-version}/verify'} + + async def wrap_key(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Wraps a symmetric key using a specified key. + + The WRAP operation supports encryption of a symmetric key using a key + encryption key that has previously been stored in an Azure Key Vault. + The WRAP operation is only strictly necessary for symmetric keys stored + in Azure Key Vault since protection with an asymmetric key can be + performed using the public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/wrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.wrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + wrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/wrapkey'} + + async def unwrap_key(self, vault_base_url, key_name, key_version, algorithm, value, *, cls=None, **kwargs): + """Unwraps a symmetric key using the specified key that was initially used + for wrapping that key. + + The UNWRAP operation supports decryption of a symmetric key using the + target key encryption key. This operation is the reverse of the WRAP + operation. The UNWRAP operation applies to asymmetric and symmetric + keys stored in Azure Key Vault since it uses the private portion of the + key. This operation requires the keys/unwrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.unwrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + unwrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/unwrapkey'} + + def get_deleted_keys( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists the deleted keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a deleted key. This + operation includes deletion-specific information. The Get Deleted Keys + operation is applicable for vaults enabled for soft-delete. While the + operation can be invoked on any vault, it will return an error if + invoked on a non soft-delete enabled vault. This operation requires the + keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedKeyItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.DeletedKeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedKeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_keys.metadata = {'url': '/deletedkeys'} + + async def get_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Gets the public part of a deleted key. + + The Get Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/get permission. . + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + async def purge_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Permanently deletes the specified key. + + The Purge Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + async def recover_deleted_key(self, vault_base_url, key_name, *, cls=None, **kwargs): + """Recovers the deleted key to its latest version. + + The Recover Deleted Key operation is applicable for deleted keys in + soft-delete enabled vaults. It recovers the deleted key back to its + latest version under /keys. An attempt to recover an non-deleted key + will return an error. Consider this the inverse of the delete operation + on soft-delete enabled vaults. This operation requires the keys/recover + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the deleted key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_key.metadata = {'url': '/deletedkeys/{key-name}/recover'} + + async def set_secret(self, vault_base_url, secret_name, value, tags=None, content_type=None, secret_attributes=None, *, cls=None, **kwargs): + """Sets a secret in a specified key vault. + + The SET operation adds a secret to the Azure Key Vault. If the named + secret already exists, Azure Key Vault creates a new version of that + secret. This operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param value: The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretSetParameters(value=value, tags=tags, content_type=content_type, secret_attributes=secret_attributes) + + # Construct URL + url = self.set_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_secret.metadata = {'url': '/secrets/{secret-name}'} + + async def delete_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Deletes a secret from a specified key vault. + + The DELETE operation applies to any secret stored in Azure Key Vault. + DELETE cannot be applied to an individual version of a secret. This + operation requires the secrets/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_secret.metadata = {'url': '/secrets/{secret-name}'} + + async def update_secret(self, vault_base_url, secret_name, secret_version, content_type=None, secret_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the attributes associated with a specified secret in a given + key vault. + + The UPDATE operation changes specified attributes of an existing stored + secret. Attributes that are not specified in the request are left + unchanged. The value of a secret itself cannot be changed. This + operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretUpdateParameters(content_type=content_type, secret_attributes=secret_attributes, tags=tags) + + # Construct URL + url = self.update_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + async def get_secret(self, vault_base_url, secret_name, secret_version, *, cls=None, **kwargs): + """Get a specified secret from a given key vault. + + The GET operation is applicable to any secret stored in Azure Key + Vault. This operation requires the secrets/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secrets( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List secrets in a specified key vault. + + The Get Secrets operation is applicable to the entire vault. However, + only the base secret identifier and its attributes are provided in the + response. Individual secret versions are not listed in the response. + This operation requires the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_secrets.metadata = {'url': '/secrets'} + + def get_secret_versions( + self, vault_base_url, secret_name, maxresults=None, *, cls=None, **kwargs): + """List all versions of the specified secret. + + The full secret identifier and attributes are provided in the response. + No values are returned for the secrets. This operations requires the + secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secret_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_secret_versions.metadata = {'url': '/secrets/{secret-name}/versions'} + + def get_deleted_secrets( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists deleted secrets for the specified vault. + + The Get Deleted Secrets operation returns the secrets that have been + deleted for a vault enabled for soft-delete. This operation requires + the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSecretItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.DeletedSecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedSecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_secrets.metadata = {'url': '/deletedsecrets'} + + async def get_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Gets the specified deleted secret. + + The Get Deleted Secret operation returns the specified deleted secret + along with its attributes. This operation requires the secrets/get + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + async def purge_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Permanently deletes the specified secret. + + The purge deleted secret operation removes the secret permanently, + without the possibility of recovery. This operation can only be enabled + on a soft-delete enabled vault. This operation requires the + secrets/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + async def recover_deleted_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Recovers the deleted secret to the latest version. + + Recovers the deleted secret in the specified vault. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the secrets/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the deleted secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}/recover'} + + async def backup_secret(self, vault_base_url, secret_name, *, cls=None, **kwargs): + """Backs up the specified secret. + + Requests that a backup of the specified secret be downloaded to the + client. All versions of the secret will be downloaded. This operation + requires the secrets/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupSecretResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupSecretResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupSecretResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_secret.metadata = {'url': '/secrets/{secret-name}/backup'} + + async def restore_secret(self, vault_base_url, secret_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up secret to a vault. + + Restores a backed up secret, and all its versions, to a vault. This + operation requires the secrets/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_bundle_backup: The backup blob associated with a secret + bundle. + :type secret_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretRestoreParameters(secret_bundle_backup=secret_bundle_backup) + + # Construct URL + url = self.restore_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_secret.metadata = {'url': '/secrets/restore'} + + def get_certificates( + self, vault_base_url, maxresults=None, include_pending=None, *, cls=None, **kwargs): + """List certificates in a specified key vault. + + The GetCertificates operation returns the set of certificates resources + in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + if include_pending is not None: + query_parameters['includePending'] = self._serialize.query("include_pending", include_pending, 'bool') + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificates.metadata = {'url': '/certificates'} + + async def delete_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Deletes a certificate from a specified key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate.metadata = {'url': '/certificates/{certificate-name}'} + + async def set_certificate_contacts(self, vault_base_url, contact_list=None, *, cls=None, **kwargs): + """Sets the certificate contacts for the specified key vault. + + Sets the certificate contacts for the specified key vault. This + operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v7_0.models.Contact] + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + contacts = models.Contacts(contact_list=contact_list) + + # Construct URL + url = self.set_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(contacts, 'Contacts') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + async def get_certificate_contacts(self, vault_base_url, *, cls=None, **kwargs): + """Lists the certificate contacts for a specified key vault. + + The GetCertificateContacts operation returns the set of certificate + contact resources in the specified key vault. This operation requires + the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + async def delete_certificate_contacts(self, vault_base_url, *, cls=None, **kwargs): + """Deletes the certificate contacts for a specified key vault. + + Deletes the certificate contacts for a specified key vault certificate. + This operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_issuers( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List certificate issuers for a specified key vault. + + The GetCertificateIssuers operation returns the set of certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateIssuerItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.CertificateIssuerItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_issuers.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateIssuerListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificate_issuers.metadata = {'url': '/certificates/issuers'} + + async def set_certificate_issuer(self, vault_base_url, issuer_name, provider, credentials=None, organization_details=None, attributes=None, *, cls=None, **kwargs): + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerSetParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.set_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def update_certificate_issuer(self, vault_base_url, issuer_name, provider=None, credentials=None, organization_details=None, attributes=None, *, cls=None, **kwargs): + """Updates the specified certificate issuer. + + The UpdateCertificateIssuer operation performs an update on the + specified certificate issuer entity. This operation requires the + certificates/setissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerUpdateParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.update_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def get_certificate_issuer(self, vault_base_url, issuer_name, *, cls=None, **kwargs): + """Lists the specified certificate issuer. + + The GetCertificateIssuer operation returns the specified certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def delete_certificate_issuer(self, vault_base_url, issuer_name, *, cls=None, **kwargs): + """Deletes the specified certificate issuer. + + The DeleteCertificateIssuer operation permanently removes the specified + certificate issuer from the vault. This operation requires the + certificates/manageissuers/deleteissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + async def create_certificate(self, vault_base_url, certificate_name, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateCreateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.create_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [202]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 202: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_certificate.metadata = {'url': '/certificates/{certificate-name}/create'} + + async def import_certificate(self, vault_base_url, certificate_name, base64_encoded_certificate, password=None, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param base64_encoded_certificate: Base64 encoded representation of + the certificate object to import. This certificate needs to contain + the private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateImportParameters(base64_encoded_certificate=base64_encoded_certificate, password=password, certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.import_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateImportParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_certificate.metadata = {'url': '/certificates/{certificate-name}/import'} + + def get_certificate_versions( + self, vault_base_url, certificate_name, maxresults=None, *, cls=None, **kwargs): + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_certificate_versions.metadata = {'url': '/certificates/{certificate-name}/versions'} + + async def get_certificate_policy(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Lists the policy for a certificate. + + The GetCertificatePolicy operation returns the specified certificate + policy resources in the specified key vault. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in a given key + vault. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + async def update_certificate_policy(self, vault_base_url, certificate_name, certificate_policy, *, cls=None, **kwargs): + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leave others as null. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_policy: The policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.update_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_policy, 'CertificatePolicy') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + async def update_certificate(self, vault_base_url, certificate_name, certificate_version, certificate_policy=None, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given key + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateUpdateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.update_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + async def get_certificate(self, vault_base_url, certificate_name, certificate_version, *, cls=None, **kwargs): + """Gets information about a certificate. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + async def update_certificate_operation(self, vault_base_url, certificate_name, cancellation_requested, *, cls=None, **kwargs): + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param cancellation_requested: Indicates if cancellation was requested + on the certificate operation. + :type cancellation_requested: bool + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + certificate_operation = models.CertificateOperationUpdateParameter(cancellation_requested=cancellation_requested) + + # Construct URL + url = self.update_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_operation, 'CertificateOperationUpdateParameter') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def get_certificate_operation(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def delete_certificate_operation(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + async def merge_certificate(self, vault_base_url, certificate_name, x509_certificates, certificate_attributes=None, tags=None, *, cls=None, **kwargs): + """Merges a certificate or a certificate chain with a key pair existing on + the server. + + The MergeCertificate operation performs the merging of a certificate or + certificate chain with a key pair currently available in the service. + This operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param x509_certificates: The certificate or the certificate chain to + merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateMergeParameters(x509_certificates=x509_certificates, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.merge_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateMergeParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [201]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 201: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + merge_certificate.metadata = {'url': '/certificates/{certificate-name}/pending/merge'} + + async def backup_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Backs up the specified certificate. + + Requests that a backup of the specified certificate be downloaded to + the client. All versions of the certificate will be downloaded. This + operation requires the certificates/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupCertificateResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupCertificateResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupCertificateResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_certificate.metadata = {'url': '/certificates/{certificate-name}/backup'} + + async def restore_certificate(self, vault_base_url, certificate_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up certificate to a vault. + + Restores a backed up certificate, and all its versions, to a vault. + This operation requires the certificates/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_bundle_backup: The backup blob associated with a + certificate bundle. + :type certificate_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateRestoreParameters(certificate_bundle_backup=certificate_bundle_backup) + + # Construct URL + url = self.restore_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_certificate.metadata = {'url': '/certificates/restore'} + + def get_deleted_certificates( + self, vault_base_url, maxresults=None, include_pending=None, *, cls=None, **kwargs): + """Lists the deleted certificates in the specified vault currently + available for recovery. + + The GetDeletedCertificates operation retrieves the certificates in the + current vault which are in a deleted state and ready for recovery or + purging. This operation includes deletion-specific information. This + operation requires the certificates/get/list permission. This operation + can only be enabled on soft-delete enabled vaults. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :return: An iterator like instance of DeletedCertificateItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.DeletedCertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + if include_pending is not None: + query_parameters['includePending'] = self._serialize.query("include_pending", include_pending, 'bool') + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedCertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_certificates.metadata = {'url': '/deletedcertificates'} + + async def get_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Retrieves information about the specified deleted certificate. + + The GetDeletedCertificate operation retrieves the deleted certificate + information plus its attributes, such as retention interval, scheduled + permanent deletion and the current deletion recovery level. This + operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + async def purge_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Permanently deletes the specified deleted certificate. + + The PurgeDeletedCertificate operation performs an irreversible deletion + of the specified certificate, without possibility for recovery. The + operation is not available if the recovery level does not specify + 'Purgeable'. This operation requires the certificate/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + async def recover_deleted_certificate(self, vault_base_url, certificate_name, *, cls=None, **kwargs): + """Recovers the deleted certificate back to its current version under + /certificates. + + The RecoverDeletedCertificate operation performs the reversal of the + Delete operation. The operation is applicable in vaults enabled for + soft-delete, and must be issued during the retention interval + (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the deleted certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}/recover'} + + def get_storage_accounts( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """List storage accounts managed by the specified key vault. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of StorageAccountItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.StorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('StorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_storage_accounts.metadata = {'url': '/storage'} + + def get_deleted_storage_accounts( + self, vault_base_url, maxresults=None, *, cls=None, **kwargs): + """Lists deleted storage accounts for the specified vault. + + The Get Deleted Storage Accounts operation returns the storage accounts + that have been deleted for a vault enabled for soft-delete. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedStorageAccountItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.DeletedStorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedStorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_storage_accounts.metadata = {'url': '/deletedstorage'} + + async def get_deleted_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Gets the specified deleted storage account. + + The Get Deleted Storage Account operation returns the specified deleted + storage account along with its attributes. This operation requires the + storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedStorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedStorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedStorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}'} + + async def purge_deleted_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Permanently deletes the specified storage account. + + The purge deleted storage account operation removes the secret + permanently, without the possibility of recovery. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the storage/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}'} + + async def recover_deleted_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Recovers the deleted storage account. + + Recovers the deleted storage account in the specified vault. This + operation can only be performed on a soft-delete enabled vault. This + operation requires the storage/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}/recover'} + + async def backup_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Backs up the specified storage account. + + Requests that a backup of the specified storage account be downloaded + to the client. This operation requires the storage/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupStorageResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupStorageResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupStorageResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_storage_account.metadata = {'url': '/storage/{storage-account-name}/backup'} + + async def restore_storage_account(self, vault_base_url, storage_bundle_backup, *, cls=None, **kwargs): + """Restores a backed up storage account to a vault. + + Restores a backed up storage account to a vault. This operation + requires the storage/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_bundle_backup: The backup blob associated with a + storage account. + :type storage_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageRestoreParameters(storage_bundle_backup=storage_bundle_backup) + + # Construct URL + url = self.restore_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_storage_account.metadata = {'url': '/storage/restore'} + + async def delete_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Deletes a storage account. This operation requires the storage/delete + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedStorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedStorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedStorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def get_storage_account(self, vault_base_url, storage_account_name, *, cls=None, **kwargs): + """Gets information about a specified storage account. This operation + requires the storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def set_storage_account(self, vault_base_url, storage_account_name, resource_id, active_key_name, auto_regenerate_key, regeneration_period=None, storage_account_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates or updates a new storage account. This operation requires the + storage/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param resource_id: Storage account resource id. + :type resource_id: str + :param active_key_name: Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountCreateParameters(resource_id=resource_id, active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.set_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def update_storage_account(self, vault_base_url, storage_account_name, active_key_name=None, auto_regenerate_key=None, regeneration_period=None, storage_account_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given storage + account. This operation requires the storage/set/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountUpdateParameters(active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.update_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + async def regenerate_storage_account_key(self, vault_base_url, storage_account_name, key_name, *, cls=None, **kwargs): + """Regenerates the specified key value for the given storage account. This + operation requires the storage/regeneratekey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param key_name: The storage account key name. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountRegenerteKeyParameters(key_name=key_name) + + # Construct URL + url = self.regenerate_storage_account_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountRegenerteKeyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + regenerate_storage_account_key.metadata = {'url': '/storage/{storage-account-name}/regeneratekey'} + + def get_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, *, cls=None, **kwargs): + """List storage SAS definitions for the given storage account. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SasDefinitionItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.SasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('SasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_sas_definitions.metadata = {'url': '/storage/{storage-account-name}/sas'} + + def get_deleted_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, *, cls=None, **kwargs): + """Lists deleted SAS definitions for the specified vault and storage + account. + + The Get Deleted Sas Definitions operation returns the SAS definitions + that have been deleted for a vault enabled for soft-delete. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSasDefinitionItem + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.keyvault.v7_0.models.DeletedSasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + async def extract_data_async(response): + deserialized = self._deserialize('DeletedSasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, AsyncList(list_of_elem) + + async def get_next_async(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return AsyncItemPaged( + get_next_async, extract_data_async + ) + get_deleted_sas_definitions.metadata = {'url': '/deletedstorage/{storage-account-name}/sas'} + + async def get_deleted_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Gets the specified deleted sas definition. + + The Get Deleted SAS Definition operation returns the specified deleted + SAS definition along with its attributes. This operation requires the + storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_sas_definition.metadata = {'url': '/deletedstorage/{storage-account-name}/sas/{sas-definition-name}'} + + async def recover_deleted_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Recovers the deleted SAS definition. + + Recovers the deleted SAS definition for the specified storage account. + This operation can only be performed on a soft-delete enabled vault. + This operation requires the storage/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_sas_definition.metadata = {'url': '/deletedstorage/{storage-account-name}/sas/{sas-definition-name}/recover'} + + async def delete_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Deletes a SAS definition from a specified storage account. This + operation requires the storage/deletesas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def get_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, *, cls=None, **kwargs): + """Gets information about a SAS definition for the specified storage + account. This operation requires the storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def set_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, template_uri, sas_type, validity_period, sas_definition_attributes=None, tags=None, *, cls=None, **kwargs): + """Creates or updates a new SAS definition for the specified storage + account. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will + have the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SasDefinitionCreateParameters(template_uri=template_uri, sas_type=sas_type, validity_period=validity_period, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.set_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SasDefinitionCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + async def update_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, template_uri=None, sas_type=None, validity_period=None, sas_definition_attributes=None, tags=None, *, cls=None, **kwargs): + """Updates the specified attributes associated with the given SAS + definition. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will + have the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SasDefinitionUpdateParameters(template_uri=template_uri, sas_type=sas_type, validity_period=validity_period, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.update_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SasDefinitionUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/__init__.py new file mode 100644 index 000000000000..5e72f49a73f6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/__init__.py @@ -0,0 +1,303 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +try: + from ._models_py3 import Action + from ._models_py3 import AdministratorDetails + from ._models_py3 import Attributes + from ._models_py3 import BackupCertificateResult + from ._models_py3 import BackupKeyResult + from ._models_py3 import BackupSecretResult + from ._models_py3 import BackupStorageResult + from ._models_py3 import CertificateAttributes + from ._models_py3 import CertificateBundle + from ._models_py3 import CertificateCreateParameters + from ._models_py3 import CertificateImportParameters + from ._models_py3 import CertificateIssuerItem + from ._models_py3 import CertificateIssuerListResult + from ._models_py3 import CertificateIssuerSetParameters + from ._models_py3 import CertificateIssuerUpdateParameters + from ._models_py3 import CertificateItem + from ._models_py3 import CertificateListResult + from ._models_py3 import CertificateMergeParameters + from ._models_py3 import CertificateOperation + from ._models_py3 import CertificateOperationUpdateParameter + from ._models_py3 import CertificatePolicy + from ._models_py3 import CertificateRestoreParameters + from ._models_py3 import CertificateUpdateParameters + from ._models_py3 import Contact + from ._models_py3 import Contacts + from ._models_py3 import DeletedCertificateBundle + from ._models_py3 import DeletedCertificateItem + from ._models_py3 import DeletedCertificateListResult + from ._models_py3 import DeletedKeyBundle + from ._models_py3 import DeletedKeyItem + from ._models_py3 import DeletedKeyListResult + from ._models_py3 import DeletedSasDefinitionBundle + from ._models_py3 import DeletedSasDefinitionItem + from ._models_py3 import DeletedSasDefinitionListResult + from ._models_py3 import DeletedSecretBundle + from ._models_py3 import DeletedSecretItem + from ._models_py3 import DeletedSecretListResult + from ._models_py3 import DeletedStorageAccountItem + from ._models_py3 import DeletedStorageBundle + from ._models_py3 import DeletedStorageListResult + from ._models_py3 import Error + from ._models_py3 import IssuerAttributes + from ._models_py3 import IssuerBundle + from ._models_py3 import IssuerCredentials + from ._models_py3 import IssuerParameters + from ._models_py3 import JsonWebKey + from ._models_py3 import KeyAttributes + from ._models_py3 import KeyBundle + from ._models_py3 import KeyCreateParameters + from ._models_py3 import KeyImportParameters + from ._models_py3 import KeyItem + from ._models_py3 import KeyListResult + from ._models_py3 import KeyOperationResult + from ._models_py3 import KeyOperationsParameters + from ._models_py3 import KeyProperties + from ._models_py3 import KeyRestoreParameters + from ._models_py3 import KeySignParameters + from ._models_py3 import KeyUpdateParameters + from ._models_py3 import KeyVaultError, KeyVaultErrorException + from ._models_py3 import KeyVerifyParameters + from ._models_py3 import KeyVerifyResult + from ._models_py3 import LifetimeAction + from ._models_py3 import OrganizationDetails + from ._models_py3 import PendingCertificateSigningRequestResult + from ._models_py3 import SasDefinitionAttributes + from ._models_py3 import SasDefinitionBundle + from ._models_py3 import SasDefinitionCreateParameters + from ._models_py3 import SasDefinitionItem + from ._models_py3 import SasDefinitionListResult + from ._models_py3 import SasDefinitionUpdateParameters + from ._models_py3 import SecretAttributes + from ._models_py3 import SecretBundle + from ._models_py3 import SecretItem + from ._models_py3 import SecretListResult + from ._models_py3 import SecretProperties + from ._models_py3 import SecretRestoreParameters + from ._models_py3 import SecretSetParameters + from ._models_py3 import SecretUpdateParameters + from ._models_py3 import StorageAccountAttributes + from ._models_py3 import StorageAccountCreateParameters + from ._models_py3 import StorageAccountItem + from ._models_py3 import StorageAccountRegenerteKeyParameters + from ._models_py3 import StorageAccountUpdateParameters + from ._models_py3 import StorageBundle + from ._models_py3 import StorageListResult + from ._models_py3 import StorageRestoreParameters + from ._models_py3 import SubjectAlternativeNames + from ._models_py3 import Trigger + from ._models_py3 import X509CertificateProperties +except (SyntaxError, ImportError): + from ._models import Action + from ._models import AdministratorDetails + from ._models import Attributes + from ._models import BackupCertificateResult + from ._models import BackupKeyResult + from ._models import BackupSecretResult + from ._models import BackupStorageResult + from ._models import CertificateAttributes + from ._models import CertificateBundle + from ._models import CertificateCreateParameters + from ._models import CertificateImportParameters + from ._models import CertificateIssuerItem + from ._models import CertificateIssuerListResult + from ._models import CertificateIssuerSetParameters + from ._models import CertificateIssuerUpdateParameters + from ._models import CertificateItem + from ._models import CertificateListResult + from ._models import CertificateMergeParameters + from ._models import CertificateOperation + from ._models import CertificateOperationUpdateParameter + from ._models import CertificatePolicy + from ._models import CertificateRestoreParameters + from ._models import CertificateUpdateParameters + from ._models import Contact + from ._models import Contacts + from ._models import DeletedCertificateBundle + from ._models import DeletedCertificateItem + from ._models import DeletedCertificateListResult + from ._models import DeletedKeyBundle + from ._models import DeletedKeyItem + from ._models import DeletedKeyListResult + from ._models import DeletedSasDefinitionBundle + from ._models import DeletedSasDefinitionItem + from ._models import DeletedSasDefinitionListResult + from ._models import DeletedSecretBundle + from ._models import DeletedSecretItem + from ._models import DeletedSecretListResult + from ._models import DeletedStorageAccountItem + from ._models import DeletedStorageBundle + from ._models import DeletedStorageListResult + from ._models import Error + from ._models import IssuerAttributes + from ._models import IssuerBundle + from ._models import IssuerCredentials + from ._models import IssuerParameters + from ._models import JsonWebKey + from ._models import KeyAttributes + from ._models import KeyBundle + from ._models import KeyCreateParameters + from ._models import KeyImportParameters + from ._models import KeyItem + from ._models import KeyListResult + from ._models import KeyOperationResult + from ._models import KeyOperationsParameters + from ._models import KeyProperties + from ._models import KeyRestoreParameters + from ._models import KeySignParameters + from ._models import KeyUpdateParameters + from ._models import KeyVaultError, KeyVaultErrorException + from ._models import KeyVerifyParameters + from ._models import KeyVerifyResult + from ._models import LifetimeAction + from ._models import OrganizationDetails + from ._models import PendingCertificateSigningRequestResult + from ._models import SasDefinitionAttributes + from ._models import SasDefinitionBundle + from ._models import SasDefinitionCreateParameters + from ._models import SasDefinitionItem + from ._models import SasDefinitionListResult + from ._models import SasDefinitionUpdateParameters + from ._models import SecretAttributes + from ._models import SecretBundle + from ._models import SecretItem + from ._models import SecretListResult + from ._models import SecretProperties + from ._models import SecretRestoreParameters + from ._models import SecretSetParameters + from ._models import SecretUpdateParameters + from ._models import StorageAccountAttributes + from ._models import StorageAccountCreateParameters + from ._models import StorageAccountItem + from ._models import StorageAccountRegenerteKeyParameters + from ._models import StorageAccountUpdateParameters + from ._models import StorageBundle + from ._models import StorageListResult + from ._models import StorageRestoreParameters + from ._models import SubjectAlternativeNames + from ._models import Trigger + from ._models import X509CertificateProperties +from ._key_vault_client_enums import ( + JsonWebKeyType, + JsonWebKeyCurveName, + DeletionRecoveryLevel, + KeyUsageType, + ActionType, + JsonWebKeyOperation, + JsonWebKeyEncryptionAlgorithm, + JsonWebKeySignatureAlgorithm, + SasTokenType, +) + +__all__ = [ + 'Action', + 'AdministratorDetails', + 'Attributes', + 'BackupCertificateResult', + 'BackupKeyResult', + 'BackupSecretResult', + 'BackupStorageResult', + 'CertificateAttributes', + 'CertificateBundle', + 'CertificateCreateParameters', + 'CertificateImportParameters', + 'CertificateIssuerItem', + 'CertificateIssuerListResult', + 'CertificateIssuerSetParameters', + 'CertificateIssuerUpdateParameters', + 'CertificateItem', + 'CertificateListResult', + 'CertificateMergeParameters', + 'CertificateOperation', + 'CertificateOperationUpdateParameter', + 'CertificatePolicy', + 'CertificateRestoreParameters', + 'CertificateUpdateParameters', + 'Contact', + 'Contacts', + 'DeletedCertificateBundle', + 'DeletedCertificateItem', + 'DeletedCertificateListResult', + 'DeletedKeyBundle', + 'DeletedKeyItem', + 'DeletedKeyListResult', + 'DeletedSasDefinitionBundle', + 'DeletedSasDefinitionItem', + 'DeletedSasDefinitionListResult', + 'DeletedSecretBundle', + 'DeletedSecretItem', + 'DeletedSecretListResult', + 'DeletedStorageAccountItem', + 'DeletedStorageBundle', + 'DeletedStorageListResult', + 'Error', + 'IssuerAttributes', + 'IssuerBundle', + 'IssuerCredentials', + 'IssuerParameters', + 'JsonWebKey', + 'KeyAttributes', + 'KeyBundle', + 'KeyCreateParameters', + 'KeyImportParameters', + 'KeyItem', + 'KeyListResult', + 'KeyOperationResult', + 'KeyOperationsParameters', + 'KeyProperties', + 'KeyRestoreParameters', + 'KeySignParameters', + 'KeyUpdateParameters', + 'KeyVaultError', 'KeyVaultErrorException', + 'KeyVerifyParameters', + 'KeyVerifyResult', + 'LifetimeAction', + 'OrganizationDetails', + 'PendingCertificateSigningRequestResult', + 'SasDefinitionAttributes', + 'SasDefinitionBundle', + 'SasDefinitionCreateParameters', + 'SasDefinitionItem', + 'SasDefinitionListResult', + 'SasDefinitionUpdateParameters', + 'SecretAttributes', + 'SecretBundle', + 'SecretItem', + 'SecretListResult', + 'SecretProperties', + 'SecretRestoreParameters', + 'SecretSetParameters', + 'SecretUpdateParameters', + 'StorageAccountAttributes', + 'StorageAccountCreateParameters', + 'StorageAccountItem', + 'StorageAccountRegenerteKeyParameters', + 'StorageAccountUpdateParameters', + 'StorageBundle', + 'StorageListResult', + 'StorageRestoreParameters', + 'SubjectAlternativeNames', + 'Trigger', + 'X509CertificateProperties', + 'JsonWebKeyType', + 'JsonWebKeyCurveName', + 'DeletionRecoveryLevel', + 'KeyUsageType', + 'ActionType', + 'JsonWebKeyOperation', + 'JsonWebKeyEncryptionAlgorithm', + 'JsonWebKeySignatureAlgorithm', + 'SasTokenType', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_key_vault_client_enums.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_key_vault_client_enums.py new file mode 100644 index 000000000000..046a304e990a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_key_vault_client_enums.py @@ -0,0 +1,94 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from enum import Enum + + +class JsonWebKeyType(str, Enum): + + ec = "EC" #: Elliptic Curve. + ec_hsm = "EC-HSM" #: Elliptic Curve with a private key which is not exportable from the HSM. + rsa = "RSA" #: RSA (https://tools.ietf.org/html/rfc3447) + rsa_hsm = "RSA-HSM" #: RSA with a private key which is not exportable from the HSM. + oct = "oct" #: Octet sequence (used to represent symmetric keys) + + +class JsonWebKeyCurveName(str, Enum): + + p_256 = "P-256" #: The NIST P-256 elliptic curve, AKA SECG curve SECP256R1. + p_384 = "P-384" #: The NIST P-384 elliptic curve, AKA SECG curve SECP384R1. + p_521 = "P-521" #: The NIST P-521 elliptic curve, AKA SECG curve SECP521R1. + p_256_k = "P-256K" #: The SECG SECP256K1 elliptic curve. + + +class DeletionRecoveryLevel(str, Enum): + + purgeable = "Purgeable" + recoverable_purgeable = "Recoverable+Purgeable" + recoverable = "Recoverable" + recoverable_protected_subscription = "Recoverable+ProtectedSubscription" + + +class KeyUsageType(str, Enum): + + digital_signature = "digitalSignature" + non_repudiation = "nonRepudiation" + key_encipherment = "keyEncipherment" + data_encipherment = "dataEncipherment" + key_agreement = "keyAgreement" + key_cert_sign = "keyCertSign" + c_rl_sign = "cRLSign" + encipher_only = "encipherOnly" + decipher_only = "decipherOnly" + + +class ActionType(str, Enum): + + email_contacts = "EmailContacts" + auto_renew = "AutoRenew" + + +class JsonWebKeyOperation(str, Enum): + + encrypt = "encrypt" + decrypt = "decrypt" + sign = "sign" + verify = "verify" + wrap_key = "wrapKey" + unwrap_key = "unwrapKey" + + +class JsonWebKeyEncryptionAlgorithm(str, Enum): + + rsa_oaep = "RSA-OAEP" + rsa_oaep_256 = "RSA-OAEP-256" + rsa1_5 = "RSA1_5" + + +class JsonWebKeySignatureAlgorithm(str, Enum): + + ps256 = "PS256" #: RSASSA-PSS using SHA-256 and MGF1 with SHA-256, as described in https://tools.ietf.org/html/rfc7518 + ps384 = "PS384" #: RSASSA-PSS using SHA-384 and MGF1 with SHA-384, as described in https://tools.ietf.org/html/rfc7518 + ps512 = "PS512" #: RSASSA-PSS using SHA-512 and MGF1 with SHA-512, as described in https://tools.ietf.org/html/rfc7518 + rs256 = "RS256" #: RSASSA-PKCS1-v1_5 using SHA-256, as described in https://tools.ietf.org/html/rfc7518 + rs384 = "RS384" #: RSASSA-PKCS1-v1_5 using SHA-384, as described in https://tools.ietf.org/html/rfc7518 + rs512 = "RS512" #: RSASSA-PKCS1-v1_5 using SHA-512, as described in https://tools.ietf.org/html/rfc7518 + rsnull = "RSNULL" #: Reserved + es256 = "ES256" #: ECDSA using P-256 and SHA-256, as described in https://tools.ietf.org/html/rfc7518. + es384 = "ES384" #: ECDSA using P-384 and SHA-384, as described in https://tools.ietf.org/html/rfc7518 + es512 = "ES512" #: ECDSA using P-521 and SHA-512, as described in https://tools.ietf.org/html/rfc7518 + es256_k = "ES256K" #: ECDSA using P-256K and SHA-256, as described in https://tools.ietf.org/html/rfc7518 + + +class SasTokenType(str, Enum): + + account = "account" + service = "service" diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models.py new file mode 100644 index 000000000000..8b8ed5a83d62 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models.py @@ -0,0 +1,3208 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from msrest.serialization import Model +from azure.core import HttpResponseError + + +class Action(Model): + """The action that will be executed. + + :param action_type: The type of the action. Possible values include: + 'EmailContacts', 'AutoRenew' + :type action_type: str or ~azure.keyvault.v7_0.models.ActionType + """ + + _attribute_map = { + 'action_type': {'key': 'action_type', 'type': 'ActionType'}, + } + + def __init__(self, **kwargs): + super(Action, self).__init__(**kwargs) + self.action_type = kwargs.get('action_type', None) + + +class AdministratorDetails(Model): + """Details of the organization administrator of the certificate issuer. + + :param first_name: First name. + :type first_name: str + :param last_name: Last name. + :type last_name: str + :param email_address: Email address. + :type email_address: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'first_name': {'key': 'first_name', 'type': 'str'}, + 'last_name': {'key': 'last_name', 'type': 'str'}, + 'email_address': {'key': 'email', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(AdministratorDetails, self).__init__(**kwargs) + self.first_name = kwargs.get('first_name', None) + self.last_name = kwargs.get('last_name', None) + self.email_address = kwargs.get('email_address', None) + self.phone = kwargs.get('phone', None) + + +class Attributes(Model): + """The object attributes managed by the KeyVault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(Attributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.not_before = kwargs.get('not_before', None) + self.expires = kwargs.get('expires', None) + self.created = None + self.updated = None + + +class BackupCertificateResult(Model): + """The backup certificate result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up certificate. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupCertificateResult, self).__init__(**kwargs) + self.value = None + + +class BackupKeyResult(Model): + """The backup key result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up key. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupKeyResult, self).__init__(**kwargs) + self.value = None + + +class BackupSecretResult(Model): + """The backup secret result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up secret. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupSecretResult, self).__init__(**kwargs) + self.value = None + + +class BackupStorageResult(Model): + """The backup storage result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up storage account. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(BackupStorageResult, self).__init__(**kwargs) + self.value = None + + +class CertificateAttributes(Attributes): + """The certificate management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for certificates in the current vault. If it contains 'Purgeable', + the certificate can be permanently deleted by a privileged user; + otherwise, only the system can purge the certificate, at the end of the + retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class CertificateBundle(Model): + """A certificate bundle consists of a certificate (X509) plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateBundle, self).__init__(**kwargs) + self.id = None + self.kid = None + self.sid = None + self.x509_thumbprint = None + self.policy = None + self.cer = kwargs.get('cer', None) + self.content_type = kwargs.get('content_type', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateCreateParameters(Model): + """The certificate create parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateCreateParameters, self).__init__(**kwargs) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateImportParameters(Model): + """The certificate import parameters. + + All required parameters must be populated in order to send to Azure. + + :param base64_encoded_certificate: Required. Base64 encoded representation + of the certificate object to import. This certificate needs to contain the + private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'base64_encoded_certificate': {'required': True}, + } + + _attribute_map = { + 'base64_encoded_certificate': {'key': 'value', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateImportParameters, self).__init__(**kwargs) + self.base64_encoded_certificate = kwargs.get('base64_encoded_certificate', None) + self.password = kwargs.get('password', None) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateIssuerItem(Model): + """The certificate issuer item containing certificate issuer metadata. + + :param id: Certificate Identifier. + :type id: str + :param provider: The issuer provider. + :type provider: str + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.provider = kwargs.get('provider', None) + + +class CertificateIssuerListResult(Model): + """The certificate issuer list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificate issuers + in the key vault along with a link to the next page of certificate + issuers. + :vartype value: list[~azure.keyvault.v7_0.models.CertificateIssuerItem] + :ivar next_link: The URL to get the next set of certificate issuers. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateIssuerItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateIssuerSetParameters(Model): + """The certificate issuer set parameters. + + All required parameters must be populated in order to send to Azure. + + :param provider: Required. The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _validation = { + 'provider': {'required': True}, + } + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerSetParameters, self).__init__(**kwargs) + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateIssuerUpdateParameters(Model): + """The certificate issuer update parameters. + + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificateIssuerUpdateParameters, self).__init__(**kwargs) + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateItem(Model): + """The certificate item containing certificate metadata. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(CertificateItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.x509_thumbprint = kwargs.get('x509_thumbprint', None) + + +class CertificateListResult(Model): + """The certificate list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificates in the + key vault along with a link to the next page of certificates. + :vartype value: list[~azure.keyvault.v7_0.models.CertificateItem] + :ivar next_link: The URL to get the next set of certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateMergeParameters(Model): + """The certificate merge parameters. + + All required parameters must be populated in order to send to Azure. + + :param x509_certificates: Required. The certificate or the certificate + chain to merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'x509_certificates': {'required': True}, + } + + _attribute_map = { + 'x509_certificates': {'key': 'x5c', 'type': '[bytearray]'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateMergeParameters, self).__init__(**kwargs) + self.x509_certificates = kwargs.get('x509_certificates', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class CertificateOperation(Model): + """A certificate operation is returned in case of asynchronous requests. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: ~azure.keyvault.v7_0.models.IssuerParameters + :param csr: The certificate signing request (CSR) that is being used in + the certificate operation. + :type csr: bytearray + :param cancellation_requested: Indicates if cancellation was requested on + the certificate operation. + :type cancellation_requested: bool + :param status: Status of the certificate operation. + :type status: str + :param status_details: The status details of the certificate operation. + :type status_details: str + :param error: Error encountered, if any, during the certificate operation. + :type error: ~azure.keyvault.v7_0.models.Error + :param target: Location which contains the result of the certificate + operation. + :type target: str + :param request_id: Identifier for the certificate operation. + :type request_id: str + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'csr': {'key': 'csr', 'type': 'bytearray'}, + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + 'status': {'key': 'status', 'type': 'str'}, + 'status_details': {'key': 'status_details', 'type': 'str'}, + 'error': {'key': 'error', 'type': 'Error'}, + 'target': {'key': 'target', 'type': 'str'}, + 'request_id': {'key': 'request_id', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(CertificateOperation, self).__init__(**kwargs) + self.id = None + self.issuer_parameters = kwargs.get('issuer_parameters', None) + self.csr = kwargs.get('csr', None) + self.cancellation_requested = kwargs.get('cancellation_requested', None) + self.status = kwargs.get('status', None) + self.status_details = kwargs.get('status_details', None) + self.error = kwargs.get('error', None) + self.target = kwargs.get('target', None) + self.request_id = kwargs.get('request_id', None) + + +class CertificateOperationUpdateParameter(Model): + """The certificate operation update parameters. + + All required parameters must be populated in order to send to Azure. + + :param cancellation_requested: Required. Indicates if cancellation was + requested on the certificate operation. + :type cancellation_requested: bool + """ + + _validation = { + 'cancellation_requested': {'required': True}, + } + + _attribute_map = { + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(CertificateOperationUpdateParameter, self).__init__(**kwargs) + self.cancellation_requested = kwargs.get('cancellation_requested', None) + + +class CertificatePolicy(Model): + """Management policy for a certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param key_properties: Properties of the key backing a certificate. + :type key_properties: ~azure.keyvault.v7_0.models.KeyProperties + :param secret_properties: Properties of the secret backing a certificate. + :type secret_properties: ~azure.keyvault.v7_0.models.SecretProperties + :param x509_certificate_properties: Properties of the X509 component of a + certificate. + :type x509_certificate_properties: + ~azure.keyvault.v7_0.models.X509CertificateProperties + :param lifetime_actions: Actions that will be performed by Key Vault over + the lifetime of a certificate. + :type lifetime_actions: list[~azure.keyvault.v7_0.models.LifetimeAction] + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: ~azure.keyvault.v7_0.models.IssuerParameters + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'key_properties': {'key': 'key_props', 'type': 'KeyProperties'}, + 'secret_properties': {'key': 'secret_props', 'type': 'SecretProperties'}, + 'x509_certificate_properties': {'key': 'x509_props', 'type': 'X509CertificateProperties'}, + 'lifetime_actions': {'key': 'lifetime_actions', 'type': '[LifetimeAction]'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + } + + def __init__(self, **kwargs): + super(CertificatePolicy, self).__init__(**kwargs) + self.id = None + self.key_properties = kwargs.get('key_properties', None) + self.secret_properties = kwargs.get('secret_properties', None) + self.x509_certificate_properties = kwargs.get('x509_certificate_properties', None) + self.lifetime_actions = kwargs.get('lifetime_actions', None) + self.issuer_parameters = kwargs.get('issuer_parameters', None) + self.attributes = kwargs.get('attributes', None) + + +class CertificateRestoreParameters(Model): + """The certificate restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param certificate_bundle_backup: Required. The backup blob associated + with a certificate bundle. + :type certificate_bundle_backup: bytes + """ + + _validation = { + 'certificate_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'certificate_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(CertificateRestoreParameters, self).__init__(**kwargs) + self.certificate_bundle_backup = kwargs.get('certificate_bundle_backup', None) + + +class CertificateUpdateParameters(Model): + """The certificate update parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(CertificateUpdateParameters, self).__init__(**kwargs) + self.certificate_policy = kwargs.get('certificate_policy', None) + self.certificate_attributes = kwargs.get('certificate_attributes', None) + self.tags = kwargs.get('tags', None) + + +class Contact(Model): + """The contact information for the vault certificates. + + :param email_address: Email address. + :type email_address: str + :param name: Name. + :type name: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'email_address': {'key': 'email', 'type': 'str'}, + 'name': {'key': 'name', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(Contact, self).__init__(**kwargs) + self.email_address = kwargs.get('email_address', None) + self.name = kwargs.get('name', None) + self.phone = kwargs.get('phone', None) + + +class Contacts(Model): + """The contacts for the vault certificates. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the contacts collection. + :vartype id: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v7_0.models.Contact] + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'contact_list': {'key': 'contacts', 'type': '[Contact]'}, + } + + def __init__(self, **kwargs): + super(Contacts, self).__init__(**kwargs) + self.id = None + self.contact_list = kwargs.get('contact_list', None) + + +class DeletedCertificateBundle(CertificateBundle): + """A Deleted Certificate consisting of its previous id, attributes and its + tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateItem(CertificateItem): + """The deleted certificate item containing metadata about the deleted + certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateListResult(Model): + """A list of certificates that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted certificates + in the vault along with a link to the next page of deleted certificates + :vartype value: list[~azure.keyvault.v7_0.models.DeletedCertificateItem] + :ivar next_link: The URL to get the next set of deleted certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedCertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedCertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyBundle(Model): + """A KeyBundle consisting of a WebKey plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyBundle, self).__init__(**kwargs) + self.key = kwargs.get('key', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.managed = None + + +class DeletedKeyBundle(KeyBundle): + """A DeletedKeyBundle consisting of a WebKey plus its Attributes and deletion + info. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class KeyItem(Model): + """The key item containing key metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyItem, self).__init__(**kwargs) + self.kid = kwargs.get('kid', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.managed = None + + +class DeletedKeyItem(KeyItem): + """The deleted key item containing the deleted key metadata and information + about deletion. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedKeyListResult(Model): + """A list of keys that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted keys in the + vault along with a link to the next page of deleted keys + :vartype value: list[~azure.keyvault.v7_0.models.DeletedKeyItem] + :ivar next_link: The URL to get the next set of deleted keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedKeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedKeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionBundle(Model): + """A SAS definition bundle consists of key vault SAS definition details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :vartype template_uri: str + :ivar sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :vartype sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :ivar validity_period: The validity period of SAS tokens created according + to the SAS definition. + :vartype validity_period: str + :ivar attributes: The SAS definition attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'template_uri': {'readonly': True}, + 'sas_type': {'readonly': True}, + 'validity_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionBundle, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.template_uri = None + self.sas_type = None + self.validity_period = None + self.attributes = None + self.tags = None + + +class DeletedSasDefinitionBundle(SasDefinitionBundle): + """A deleted SAS definition bundle consisting of its previous id, attributes + and its tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :vartype template_uri: str + :ivar sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :vartype sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :ivar validity_period: The validity period of SAS tokens created according + to the SAS definition. + :vartype validity_period: str + :ivar attributes: The SAS definition attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted SAS definition. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the SAS definition is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the SAS definition was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'template_uri': {'readonly': True}, + 'sas_type': {'readonly': True}, + 'validity_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSasDefinitionBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class SasDefinitionItem(Model): + """The SAS definition item containing storage SAS definition metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionItem, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.attributes = None + self.tags = None + + +class DeletedSasDefinitionItem(SasDefinitionItem): + """The deleted SAS definition item containing metadata about the deleted SAS + definition. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted SAS definition. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the SAS definition is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the SAS definition was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSasDefinitionItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSasDefinitionListResult(Model): + """The deleted SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted SAS + definitions in the vault along with a link to the next page of deleted sas + definitions + :vartype value: list[~azure.keyvault.v7_0.models.DeletedSasDefinitionItem] + :ivar next_link: The URL to get the next set of deleted SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedSasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretBundle(Model): + """A secret consisting of a value, id and its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(SecretBundle, self).__init__(**kwargs) + self.value = kwargs.get('value', None) + self.id = kwargs.get('id', None) + self.content_type = kwargs.get('content_type', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.kid = None + self.managed = None + + +class DeletedSecretBundle(SecretBundle): + """A Deleted Secret consisting of its previous id, attributes and its tags, as + well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class SecretItem(Model): + """The secret item containing secret metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(SecretItem, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.attributes = kwargs.get('attributes', None) + self.tags = kwargs.get('tags', None) + self.content_type = kwargs.get('content_type', None) + self.managed = None + + +class DeletedSecretItem(SecretItem): + """The deleted secret item containing metadata about the deleted secret. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSecretListResult(Model): + """The deleted secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted secrets + in the vault along with a link to the next page of deleted secrets + :vartype value: list[~azure.keyvault.v7_0.models.DeletedSecretItem] + :ivar next_link: The URL to get the next set of deleted secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedSecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class StorageAccountItem(Model): + """The storage account item containing storage account metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountItem, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.attributes = None + self.tags = None + + +class DeletedStorageAccountItem(StorageAccountItem): + """The deleted storage account item containing metadata about the deleted + storage account. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted storage account. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the storage account is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the storage account was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedStorageAccountItem, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class StorageBundle(Model): + """A Storage account bundle consists of key vault storage account details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageBundle, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.active_key_name = None + self.auto_regenerate_key = None + self.regeneration_period = None + self.attributes = None + self.tags = None + + +class DeletedStorageBundle(StorageBundle): + """A deleted storage account bundle consisting of its previous id, attributes + and its tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted storage account. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the storage account is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the storage account was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(DeletedStorageBundle, self).__init__(**kwargs) + self.recovery_id = kwargs.get('recovery_id', None) + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedStorageListResult(Model): + """The deleted storage account list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted storage + accounts in the vault along with a link to the next page of deleted + storage accounts + :vartype value: + list[~azure.keyvault.v7_0.models.DeletedStorageAccountItem] + :ivar next_link: The URL to get the next set of deleted storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedStorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(DeletedStorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class Error(Model): + """The key vault server error. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar code: The error code. + :vartype code: str + :ivar message: The error message. + :vartype message: str + :ivar inner_error: + :vartype inner_error: ~azure.keyvault.v7_0.models.Error + """ + + _validation = { + 'code': {'readonly': True}, + 'message': {'readonly': True}, + 'inner_error': {'readonly': True}, + } + + _attribute_map = { + 'code': {'key': 'code', 'type': 'str'}, + 'message': {'key': 'message', 'type': 'str'}, + 'inner_error': {'key': 'innererror', 'type': 'Error'}, + } + + def __init__(self, **kwargs): + super(Error, self).__init__(**kwargs) + self.code = None + self.message = None + self.inner_error = None + + +class IssuerAttributes(Model): + """The attributes of an issuer managed by the Key Vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, **kwargs): + super(IssuerAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + + +class IssuerBundle(Model): + """The issuer for Key Vault certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the issuer object. + :vartype id: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, **kwargs): + super(IssuerBundle, self).__init__(**kwargs) + self.id = None + self.provider = kwargs.get('provider', None) + self.credentials = kwargs.get('credentials', None) + self.organization_details = kwargs.get('organization_details', None) + self.attributes = kwargs.get('attributes', None) + + +class IssuerCredentials(Model): + """The credentials to be used for the certificate issuer. + + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + """ + + _attribute_map = { + 'account_id': {'key': 'account_id', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(IssuerCredentials, self).__init__(**kwargs) + self.account_id = kwargs.get('account_id', None) + self.password = kwargs.get('password', None) + + +class IssuerParameters(Model): + """Parameters for the issuer of the X509 component of a certificate. + + :param name: Name of the referenced issuer object or reserved names; for + example, 'Self' or 'Unknown'. + :type name: str + :param certificate_type: Type of certificate to be requested from the + issuer provider. + :type certificate_type: str + :param certificate_transparency: Indicates if the certificates generated + under this policy should be published to certificate transparency logs. + :type certificate_transparency: bool + """ + + _attribute_map = { + 'name': {'key': 'name', 'type': 'str'}, + 'certificate_type': {'key': 'cty', 'type': 'str'}, + 'certificate_transparency': {'key': 'cert_transparency', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(IssuerParameters, self).__init__(**kwargs) + self.name = kwargs.get('name', None) + self.certificate_type = kwargs.get('certificate_type', None) + self.certificate_transparency = kwargs.get('certificate_transparency', None) + + +class JsonWebKey(Model): + """As of http://tools.ietf.org/html/draft-ietf-jose-json-web-key-18. + + :param kid: Key identifier. + :type kid: str + :param kty: JsonWebKey Key Type (kty), as defined in + https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40. + Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_ops: + :type key_ops: list[str] + :param n: RSA modulus. + :type n: bytes + :param e: RSA public exponent. + :type e: bytes + :param d: RSA private exponent, or the D component of an EC private key. + :type d: bytes + :param dp: RSA private key parameter. + :type dp: bytes + :param dq: RSA private key parameter. + :type dq: bytes + :param qi: RSA private key parameter. + :type qi: bytes + :param p: RSA secret prime. + :type p: bytes + :param q: RSA secret prime, with p < q. + :type q: bytes + :param k: Symmetric key. + :type k: bytes + :param t: HSM Token, used with 'Bring Your Own Key'. + :type t: bytes + :param crv: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type crv: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + :param x: X component of an EC public key. + :type x: bytes + :param y: Y component of an EC public key. + :type y: bytes + """ + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'n': {'key': 'n', 'type': 'base64'}, + 'e': {'key': 'e', 'type': 'base64'}, + 'd': {'key': 'd', 'type': 'base64'}, + 'dp': {'key': 'dp', 'type': 'base64'}, + 'dq': {'key': 'dq', 'type': 'base64'}, + 'qi': {'key': 'qi', 'type': 'base64'}, + 'p': {'key': 'p', 'type': 'base64'}, + 'q': {'key': 'q', 'type': 'base64'}, + 'k': {'key': 'k', 'type': 'base64'}, + 't': {'key': 'key_hsm', 'type': 'base64'}, + 'crv': {'key': 'crv', 'type': 'str'}, + 'x': {'key': 'x', 'type': 'base64'}, + 'y': {'key': 'y', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(JsonWebKey, self).__init__(**kwargs) + self.kid = kwargs.get('kid', None) + self.kty = kwargs.get('kty', None) + self.key_ops = kwargs.get('key_ops', None) + self.n = kwargs.get('n', None) + self.e = kwargs.get('e', None) + self.d = kwargs.get('d', None) + self.dp = kwargs.get('dp', None) + self.dq = kwargs.get('dq', None) + self.qi = kwargs.get('qi', None) + self.p = kwargs.get('p', None) + self.q = kwargs.get('q', None) + self.k = kwargs.get('k', None) + self.t = kwargs.get('t', None) + self.crv = kwargs.get('crv', None) + self.x = kwargs.get('x', None) + self.y = kwargs.get('y', None) + + +class KeyAttributes(Attributes): + """The attributes of a key managed by the key vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for keys in the current vault. If it contains 'Purgeable' the key + can be permanently deleted by a privileged user; otherwise, only the + system can purge the key, at the end of the retention interval. Possible + values include: 'Purgeable', 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class KeyCreateParameters(Model): + """The key create parameters. + + All required parameters must be populated in order to send to Azure. + + :param kty: Required. The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', + 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + """ + + _validation = { + 'kty': {'required': True, 'min_length': 1}, + } + + _attribute_map = { + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyCreateParameters, self).__init__(**kwargs) + self.kty = kwargs.get('kty', None) + self.key_size = kwargs.get('key_size', None) + self.key_ops = kwargs.get('key_ops', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + self.curve = kwargs.get('curve', None) + + +class KeyImportParameters(Model): + """The key import parameters. + + All required parameters must be populated in order to send to Azure. + + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key: Required. The Json web key + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'key': {'required': True}, + } + + _attribute_map = { + 'hsm': {'key': 'Hsm', 'type': 'bool'}, + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(KeyImportParameters, self).__init__(**kwargs) + self.hsm = kwargs.get('hsm', None) + self.key = kwargs.get('key', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + + +class KeyListResult(Model): + """The key list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of keys in the key vault + along with a link to the next page of keys. + :vartype value: list[~azure.keyvault.v7_0.models.KeyItem] + :ivar next_link: The URL to get the next set of keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[KeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyOperationResult(Model): + """The key operation result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar kid: Key identifier + :vartype kid: str + :ivar result: + :vartype result: bytes + """ + + _validation = { + 'kid': {'readonly': True}, + 'result': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'result': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyOperationResult, self).__init__(**kwargs) + self.kid = None + self.result = None + + +class KeyOperationsParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyOperationsParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.value = kwargs.get('value', None) + + +class KeyProperties(Model): + """Properties of the key pair backing a certificate. + + :param exportable: Indicates if the private key can be exported. + :type exportable: bool + :param key_type: The type of key pair to be used for the certificate. + Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type key_type: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param reuse_key: Indicates if the same key pair will be used on + certificate renewal. + :type reuse_key: bool + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + """ + + _attribute_map = { + 'exportable': {'key': 'exportable', 'type': 'bool'}, + 'key_type': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'reuse_key': {'key': 'reuse_key', 'type': 'bool'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(KeyProperties, self).__init__(**kwargs) + self.exportable = kwargs.get('exportable', None) + self.key_type = kwargs.get('key_type', None) + self.key_size = kwargs.get('key_size', None) + self.reuse_key = kwargs.get('reuse_key', None) + self.curve = kwargs.get('curve', None) + + +class KeyRestoreParameters(Model): + """The key restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_bundle_backup: Required. The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + """ + + _validation = { + 'key_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'key_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyRestoreParameters, self).__init__(**kwargs) + self.key_bundle_backup = kwargs.get('key_bundle_backup', None) + + +class KeySignParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm identifier. + For more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', 'PS384', + 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', + 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeySignParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.value = kwargs.get('value', None) + + +class KeyUpdateParameters(Model): + """The key update parameters. + + :param key_ops: Json web key operations. For more information on possible + key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(KeyUpdateParameters, self).__init__(**kwargs) + self.key_ops = kwargs.get('key_ops', None) + self.key_attributes = kwargs.get('key_attributes', None) + self.tags = kwargs.get('tags', None) + + +class KeyVaultError(Model): + """The key vault error exception. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar error: + :vartype error: ~azure.keyvault.v7_0.models.Error + """ + + _validation = { + 'error': {'readonly': True}, + } + + _attribute_map = { + 'error': {'key': 'error', 'type': 'Error'}, + } + + def __init__(self, **kwargs): + super(KeyVaultError, self).__init__(**kwargs) + self.error = None + + +class KeyVaultErrorException(HttpResponseError): + """Server responsed with exception of type: 'KeyVaultError'. + + :param deserialize: A deserializer + :param response: Server response to be deserialized. + """ + + def __init__(self, response, deserialize, *args): + + model_name = 'KeyVaultError' + self.error = deserialize(model_name, response) + if self.error is None: + self.error = deserialize.dependencies[model_name]() + super(KeyVaultErrorException, self).__init__(response=response) + + +class KeyVerifyParameters(Model): + """The key verify parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm. For more + information on possible algorithm types, see JsonWebKeySignatureAlgorithm. + Possible values include: 'PS256', 'PS384', 'PS512', 'RS256', 'RS384', + 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param digest: Required. The digest used for signing. + :type digest: bytes + :param signature: Required. The signature to be verified. + :type signature: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'digest': {'required': True}, + 'signature': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'digest': {'key': 'digest', 'type': 'base64'}, + 'signature': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(KeyVerifyParameters, self).__init__(**kwargs) + self.algorithm = kwargs.get('algorithm', None) + self.digest = kwargs.get('digest', None) + self.signature = kwargs.get('signature', None) + + +class KeyVerifyResult(Model): + """The key verify result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: True if the signature is verified, otherwise false. + :vartype value: bool + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'bool'}, + } + + def __init__(self, **kwargs): + super(KeyVerifyResult, self).__init__(**kwargs) + self.value = None + + +class LifetimeAction(Model): + """Action and its trigger that will be performed by Key Vault over the + lifetime of a certificate. + + :param trigger: The condition that will execute the action. + :type trigger: ~azure.keyvault.v7_0.models.Trigger + :param action: The action that will be executed. + :type action: ~azure.keyvault.v7_0.models.Action + """ + + _attribute_map = { + 'trigger': {'key': 'trigger', 'type': 'Trigger'}, + 'action': {'key': 'action', 'type': 'Action'}, + } + + def __init__(self, **kwargs): + super(LifetimeAction, self).__init__(**kwargs) + self.trigger = kwargs.get('trigger', None) + self.action = kwargs.get('action', None) + + +class OrganizationDetails(Model): + """Details of the organization of the certificate issuer. + + :param id: Id of the organization. + :type id: str + :param admin_details: Details of the organization administrator. + :type admin_details: + list[~azure.keyvault.v7_0.models.AdministratorDetails] + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'admin_details': {'key': 'admin_details', 'type': '[AdministratorDetails]'}, + } + + def __init__(self, **kwargs): + super(OrganizationDetails, self).__init__(**kwargs) + self.id = kwargs.get('id', None) + self.admin_details = kwargs.get('admin_details', None) + + +class PendingCertificateSigningRequestResult(Model): + """The pending certificate signing request result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The pending certificate signing request as Base64 encoded + string. + :vartype value: str + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(PendingCertificateSigningRequestResult, self).__init__(**kwargs) + self.value = None + + +class SasDefinitionAttributes(Model): + """The SAS definition management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for SAS definitions in the current vault. If it contains + 'Purgeable' the SAS definition can be permanently deleted by a privileged + user; otherwise, only the system can purge the SAS definition, at the end + of the retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + self.recovery_level = None + + +class SasDefinitionCreateParameters(Model): + """The SAS definition create parameters. + + All required parameters must be populated in order to send to Azure. + + :param template_uri: Required. The SAS definition token template signed + with an arbitrary key. Tokens created according to the SAS definition + will have the same properties as the template. + :type template_uri: str + :param sas_type: Required. The type of SAS token the SAS definition will + create. Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: Required. The validity period of SAS tokens + created according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'template_uri': {'required': True}, + 'sas_type': {'required': True}, + 'validity_period': {'required': True}, + } + + _attribute_map = { + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionCreateParameters, self).__init__(**kwargs) + self.template_uri = kwargs.get('template_uri', None) + self.sas_type = kwargs.get('sas_type', None) + self.validity_period = kwargs.get('validity_period', None) + self.sas_definition_attributes = kwargs.get('sas_definition_attributes', None) + self.tags = kwargs.get('tags', None) + + +class SasDefinitionListResult(Model): + """The storage account SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of SAS definitions along + with a link to the next page of SAS definitions. + :vartype value: list[~azure.keyvault.v7_0.models.SasDefinitionItem] + :ivar next_link: The URL to get the next set of SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionUpdateParameters(Model): + """The SAS definition update parameters. + + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SasDefinitionUpdateParameters, self).__init__(**kwargs) + self.template_uri = kwargs.get('template_uri', None) + self.sas_type = kwargs.get('sas_type', None) + self.validity_period = kwargs.get('validity_period', None) + self.sas_definition_attributes = kwargs.get('sas_definition_attributes', None) + self.tags = kwargs.get('tags', None) + + +class SecretAttributes(Attributes): + """The secret management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for secrets in the current vault. If it contains 'Purgeable', the + secret can be permanently deleted by a privileged user; otherwise, only + the system can purge the secret, at the end of the retention interval. + Possible values include: 'Purgeable', 'Recoverable+Purgeable', + 'Recoverable', 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretAttributes, self).__init__(**kwargs) + self.recovery_level = None + + +class SecretListResult(Model): + """The secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of secrets in the key + vault along with a link to the next page of secrets. + :vartype value: list[~azure.keyvault.v7_0.models.SecretItem] + :ivar next_link: The URL to get the next set of secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretProperties(Model): + """Properties of the key backing a certificate. + + :param content_type: The media type (MIME type). + :type content_type: str + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(SecretProperties, self).__init__(**kwargs) + self.content_type = kwargs.get('content_type', None) + + +class SecretRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param secret_bundle_backup: Required. The backup blob associated with a + secret bundle. + :type secret_bundle_backup: bytes + """ + + _validation = { + 'secret_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'secret_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(SecretRestoreParameters, self).__init__(**kwargs) + self.secret_bundle_backup = kwargs.get('secret_bundle_backup', None) + + +class SecretSetParameters(Model): + """The secret set parameters. + + All required parameters must be populated in order to send to Azure. + + :param value: Required. The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + """ + + _validation = { + 'value': {'required': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + } + + def __init__(self, **kwargs): + super(SecretSetParameters, self).__init__(**kwargs) + self.value = kwargs.get('value', None) + self.tags = kwargs.get('tags', None) + self.content_type = kwargs.get('content_type', None) + self.secret_attributes = kwargs.get('secret_attributes', None) + + +class SecretUpdateParameters(Model): + """The secret update parameters. + + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(SecretUpdateParameters, self).__init__(**kwargs) + self.content_type = kwargs.get('content_type', None) + self.secret_attributes = kwargs.get('secret_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageAccountAttributes(Model): + """The storage account management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for storage accounts in the current vault. If it contains + 'Purgeable' the storage account can be permanently deleted by a privileged + user; otherwise, only the system can purge the storage account, at the end + of the retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(StorageAccountAttributes, self).__init__(**kwargs) + self.enabled = kwargs.get('enabled', None) + self.created = None + self.updated = None + self.recovery_level = None + + +class StorageAccountCreateParameters(Model): + """The storage account create parameters. + + All required parameters must be populated in order to send to Azure. + + :param resource_id: Required. Storage account resource id. + :type resource_id: str + :param active_key_name: Required. Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: Required. whether keyvault should manage the + storage account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'resource_id': {'required': True}, + 'active_key_name': {'required': True}, + 'auto_regenerate_key': {'required': True}, + } + + _attribute_map = { + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountCreateParameters, self).__init__(**kwargs) + self.resource_id = kwargs.get('resource_id', None) + self.active_key_name = kwargs.get('active_key_name', None) + self.auto_regenerate_key = kwargs.get('auto_regenerate_key', None) + self.regeneration_period = kwargs.get('regeneration_period', None) + self.storage_account_attributes = kwargs.get('storage_account_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageAccountRegenerteKeyParameters(Model): + """The storage account key regenerate parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_name: Required. The storage account key name. + :type key_name: str + """ + + _validation = { + 'key_name': {'required': True}, + } + + _attribute_map = { + 'key_name': {'key': 'keyName', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(StorageAccountRegenerteKeyParameters, self).__init__(**kwargs) + self.key_name = kwargs.get('key_name', None) + + +class StorageAccountUpdateParameters(Model): + """The storage account update parameters. + + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs): + super(StorageAccountUpdateParameters, self).__init__(**kwargs) + self.active_key_name = kwargs.get('active_key_name', None) + self.auto_regenerate_key = kwargs.get('auto_regenerate_key', None) + self.regeneration_period = kwargs.get('regeneration_period', None) + self.storage_account_attributes = kwargs.get('storage_account_attributes', None) + self.tags = kwargs.get('tags', None) + + +class StorageListResult(Model): + """The storage accounts list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of storage accounts in + the key vault along with a link to the next page of storage accounts. + :vartype value: list[~azure.keyvault.v7_0.models.StorageAccountItem] + :ivar next_link: The URL to get the next set of storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[StorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs): + super(StorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class StorageRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param storage_bundle_backup: Required. The backup blob associated with a + storage account. + :type storage_bundle_backup: bytes + """ + + _validation = { + 'storage_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'storage_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs): + super(StorageRestoreParameters, self).__init__(**kwargs) + self.storage_bundle_backup = kwargs.get('storage_bundle_backup', None) + + +class SubjectAlternativeNames(Model): + """The subject alternate names of a X509 object. + + :param emails: Email addresses. + :type emails: list[str] + :param dns_names: Domain names. + :type dns_names: list[str] + :param upns: User principal names. + :type upns: list[str] + """ + + _attribute_map = { + 'emails': {'key': 'emails', 'type': '[str]'}, + 'dns_names': {'key': 'dns_names', 'type': '[str]'}, + 'upns': {'key': 'upns', 'type': '[str]'}, + } + + def __init__(self, **kwargs): + super(SubjectAlternativeNames, self).__init__(**kwargs) + self.emails = kwargs.get('emails', None) + self.dns_names = kwargs.get('dns_names', None) + self.upns = kwargs.get('upns', None) + + +class Trigger(Model): + """A condition to be satisfied for an action to be executed. + + :param lifetime_percentage: Percentage of lifetime at which to trigger. + Value should be between 1 and 99. + :type lifetime_percentage: int + :param days_before_expiry: Days before expiry to attempt renewal. Value + should be between 1 and validity_in_months multiplied by 27. If + validity_in_months is 36, then value should be between 1 and 972 (36 * + 27). + :type days_before_expiry: int + """ + + _validation = { + 'lifetime_percentage': {'maximum': 99, 'minimum': 1}, + } + + _attribute_map = { + 'lifetime_percentage': {'key': 'lifetime_percentage', 'type': 'int'}, + 'days_before_expiry': {'key': 'days_before_expiry', 'type': 'int'}, + } + + def __init__(self, **kwargs): + super(Trigger, self).__init__(**kwargs) + self.lifetime_percentage = kwargs.get('lifetime_percentage', None) + self.days_before_expiry = kwargs.get('days_before_expiry', None) + + +class X509CertificateProperties(Model): + """Properties of the X509 component of a certificate. + + :param subject: The subject name. Should be a valid X509 distinguished + Name. + :type subject: str + :param ekus: The enhanced key usage. + :type ekus: list[str] + :param subject_alternative_names: The subject alternative names. + :type subject_alternative_names: + ~azure.keyvault.v7_0.models.SubjectAlternativeNames + :param key_usage: List of key usages. + :type key_usage: list[str or ~azure.keyvault.v7_0.models.KeyUsageType] + :param validity_in_months: The duration that the certificate is valid in + months. + :type validity_in_months: int + """ + + _validation = { + 'validity_in_months': {'minimum': 0}, + } + + _attribute_map = { + 'subject': {'key': 'subject', 'type': 'str'}, + 'ekus': {'key': 'ekus', 'type': '[str]'}, + 'subject_alternative_names': {'key': 'sans', 'type': 'SubjectAlternativeNames'}, + 'key_usage': {'key': 'key_usage', 'type': '[str]'}, + 'validity_in_months': {'key': 'validity_months', 'type': 'int'}, + } + + def __init__(self, **kwargs): + super(X509CertificateProperties, self).__init__(**kwargs) + self.subject = kwargs.get('subject', None) + self.ekus = kwargs.get('ekus', None) + self.subject_alternative_names = kwargs.get('subject_alternative_names', None) + self.key_usage = kwargs.get('key_usage', None) + self.validity_in_months = kwargs.get('validity_in_months', None) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models_py3.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models_py3.py new file mode 100644 index 000000000000..59e6f039d4b6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/models/_models_py3.py @@ -0,0 +1,3208 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from msrest.serialization import Model +from azure.core import HttpResponseError + + +class Action(Model): + """The action that will be executed. + + :param action_type: The type of the action. Possible values include: + 'EmailContacts', 'AutoRenew' + :type action_type: str or ~azure.keyvault.v7_0.models.ActionType + """ + + _attribute_map = { + 'action_type': {'key': 'action_type', 'type': 'ActionType'}, + } + + def __init__(self, *, action_type=None, **kwargs) -> None: + super(Action, self).__init__(**kwargs) + self.action_type = action_type + + +class AdministratorDetails(Model): + """Details of the organization administrator of the certificate issuer. + + :param first_name: First name. + :type first_name: str + :param last_name: Last name. + :type last_name: str + :param email_address: Email address. + :type email_address: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'first_name': {'key': 'first_name', 'type': 'str'}, + 'last_name': {'key': 'last_name', 'type': 'str'}, + 'email_address': {'key': 'email', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, *, first_name: str=None, last_name: str=None, email_address: str=None, phone: str=None, **kwargs) -> None: + super(AdministratorDetails, self).__init__(**kwargs) + self.first_name = first_name + self.last_name = last_name + self.email_address = email_address + self.phone = phone + + +class Attributes(Model): + """The object attributes managed by the KeyVault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(Attributes, self).__init__(**kwargs) + self.enabled = enabled + self.not_before = not_before + self.expires = expires + self.created = None + self.updated = None + + +class BackupCertificateResult(Model): + """The backup certificate result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up certificate. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupCertificateResult, self).__init__(**kwargs) + self.value = None + + +class BackupKeyResult(Model): + """The backup key result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up key. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupKeyResult, self).__init__(**kwargs) + self.value = None + + +class BackupSecretResult(Model): + """The backup secret result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up secret. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupSecretResult, self).__init__(**kwargs) + self.value = None + + +class BackupStorageResult(Model): + """The backup storage result, containing the backup blob. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The backup blob containing the backed up storage account. + :vartype value: bytes + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(BackupStorageResult, self).__init__(**kwargs) + self.value = None + + +class CertificateAttributes(Attributes): + """The certificate management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for certificates in the current vault. If it contains 'Purgeable', + the certificate can be permanently deleted by a privileged user; + otherwise, only the system can purge the certificate, at the end of the + retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(CertificateAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class CertificateBundle(Model): + """A certificate bundle consists of a certificate (X509) plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, cer: bytearray=None, content_type: str=None, attributes=None, tags=None, **kwargs) -> None: + super(CertificateBundle, self).__init__(**kwargs) + self.id = None + self.kid = None + self.sid = None + self.x509_thumbprint = None + self.policy = None + self.cer = cer + self.content_type = content_type + self.attributes = attributes + self.tags = tags + + +class CertificateCreateParameters(Model): + """The certificate create parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateCreateParameters, self).__init__(**kwargs) + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateImportParameters(Model): + """The certificate import parameters. + + All required parameters must be populated in order to send to Azure. + + :param base64_encoded_certificate: Required. Base64 encoded representation + of the certificate object to import. This certificate needs to contain the + private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'base64_encoded_certificate': {'required': True}, + } + + _attribute_map = { + 'base64_encoded_certificate': {'key': 'value', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, base64_encoded_certificate: str, password: str=None, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateImportParameters, self).__init__(**kwargs) + self.base64_encoded_certificate = base64_encoded_certificate + self.password = password + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateIssuerItem(Model): + """The certificate issuer item containing certificate issuer metadata. + + :param id: Certificate Identifier. + :type id: str + :param provider: The issuer provider. + :type provider: str + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + } + + def __init__(self, *, id: str=None, provider: str=None, **kwargs) -> None: + super(CertificateIssuerItem, self).__init__(**kwargs) + self.id = id + self.provider = provider + + +class CertificateIssuerListResult(Model): + """The certificate issuer list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificate issuers + in the key vault along with a link to the next page of certificate + issuers. + :vartype value: list[~azure.keyvault.v7_0.models.CertificateIssuerItem] + :ivar next_link: The URL to get the next set of certificate issuers. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateIssuerItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(CertificateIssuerListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateIssuerSetParameters(Model): + """The certificate issuer set parameters. + + All required parameters must be populated in order to send to Azure. + + :param provider: Required. The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _validation = { + 'provider': {'required': True}, + } + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(CertificateIssuerSetParameters, self).__init__(**kwargs) + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class CertificateIssuerUpdateParameters(Model): + """The certificate issuer update parameters. + + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _attribute_map = { + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str=None, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(CertificateIssuerUpdateParameters, self).__init__(**kwargs) + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class CertificateItem(Model): + """The certificate item containing certificate metadata. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, x509_thumbprint: bytes=None, **kwargs) -> None: + super(CertificateItem, self).__init__(**kwargs) + self.id = id + self.attributes = attributes + self.tags = tags + self.x509_thumbprint = x509_thumbprint + + +class CertificateListResult(Model): + """The certificate list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of certificates in the + key vault along with a link to the next page of certificates. + :vartype value: list[~azure.keyvault.v7_0.models.CertificateItem] + :ivar next_link: The URL to get the next set of certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[CertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(CertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class CertificateMergeParameters(Model): + """The certificate merge parameters. + + All required parameters must be populated in order to send to Azure. + + :param x509_certificates: Required. The certificate or the certificate + chain to merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'x509_certificates': {'required': True}, + } + + _attribute_map = { + 'x509_certificates': {'key': 'x5c', 'type': '[bytearray]'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, x509_certificates, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateMergeParameters, self).__init__(**kwargs) + self.x509_certificates = x509_certificates + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class CertificateOperation(Model): + """A certificate operation is returned in case of asynchronous requests. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: ~azure.keyvault.v7_0.models.IssuerParameters + :param csr: The certificate signing request (CSR) that is being used in + the certificate operation. + :type csr: bytearray + :param cancellation_requested: Indicates if cancellation was requested on + the certificate operation. + :type cancellation_requested: bool + :param status: Status of the certificate operation. + :type status: str + :param status_details: The status details of the certificate operation. + :type status_details: str + :param error: Error encountered, if any, during the certificate operation. + :type error: ~azure.keyvault.v7_0.models.Error + :param target: Location which contains the result of the certificate + operation. + :type target: str + :param request_id: Identifier for the certificate operation. + :type request_id: str + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'csr': {'key': 'csr', 'type': 'bytearray'}, + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + 'status': {'key': 'status', 'type': 'str'}, + 'status_details': {'key': 'status_details', 'type': 'str'}, + 'error': {'key': 'error', 'type': 'Error'}, + 'target': {'key': 'target', 'type': 'str'}, + 'request_id': {'key': 'request_id', 'type': 'str'}, + } + + def __init__(self, *, issuer_parameters=None, csr: bytearray=None, cancellation_requested: bool=None, status: str=None, status_details: str=None, error=None, target: str=None, request_id: str=None, **kwargs) -> None: + super(CertificateOperation, self).__init__(**kwargs) + self.id = None + self.issuer_parameters = issuer_parameters + self.csr = csr + self.cancellation_requested = cancellation_requested + self.status = status + self.status_details = status_details + self.error = error + self.target = target + self.request_id = request_id + + +class CertificateOperationUpdateParameter(Model): + """The certificate operation update parameters. + + All required parameters must be populated in order to send to Azure. + + :param cancellation_requested: Required. Indicates if cancellation was + requested on the certificate operation. + :type cancellation_requested: bool + """ + + _validation = { + 'cancellation_requested': {'required': True}, + } + + _attribute_map = { + 'cancellation_requested': {'key': 'cancellation_requested', 'type': 'bool'}, + } + + def __init__(self, *, cancellation_requested: bool, **kwargs) -> None: + super(CertificateOperationUpdateParameter, self).__init__(**kwargs) + self.cancellation_requested = cancellation_requested + + +class CertificatePolicy(Model): + """Management policy for a certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :param key_properties: Properties of the key backing a certificate. + :type key_properties: ~azure.keyvault.v7_0.models.KeyProperties + :param secret_properties: Properties of the secret backing a certificate. + :type secret_properties: ~azure.keyvault.v7_0.models.SecretProperties + :param x509_certificate_properties: Properties of the X509 component of a + certificate. + :type x509_certificate_properties: + ~azure.keyvault.v7_0.models.X509CertificateProperties + :param lifetime_actions: Actions that will be performed by Key Vault over + the lifetime of a certificate. + :type lifetime_actions: list[~azure.keyvault.v7_0.models.LifetimeAction] + :param issuer_parameters: Parameters for the issuer of the X509 component + of a certificate. + :type issuer_parameters: ~azure.keyvault.v7_0.models.IssuerParameters + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'key_properties': {'key': 'key_props', 'type': 'KeyProperties'}, + 'secret_properties': {'key': 'secret_props', 'type': 'SecretProperties'}, + 'x509_certificate_properties': {'key': 'x509_props', 'type': 'X509CertificateProperties'}, + 'lifetime_actions': {'key': 'lifetime_actions', 'type': '[LifetimeAction]'}, + 'issuer_parameters': {'key': 'issuer', 'type': 'IssuerParameters'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + } + + def __init__(self, *, key_properties=None, secret_properties=None, x509_certificate_properties=None, lifetime_actions=None, issuer_parameters=None, attributes=None, **kwargs) -> None: + super(CertificatePolicy, self).__init__(**kwargs) + self.id = None + self.key_properties = key_properties + self.secret_properties = secret_properties + self.x509_certificate_properties = x509_certificate_properties + self.lifetime_actions = lifetime_actions + self.issuer_parameters = issuer_parameters + self.attributes = attributes + + +class CertificateRestoreParameters(Model): + """The certificate restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param certificate_bundle_backup: Required. The backup blob associated + with a certificate bundle. + :type certificate_bundle_backup: bytes + """ + + _validation = { + 'certificate_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'certificate_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, certificate_bundle_backup: bytes, **kwargs) -> None: + super(CertificateRestoreParameters, self).__init__(**kwargs) + self.certificate_bundle_backup = certificate_bundle_backup + + +class CertificateUpdateParameters(Model): + """The certificate update parameters. + + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'certificate_policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'certificate_attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, certificate_policy=None, certificate_attributes=None, tags=None, **kwargs) -> None: + super(CertificateUpdateParameters, self).__init__(**kwargs) + self.certificate_policy = certificate_policy + self.certificate_attributes = certificate_attributes + self.tags = tags + + +class Contact(Model): + """The contact information for the vault certificates. + + :param email_address: Email address. + :type email_address: str + :param name: Name. + :type name: str + :param phone: Phone number. + :type phone: str + """ + + _attribute_map = { + 'email_address': {'key': 'email', 'type': 'str'}, + 'name': {'key': 'name', 'type': 'str'}, + 'phone': {'key': 'phone', 'type': 'str'}, + } + + def __init__(self, *, email_address: str=None, name: str=None, phone: str=None, **kwargs) -> None: + super(Contact, self).__init__(**kwargs) + self.email_address = email_address + self.name = name + self.phone = phone + + +class Contacts(Model): + """The contacts for the vault certificates. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the contacts collection. + :vartype id: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v7_0.models.Contact] + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'contact_list': {'key': 'contacts', 'type': '[Contact]'}, + } + + def __init__(self, *, contact_list=None, **kwargs) -> None: + super(Contacts, self).__init__(**kwargs) + self.id = None + self.contact_list = contact_list + + +class DeletedCertificateBundle(CertificateBundle): + """A Deleted Certificate consisting of its previous id, attributes and its + tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The certificate id. + :vartype id: str + :ivar kid: The key id. + :vartype kid: str + :ivar sid: The secret id. + :vartype sid: str + :ivar x509_thumbprint: Thumbprint of the certificate. + :vartype x509_thumbprint: bytes + :ivar policy: The management policy. + :vartype policy: ~azure.keyvault.v7_0.models.CertificatePolicy + :param cer: CER contents of x509 certificate. + :type cer: bytearray + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs + :type tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'kid': {'readonly': True}, + 'sid': {'readonly': True}, + 'x509_thumbprint': {'readonly': True}, + 'policy': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'sid': {'key': 'sid', 'type': 'str'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'policy': {'key': 'policy', 'type': 'CertificatePolicy'}, + 'cer': {'key': 'cer', 'type': 'bytearray'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, cer: bytearray=None, content_type: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedCertificateBundle, self).__init__(cer=cer, content_type=content_type, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateItem(CertificateItem): + """The deleted certificate item containing metadata about the deleted + certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Certificate identifier. + :type id: str + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param x509_thumbprint: Thumbprint of the certificate. + :type x509_thumbprint: bytes + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the certificate was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'CertificateAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'x509_thumbprint': {'key': 'x5t', 'type': 'base64'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, x509_thumbprint: bytes=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedCertificateItem, self).__init__(id=id, attributes=attributes, tags=tags, x509_thumbprint=x509_thumbprint, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedCertificateListResult(Model): + """A list of certificates that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted certificates + in the vault along with a link to the next page of deleted certificates + :vartype value: list[~azure.keyvault.v7_0.models.DeletedCertificateItem] + :ivar next_link: The URL to get the next set of deleted certificates. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedCertificateItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedCertificateListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyBundle(Model): + """A KeyBundle consisting of a WebKey plus its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, key=None, attributes=None, tags=None, **kwargs) -> None: + super(KeyBundle, self).__init__(**kwargs) + self.key = key + self.attributes = attributes + self.tags = tags + self.managed = None + + +class DeletedKeyBundle(KeyBundle): + """A DeletedKeyBundle consisting of a WebKey plus its Attributes and deletion + info. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param key: The Json web key. + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, key=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedKeyBundle, self).__init__(key=key, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class KeyItem(Model): + """The key item containing key metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, kid: str=None, attributes=None, tags=None, **kwargs) -> None: + super(KeyItem, self).__init__(**kwargs) + self.kid = kid + self.attributes = attributes + self.tags = tags + self.managed = None + + +class DeletedKeyItem(KeyItem): + """The deleted key item containing the deleted key metadata and information + about deletion. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param kid: Key identifier. + :type kid: str + :param attributes: The key management attributes. + :type attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar managed: True if the key's lifetime is managed by key vault. If this + is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted key. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the key is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the key was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, kid: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedKeyItem, self).__init__(kid=kid, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedKeyListResult(Model): + """A list of keys that have been deleted in this vault. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of deleted keys in the + vault along with a link to the next page of deleted keys + :vartype value: list[~azure.keyvault.v7_0.models.DeletedKeyItem] + :ivar next_link: The URL to get the next set of deleted keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedKeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedKeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionBundle(Model): + """A SAS definition bundle consists of key vault SAS definition details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :vartype template_uri: str + :ivar sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :vartype sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :ivar validity_period: The validity period of SAS tokens created according + to the SAS definition. + :vartype validity_period: str + :ivar attributes: The SAS definition attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'template_uri': {'readonly': True}, + 'sas_type': {'readonly': True}, + 'validity_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionBundle, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.template_uri = None + self.sas_type = None + self.validity_period = None + self.attributes = None + self.tags = None + + +class DeletedSasDefinitionBundle(SasDefinitionBundle): + """A deleted SAS definition bundle consisting of its previous id, attributes + and its tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The SAS definition id. + :vartype id: str + :ivar secret_id: Storage account SAS definition secret id. + :vartype secret_id: str + :ivar template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :vartype template_uri: str + :ivar sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :vartype sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :ivar validity_period: The validity period of SAS tokens created according + to the SAS definition. + :vartype validity_period: str + :ivar attributes: The SAS definition attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted SAS definition. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the SAS definition is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the SAS definition was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'template_uri': {'readonly': True}, + 'sas_type': {'readonly': True}, + 'validity_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, recovery_id: str=None, **kwargs) -> None: + super(DeletedSasDefinitionBundle, self).__init__(**kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class SasDefinitionItem(Model): + """The SAS definition item containing storage SAS definition metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionItem, self).__init__(**kwargs) + self.id = None + self.secret_id = None + self.attributes = None + self.tags = None + + +class DeletedSasDefinitionItem(SasDefinitionItem): + """The deleted SAS definition item containing metadata about the deleted SAS + definition. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage SAS identifier. + :vartype id: str + :ivar secret_id: The storage account SAS definition secret id. + :vartype secret_id: str + :ivar attributes: The SAS definition management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted SAS definition. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the SAS definition is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the SAS definition was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'secret_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'secret_id': {'key': 'sid', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, recovery_id: str=None, **kwargs) -> None: + super(DeletedSasDefinitionItem, self).__init__(**kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSasDefinitionListResult(Model): + """The deleted SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted SAS + definitions in the vault along with a link to the next page of deleted sas + definitions + :vartype value: list[~azure.keyvault.v7_0.models.DeletedSasDefinitionItem] + :ivar next_link: The URL to get the next set of deleted SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedSasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretBundle(Model): + """A secret consisting of a value, id and its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, value: str=None, id: str=None, content_type: str=None, attributes=None, tags=None, **kwargs) -> None: + super(SecretBundle, self).__init__(**kwargs) + self.value = value + self.id = id + self.content_type = content_type + self.attributes = attributes + self.tags = tags + self.kid = None + self.managed = None + + +class DeletedSecretBundle(SecretBundle): + """A Deleted Secret consisting of its previous id, attributes and its tags, as + well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param value: The secret value. + :type value: str + :param id: The secret id. + :type id: str + :param content_type: The content type of the secret. + :type content_type: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :ivar kid: If this is a secret backing a KV certificate, then this field + specifies the corresponding key backing the KV certificate. + :vartype kid: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a secret backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'kid': {'readonly': True}, + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'id': {'key': 'id', 'type': 'str'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'kid': {'key': 'kid', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, value: str=None, id: str=None, content_type: str=None, attributes=None, tags=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedSecretBundle, self).__init__(value=value, id=id, content_type=content_type, attributes=attributes, tags=tags, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class SecretItem(Model): + """The secret item containing secret metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + """ + + _validation = { + 'managed': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, content_type: str=None, **kwargs) -> None: + super(SecretItem, self).__init__(**kwargs) + self.id = id + self.attributes = attributes + self.tags = tags + self.content_type = content_type + self.managed = None + + +class DeletedSecretItem(SecretItem): + """The deleted secret item containing metadata about the deleted secret. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param id: Secret identifier. + :type id: str + :param attributes: The secret management attributes. + :type attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :ivar managed: True if the secret's lifetime is managed by key vault. If + this is a key backing a certificate, then managed will be true. + :vartype managed: bool + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted secret. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the secret is scheduled to be + purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the secret was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'managed': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'managed': {'key': 'managed', 'type': 'bool'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, id: str=None, attributes=None, tags=None, content_type: str=None, recovery_id: str=None, **kwargs) -> None: + super(DeletedSecretItem, self).__init__(id=id, attributes=attributes, tags=tags, content_type=content_type, **kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedSecretListResult(Model): + """The deleted secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted secrets + in the vault along with a link to the next page of deleted secrets + :vartype value: list[~azure.keyvault.v7_0.models.DeletedSecretItem] + :ivar next_link: The URL to get the next set of deleted secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedSecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedSecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class StorageAccountItem(Model): + """The storage account item containing storage account metadata. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageAccountItem, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.attributes = None + self.tags = None + + +class DeletedStorageAccountItem(StorageAccountItem): + """The deleted storage account item containing metadata about the deleted + storage account. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Storage identifier. + :vartype id: str + :ivar resource_id: Storage account resource Id. + :vartype resource_id: str + :ivar attributes: The storage account management attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs. + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted storage account. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the storage account is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the storage account was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, recovery_id: str=None, **kwargs) -> None: + super(DeletedStorageAccountItem, self).__init__(**kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class StorageBundle(Model): + """A Storage account bundle consists of key vault storage account details plus + its attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageBundle, self).__init__(**kwargs) + self.id = None + self.resource_id = None + self.active_key_name = None + self.auto_regenerate_key = None + self.regeneration_period = None + self.attributes = None + self.tags = None + + +class DeletedStorageBundle(StorageBundle): + """A deleted storage account bundle consisting of its previous id, attributes + and its tags, as well as information on when it will be purged. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: The storage account id. + :vartype id: str + :ivar resource_id: The storage account resource id. + :vartype resource_id: str + :ivar active_key_name: The current active storage account key name. + :vartype active_key_name: str + :ivar auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :vartype auto_regenerate_key: bool + :ivar regeneration_period: The key regeneration time duration specified in + ISO-8601 format. + :vartype regeneration_period: str + :ivar attributes: The storage account attributes. + :vartype attributes: ~azure.keyvault.v7_0.models.StorageAccountAttributes + :ivar tags: Application specific metadata in the form of key-value pairs + :vartype tags: dict[str, str] + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted storage account. + :type recovery_id: str + :ivar scheduled_purge_date: The time when the storage account is scheduled + to be purged, in UTC + :vartype scheduled_purge_date: datetime + :ivar deleted_date: The time when the storage account was deleted, in UTC + :vartype deleted_date: datetime + """ + + _validation = { + 'id': {'readonly': True}, + 'resource_id': {'readonly': True}, + 'active_key_name': {'readonly': True}, + 'auto_regenerate_key': {'readonly': True}, + 'regeneration_period': {'readonly': True}, + 'attributes': {'readonly': True}, + 'tags': {'readonly': True}, + 'scheduled_purge_date': {'readonly': True}, + 'deleted_date': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'recovery_id': {'key': 'recoveryId', 'type': 'str'}, + 'scheduled_purge_date': {'key': 'scheduledPurgeDate', 'type': 'unix-time'}, + 'deleted_date': {'key': 'deletedDate', 'type': 'unix-time'}, + } + + def __init__(self, *, recovery_id: str=None, **kwargs) -> None: + super(DeletedStorageBundle, self).__init__(**kwargs) + self.recovery_id = recovery_id + self.scheduled_purge_date = None + self.deleted_date = None + + +class DeletedStorageListResult(Model): + """The deleted storage account list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of the deleted storage + accounts in the vault along with a link to the next page of deleted + storage accounts + :vartype value: + list[~azure.keyvault.v7_0.models.DeletedStorageAccountItem] + :ivar next_link: The URL to get the next set of deleted storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[DeletedStorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(DeletedStorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class Error(Model): + """The key vault server error. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar code: The error code. + :vartype code: str + :ivar message: The error message. + :vartype message: str + :ivar inner_error: + :vartype inner_error: ~azure.keyvault.v7_0.models.Error + """ + + _validation = { + 'code': {'readonly': True}, + 'message': {'readonly': True}, + 'inner_error': {'readonly': True}, + } + + _attribute_map = { + 'code': {'key': 'code', 'type': 'str'}, + 'message': {'key': 'message', 'type': 'str'}, + 'inner_error': {'key': 'innererror', 'type': 'Error'}, + } + + def __init__(self, **kwargs) -> None: + super(Error, self).__init__(**kwargs) + self.code = None + self.message = None + self.inner_error = None + + +class IssuerAttributes(Model): + """The attributes of an issuer managed by the Key Vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(IssuerAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + + +class IssuerBundle(Model): + """The issuer for Key Vault certificate. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar id: Identifier for the issuer object. + :vartype id: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided to + the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + """ + + _validation = { + 'id': {'readonly': True}, + } + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'provider': {'key': 'provider', 'type': 'str'}, + 'credentials': {'key': 'credentials', 'type': 'IssuerCredentials'}, + 'organization_details': {'key': 'org_details', 'type': 'OrganizationDetails'}, + 'attributes': {'key': 'attributes', 'type': 'IssuerAttributes'}, + } + + def __init__(self, *, provider: str=None, credentials=None, organization_details=None, attributes=None, **kwargs) -> None: + super(IssuerBundle, self).__init__(**kwargs) + self.id = None + self.provider = provider + self.credentials = credentials + self.organization_details = organization_details + self.attributes = attributes + + +class IssuerCredentials(Model): + """The credentials to be used for the certificate issuer. + + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + """ + + _attribute_map = { + 'account_id': {'key': 'account_id', 'type': 'str'}, + 'password': {'key': 'pwd', 'type': 'str'}, + } + + def __init__(self, *, account_id: str=None, password: str=None, **kwargs) -> None: + super(IssuerCredentials, self).__init__(**kwargs) + self.account_id = account_id + self.password = password + + +class IssuerParameters(Model): + """Parameters for the issuer of the X509 component of a certificate. + + :param name: Name of the referenced issuer object or reserved names; for + example, 'Self' or 'Unknown'. + :type name: str + :param certificate_type: Type of certificate to be requested from the + issuer provider. + :type certificate_type: str + :param certificate_transparency: Indicates if the certificates generated + under this policy should be published to certificate transparency logs. + :type certificate_transparency: bool + """ + + _attribute_map = { + 'name': {'key': 'name', 'type': 'str'}, + 'certificate_type': {'key': 'cty', 'type': 'str'}, + 'certificate_transparency': {'key': 'cert_transparency', 'type': 'bool'}, + } + + def __init__(self, *, name: str=None, certificate_type: str=None, certificate_transparency: bool=None, **kwargs) -> None: + super(IssuerParameters, self).__init__(**kwargs) + self.name = name + self.certificate_type = certificate_type + self.certificate_transparency = certificate_transparency + + +class JsonWebKey(Model): + """As of http://tools.ietf.org/html/draft-ietf-jose-json-web-key-18. + + :param kid: Key identifier. + :type kid: str + :param kty: JsonWebKey Key Type (kty), as defined in + https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40. + Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_ops: + :type key_ops: list[str] + :param n: RSA modulus. + :type n: bytes + :param e: RSA public exponent. + :type e: bytes + :param d: RSA private exponent, or the D component of an EC private key. + :type d: bytes + :param dp: RSA private key parameter. + :type dp: bytes + :param dq: RSA private key parameter. + :type dq: bytes + :param qi: RSA private key parameter. + :type qi: bytes + :param p: RSA secret prime. + :type p: bytes + :param q: RSA secret prime, with p < q. + :type q: bytes + :param k: Symmetric key. + :type k: bytes + :param t: HSM Token, used with 'Bring Your Own Key'. + :type t: bytes + :param crv: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type crv: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + :param x: X component of an EC public key. + :type x: bytes + :param y: Y component of an EC public key. + :type y: bytes + """ + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'n': {'key': 'n', 'type': 'base64'}, + 'e': {'key': 'e', 'type': 'base64'}, + 'd': {'key': 'd', 'type': 'base64'}, + 'dp': {'key': 'dp', 'type': 'base64'}, + 'dq': {'key': 'dq', 'type': 'base64'}, + 'qi': {'key': 'qi', 'type': 'base64'}, + 'p': {'key': 'p', 'type': 'base64'}, + 'q': {'key': 'q', 'type': 'base64'}, + 'k': {'key': 'k', 'type': 'base64'}, + 't': {'key': 'key_hsm', 'type': 'base64'}, + 'crv': {'key': 'crv', 'type': 'str'}, + 'x': {'key': 'x', 'type': 'base64'}, + 'y': {'key': 'y', 'type': 'base64'}, + } + + def __init__(self, *, kid: str=None, kty=None, key_ops=None, n: bytes=None, e: bytes=None, d: bytes=None, dp: bytes=None, dq: bytes=None, qi: bytes=None, p: bytes=None, q: bytes=None, k: bytes=None, t: bytes=None, crv=None, x: bytes=None, y: bytes=None, **kwargs) -> None: + super(JsonWebKey, self).__init__(**kwargs) + self.kid = kid + self.kty = kty + self.key_ops = key_ops + self.n = n + self.e = e + self.d = d + self.dp = dp + self.dq = dq + self.qi = qi + self.p = p + self.q = q + self.k = k + self.t = t + self.crv = crv + self.x = x + self.y = y + + +class KeyAttributes(Attributes): + """The attributes of a key managed by the key vault service. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for keys in the current vault. If it contains 'Purgeable' the key + can be permanently deleted by a privileged user; otherwise, only the + system can purge the key, at the end of the retention interval. Possible + values include: 'Purgeable', 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(KeyAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class KeyCreateParameters(Model): + """The key create parameters. + + All required parameters must be populated in order to send to Azure. + + :param kty: Required. The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', + 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + """ + + _validation = { + 'kty': {'required': True, 'min_length': 1}, + } + + _attribute_map = { + 'kty': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, *, kty, key_size: int=None, key_ops=None, key_attributes=None, tags=None, curve=None, **kwargs) -> None: + super(KeyCreateParameters, self).__init__(**kwargs) + self.kty = kty + self.key_size = key_size + self.key_ops = key_ops + self.key_attributes = key_attributes + self.tags = tags + self.curve = curve + + +class KeyImportParameters(Model): + """The key import parameters. + + All required parameters must be populated in order to send to Azure. + + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key: Required. The Json web key + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'key': {'required': True}, + } + + _attribute_map = { + 'hsm': {'key': 'Hsm', 'type': 'bool'}, + 'key': {'key': 'key', 'type': 'JsonWebKey'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, key, hsm: bool=None, key_attributes=None, tags=None, **kwargs) -> None: + super(KeyImportParameters, self).__init__(**kwargs) + self.hsm = hsm + self.key = key + self.key_attributes = key_attributes + self.tags = tags + + +class KeyListResult(Model): + """The key list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of keys in the key vault + along with a link to the next page of keys. + :vartype value: list[~azure.keyvault.v7_0.models.KeyItem] + :ivar next_link: The URL to get the next set of keys. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[KeyItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class KeyOperationResult(Model): + """The key operation result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar kid: Key identifier + :vartype kid: str + :ivar result: + :vartype result: bytes + """ + + _validation = { + 'kid': {'readonly': True}, + 'result': {'readonly': True}, + } + + _attribute_map = { + 'kid': {'key': 'kid', 'type': 'str'}, + 'result': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyOperationResult, self).__init__(**kwargs) + self.kid = None + self.result = None + + +class KeyOperationsParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, value: bytes, **kwargs) -> None: + super(KeyOperationsParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.value = value + + +class KeyProperties(Model): + """Properties of the key pair backing a certificate. + + :param exportable: Indicates if the private key can be exported. + :type exportable: bool + :param key_type: The type of key pair to be used for the certificate. + Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type key_type: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param reuse_key: Indicates if the same key pair will be used on + certificate renewal. + :type reuse_key: bool + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', 'P-521', + 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + """ + + _attribute_map = { + 'exportable': {'key': 'exportable', 'type': 'bool'}, + 'key_type': {'key': 'kty', 'type': 'str'}, + 'key_size': {'key': 'key_size', 'type': 'int'}, + 'reuse_key': {'key': 'reuse_key', 'type': 'bool'}, + 'curve': {'key': 'crv', 'type': 'str'}, + } + + def __init__(self, *, exportable: bool=None, key_type=None, key_size: int=None, reuse_key: bool=None, curve=None, **kwargs) -> None: + super(KeyProperties, self).__init__(**kwargs) + self.exportable = exportable + self.key_type = key_type + self.key_size = key_size + self.reuse_key = reuse_key + self.curve = curve + + +class KeyRestoreParameters(Model): + """The key restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_bundle_backup: Required. The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + """ + + _validation = { + 'key_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'key_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, key_bundle_backup: bytes, **kwargs) -> None: + super(KeyRestoreParameters, self).__init__(**kwargs) + self.key_bundle_backup = key_bundle_backup + + +class KeySignParameters(Model): + """The key operations parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm identifier. + For more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', 'PS384', + 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', + 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param value: Required. + :type value: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'value': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'value': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, value: bytes, **kwargs) -> None: + super(KeySignParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.value = value + + +class KeyUpdateParameters(Model): + """The key update parameters. + + :param key_ops: Json web key operations. For more information on possible + key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'key_ops': {'key': 'key_ops', 'type': '[str]'}, + 'key_attributes': {'key': 'attributes', 'type': 'KeyAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, key_ops=None, key_attributes=None, tags=None, **kwargs) -> None: + super(KeyUpdateParameters, self).__init__(**kwargs) + self.key_ops = key_ops + self.key_attributes = key_attributes + self.tags = tags + + +class KeyVaultError(Model): + """The key vault error exception. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar error: + :vartype error: ~azure.keyvault.v7_0.models.Error + """ + + _validation = { + 'error': {'readonly': True}, + } + + _attribute_map = { + 'error': {'key': 'error', 'type': 'Error'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyVaultError, self).__init__(**kwargs) + self.error = None + + +class KeyVaultErrorException(HttpResponseError): + """Server responsed with exception of type: 'KeyVaultError'. + + :param deserialize: A deserializer + :param response: Server response to be deserialized. + """ + + def __init__(self, response, deserialize, *args): + + model_name = 'KeyVaultError' + self.error = deserialize(model_name, response) + if self.error is None: + self.error = deserialize.dependencies[model_name]() + super(KeyVaultErrorException, self).__init__(response=response) + + +class KeyVerifyParameters(Model): + """The key verify parameters. + + All required parameters must be populated in order to send to Azure. + + :param algorithm: Required. The signing/verification algorithm. For more + information on possible algorithm types, see JsonWebKeySignatureAlgorithm. + Possible values include: 'PS256', 'PS384', 'PS512', 'RS256', 'RS384', + 'RS512', 'RSNULL', 'ES256', 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param digest: Required. The digest used for signing. + :type digest: bytes + :param signature: Required. The signature to be verified. + :type signature: bytes + """ + + _validation = { + 'algorithm': {'required': True, 'min_length': 1}, + 'digest': {'required': True}, + 'signature': {'required': True}, + } + + _attribute_map = { + 'algorithm': {'key': 'alg', 'type': 'str'}, + 'digest': {'key': 'digest', 'type': 'base64'}, + 'signature': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, algorithm, digest: bytes, signature: bytes, **kwargs) -> None: + super(KeyVerifyParameters, self).__init__(**kwargs) + self.algorithm = algorithm + self.digest = digest + self.signature = signature + + +class KeyVerifyResult(Model): + """The key verify result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: True if the signature is verified, otherwise false. + :vartype value: bool + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'bool'}, + } + + def __init__(self, **kwargs) -> None: + super(KeyVerifyResult, self).__init__(**kwargs) + self.value = None + + +class LifetimeAction(Model): + """Action and its trigger that will be performed by Key Vault over the + lifetime of a certificate. + + :param trigger: The condition that will execute the action. + :type trigger: ~azure.keyvault.v7_0.models.Trigger + :param action: The action that will be executed. + :type action: ~azure.keyvault.v7_0.models.Action + """ + + _attribute_map = { + 'trigger': {'key': 'trigger', 'type': 'Trigger'}, + 'action': {'key': 'action', 'type': 'Action'}, + } + + def __init__(self, *, trigger=None, action=None, **kwargs) -> None: + super(LifetimeAction, self).__init__(**kwargs) + self.trigger = trigger + self.action = action + + +class OrganizationDetails(Model): + """Details of the organization of the certificate issuer. + + :param id: Id of the organization. + :type id: str + :param admin_details: Details of the organization administrator. + :type admin_details: + list[~azure.keyvault.v7_0.models.AdministratorDetails] + """ + + _attribute_map = { + 'id': {'key': 'id', 'type': 'str'}, + 'admin_details': {'key': 'admin_details', 'type': '[AdministratorDetails]'}, + } + + def __init__(self, *, id: str=None, admin_details=None, **kwargs) -> None: + super(OrganizationDetails, self).__init__(**kwargs) + self.id = id + self.admin_details = admin_details + + +class PendingCertificateSigningRequestResult(Model): + """The pending certificate signing request result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: The pending certificate signing request as Base64 encoded + string. + :vartype value: str + """ + + _validation = { + 'value': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(PendingCertificateSigningRequestResult, self).__init__(**kwargs) + self.value = None + + +class SasDefinitionAttributes(Model): + """The SAS definition management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for SAS definitions in the current vault. If it contains + 'Purgeable' the SAS definition can be permanently deleted by a privileged + user; otherwise, only the system can purge the SAS definition, at the end + of the retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(SasDefinitionAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + self.recovery_level = None + + +class SasDefinitionCreateParameters(Model): + """The SAS definition create parameters. + + All required parameters must be populated in order to send to Azure. + + :param template_uri: Required. The SAS definition token template signed + with an arbitrary key. Tokens created according to the SAS definition + will have the same properties as the template. + :type template_uri: str + :param sas_type: Required. The type of SAS token the SAS definition will + create. Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: Required. The validity period of SAS tokens + created according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'template_uri': {'required': True}, + 'sas_type': {'required': True}, + 'validity_period': {'required': True}, + } + + _attribute_map = { + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, template_uri: str, sas_type, validity_period: str, sas_definition_attributes=None, tags=None, **kwargs) -> None: + super(SasDefinitionCreateParameters, self).__init__(**kwargs) + self.template_uri = template_uri + self.sas_type = sas_type + self.validity_period = validity_period + self.sas_definition_attributes = sas_definition_attributes + self.tags = tags + + +class SasDefinitionListResult(Model): + """The storage account SAS definition list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of SAS definitions along + with a link to the next page of SAS definitions. + :vartype value: list[~azure.keyvault.v7_0.models.SasDefinitionItem] + :ivar next_link: The URL to get the next set of SAS definitions. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SasDefinitionItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(SasDefinitionListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SasDefinitionUpdateParameters(Model): + """The SAS definition update parameters. + + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will have + the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'template_uri': {'key': 'templateUri', 'type': 'str'}, + 'sas_type': {'key': 'sasType', 'type': 'str'}, + 'validity_period': {'key': 'validityPeriod', 'type': 'str'}, + 'sas_definition_attributes': {'key': 'attributes', 'type': 'SasDefinitionAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, template_uri: str=None, sas_type=None, validity_period: str=None, sas_definition_attributes=None, tags=None, **kwargs) -> None: + super(SasDefinitionUpdateParameters, self).__init__(**kwargs) + self.template_uri = template_uri + self.sas_type = sas_type + self.validity_period = validity_period + self.sas_definition_attributes = sas_definition_attributes + self.tags = tags + + +class SecretAttributes(Attributes): + """The secret management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param not_before: Not before date in UTC. + :type not_before: datetime + :param expires: Expiry date in UTC. + :type expires: datetime + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for secrets in the current vault. If it contains 'Purgeable', the + secret can be permanently deleted by a privileged user; otherwise, only + the system can purge the secret, at the end of the retention interval. + Possible values include: 'Purgeable', 'Recoverable+Purgeable', + 'Recoverable', 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'not_before': {'key': 'nbf', 'type': 'unix-time'}, + 'expires': {'key': 'exp', 'type': 'unix-time'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, not_before=None, expires=None, **kwargs) -> None: + super(SecretAttributes, self).__init__(enabled=enabled, not_before=not_before, expires=expires, **kwargs) + self.recovery_level = None + + +class SecretListResult(Model): + """The secret list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of secrets in the key + vault along with a link to the next page of secrets. + :vartype value: list[~azure.keyvault.v7_0.models.SecretItem] + :ivar next_link: The URL to get the next set of secrets. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[SecretItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(SecretListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class SecretProperties(Model): + """Properties of the key backing a certificate. + + :param content_type: The media type (MIME type). + :type content_type: str + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + } + + def __init__(self, *, content_type: str=None, **kwargs) -> None: + super(SecretProperties, self).__init__(**kwargs) + self.content_type = content_type + + +class SecretRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param secret_bundle_backup: Required. The backup blob associated with a + secret bundle. + :type secret_bundle_backup: bytes + """ + + _validation = { + 'secret_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'secret_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, secret_bundle_backup: bytes, **kwargs) -> None: + super(SecretRestoreParameters, self).__init__(**kwargs) + self.secret_bundle_backup = secret_bundle_backup + + +class SecretSetParameters(Model): + """The secret set parameters. + + All required parameters must be populated in order to send to Azure. + + :param value: Required. The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + """ + + _validation = { + 'value': {'required': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': 'str'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + } + + def __init__(self, *, value: str, tags=None, content_type: str=None, secret_attributes=None, **kwargs) -> None: + super(SecretSetParameters, self).__init__(**kwargs) + self.value = value + self.tags = tags + self.content_type = content_type + self.secret_attributes = secret_attributes + + +class SecretUpdateParameters(Model): + """The secret update parameters. + + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'content_type': {'key': 'contentType', 'type': 'str'}, + 'secret_attributes': {'key': 'attributes', 'type': 'SecretAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, content_type: str=None, secret_attributes=None, tags=None, **kwargs) -> None: + super(SecretUpdateParameters, self).__init__(**kwargs) + self.content_type = content_type + self.secret_attributes = secret_attributes + self.tags = tags + + +class StorageAccountAttributes(Model): + """The storage account management attributes. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :param enabled: the enabled state of the object. + :type enabled: bool + :ivar created: Creation time in UTC. + :vartype created: datetime + :ivar updated: Last updated time in UTC. + :vartype updated: datetime + :ivar recovery_level: Reflects the deletion recovery level currently in + effect for storage accounts in the current vault. If it contains + 'Purgeable' the storage account can be permanently deleted by a privileged + user; otherwise, only the system can purge the storage account, at the end + of the retention interval. Possible values include: 'Purgeable', + 'Recoverable+Purgeable', 'Recoverable', + 'Recoverable+ProtectedSubscription' + :vartype recovery_level: str or + ~azure.keyvault.v7_0.models.DeletionRecoveryLevel + """ + + _validation = { + 'created': {'readonly': True}, + 'updated': {'readonly': True}, + 'recovery_level': {'readonly': True}, + } + + _attribute_map = { + 'enabled': {'key': 'enabled', 'type': 'bool'}, + 'created': {'key': 'created', 'type': 'unix-time'}, + 'updated': {'key': 'updated', 'type': 'unix-time'}, + 'recovery_level': {'key': 'recoveryLevel', 'type': 'str'}, + } + + def __init__(self, *, enabled: bool=None, **kwargs) -> None: + super(StorageAccountAttributes, self).__init__(**kwargs) + self.enabled = enabled + self.created = None + self.updated = None + self.recovery_level = None + + +class StorageAccountCreateParameters(Model): + """The storage account create parameters. + + All required parameters must be populated in order to send to Azure. + + :param resource_id: Required. Storage account resource id. + :type resource_id: str + :param active_key_name: Required. Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: Required. whether keyvault should manage the + storage account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _validation = { + 'resource_id': {'required': True}, + 'active_key_name': {'required': True}, + 'auto_regenerate_key': {'required': True}, + } + + _attribute_map = { + 'resource_id': {'key': 'resourceId', 'type': 'str'}, + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, resource_id: str, active_key_name: str, auto_regenerate_key: bool, regeneration_period: str=None, storage_account_attributes=None, tags=None, **kwargs) -> None: + super(StorageAccountCreateParameters, self).__init__(**kwargs) + self.resource_id = resource_id + self.active_key_name = active_key_name + self.auto_regenerate_key = auto_regenerate_key + self.regeneration_period = regeneration_period + self.storage_account_attributes = storage_account_attributes + self.tags = tags + + +class StorageAccountRegenerteKeyParameters(Model): + """The storage account key regenerate parameters. + + All required parameters must be populated in order to send to Azure. + + :param key_name: Required. The storage account key name. + :type key_name: str + """ + + _validation = { + 'key_name': {'required': True}, + } + + _attribute_map = { + 'key_name': {'key': 'keyName', 'type': 'str'}, + } + + def __init__(self, *, key_name: str, **kwargs) -> None: + super(StorageAccountRegenerteKeyParameters, self).__init__(**kwargs) + self.key_name = key_name + + +class StorageAccountUpdateParameters(Model): + """The storage account update parameters. + + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration specified + in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + """ + + _attribute_map = { + 'active_key_name': {'key': 'activeKeyName', 'type': 'str'}, + 'auto_regenerate_key': {'key': 'autoRegenerateKey', 'type': 'bool'}, + 'regeneration_period': {'key': 'regenerationPeriod', 'type': 'str'}, + 'storage_account_attributes': {'key': 'attributes', 'type': 'StorageAccountAttributes'}, + 'tags': {'key': 'tags', 'type': '{str}'}, + } + + def __init__(self, *, active_key_name: str=None, auto_regenerate_key: bool=None, regeneration_period: str=None, storage_account_attributes=None, tags=None, **kwargs) -> None: + super(StorageAccountUpdateParameters, self).__init__(**kwargs) + self.active_key_name = active_key_name + self.auto_regenerate_key = auto_regenerate_key + self.regeneration_period = regeneration_period + self.storage_account_attributes = storage_account_attributes + self.tags = tags + + +class StorageListResult(Model): + """The storage accounts list result. + + Variables are only populated by the server, and will be ignored when + sending a request. + + :ivar value: A response message containing a list of storage accounts in + the key vault along with a link to the next page of storage accounts. + :vartype value: list[~azure.keyvault.v7_0.models.StorageAccountItem] + :ivar next_link: The URL to get the next set of storage accounts. + :vartype next_link: str + """ + + _validation = { + 'value': {'readonly': True}, + 'next_link': {'readonly': True}, + } + + _attribute_map = { + 'value': {'key': 'value', 'type': '[StorageAccountItem]'}, + 'next_link': {'key': 'nextLink', 'type': 'str'}, + } + + def __init__(self, **kwargs) -> None: + super(StorageListResult, self).__init__(**kwargs) + self.value = None + self.next_link = None + + +class StorageRestoreParameters(Model): + """The secret restore parameters. + + All required parameters must be populated in order to send to Azure. + + :param storage_bundle_backup: Required. The backup blob associated with a + storage account. + :type storage_bundle_backup: bytes + """ + + _validation = { + 'storage_bundle_backup': {'required': True}, + } + + _attribute_map = { + 'storage_bundle_backup': {'key': 'value', 'type': 'base64'}, + } + + def __init__(self, *, storage_bundle_backup: bytes, **kwargs) -> None: + super(StorageRestoreParameters, self).__init__(**kwargs) + self.storage_bundle_backup = storage_bundle_backup + + +class SubjectAlternativeNames(Model): + """The subject alternate names of a X509 object. + + :param emails: Email addresses. + :type emails: list[str] + :param dns_names: Domain names. + :type dns_names: list[str] + :param upns: User principal names. + :type upns: list[str] + """ + + _attribute_map = { + 'emails': {'key': 'emails', 'type': '[str]'}, + 'dns_names': {'key': 'dns_names', 'type': '[str]'}, + 'upns': {'key': 'upns', 'type': '[str]'}, + } + + def __init__(self, *, emails=None, dns_names=None, upns=None, **kwargs) -> None: + super(SubjectAlternativeNames, self).__init__(**kwargs) + self.emails = emails + self.dns_names = dns_names + self.upns = upns + + +class Trigger(Model): + """A condition to be satisfied for an action to be executed. + + :param lifetime_percentage: Percentage of lifetime at which to trigger. + Value should be between 1 and 99. + :type lifetime_percentage: int + :param days_before_expiry: Days before expiry to attempt renewal. Value + should be between 1 and validity_in_months multiplied by 27. If + validity_in_months is 36, then value should be between 1 and 972 (36 * + 27). + :type days_before_expiry: int + """ + + _validation = { + 'lifetime_percentage': {'maximum': 99, 'minimum': 1}, + } + + _attribute_map = { + 'lifetime_percentage': {'key': 'lifetime_percentage', 'type': 'int'}, + 'days_before_expiry': {'key': 'days_before_expiry', 'type': 'int'}, + } + + def __init__(self, *, lifetime_percentage: int=None, days_before_expiry: int=None, **kwargs) -> None: + super(Trigger, self).__init__(**kwargs) + self.lifetime_percentage = lifetime_percentage + self.days_before_expiry = days_before_expiry + + +class X509CertificateProperties(Model): + """Properties of the X509 component of a certificate. + + :param subject: The subject name. Should be a valid X509 distinguished + Name. + :type subject: str + :param ekus: The enhanced key usage. + :type ekus: list[str] + :param subject_alternative_names: The subject alternative names. + :type subject_alternative_names: + ~azure.keyvault.v7_0.models.SubjectAlternativeNames + :param key_usage: List of key usages. + :type key_usage: list[str or ~azure.keyvault.v7_0.models.KeyUsageType] + :param validity_in_months: The duration that the certificate is valid in + months. + :type validity_in_months: int + """ + + _validation = { + 'validity_in_months': {'minimum': 0}, + } + + _attribute_map = { + 'subject': {'key': 'subject', 'type': 'str'}, + 'ekus': {'key': 'ekus', 'type': '[str]'}, + 'subject_alternative_names': {'key': 'sans', 'type': 'SubjectAlternativeNames'}, + 'key_usage': {'key': 'key_usage', 'type': '[str]'}, + 'validity_in_months': {'key': 'validity_months', 'type': 'int'}, + } + + def __init__(self, *, subject: str=None, ekus=None, subject_alternative_names=None, key_usage=None, validity_in_months: int=None, **kwargs) -> None: + super(X509CertificateProperties, self).__init__(**kwargs) + self.subject = subject + self.ekus = ekus + self.subject_alternative_names = subject_alternative_names + self.key_usage = key_usage + self.validity_in_months = validity_in_months diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/__init__.py new file mode 100644 index 000000000000..603e37d3ee07 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from ._key_vault_client_operations import KeyVaultClientOperationsMixin + +__all__ = [ + 'KeyVaultClientOperationsMixin', +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/_key_vault_client_operations.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/_key_vault_client_operations.py new file mode 100644 index 000000000000..b9ed6e10ea21 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/operations/_key_vault_client_operations.py @@ -0,0 +1,5163 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +from azure.core.exceptions import map_error +from azure.core.paging import ItemPaged +from .. import models +import uuid + + +class KeyVaultClientOperationsMixin(object): + + def create_key(self, vault_base_url, key_name, kty, key_size=None, key_ops=None, key_attributes=None, tags=None, curve=None, cls=None, **kwargs): + """Creates a new key, stores it, then returns key parameters and + attributes to the client. + + The create key operation can be used to create any key type in Azure + Key Vault. If the named key already exists, Azure Key Vault creates a + new version of the key. It requires the keys/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name for the new key. The system will generate + the version name for the new key. + :type key_name: str + :param kty: The type of key to create. For valid values, see + JsonWebKeyType. Possible values include: 'EC', 'EC-HSM', 'RSA', + 'RSA-HSM', 'oct' + :type kty: str or ~azure.keyvault.v7_0.models.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or + 4096 for RSA. + :type key_size: int + :param key_ops: + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param curve: Elliptic curve name. For valid values, see + JsonWebKeyCurveName. Possible values include: 'P-256', 'P-384', + 'P-521', 'P-256K' + :type curve: str or ~azure.keyvault.v7_0.models.JsonWebKeyCurveName + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyCreateParameters(kty=kty, key_size=key_size, key_ops=key_ops, key_attributes=key_attributes, tags=tags, curve=curve) + + # Construct URL + url = self.create_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_key.metadata = {'url': '/keys/{key-name}/create'} + + def import_key(self, vault_base_url, key_name, key, hsm=None, key_attributes=None, tags=None, cls=None, **kwargs): + """Imports an externally created key, stores it, and returns key + parameters and attributes to the client. + + The import key operation may be used to import any key type into an + Azure Key Vault. If the named key already exists, Azure Key Vault + creates a new version of the key. This operation requires the + keys/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: Name for the imported key. + :type key_name: str + :param key: The Json web key + :type key: ~azure.keyvault.v7_0.models.JsonWebKey + :param hsm: Whether to import as a hardware key (HSM) or software key. + :type hsm: bool + :param key_attributes: The key management attributes. + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyImportParameters(hsm=hsm, key=key, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.import_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyImportParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_key.metadata = {'url': '/keys/{key-name}'} + + def delete_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Deletes a key of any type from storage in Azure Key Vault. + + The delete key operation cannot be used to remove individual versions + of a key. This operation removes the cryptographic material associated + with the key, which means the key is not usable for Sign/Verify, + Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the + keys/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to delete. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_key.metadata = {'url': '/keys/{key-name}'} + + def update_key(self, vault_base_url, key_name, key_version, key_ops=None, key_attributes=None, tags=None, cls=None, **kwargs): + """The update key operation changes specified attributes of a stored key + and can be applied to any key type and key version stored in Azure Key + Vault. + + In order to perform this operation, the key must already exist in the + Key Vault. Note: The cryptographic material of a key itself cannot be + changed. This operation requires the keys/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of key to update. + :type key_name: str + :param key_version: The version of the key to update. + :type key_version: str + :param key_ops: Json web key operations. For more information on + possible key operations, see JsonWebKeyOperation. + :type key_ops: list[str or + ~azure.keyvault.v7_0.models.JsonWebKeyOperation] + :param key_attributes: + :type key_attributes: ~azure.keyvault.v7_0.models.KeyAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyUpdateParameters(key_ops=key_ops, key_attributes=key_attributes, tags=tags) + + # Construct URL + url = self.update_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key(self, vault_base_url, key_name, key_version, cls=None, **kwargs): + """Gets the public part of a stored key. + + The get key operation is applicable to all key types. If the requested + key is symmetric, then no key material is released in the response. + This operation requires the keys/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key to get. + :type key_name: str + :param key_version: Adding the version parameter retrieves a specific + version of a key. + :type key_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_key.metadata = {'url': '/keys/{key-name}/{key-version}'} + + def get_key_versions( + self, vault_base_url, key_name, maxresults=None, cls=None, **kwargs): + """Retrieves a list of individual key versions with the same key name. + + The full key identifier, attributes, and tags are provided in the + response. This operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_key_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_key_versions.metadata = {'url': '/keys/{key-name}/versions'} + + def get_keys( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a stored key. The LIST + operation is applicable to all key types, however only the base key + identifier, attributes, and tags are provided in the response. + Individual versions of a key are not listed in the response. This + operation requires the keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of KeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.KeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('KeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_keys.metadata = {'url': '/keys'} + + def backup_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Requests that a backup of the specified key be downloaded to the + client. + + The Key Backup operation exports a key from Azure Key Vault in a + protected form. Note that this operation does NOT return key material + in a form that can be used outside the Azure Key Vault system, the + returned key material is either protected to a Azure Key Vault HSM or + to Azure Key Vault itself. The intent of this operation is to allow a + client to GENERATE a key in one Azure Key Vault instance, BACKUP the + key, and then RESTORE it into another Azure Key Vault instance. The + BACKUP operation may be used to export, in protected form, any key type + from Azure Key Vault. Individual versions of a key cannot be backed up. + BACKUP / RESTORE can be performed within geographical boundaries only; + meaning that a BACKUP from one geographical area cannot be restored to + another geographical area. For example, a backup from the US + geographical area cannot be restored in an EU geographical area. This + operation requires the key/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupKeyResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupKeyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupKeyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_key.metadata = {'url': '/keys/{key-name}/backup'} + + def restore_key(self, vault_base_url, key_bundle_backup, cls=None, **kwargs): + """Restores a backed up key to a vault. + + Imports a previously backed up key into Azure Key Vault, restoring the + key, its key identifier, attributes and access control policies. The + RESTORE operation may be used to import a previously backed up key. + Individual versions of a key cannot be restored. The key is restored in + its entirety with the same key name as it had when it was backed up. If + the key name is not available in the target Key Vault, the RESTORE + operation will be rejected. While the key name is retained during + restore, the final key identifier will change if the key is restored to + a different vault. Restore will restore all versions and preserve + version identifiers. The RESTORE operation is subject to security + constraints: The target Key Vault must be owned by the same Microsoft + Azure Subscription as the source Key Vault The user must have RESTORE + permission in the target Key Vault. This operation requires the + keys/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_bundle_backup: The backup blob associated with a key + bundle. + :type key_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyRestoreParameters(key_bundle_backup=key_bundle_backup) + + # Construct URL + url = self.restore_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_key.metadata = {'url': '/keys/restore'} + + def encrypt(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Encrypts an arbitrary sequence of bytes using an encryption key that is + stored in a key vault. + + The ENCRYPT operation encrypts an arbitrary sequence of bytes using an + encryption key that is stored in Azure Key Vault. Note that the ENCRYPT + operation only supports a single block of data, the size of which is + dependent on the target key and the encryption algorithm to be used. + The ENCRYPT operation is only strictly necessary for symmetric keys + stored in Azure Key Vault since protection with an asymmetric key can + be performed using public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/encrypt permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.encrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + encrypt.metadata = {'url': '/keys/{key-name}/{key-version}/encrypt'} + + def decrypt(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Decrypts a single block of encrypted data. + + The DECRYPT operation decrypts a well-formed block of ciphertext using + the target encryption key and specified algorithm. This operation is + the reverse of the ENCRYPT operation; only a single block of data may + be decrypted, the size of this block is dependent on the target key and + the algorithm to be used. The DECRYPT operation applies to asymmetric + and symmetric keys stored in Azure Key Vault since it uses the private + portion of the key. This operation requires the keys/decrypt + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.decrypt.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + decrypt.metadata = {'url': '/keys/{key-name}/{key-version}/decrypt'} + + def sign(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Creates a signature from a digest using the specified key. + + The SIGN operation is applicable to asymmetric and symmetric keys + stored in Azure Key Vault since this operation uses the private portion + of the key. This operation requires the keys/sign permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm identifier. For + more information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeySignParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.sign.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeySignParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + sign.metadata = {'url': '/keys/{key-name}/{key-version}/sign'} + + def verify(self, vault_base_url, key_name, key_version, algorithm, digest, signature, cls=None, **kwargs): + """Verifies a signature using a specified key. + + The VERIFY operation is applicable to symmetric keys stored in Azure + Key Vault. VERIFY is not strictly necessary for asymmetric keys stored + in Azure Key Vault since signature verification can be performed using + the public portion of the key but this operation is supported as a + convenience for callers that only have a key-reference and not the + public portion of the key. This operation requires the keys/verify + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: The signing/verification algorithm. For more + information on possible algorithm types, see + JsonWebKeySignatureAlgorithm. Possible values include: 'PS256', + 'PS384', 'PS512', 'RS256', 'RS384', 'RS512', 'RSNULL', 'ES256', + 'ES384', 'ES512', 'ES256K' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeySignatureAlgorithm + :param digest: The digest used for signing. + :type digest: bytes + :param signature: The signature to be verified. + :type signature: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyVerifyResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyVerifyResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyVerifyParameters(algorithm=algorithm, digest=digest, signature=signature) + + # Construct URL + url = self.verify.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyVerifyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyVerifyResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + verify.metadata = {'url': '/keys/{key-name}/{key-version}/verify'} + + def wrap_key(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Wraps a symmetric key using a specified key. + + The WRAP operation supports encryption of a symmetric key using a key + encryption key that has previously been stored in an Azure Key Vault. + The WRAP operation is only strictly necessary for symmetric keys stored + in Azure Key Vault since protection with an asymmetric key can be + performed using the public portion of the key. This operation is + supported for asymmetric keys as a convenience for callers that have a + key-reference but do not have access to the public key material. This + operation requires the keys/wrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.wrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + wrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/wrapkey'} + + def unwrap_key(self, vault_base_url, key_name, key_version, algorithm, value, cls=None, **kwargs): + """Unwraps a symmetric key using the specified key that was initially used + for wrapping that key. + + The UNWRAP operation supports decryption of a symmetric key using the + target key encryption key. This operation is the reverse of the WRAP + operation. The UNWRAP operation applies to asymmetric and symmetric + keys stored in Azure Key Vault since it uses the private portion of the + key. This operation requires the keys/unwrapKey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param key_version: The version of the key. + :type key_version: str + :param algorithm: algorithm identifier. Possible values include: + 'RSA-OAEP', 'RSA-OAEP-256', 'RSA1_5' + :type algorithm: str or + ~azure.keyvault.v7_0.models.JsonWebKeyEncryptionAlgorithm + :param value: + :type value: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyOperationResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyOperationResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.KeyOperationsParameters(algorithm=algorithm, value=value) + + # Construct URL + url = self.unwrap_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str'), + 'key-version': self._serialize.url("key_version", key_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'KeyOperationsParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyOperationResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + unwrap_key.metadata = {'url': '/keys/{key-name}/{key-version}/unwrapkey'} + + def get_deleted_keys( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists the deleted keys in the specified vault. + + Retrieves a list of the keys in the Key Vault as JSON Web Key + structures that contain the public part of a deleted key. This + operation includes deletion-specific information. The Get Deleted Keys + operation is applicable for vaults enabled for soft-delete. While the + operation can be invoked on any vault, it will return an error if + invoked on a non soft-delete enabled vault. This operation requires the + keys/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedKeyItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.DeletedKeyItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_keys.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedKeyListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_keys.metadata = {'url': '/deletedkeys'} + + def get_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Gets the public part of a deleted key. + + The Get Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/get permission. . + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedKeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedKeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedKeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + def purge_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Permanently deletes the specified key. + + The Purge Deleted Key operation is applicable for soft-delete enabled + vaults. While the operation can be invoked on any vault, it will return + an error if invoked on a non soft-delete enabled vault. This operation + requires the keys/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the key + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_key.metadata = {'url': '/deletedkeys/{key-name}'} + + def recover_deleted_key(self, vault_base_url, key_name, cls=None, **kwargs): + """Recovers the deleted key to its latest version. + + The Recover Deleted Key operation is applicable for deleted keys in + soft-delete enabled vaults. It recovers the deleted key back to its + latest version under /keys. An attempt to recover an non-deleted key + will return an error. Consider this the inverse of the delete operation + on soft-delete enabled vaults. This operation requires the keys/recover + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param key_name: The name of the deleted key. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: KeyBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.KeyBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'key-name': self._serialize.url("key_name", key_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('KeyBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_key.metadata = {'url': '/deletedkeys/{key-name}/recover'} + + def set_secret(self, vault_base_url, secret_name, value, tags=None, content_type=None, secret_attributes=None, cls=None, **kwargs): + """Sets a secret in a specified key vault. + + The SET operation adds a secret to the Azure Key Vault. If the named + secret already exists, Azure Key Vault creates a new version of that + secret. This operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param value: The value of the secret. + :type value: str + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretSetParameters(value=value, tags=tags, content_type=content_type, secret_attributes=secret_attributes) + + # Construct URL + url = self.set_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_secret.metadata = {'url': '/secrets/{secret-name}'} + + def delete_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Deletes a secret from a specified key vault. + + The DELETE operation applies to any secret stored in Azure Key Vault. + DELETE cannot be applied to an individual version of a secret. This + operation requires the secrets/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_secret.metadata = {'url': '/secrets/{secret-name}'} + + def update_secret(self, vault_base_url, secret_name, secret_version, content_type=None, secret_attributes=None, tags=None, cls=None, **kwargs): + """Updates the attributes associated with a specified secret in a given + key vault. + + The UPDATE operation changes specified attributes of an existing stored + secret. Attributes that are not specified in the request are left + unchanged. The value of a secret itself cannot be changed. This + operation requires the secrets/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param content_type: Type of the secret value such as a password. + :type content_type: str + :param secret_attributes: The secret management attributes. + :type secret_attributes: ~azure.keyvault.v7_0.models.SecretAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretUpdateParameters(content_type=content_type, secret_attributes=secret_attributes, tags=tags) + + # Construct URL + url = self.update_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secret(self, vault_base_url, secret_name, secret_version, cls=None, **kwargs): + """Get a specified secret from a given key vault. + + The GET operation is applicable to any secret stored in Azure Key + Vault. This operation requires the secrets/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param secret_version: The version of the secret. + :type secret_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str'), + 'secret-version': self._serialize.url("secret_version", secret_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_secret.metadata = {'url': '/secrets/{secret-name}/{secret-version}'} + + def get_secrets( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List secrets in a specified key vault. + + The Get Secrets operation is applicable to the entire vault. However, + only the base secret identifier and its attributes are provided in the + response. Individual secret versions are not listed in the response. + This operation requires the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_secrets.metadata = {'url': '/secrets'} + + def get_secret_versions( + self, vault_base_url, secret_name, maxresults=None, cls=None, **kwargs): + """List all versions of the specified secret. + + The full secret identifier and attributes are provided in the response. + No values are returned for the secrets. This operations requires the + secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified, the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.SecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_secret_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_secret_versions.metadata = {'url': '/secrets/{secret-name}/versions'} + + def get_deleted_secrets( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists deleted secrets for the specified vault. + + The Get Deleted Secrets operation returns the secrets that have been + deleted for a vault enabled for soft-delete. This operation requires + the secrets/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSecretItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.DeletedSecretItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_secrets.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedSecretListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_secrets.metadata = {'url': '/deletedsecrets'} + + def get_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Gets the specified deleted secret. + + The Get Deleted Secret operation returns the specified deleted secret + along with its attributes. This operation requires the secrets/get + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + def purge_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Permanently deletes the specified secret. + + The purge deleted secret operation removes the secret permanently, + without the possibility of recovery. This operation can only be enabled + on a soft-delete enabled vault. This operation requires the + secrets/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}'} + + def recover_deleted_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Recovers the deleted secret to the latest version. + + Recovers the deleted secret in the specified vault. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the secrets/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the deleted secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_secret.metadata = {'url': '/deletedsecrets/{secret-name}/recover'} + + def backup_secret(self, vault_base_url, secret_name, cls=None, **kwargs): + """Backs up the specified secret. + + Requests that a backup of the specified secret be downloaded to the + client. All versions of the secret will be downloaded. This operation + requires the secrets/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_name: The name of the secret. + :type secret_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupSecretResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupSecretResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'secret-name': self._serialize.url("secret_name", secret_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupSecretResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_secret.metadata = {'url': '/secrets/{secret-name}/backup'} + + def restore_secret(self, vault_base_url, secret_bundle_backup, cls=None, **kwargs): + """Restores a backed up secret to a vault. + + Restores a backed up secret, and all its versions, to a vault. This + operation requires the secrets/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param secret_bundle_backup: The backup blob associated with a secret + bundle. + :type secret_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: SecretBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SecretBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SecretRestoreParameters(secret_bundle_backup=secret_bundle_backup) + + # Construct URL + url = self.restore_secret.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SecretRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SecretBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_secret.metadata = {'url': '/secrets/restore'} + + def get_certificates( + self, vault_base_url, maxresults=None, include_pending=None, cls=None, **kwargs): + """List certificates in a specified key vault. + + The GetCertificates operation returns the set of certificates resources + in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + if include_pending is not None: + query_parameters['includePending'] = self._serialize.query("include_pending", include_pending, 'bool') + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificates.metadata = {'url': '/certificates'} + + def delete_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Deletes a certificate from a specified key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate.metadata = {'url': '/certificates/{certificate-name}'} + + def set_certificate_contacts(self, vault_base_url, contact_list=None, cls=None, **kwargs): + """Sets the certificate contacts for the specified key vault. + + Sets the certificate contacts for the specified key vault. This + operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param contact_list: The contact list for the vault certificates. + :type contact_list: list[~azure.keyvault.v7_0.models.Contact] + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + contacts = models.Contacts(contact_list=contact_list) + + # Construct URL + url = self.set_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(contacts, 'Contacts') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_contacts(self, vault_base_url, cls=None, **kwargs): + """Lists the certificate contacts for a specified key vault. + + The GetCertificateContacts operation returns the set of certificate + contact resources in the specified key vault. This operation requires + the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def delete_certificate_contacts(self, vault_base_url, cls=None, **kwargs): + """Deletes the certificate contacts for a specified key vault. + + Deletes the certificate contacts for a specified key vault certificate. + This operation requires the certificates/managecontacts permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: Contacts or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.Contacts + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_contacts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('Contacts', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_contacts.metadata = {'url': '/certificates/contacts'} + + def get_certificate_issuers( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List certificate issuers for a specified key vault. + + The GetCertificateIssuers operation returns the set of certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateIssuerItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.CertificateIssuerItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_issuers.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateIssuerListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificate_issuers.metadata = {'url': '/certificates/issuers'} + + def set_certificate_issuer(self, vault_base_url, issuer_name, provider, credentials=None, organization_details=None, attributes=None, cls=None, **kwargs): + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerSetParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.set_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerSetParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def update_certificate_issuer(self, vault_base_url, issuer_name, provider=None, credentials=None, organization_details=None, attributes=None, cls=None, **kwargs): + """Updates the specified certificate issuer. + + The UpdateCertificateIssuer operation performs an update on the + specified certificate issuer entity. This operation requires the + certificates/setissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param provider: The issuer provider. + :type provider: str + :param credentials: The credentials to be used for the issuer. + :type credentials: ~azure.keyvault.v7_0.models.IssuerCredentials + :param organization_details: Details of the organization as provided + to the issuer. + :type organization_details: + ~azure.keyvault.v7_0.models.OrganizationDetails + :param attributes: Attributes of the issuer object. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameter = models.CertificateIssuerUpdateParameters(provider=provider, credentials=credentials, organization_details=organization_details, attributes=attributes) + + # Construct URL + url = self.update_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameter, 'CertificateIssuerUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def get_certificate_issuer(self, vault_base_url, issuer_name, cls=None, **kwargs): + """Lists the specified certificate issuer. + + The GetCertificateIssuer operation returns the specified certificate + issuer resources in the specified key vault. This operation requires + the certificates/manageissuers/getissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def delete_certificate_issuer(self, vault_base_url, issuer_name, cls=None, **kwargs): + """Deletes the specified certificate issuer. + + The DeleteCertificateIssuer operation permanently removes the specified + certificate issuer from the vault. This operation requires the + certificates/manageissuers/deleteissuers permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param issuer_name: The name of the issuer. + :type issuer_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: IssuerBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.IssuerBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_issuer.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'issuer-name': self._serialize.url("issuer_name", issuer_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('IssuerBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_issuer.metadata = {'url': '/certificates/issuers/{issuer-name}'} + + def create_certificate(self, vault_base_url, certificate_name, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateCreateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.create_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateCreateParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [202]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 202: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + create_certificate.metadata = {'url': '/certificates/{certificate-name}/create'} + + def import_certificate(self, vault_base_url, certificate_name, base64_encoded_certificate, password=None, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param base64_encoded_certificate: Base64 encoded representation of + the certificate object to import. This certificate needs to contain + the private key. + :type base64_encoded_certificate: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateImportParameters(base64_encoded_certificate=base64_encoded_certificate, password=password, certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.import_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str', pattern=r'^[0-9a-zA-Z-]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateImportParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + import_certificate.metadata = {'url': '/certificates/{certificate-name}/import'} + + def get_certificate_versions( + self, vault_base_url, certificate_name, maxresults=None, cls=None, **kwargs): + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the specified key vault. This operation requires the + certificates/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of CertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.CertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_certificate_versions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('CertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_certificate_versions.metadata = {'url': '/certificates/{certificate-name}/versions'} + + def get_certificate_policy(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Lists the policy for a certificate. + + The GetCertificatePolicy operation returns the specified certificate + policy resources in the specified key vault. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in a given key + vault. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + def update_certificate_policy(self, vault_base_url, certificate_name, certificate_policy, cls=None, **kwargs): + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leave others as null. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_policy: The policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificatePolicy or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificatePolicy + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.update_certificate_policy.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_policy, 'CertificatePolicy') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificatePolicy', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_policy.metadata = {'url': '/certificates/{certificate-name}/policy'} + + def update_certificate(self, vault_base_url, certificate_name, certificate_version, certificate_policy=None, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given key + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param certificate_policy: The management policy for the certificate. + :type certificate_policy: + ~azure.keyvault.v7_0.models.CertificatePolicy + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateUpdateParameters(certificate_policy=certificate_policy, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.update_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + def get_certificate(self, vault_base_url, certificate_name, certificate_version, cls=None, **kwargs): + """Gets information about a certificate. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate in the given + vault. + :type certificate_name: str + :param certificate_version: The version of the certificate. + :type certificate_version: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str'), + 'certificate-version': self._serialize.url("certificate_version", certificate_version, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate.metadata = {'url': '/certificates/{certificate-name}/{certificate-version}'} + + def update_certificate_operation(self, vault_base_url, certificate_name, cancellation_requested, cls=None, **kwargs): + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param cancellation_requested: Indicates if cancellation was requested + on the certificate operation. + :type cancellation_requested: bool + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + certificate_operation = models.CertificateOperationUpdateParameter(cancellation_requested=cancellation_requested) + + # Construct URL + url = self.update_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(certificate_operation, 'CertificateOperationUpdateParameter') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def get_certificate_operation(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def delete_certificate_operation(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateOperation or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateOperation + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_certificate_operation.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateOperation', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_certificate_operation.metadata = {'url': '/certificates/{certificate-name}/pending'} + + def merge_certificate(self, vault_base_url, certificate_name, x509_certificates, certificate_attributes=None, tags=None, cls=None, **kwargs): + """Merges a certificate or a certificate chain with a key pair existing on + the server. + + The MergeCertificate operation performs the merging of a certificate or + certificate chain with a key pair currently available in the service. + This operation requires the certificates/create permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param x509_certificates: The certificate or the certificate chain to + merge. + :type x509_certificates: list[bytearray] + :param certificate_attributes: The attributes of the certificate + (optional). + :type certificate_attributes: + ~azure.keyvault.v7_0.models.CertificateAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateMergeParameters(x509_certificates=x509_certificates, certificate_attributes=certificate_attributes, tags=tags) + + # Construct URL + url = self.merge_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateMergeParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [201]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 201: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + merge_certificate.metadata = {'url': '/certificates/{certificate-name}/pending/merge'} + + def backup_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Backs up the specified certificate. + + Requests that a backup of the specified certificate be downloaded to + the client. All versions of the certificate will be downloaded. This + operation requires the certificates/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate. + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupCertificateResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupCertificateResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupCertificateResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_certificate.metadata = {'url': '/certificates/{certificate-name}/backup'} + + def restore_certificate(self, vault_base_url, certificate_bundle_backup, cls=None, **kwargs): + """Restores a backed up certificate to a vault. + + Restores a backed up certificate, and all its versions, to a vault. + This operation requires the certificates/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_bundle_backup: The backup blob associated with a + certificate bundle. + :type certificate_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.CertificateRestoreParameters(certificate_bundle_backup=certificate_bundle_backup) + + # Construct URL + url = self.restore_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'CertificateRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_certificate.metadata = {'url': '/certificates/restore'} + + def get_deleted_certificates( + self, vault_base_url, maxresults=None, include_pending=None, cls=None, **kwargs): + """Lists the deleted certificates in the specified vault currently + available for recovery. + + The GetDeletedCertificates operation retrieves the certificates in the + current vault which are in a deleted state and ready for recovery or + purging. This operation includes deletion-specific information. This + operation requires the certificates/get/list permission. This operation + can only be enabled on soft-delete enabled vaults. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :return: An iterator like instance of DeletedCertificateItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.DeletedCertificateItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_certificates.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + if include_pending is not None: + query_parameters['includePending'] = self._serialize.query("include_pending", include_pending, 'bool') + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedCertificateListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_certificates.metadata = {'url': '/deletedcertificates'} + + def get_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Retrieves information about the specified deleted certificate. + + The GetDeletedCertificate operation retrieves the deleted certificate + information plus its attributes, such as retention interval, scheduled + permanent deletion and the current deletion recovery level. This + operation requires the certificates/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedCertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedCertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedCertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + def purge_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Permanently deletes the specified deleted certificate. + + The PurgeDeletedCertificate operation performs an irreversible deletion + of the specified certificate, without possibility for recovery. The + operation is not available if the recovery level does not specify + 'Purgeable'. This operation requires the certificate/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}'} + + def recover_deleted_certificate(self, vault_base_url, certificate_name, cls=None, **kwargs): + """Recovers the deleted certificate back to its current version under + /certificates. + + The RecoverDeletedCertificate operation performs the reversal of the + Delete operation. The operation is applicable in vaults enabled for + soft-delete, and must be issued during the retention interval + (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param certificate_name: The name of the deleted certificate + :type certificate_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: CertificateBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.CertificateBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_certificate.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._serialize.url("certificate_name", certificate_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('CertificateBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_certificate.metadata = {'url': '/deletedcertificates/{certificate-name}/recover'} + + def get_storage_accounts( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """List storage accounts managed by the specified key vault. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of StorageAccountItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.StorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('StorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_storage_accounts.metadata = {'url': '/storage'} + + def get_deleted_storage_accounts( + self, vault_base_url, maxresults=None, cls=None, **kwargs): + """Lists deleted storage accounts for the specified vault. + + The Get Deleted Storage Accounts operation returns the storage accounts + that have been deleted for a vault enabled for soft-delete. This + operation requires the storage/list permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedStorageAccountItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.DeletedStorageAccountItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_storage_accounts.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedStorageListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_storage_accounts.metadata = {'url': '/deletedstorage'} + + def get_deleted_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Gets the specified deleted storage account. + + The Get Deleted Storage Account operation returns the specified deleted + storage account along with its attributes. This operation requires the + storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedStorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedStorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedStorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}'} + + def purge_deleted_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Permanently deletes the specified storage account. + + The purge deleted storage account operation removes the secret + permanently, without the possibility of recovery. This operation can + only be performed on a soft-delete enabled vault. This operation + requires the storage/purge permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: None or the result of cls(response) + :rtype: None + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.purge_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [204]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + if cls: + response_headers = {} + return cls(response, None, response_headers) + purge_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}'} + + def recover_deleted_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Recovers the deleted storage account. + + Recovers the deleted storage account in the specified vault. This + operation can only be performed on a soft-delete enabled vault. This + operation requires the storage/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_storage_account.metadata = {'url': '/deletedstorage/{storage-account-name}/recover'} + + def backup_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Backs up the specified storage account. + + Requests that a backup of the specified storage account be downloaded + to the client. This operation requires the storage/backup permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: BackupStorageResult or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.BackupStorageResult + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.backup_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('BackupStorageResult', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + backup_storage_account.metadata = {'url': '/storage/{storage-account-name}/backup'} + + def restore_storage_account(self, vault_base_url, storage_bundle_backup, cls=None, **kwargs): + """Restores a backed up storage account to a vault. + + Restores a backed up storage account to a vault. This operation + requires the storage/restore permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_bundle_backup: The backup blob associated with a + storage account. + :type storage_bundle_backup: bytes + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageRestoreParameters(storage_bundle_backup=storage_bundle_backup) + + # Construct URL + url = self.restore_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True) + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageRestoreParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + restore_storage_account.metadata = {'url': '/storage/restore'} + + def delete_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Deletes a storage account. This operation requires the storage/delete + permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedStorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedStorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedStorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def get_storage_account(self, vault_base_url, storage_account_name, cls=None, **kwargs): + """Gets information about a specified storage account. This operation + requires the storage/get permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def set_storage_account(self, vault_base_url, storage_account_name, resource_id, active_key_name, auto_regenerate_key, regeneration_period=None, storage_account_attributes=None, tags=None, cls=None, **kwargs): + """Creates or updates a new storage account. This operation requires the + storage/set permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param resource_id: Storage account resource id. + :type resource_id: str + :param active_key_name: Current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountCreateParameters(resource_id=resource_id, active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.set_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def update_storage_account(self, vault_base_url, storage_account_name, active_key_name=None, auto_regenerate_key=None, regeneration_period=None, storage_account_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given storage + account. This operation requires the storage/set/update permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param active_key_name: The current active storage account key name. + :type active_key_name: str + :param auto_regenerate_key: whether keyvault should manage the storage + account for the user. + :type auto_regenerate_key: bool + :param regeneration_period: The key regeneration time duration + specified in ISO-8601 format. + :type regeneration_period: str + :param storage_account_attributes: The attributes of the storage + account. + :type storage_account_attributes: + ~azure.keyvault.v7_0.models.StorageAccountAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountUpdateParameters(active_key_name=active_key_name, auto_regenerate_key=auto_regenerate_key, regeneration_period=regeneration_period, storage_account_attributes=storage_account_attributes, tags=tags) + + # Construct URL + url = self.update_storage_account.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_storage_account.metadata = {'url': '/storage/{storage-account-name}'} + + def regenerate_storage_account_key(self, vault_base_url, storage_account_name, key_name, cls=None, **kwargs): + """Regenerates the specified key value for the given storage account. This + operation requires the storage/regeneratekey permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param key_name: The storage account key name. + :type key_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: StorageBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.StorageBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.StorageAccountRegenerteKeyParameters(key_name=key_name) + + # Construct URL + url = self.regenerate_storage_account_key.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'StorageAccountRegenerteKeyParameters') + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('StorageBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + regenerate_storage_account_key.metadata = {'url': '/storage/{storage-account-name}/regeneratekey'} + + def get_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, cls=None, **kwargs): + """List storage SAS definitions for the given storage account. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of SasDefinitionItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.SasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('SasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_sas_definitions.metadata = {'url': '/storage/{storage-account-name}/sas'} + + def get_deleted_sas_definitions( + self, vault_base_url, storage_account_name, maxresults=None, cls=None, **kwargs): + """Lists deleted SAS definitions for the specified vault and storage + account. + + The Get Deleted Sas Definitions operation returns the SAS definitions + that have been deleted for a vault enabled for soft-delete. This + operation requires the storage/listsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param maxresults: Maximum number of results to return in a page. If + not specified the service will return up to 25 results. + :type maxresults: int + :return: An iterator like instance of DeletedSasDefinitionItem + :rtype: + ~azure.core.paging.ItemPaged[~azure.keyvault.v7_0.models.DeletedSasDefinitionItem] + :raises: + :class:`KeyVaultErrorException` + """ + def prepare_request(next_link=None): + query_parameters = {} + if not next_link: + # Construct URL + url = self.get_deleted_sas_definitions.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + if maxresults is not None: + query_parameters['maxresults'] = self._serialize.query("maxresults", maxresults, 'int', maximum=25, minimum=1) + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + else: + url = next_link + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + return request + + def extract_data(response): + deserialized = self._deserialize('DeletedSasDefinitionListResult', response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run(request) + response = pipeline_response.http_response + + error_map = kwargs.pop('error_map', None) + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + return response + + # Deserialize response + return ItemPaged( + get_next, extract_data + ) + get_deleted_sas_definitions.metadata = {'url': '/deletedstorage/{storage-account-name}/sas'} + + def get_deleted_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Gets the specified deleted sas definition. + + The Get Deleted SAS Definition operation returns the specified deleted + SAS definition along with its attributes. This operation requires the + storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_deleted_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_deleted_sas_definition.metadata = {'url': '/deletedstorage/{storage-account-name}/sas/{sas-definition-name}'} + + def recover_deleted_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Recovers the deleted SAS definition. + + Recovers the deleted SAS definition for the specified storage account. + This operation can only be performed on a soft-delete enabled vault. + This operation requires the storage/recover permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.recover_deleted_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.post(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + recover_deleted_sas_definition.metadata = {'url': '/deletedstorage/{storage-account-name}/sas/{sas-definition-name}/recover'} + + def delete_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Deletes a SAS definition from a specified storage account. This + operation requires the storage/deletesas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: DeletedSasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.DeletedSasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.delete_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('DeletedSasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + delete_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def get_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, cls=None, **kwargs): + """Gets information about a SAS definition for the specified storage + account. This operation requires the storage/getsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + # Construct URL + url = self.get_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + get_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def set_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, template_uri, sas_type, validity_period, sas_definition_attributes=None, tags=None, cls=None, **kwargs): + """Creates or updates a new SAS definition for the specified storage + account. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will + have the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SasDefinitionCreateParameters(template_uri=template_uri, sas_type=sas_type, validity_period=validity_period, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.set_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SasDefinitionCreateParameters') + + # Construct and send request + request = self._client.put(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + set_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} + + def update_sas_definition(self, vault_base_url, storage_account_name, sas_definition_name, template_uri=None, sas_type=None, validity_period=None, sas_definition_attributes=None, tags=None, cls=None, **kwargs): + """Updates the specified attributes associated with the given SAS + definition. This operation requires the storage/setsas permission. + + :param vault_base_url: The vault name, for example + https://myvault.vault.azure.net. + :type vault_base_url: str + :param storage_account_name: The name of the storage account. + :type storage_account_name: str + :param sas_definition_name: The name of the SAS definition. + :type sas_definition_name: str + :param template_uri: The SAS definition token template signed with an + arbitrary key. Tokens created according to the SAS definition will + have the same properties as the template. + :type template_uri: str + :param sas_type: The type of SAS token the SAS definition will create. + Possible values include: 'account', 'service' + :type sas_type: str or ~azure.keyvault.v7_0.models.SasTokenType + :param validity_period: The validity period of SAS tokens created + according to the SAS definition. + :type validity_period: str + :param sas_definition_attributes: The attributes of the SAS + definition. + :type sas_definition_attributes: + ~azure.keyvault.v7_0.models.SasDefinitionAttributes + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :param callable cls: A custom type or function that will be passed the + direct response + :return: SasDefinitionBundle or the result of cls(response) + :rtype: ~azure.keyvault.v7_0.models.SasDefinitionBundle + :raises: + :class:`KeyVaultErrorException` + """ + error_map = kwargs.pop('error_map', None) + parameters = models.SasDefinitionUpdateParameters(template_uri=template_uri, sas_type=sas_type, validity_period=validity_period, sas_definition_attributes=sas_definition_attributes, tags=tags) + + # Construct URL + url = self.update_sas_definition.metadata['url'] + path_format_arguments = { + 'vaultBaseUrl': self._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'storage-account-name': self._serialize.url("storage_account_name", storage_account_name, 'str', pattern=r'^[0-9a-zA-Z]+$'), + 'sas-definition-name': self._serialize.url("sas_definition_name", sas_definition_name, 'str', pattern=r'^[0-9a-zA-Z]+$') + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._serialize.query("self.api_version", self.api_version, 'str') + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/json' + header_parameters['Content-Type'] = 'application/json; charset=utf-8' + if self._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct body + body_content = self._serialize.body(parameters, 'SasDefinitionUpdateParameters') + + # Construct and send request + request = self._client.patch(url, query_parameters, header_parameters, body_content) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise models.KeyVaultErrorException(response, self._deserialize) + + deserialized = None + if response.status_code == 200: + deserialized = self._deserialize('SasDefinitionBundle', response) + + if cls: + return cls(response, deserialized, None) + + return deserialized + update_sas_definition.metadata = {'url': '/storage/{storage-account-name}/sas/{sas-definition-name}'} diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/version.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/version.py new file mode 100644 index 000000000000..3c10f7d869d7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/_generated/v7_0/version.py @@ -0,0 +1,13 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +VERSION = "7.0" + diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_challenge_auth_policy.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_challenge_auth_policy.py new file mode 100644 index 000000000000..d07718d9c5e6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_challenge_auth_policy.py @@ -0,0 +1,57 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from azure.core.pipeline import PipelineRequest +from azure.core.pipeline.policies import AsyncHTTPPolicy +from azure.core.pipeline.transport import HttpRequest, HttpResponse + +from . import ChallengeAuthPolicyBase, HttpChallenge, HttpChallengeCache + + +class AsyncChallengeAuthPolicy(ChallengeAuthPolicyBase, AsyncHTTPPolicy): + """policy for handling HTTP authentication challenges""" + + async def send(self, request: PipelineRequest) -> HttpResponse: + challenge = HttpChallengeCache.get_challenge_for_url(request.http_request.url) + if not challenge: + # provoke a challenge with an unauthorized, bodiless request + no_body = HttpRequest( + request.http_request.method, request.http_request.url, headers=request.http_request.headers + ) + if request.http_request.body: + # no_body was created with request's headers -> if request has a body, no_body's content-length is wrong + no_body.headers["Content-Length"] = "0" + + challenger = await self.next.send(PipelineRequest(http_request=no_body, context=request.context)) + try: + challenge = self._update_challenge(request, challenger) + except ValueError: + # didn't receive the expected challenge -> nothing more this policy can do + return challenger + + await self._handle_challenge(request, challenge) + response = await self.next.send(request) + + if response.http_response.status_code == 401: + # cached challenge could be outdated; maybe this response has a new one? + try: + challenge = self._update_challenge(request, response) + except ValueError: + # 401 with no legible challenge -> nothing more this policy can do + return response + + await self._handle_challenge(request, challenge) + response = await self.next.send(request) + + return response + + async def _handle_challenge(self, request: PipelineRequest, challenge: HttpChallenge) -> None: + """authenticate according to challenge, add Authorization header to request""" + + scope = challenge.get_resource() + if not scope.endswith("/.default"): + scope += "/.default" + + access_token = await self._credential.get_token(scope) + self._update_headers(request.http_request.headers, access_token.token) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_client_base.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_client_base.py new file mode 100644 index 000000000000..b6081db0d09e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/async_client_base.py @@ -0,0 +1,115 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from typing import Any, TYPE_CHECKING + +from azure.core.configuration import Configuration +from azure.core.pipeline import AsyncPipeline +from azure.core.pipeline.policies import UserAgentPolicy +from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy +from azure.core.pipeline.transport import AsyncHttpTransport + +from ._generated import KeyVaultClient +from . import AsyncChallengeAuthPolicy +from .._user_agent import USER_AGENT + + +if TYPE_CHECKING: + try: + # pylint:disable=unused-import + from azure.core.credentials import TokenCredential + except ImportError: + # TokenCredential is a typing_extensions.Protocol; we don't depend on that package + pass + + +class AsyncKeyVaultClientBase: + """Base class for async Key Vault clients""" + + @staticmethod + def _create_config( + credential: "TokenCredential", api_version: str = None, **kwargs: "**Any" + ) -> Configuration: + if api_version is None: + api_version = KeyVaultClient.DEFAULT_API_VERSION + config = KeyVaultClient.get_configuration_class(api_version, aio=True)(credential, **kwargs) + config.authentication_policy = AsyncChallengeAuthPolicy(credential) + + # replace the autorest-generated UserAgentPolicy and its hard-coded user agent + # https://github.com/Azure/azure-sdk-for-python/issues/6637 + config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + + # Override config policies if found in kwargs + # TODO: should be unnecessary after next regeneration (written 2019-08-02) + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + + return config + + def __init__( + self, + vault_url: str, + credential: "TokenCredential", + transport: AsyncHttpTransport = None, + api_version: str = None, + **kwargs: "**Any" + ) -> None: + if not credential: + raise ValueError( + "credential should be an object supporting the TokenCredential protocol, " + "such as a credential from azure-identity" + ) + if not vault_url: + raise ValueError("vault_url must be the URL of an Azure Key Vault") + + self._vault_url = vault_url.strip(" /") + + client = kwargs.pop("generated_client", None) + if client: + # caller provided a configured client -> nothing left to initialize + self._client = client + return + + if api_version is None: + api_version = KeyVaultClient.DEFAULT_API_VERSION + + config = self._create_config(credential, api_version=api_version, **kwargs) + pipeline = kwargs.pop("pipeline", None) or self._build_pipeline(config, transport=transport, **kwargs) + self._client = KeyVaultClient(credential, api_version=api_version, pipeline=pipeline, aio=True) + + @staticmethod + def _build_pipeline(config: Configuration, transport: AsyncHttpTransport, **kwargs: "**Any") -> AsyncPipeline: + policies = [ + config.headers_policy, + config.user_agent_policy, + config.proxy_policy, + config.redirect_policy, + config.retry_policy, + config.authentication_policy, + config.logging_policy, + DistributedTracingPolicy(), + ] + + if transport is None: + from azure.core.pipeline.transport import AioHttpTransport + + transport = AioHttpTransport(**kwargs) + + return AsyncPipeline(transport, policies=policies) + + @property + def vault_url(self) -> str: + return self._vault_url diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/challenge_auth_policy.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/challenge_auth_policy.py new file mode 100644 index 000000000000..2ca78ed9393d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/challenge_auth_policy.py @@ -0,0 +1,92 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from azure.core.pipeline import PipelineRequest +from azure.core.pipeline.policies import HTTPPolicy +from azure.core.pipeline.policies.authentication import _BearerTokenCredentialPolicyBase +from azure.core.pipeline.transport import HttpRequest + +from .http_challenge import HttpChallenge +from . import http_challenge_cache as ChallengeCache + +try: + from typing import TYPE_CHECKING +except ImportError: + TYPE_CHECKING = False + +if TYPE_CHECKING: + # pylint:disable=unused-import + from azure.core.pipeline.transport import HttpResponse + + +class ChallengeAuthPolicyBase(_BearerTokenCredentialPolicyBase): + """Sans I/O base for challenge authentication policies""" + + # pylint:disable=useless-super-delegation + def __init__(self, credential, **kwargs): + super(ChallengeAuthPolicyBase, self).__init__(credential, **kwargs) + + @staticmethod + def _update_challenge(request, challenger): + # type: (HttpRequest, HttpResponse) -> HttpChallenge + """parse challenge from challenger, cache it, return it""" + + challenge = HttpChallenge( + request.http_request.url, + challenger.http_response.headers.get("WWW-Authenticate"), + response_headers=challenger.http_response.headers, + ) + ChallengeCache.set_challenge_for_url(request.http_request.url, challenge) + return challenge + + +class ChallengeAuthPolicy(ChallengeAuthPolicyBase, HTTPPolicy): + """policy for handling HTTP authentication challenges""" + + def send(self, request): + # type: (PipelineRequest) -> HttpResponse + + challenge = ChallengeCache.get_challenge_for_url(request.http_request.url) + if not challenge: + # provoke a challenge with an unauthorized, bodiless request + no_body = HttpRequest( + request.http_request.method, request.http_request.url, headers=request.http_request.headers + ) + if request.http_request.body: + # no_body was created with request's headers -> if request has a body, no_body's content-length is wrong + no_body.headers["Content-Length"] = "0" + + challenger = self.next.send(PipelineRequest(http_request=no_body, context=request.context)) + try: + challenge = self._update_challenge(request, challenger) + except ValueError: + # didn't receive the expected challenge -> nothing more this policy can do + return challenger + + self._handle_challenge(request, challenge) + response = self.next.send(request) + + if response.http_response.status_code == 401: + # cached challenge could be outdated; maybe this response has a new one? + try: + challenge = self._update_challenge(request, response) + except ValueError: + # 401 with no legible challenge -> nothing more this policy can do + return response + + self._handle_challenge(request, challenge) + response = self.next.send(request) + + return response + + def _handle_challenge(self, request, challenge): + # type: (PipelineRequest, HttpChallenge) -> None + """authenticate according to challenge, add Authorization header to request""" + + scope = challenge.get_resource() + if not scope.endswith("/.default"): + scope += "/.default" + + access_token = self._credential.get_token(scope) + self._update_headers(request.http_request.headers, access_token.token) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/client_base.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/client_base.py new file mode 100644 index 000000000000..54f033e55d28 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/client_base.py @@ -0,0 +1,106 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from typing import TYPE_CHECKING + +from azure.core import Configuration +from azure.core.pipeline import Pipeline +from azure.core.pipeline.policies import UserAgentPolicy +from azure.core.pipeline.transport import RequestsTransport +from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy +from ._generated import KeyVaultClient +from .challenge_auth_policy import ChallengeAuthPolicy +from .._user_agent import USER_AGENT + +if TYPE_CHECKING: + # pylint:disable=unused-import + from typing import Any, Optional + from azure.core.credentials import TokenCredential + from azure.core.pipeline.transport import HttpTransport + +KEY_VAULT_SCOPE = "https://vault.azure.net/.default" + + +class KeyVaultClientBase(object): + """Base class for Key Vault clients""" + + @staticmethod + def _create_config(credential, api_version=None, **kwargs): + # type: (TokenCredential, Optional[str], **Any) -> Configuration + if api_version is None: + api_version = KeyVaultClient.DEFAULT_API_VERSION + config = KeyVaultClient.get_configuration_class(api_version, aio=False)(credential, **kwargs) + config.authentication_policy = ChallengeAuthPolicy(credential) + + # replace the autorest-generated UserAgentPolicy and its hard-coded user agent + # https://github.com/Azure/azure-sdk-for-python/issues/6637 + config.user_agent_policy = UserAgentPolicy(base_user_agent=USER_AGENT, **kwargs) + + # Override config policies if found in kwargs + # TODO: should be unnecessary after next regeneration (written 2019-08-02) + if "user_agent_policy" in kwargs: + config.user_agent_policy = kwargs["user_agent_policy"] + if "headers_policy" in kwargs: + config.headers_policy = kwargs["headers_policy"] + if "proxy_policy" in kwargs: + config.proxy_policy = kwargs["proxy_policy"] + if "logging_policy" in kwargs: + config.logging_policy = kwargs["logging_policy"] + if "retry_policy" in kwargs: + config.retry_policy = kwargs["retry_policy"] + if "custom_hook_policy" in kwargs: + config.custom_hook_policy = kwargs["custom_hook_policy"] + if "redirect_policy" in kwargs: + config.redirect_policy = kwargs["redirect_policy"] + + return config + + def __init__(self, vault_url, credential, transport=None, api_version=None, **kwargs): + # type: (str, TokenCredential, Optional[HttpTransport], Optional[str], **Any) -> None + if not credential: + raise ValueError( + "credential should be an object supporting the TokenCredential protocol, " + "such as a credential from azure-identity" + ) + if not vault_url: + raise ValueError("vault_url must be the URL of an Azure Key Vault") + + self._vault_url = vault_url.strip(" /") + + client = kwargs.pop("generated_client", None) + if client: + # caller provided a configured client -> nothing left to initialize + self._client = client + return + + if api_version is None: + api_version = KeyVaultClient.DEFAULT_API_VERSION + + config = self._create_config(credential, api_version=api_version, **kwargs) + pipeline = kwargs.pop("pipeline", None) or self._build_pipeline(config, transport, **kwargs) + self._client = KeyVaultClient(credential, api_version=api_version, pipeline=pipeline, aio=False, **kwargs) + + # pylint:disable=no-self-use + def _build_pipeline(self, config, transport, **kwargs): + # type: (Configuration, HttpTransport, **Any) -> Pipeline + policies = [ + config.headers_policy, + config.user_agent_policy, + config.proxy_policy, + config.redirect_policy, + config.retry_policy, + config.authentication_policy, + config.logging_policy, + DistributedTracingPolicy(), + ] + + if transport is None: + transport = RequestsTransport(**kwargs) + + return Pipeline(transport, policies=policies) + + @property + def vault_url(self): + # type: () -> str + return self._vault_url diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge.py new file mode 100644 index 000000000000..c762e1ae50ef --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge.py @@ -0,0 +1,114 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +try: + import urllib.parse as parse +except ImportError: + import urlparse as parse # type: ignore + + +class HttpChallenge(object): + def __init__(self, request_uri, challenge, response_headers=None): + """ Parses an HTTP WWW-Authentication Bearer challenge from a server. """ + self.source_authority = self._validate_request_uri(request_uri) + self.source_uri = request_uri + self._parameters = {} + + # get the scheme of the challenge and remove from the challenge string + trimmed_challenge = self._validate_challenge(challenge) + split_challenge = trimmed_challenge.split(" ", 1) + self.scheme = split_challenge[0] + trimmed_challenge = split_challenge[1] + + # split trimmed challenge into comma-separated name=value pairs. Values are expected + # to be surrounded by quotes which are stripped here. + for item in trimmed_challenge.split(","): + # process name=value pairs + comps = item.split("=") + if len(comps) == 2: + key = comps[0].strip(' "') + value = comps[1].strip(' "') + if key: + self._parameters[key] = value + + # minimum set of parameters + if not self._parameters: + raise ValueError("Invalid challenge parameters") + + # must specify authorization or authorization_uri + if "authorization" not in self._parameters and "authorization_uri" not in self._parameters: + raise ValueError("Invalid challenge parameters") + + # if the response headers were supplied + if response_headers: + # get the message signing key and message key encryption key from the headers + self.server_signature_key = response_headers.get("x-ms-message-signing-key", None) + self.server_encryption_key = response_headers.get("x-ms-message-encryption-key", None) + + def is_bearer_challenge(self): + """ Tests whether the HttpChallenge a Bearer challenge. + rtype: bool """ + if not self.scheme: + return False + + return self.scheme.lower() == "bearer" + + def is_pop_challenge(self): + """ Tests whether the HttpChallenge is a proof of possession challenge. + rtype: bool """ + if not self.scheme: + return False + + return self.scheme.lower() == "pop" + + def get_value(self, key): + return self._parameters.get(key) + + def get_authorization_server(self): + """ Returns the URI for the authorization server if present, otherwise empty string. """ + value = "" + for key in ["authorization_uri", "authorization"]: + value = self.get_value(key) or "" + if value: + break + return value + + def get_resource(self): + """ Returns the resource if present, otherwise empty string. """ + return self.get_value("resource") or "" + + def get_scope(self): + """ Returns the scope if present, otherwise empty string. """ + return self.get_value("scope") or "" + + def supports_pop(self): + """ Returns True if challenge supports pop token auth else False """ + return self._parameters.get("supportspop", "").lower() == "true" + + def supports_message_protection(self): + """ Returns True if challenge vault supports message protection """ + return self.supports_pop() and self.server_encryption_key and self.server_signature_key + + # pylint:disable=no-self-use + def _validate_challenge(self, challenge): + """ Verifies that the challenge is a valid auth challenge and returns the key=value pairs. """ + if not challenge: + raise ValueError("Challenge cannot be empty") + + return challenge.strip() + + # pylint:disable=no-self-use + def _validate_request_uri(self, uri): + """ Extracts the host authority from the given URI. """ + if not uri: + raise ValueError("request_uri cannot be empty") + + uri = parse.urlparse(uri) + if not uri.netloc: + raise ValueError("request_uri must be an absolute URI") + + if uri.scheme.lower() not in ["http", "https"]: + raise ValueError("request_uri must be HTTP or HTTPS") + + return uri.netloc diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge_cache.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge_cache.py new file mode 100644 index 000000000000..07cda1366aa8 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/http_challenge_cache.py @@ -0,0 +1,89 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import threading + +try: + import urllib.parse as parse +except ImportError: + import urlparse as parse # type: ignore + +try: + from typing import TYPE_CHECKING +except ImportError: + TYPE_CHECKING = False + +if TYPE_CHECKING: + # pylint: disable=unused-import + from typing import Dict + from .http_challenge import HttpChallenge + + +_cache = {} # type: Dict[str, HttpChallenge] +_lock = threading.Lock() + + +def get_challenge_for_url(url): + """ Gets the challenge for the cached URL. + :param url: the URL the challenge is cached for. + :rtype: HttpBearerChallenge """ + + if not url: + raise ValueError("URL cannot be None") + + key = _get_cache_key(url) + + with _lock: + return _cache.get(key) + + +def _get_cache_key(url): + """Use the URL's netloc as cache key except when the URL specifies the default port for its scheme. In that case + use the netloc without the port. That is to say, https://foo.bar and https://foo.bar:443 are considered equivalent. + + This equivalency prevents an unnecessary challenge when using Key Vault's paging API. The Key Vault client doesn't + specify ports, but Key Vault's next page links do, so a redundant challenge would otherwise be executed when the + client requests the next page.""" + + parsed = parse.urlparse(url) + if parsed.scheme == "https" and parsed.port == 443: + return parsed.netloc[:-4] + return parsed.netloc + + +def remove_challenge_for_url(url): + """ Removes the cached challenge for the specified URL. + :param url: the URL for which to remove the cached challenge """ + if not url: + raise ValueError("URL cannot be empty") + + url = parse.urlparse(url) + + with _lock: + del _cache[url.netloc] + + +def set_challenge_for_url(url, challenge): + """ Caches the challenge for the specified URL. + :param url: the URL for which to cache the challenge + :param challenge: the challenge to cache """ + if not url: + raise ValueError("URL cannot be empty") + + if not challenge: + raise ValueError("Challenge cannot be empty") + + src_url = parse.urlparse(url) + if src_url.netloc != challenge.source_authority: + raise ValueError("Source URL and Challenge URL do not match") + + with _lock: + _cache[src_url.netloc] = challenge + + +def clear(): + """ Clears the cache. """ + + with _lock: + _cache.clear() diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_user_agent.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_user_agent.py new file mode 100644 index 000000000000..60d5dd5502c3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_user_agent.py @@ -0,0 +1,10 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import platform +from ._version import VERSION + +USER_AGENT = "azsdk-python-keyvault-certificates/{} Python/{} ({})".format( + VERSION, platform.python_version(), platform.platform() +) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_version.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_version.py new file mode 100644 index 000000000000..ccaa7193d0b4 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_version.py @@ -0,0 +1,6 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +VERSION = "4.0.0b1" diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/__init__.py new file mode 100644 index 000000000000..af111e52db7b --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/__init__.py @@ -0,0 +1,22 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +from .client import CertificateClient +from ..enums import ActionType, JsonWebKeyCurveName, JsonWebKeyType, SecretContentType, KeyUsageType +from ..models import AdministratorDetails, CertificatePolicy, Contact, KeyProperties, LifetimeAction + +__all__ = [ + "ActionType", + "AdministratorDetails", + "CertificateClient", + "CertificatePolicy", + "Contact", + "JsonWebKeyCurveName", + "JsonWebKeyType", + "KeyProperties", + "KeyUsageType", + "LifetimeAction", + "SecretContentType" +] diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/_polling_async.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/_polling_async.py new file mode 100644 index 000000000000..1ae0f029b728 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/_polling_async.py @@ -0,0 +1,64 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import asyncio +import logging +from typing import Any, Callable + +from azure.core import HttpResponseError +from azure.core.polling import AsyncPollingMethod +from azure.keyvault.certificates._shared import parse_vault_id + + +logger = logging.getLogger(__name__) + + +class CreateCertificatePollerAsync(AsyncPollingMethod): + def __init__(self, interval=5, unknown_issuer=False): + self._command = None + self._status = None + self._certificate_id = None + self.polling_interval = interval + self.unknown_issuer = unknown_issuer + + async def _update_status(self): + # type: () -> None + pending_certificate = await self._command() + self._status = pending_certificate.status.lower() + if not self._certificate_id: + self._certificate_id = parse_vault_id(pending_certificate.id) + + def initialize(self, client, initial_response, _): + # type: (Any, Any, Callable) -> None + self._command = client + self._status = initial_response + + async def run(self): + # type: () -> None + try: + while not self.finished(): + await self._update_status() + if self._status != 'completed' and self._status != 'inprogress' and self._status != 'cancelled': + raise HttpResponseError( + 'Unknown status \'{}\' for pending certificate {}'.format(self._status, self._certificate_id)) + await asyncio.sleep(self.polling_interval) + except Exception as e: + logger.warning(str(e)) + raise + + def finished(self): + # type: () -> bool + if self.unknown_issuer: + return True + return self._status == 'completed' or self._status == 'cancelled' + + def resource(self): + # type: () -> Any + return self._status + + def status(self): + # type: () -> str + return self._status diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/client.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/client.py new file mode 100644 index 000000000000..070adb786346 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/client.py @@ -0,0 +1,1083 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# pylint:disable=too-many-lines,too-many-public-methods +import base64 +import uuid +from typing import Any, AsyncIterable, Optional, Iterable, List, Dict +from functools import partial + +from azure.core.exceptions import ResourceExistsError, ResourceNotFoundError +from azure.core.tracing.decorator import distributed_trace +from azure.core.tracing.decorator_async import distributed_trace_async +from azure.core.polling import async_poller + +from azure.keyvault.certificates.models import( + AdministratorDetails, + CertificatePolicy, + CertificateOperation, + Certificate, + DeletedCertificate, + CertificateBase, + Contact, + Issuer, + IssuerBase, + KeyProperties, + SecretContentType, + LifetimeAction, + KeyUsageType +) +from ._polling_async import CreateCertificatePollerAsync +from .._shared import AsyncKeyVaultClientBase + + +class CertificateClient(AsyncKeyVaultClientBase): + """"CertificateClient defines a high level interface for + managing certificates in the specified vault. + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START create_certificate_client] + :end-before: [END create_certificate_client] + :language: python + :dedent: 4 + :caption: Creates a new instance of the Certificate client + """ + + # pylint:disable=protected-access + @distributed_trace_async + async def create_certificate( + self, + name: str, + policy: Optional[CertificatePolicy] = None, + enabled: Optional[bool] = None, + tags: Optional[Dict[str, str]] = None, + **kwargs: "**Any" + ) -> CertificateOperation: + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param name: The name of the certificate. + :type name: str + :param policy: The management policy for the certificate. + :type policy: + ~azure.keyvault.certificates.models.CertificatePolicy + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict(str, str) + :returns: The created CertificateOperation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START create_certificate] + :end-before: [END create_certificate] + :language: python + :caption: Create a certificate + :dedent: 8 + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + + if not policy: + lifetime_actions = [LifetimeAction( + days_before_expiry=90, + action_type="AutoRenew" + )] + policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=True, + key_usage=[ + KeyUsageType.c_rl_sign, + KeyUsageType.data_encipherment, + KeyUsageType.digital_signature, + KeyUsageType.key_agreement, + KeyUsageType.key_cert_sign, + KeyUsageType.key_encipherment + ]), + issuer_name="Self", + lifetime_actions=lifetime_actions, + content_type=SecretContentType.PFX, + subject_name="CN=DefaultPolicy", + validity_in_months=12) + + await self._client.create_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + certificate_attributes=attributes, + tags=tags, + **kwargs + ) + + command = partial( + self._client.get_certificate_operation, + vault_base_url=self.vault_url, + certificate_name=name, + **kwargs + ) + + create_certificate_polling = CreateCertificatePollerAsync( + unknown_issuer=(policy.issuer_name.lower() == 'unknown')) + return async_poller( + command, + "inprogress", + None, + create_certificate_polling + ) + + @distributed_trace_async + async def get_certificate_with_policy( + self, + name: str, + **kwargs: "**Any" + ) -> Certificate: + """Gets information about a certificate, which includes information about the + certificate's policy. + + + Gets information about a specific certificate. This operation requires + the certificates/get permission. Does not accept the version of the certificate + as a parameter. + + :param name: The name of the certificate in the given + vault. + :type name: str + :returns: An instance of Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START get_certificate] + :end-before: [END get_certificate] + :language: python + :caption: Get a certificate + :dedent: 8 + """ + bundle = await self._client.get_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version="", + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def get_certificate( + self, + name: str, + version: str, + **kwargs: "**Any" + ) -> Certificate: + """Gets information about a certificate. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. If you wish to not specify a version or to + get the certificate's policy as well, use the get_certificate_with_policy function. + + :param name: The name of the certificate in the given + vault. + :type name: str + :param version: The version of the certificate. + :type version: str + :returns: An instance of Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START get_certificate] + :end-before: [END get_certificate] + :language: python + :caption: Get a certificate + :dedent: 8 + """ + bundle = await self._client.get_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version=version, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def delete_certificate(self, name: str, **kwargs: "**Any") -> DeletedCertificate: + """Deletes a certificate from the key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param name: The name of the certificate. + :type name: str + :returns: The deleted certificate + :rtype: ~azure.keyvault.certificates.models.DeletedCertificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START delete_certificate] + :end-before: [END delete_certificate] + :language: python + :caption: Delete a certificate + :dedent: 8 + """ + bundle = await self._client.delete_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return DeletedCertificate._from_deleted_certificate_bundle(deleted_certificate_bundle=bundle) + + @distributed_trace_async + async def get_deleted_certificate(self, name: str, **kwargs: "**Any") -> DeletedCertificate: + """Retrieves information about the specified deleted certificate. + + Retrieves the deleted certificate information plus its attributes, + such as retention interval, scheduled permanent deletion, and the + current deletion recovery level. This operaiton requires the certificates/ + get permission. + + :param name: The name of the certificate. + :type name: str + :return: The deleted certificate + :rtype: ~azure.keyvault.certificates.models.DeletedCertificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START get_deleted_certificate] + :end-before: [END get_deleted_certificate] + :language: python + :caption: Get a deleted certificate + :dedent: 8 + """ + bundle = await self._client.get_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return DeletedCertificate._from_deleted_certificate_bundle(deleted_certificate_bundle=bundle) + + @distributed_trace_async + async def purge_deleted_certificate(self, name: str, **kwargs: "**Any") -> None: + """Permanently deletes the specified deleted certificate. + + Performs an irreversible deletion of the specified certificate, without + possibility for recovery. The operation is not available if the recovery + level does not specified 'Purgeable'. This operation requires the + certificate/purge permission. + + :param name: The name of the certificate + :type name: str + :return: None + :rtype: None + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + """ + await self._client.purge_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + + @distributed_trace_async + async def recover_deleted_certificate(self, name: str, **kwargs: "**Any") -> Certificate: + """Recovers the deleted certificate back to its current version under + /certificates. + + Performs the reversal of the Delete operation. THe operation is applicable + in vaults enabled for soft-delete, and must be issued during the retention + interval (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param name: The name of the deleted certificate + :type name: str + :return: The recovered certificate + :rtype ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START recover_deleted_certificate] + :end-before: [END recover_deleted_certificate] + :language: python + :caption: Recover a deleted certificate + :dedent: 8 + """ + bundle = await self._client.recover_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def import_certificate( + self, + name: str, + certificate_bytes: bytes, + password: Optional[str] = None, + policy: Optional[CertificatePolicy] = None, + enabled: Optional[bool] = None, + tags: Optional[Dict[str, str]] = None, + **kwargs: "**Any" + ) -> Certificate: + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param name: The name of the certificate. + :type name: str + :param certificate_bytes: Bytes of the ertificate object to import. + This certificate needs to contain the private key. + :type certificate_bytes: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param policy: The management policy for the certificate. + :type policy: + ~azure.keyvault.certificates.models.CertificatePolicy + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :returns: The imported Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + base64_encoded_certificate = base64.b64encode(certificate_bytes).decode("utf-8") + bundle = await self._client.import_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + base64_encoded_certificate=base64_encoded_certificate, + password=password, + certificate_policy=CertificatePolicy._to_certificate_policy_bundle(policy), + certificate_attributes=attributes, + tags=tags, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def get_policy(self, name: str, **kwargs: "**Any") -> CertificatePolicy: + """Gets the policy for a certificate. + + Returns the specified certificate policy resources in the key + vault. This operation requires the certificates/get permission. + + :param name: The name of the certificate in a given key vault. + :type name: str + :return: The certificate policy + :rtype ~azure.keyvault.certificates.models.CertificatePolicy + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + """ + bundle = await self._client.get_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificatePolicy._from_certificate_policy_bundle(certificate_policy_bundle=bundle) + + @distributed_trace_async + async def update_policy( + self, + name: str, + policy: CertificatePolicy, + **kwargs: "**Any" + ) -> CertificatePolicy: + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leaves others as null. + This operation requries the certificates/update permission. + + :param name: The name of the certificate in the given vault. + :type name: str + :param policy: The policy for the certificate. + :type policy: ~azure.keyvault.certificates.models.CertificatePolicy + :return: The certificate policy + :rtype: ~azure.keyvault.certificates.models.CertificatePolicy + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + """ + bundle = await self._client.update_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificatePolicy._from_certificate_policy_bundle(certificate_policy_bundle=bundle) + + @distributed_trace_async + async def update_certificate( + self, + name: str, + version: Optional[str] = None, + enabled: Optional[bool] = None, + tags: Optional[Dict[str, str]] = None, + **kwargs: "**Any" + ) -> Certificate: + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param name: The name of the certificate in the given key + vault. + :type name: str + :param version: The version of the certificate. + :type version: str + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict(str, str) + :returns: The updated Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START update_certificate] + :end-before: [END update_certificate] + :language: python + :caption: Update a certificate's attributes + :dedent: 8 + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + + bundle = await self._client.update_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version=version or "", + certificate_attributes=attributes, + tags=tags, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def backup_certificate(self, name: str, **kwargs: "**Any") -> bytes: + """Backs up the specified certificate. + + Requests that a backup of the specified certificate be downloaded + to the client. All versions of the certificate will be downloaded. + This operation requires the certificates/backup permission. + + :param name: The name of the certificate. + :type name: str + :return: the backup blob containing the backed up certificate. + :rtype: bytes + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START backup_certificate] + :end-before: [END backup_certificate] + :language: python + :caption: Get a certificate backup + :dedent: 8 + """ + backup_result = await self._client.backup_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return backup_result.value + + @distributed_trace_async + async def restore_certificate(self, backup: bytes, **kwargs: "**Any") -> Certificate: + """Restores a backed up certificate to a vault. + + Restores a backed up certificate, and all its versions, to a vault. + this operation requires the certificates/restore permission. + + :param backup: The backup blob associated with a certificate bundle. + :type backup bytes + :return: The restored Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: + ~azure.core.exceptions.ResourceExistsError if the backed up certificate's name is already in use + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START restore_certificate] + :end-before: [END restore_certificate] + :language: python + :caption: Restore a certificate backup + :dedent: 8 + """ + bundle = await self._client.restore_certificate( + vault_base_url=self.vault_url, + certificate_bundle_backup=backup, + error_map={409: ResourceExistsError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def list_deleted_certificates( + self, + include_pending: Optional[bool] = None, + **kwargs: "**Any" + ) -> AsyncIterable[DeletedCertificate]: + """Lists the deleted certificates in the specified vault currently + available for recovery. + + Retrieves the certificates in the current vault which are in a deleted + state and ready for recovery or purging. This operation includes + deletion-specific information. This operation requires the certificates/get/list + permission. This operation can only be enabled on soft-delete enabled vaults. + + :param include_pending: Specifies whether to include certificates which are not + completely provisioned. + :type include_pending: bool + :return: An iterator like instance of DeletedCertificate + :rtype: + typing.Generator[~azure.keyvault.certificates.models.DeletedCertificate] + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START list_deleted_certificates] + :end-before: [END list_deleted_certificates] + :language: python + :caption: List all the deleted certificates + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_deleted_certificates( + vault_base_url=self._vault_url, + maxresults=max_page_size, + include_pending=include_pending, + cls=lambda objs: [DeletedCertificate._from_deleted_certificate_item(x) for x in objs], + **kwargs + ) + + @distributed_trace + def list_certificates( + self, + include_pending: Optional[bool] = None, + **kwargs: "**Any" + ) -> AsyncIterable[CertificateBase]: + """List certificates in the key vault. + + The GetCertificates operation returns the set of certificates resources + in the key vault. This operation requires the + certificates/list permission. + + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :returns: An iterator like instance of CertificateBase + :rtype: + typing.Generator[~azure.keyvault.certificates.models.CertificateBase] + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START list_certificates] + :end-before: [END list_certificates] + :language: python + :caption: List all certificates + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificates( + vault_base_url=self._vault_url, + maxresults=max_page_size, + include_pending=include_pending, + cls=lambda objs: [CertificateBase._from_certificate_item(x) for x in objs], + **kwargs + ) + + @distributed_trace + def list_certificate_versions(self, name: str, **kwargs: "**Any") -> AsyncIterable[CertificateBase]: + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the key vault. This operation requires the + certificates/list permission. + + :param name: The name of the certificate. + :type name: str + :returns: An iterator like instance of CertificateBase + :rtype: + typing.Generator[~azure.keyvault.certificates.models.CertificateBase] + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START list_certificate_versions] + :end-before: [END list_certificate_versions] + :language: python + :caption: List all versions of a certificate + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificate_versions( + vault_base_url=self._vault_url, + certificate_name=name, + maxresults=max_page_size, + cls=lambda objs: [CertificateBase._from_certificate_item(x) for x in objs], + **kwargs) + + @distributed_trace_async + async def create_contacts(self, contacts: Iterable[Contact], **kwargs: "**Any") -> List[Contact]: + # pylint:disable=unsubscriptable-object + + # disabled unsubscruptable-object because of pylint bug referenced here: + # https://github.com/PyCQA/pylint/issues/2377 + """Sets the certificate contacts for the key vault. + + Sets the certificate contacts for the key vault. This + operation requires the certificates/managecontacts permission. + + :param contacts: The contact list for the vault certificates. + :type contacts: list[~azure.keyvault.certificates.models.Contact] + :returns: The created list of contacts + :rtype: Iterator[~azure.keyvault.certificates.models.Contact] + """ + contacts = await self._client.set_certificate_contacts( + vault_base_url=self.vault_url, + contact_list=[c._to_certificate_contacts_item() for c in contacts], + **kwargs + ) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace_async + async def get_contacts(self, **kwargs: "**Any") -> List[Contact]: + # pylint:disable=unsubscriptable-object + + # disabled unsubscruptable-object because of pylint bug referenced here: + # https://github.com/PyCQA/pylint/issues/2377 + """Gets the certificate contacts for the key vault. + + Returns the set of certificate contact resources in the specified + key vault. This operation requires the certificates/managecontacts + permission. + + :return: The certificate contacts for the key vault. + :rtype: Iterator[azure.keyvault.certificates.models.Contact] + """ + contacts = await self._client.get_certificate_contacts(vault_base_url=self._vault_url, **kwargs) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace_async + async def delete_contacts(self, **kwargs: "**Any") -> List[Contact]: + # pylint:disable=unsubscriptable-object + + # disabled unsubscruptable-object because of pylint bug referenced here: + # https://github.com/PyCQA/pylint/issues/2377 + """Deletes the certificate contacts for the key vault. + + Deletes the certificate contacts for the key vault certificate. + This operation requires the certificates/managecontacts permission. + + :return: Contacts + :rtype: Iterator[~azure.security.certificates._models.Contact] + """ + contacts = await self._client.delete_certificate_contacts(vault_base_url=self.vault_url, **kwargs) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace_async + async def get_certificate_operation(self, name: str, **kwargs: "**Any") -> CertificateOperation: + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param name: The name of the certificate. + :type name: str + :returns: The created CertificateOperation + :rtype: ~azure.security.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + + bundle = await self._client.get_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace_async + async def delete_certificate_operation(self, name: str, **kwargs: "**Any") -> CertificateOperation: + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param name: The name of the certificate. + :type name: str + :return: The deleted CertificateOperation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + bundle = await self._client.delete_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace_async + async def cancel_certificate_operation(self, name: str, **kwargs: "**Any") -> CertificateOperation: + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param name: The name of the certificate. + :type name: str + :returns: The updated certificate operation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + bundle = await self._client.update_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + cancellation_requested=True, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace_async + async def get_pending_certificate_signing_request( + self, + name: str, + custom_headers: Optional[Dict[str, str]] = None, + **kwargs: "**Any") -> str: + """Gets the Base64 pending certificate signing request (PKCS-10). + :param name: The name of the certificate + :type name: str + :param custom_headers: headers that will be added to the request + :type custom_headers: dict + :return: Base64 encoded pending certificate signing request (PKCS-10). + :rtype: str + :raises: ~azure.core.exceptions.ResourceNotFoundError if the pending csr doesn't exist + """ + error_map = {404: ResourceNotFoundError} + vault_base_url = self.vault_url + # Construct URL + url = '/certificates/{certificate-name}/pending' + path_format_arguments = { + 'vaultBaseUrl': self._client._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._client._serialize.url("certificate_name", name, 'str') + } + url = self._client._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._client._serialize.query( + name="self.api_version", + data=self._client.api_version, + data_type='str' + ) + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/pkcs10' + if self._client._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + if custom_headers: + header_parameters.update(custom_headers) + + # Construct and send request + request = self._client._client.get( + url=url, + params=query_parameters, + headers=header_parameters + ) + pipeline_response = await self._client._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + self._client.map_error(status_code=response.status_code, response=response, error_map=error_map) + raise self._client.models.KeyVaultErrorException(response, self._client._deserialize) + + deserialized = None + + if response.status_code == 200: + deserialized = response.body() if hasattr(response, 'body') else response.content + + return deserialized + + @distributed_trace_async + async def merge_certificate( + self, + name: str, + x509_certificates: List[bytearray], + enabled: Optional[bool] = None, + tags: Optional[Dict[str, str]] = None, + **kwargs: "**Any" + ) -> Certificate: + """Merges a certificate or a certificate chain with a key pair existing on the server. + + Performs the merging of a certificate or certificate chain with a key pair currently + available in the service. This operation requires the certificates/create permission. + + :param name: The name of the certificate + :type name: str + :param x509_certificates: The certificate or the certificate chain to merge. + :type x509_certificates: list[bytearray] + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :return: The merged certificate operation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the create certificate operation doesn't exist + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + bundle = await self._client.merge_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + x509_certificates=x509_certificates, + certificate_attributes=attributes, + tags=tags, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace_async + async def get_issuer(self, name: str, **kwargs: "**Any") -> Issuer: + """Gets the specified certificate issuer. + + Returns the specified certificate issuer resources in the key vault. + This operation requires the certificates/manageissuers/getissuers permission. + + :param name: The name of the issuer. + :type name: str + :return: The specified certificate issuer. + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + issuer_bundle = await self._client.get_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace_async + async def create_issuer( + self, + name: str, + provider: str, + account_id: Optional[str] = None, + password: Optional[str] = None, + organization_id: Optional[str] = None, + admin_details: Optional[List[AdministratorDetails]] = None, + enabled: Optional[bool] = None, + **kwargs: "**Any" + ) -> Issuer: + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param name: The name of the issuer. + :type name: str + :param provider: The issuer provider. + :type provider: str + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + :param organization_id: Id of the organization. + :type organization_id: str + :param admin_details: Details of the organization administrators of the certificate issuer. + :type admin_details: ~azure.keyvault.certificates.models.AdministratorDetails + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :returns: The created Issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + """ + if account_id or password: + issuer_credentials = self._client.models.IssuerCredentials(account_id=account_id, password=password) + else: + issuer_credentials = None + if admin_details and admin_details[0]: + admin_details_to_pass = list(self._client.models.AdministratorDetails( + first_name=admin_detail.first_name, + last_name=admin_detail.last_name, + email_address=admin_detail.email, + phone=admin_detail.phone + ) for admin_detail in admin_details) + else: + admin_details_to_pass = admin_details + if organization_id or admin_details: + organization_details = self._client.models.OrganizationDetails( + id=organization_id, + admin_details=admin_details_to_pass + ) + else: + organization_details = None + if enabled is not None: + issuer_attributes = self._client.models.IssuerAttributes(enabled=enabled) + else: + issuer_attributes = None + issuer_bundle = await self._client.set_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + provider=provider, + credentials=issuer_credentials, + organization_details=organization_details, + attributes=issuer_attributes, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace_async + async def update_issuer( + self, + name: str, + provider: Optional[str] = None, + account_id: Optional[str] = None, + password: Optional[str] = None, + organization_id: Optional[str] = None, + admin_details: Optional[List[AdministratorDetails]] = None, + enabled: Optional[bool] = None, + **kwargs: "**Any" + ) -> Issuer: + """Updates the specified certificate issuer. + + Performs an update on the specified certificate issuer entity. + THis operation requires the certificates/setissuers permission. + + :param name: The name of the issuer. + :type name: str + :param provider: The issuer provider. + :type provider: str + :param account_id: The username / account name / account key. + :type account_id: str + :param password: The password / secret / account key. + :type password: str + :param organization_id: Id of the organization + :type organization_id: str + :param admin_details: Details of the organization administrators of the certificate issuer. + :type admin_details: ~azure.keyvault.certificates.models.AdministratorDetails + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :return: The updated issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + if account_id or password: + issuer_credentials = self._client.models.IssuerCredentials(account_id=account_id, password=password) + else: + issuer_credentials = None + if admin_details and admin_details[0]: + admin_details_to_pass = list(self._client.models.AdministratorDetails( + first_name=admin_detail.first_name, + last_name=admin_detail.last_name, + email_address=admin_detail.email, + phone=admin_detail.phone + ) for admin_detail in admin_details) + else: + admin_details_to_pass = admin_details + if organization_id or admin_details: + organization_details = self._client.models.OrganizationDetails( + id=organization_id, + admin_details=admin_details_to_pass + ) + else: + organization_details = None + if enabled is not None: + issuer_attributes = self._client.models.IssuerAttributes(enabled=enabled) + else: + issuer_attributes = None + issuer_bundle = await self._client.update_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + provider=provider, + credentials=issuer_credentials, + organization_details=organization_details, + attributes=issuer_attributes, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace_async + async def delete_issuer(self, name: str, **kwargs: "**Any") -> Issuer: + """Deletes the specified certificate issuer. + + Permanently removes the specified certificate issuer from the vault. + This operation requires the certificates/manageissuers/deleteissuers permission. + + :param name: The name of the issuer. + :type name: str + :return: Issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + issuer_bundle = await self._client.delete_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace + def list_issuers(self, **kwargs: "**Any") -> AsyncIterable[IssuerBase]: + """List certificate issuers for the key vault. + + Returns the set of certificate issuer resources in the key + vault. This operation requires the certificates/manageissuers/getissuers + permission. + + :return: An iterator like instance of Issuers + :rtype: Iterable[~azure.keyvault.certificates.models.Issuer] + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificate_issuers( + vault_base_url=self.vault_url, + maxresults=max_page_size, + cls=lambda objs: [IssuerBase._from_issuer_item(x) for x in objs], + **kwargs + ) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/client.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/client.py new file mode 100644 index 000000000000..d054e6cefcc3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/client.py @@ -0,0 +1,1085 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# pylint:disable=too-many-lines,too-many-public-methods +import base64 +import uuid +from functools import partial +from azure.core.exceptions import ResourceExistsError, ResourceNotFoundError +from azure.core.polling import LROPoller +from azure.core.tracing.decorator import distributed_trace + +from ._shared import KeyVaultClientBase +from .models import ( + Certificate, + CertificateBase, + CertificatePolicy, + DeletedCertificate, + Issuer, + IssuerBase, + Contact, + CertificateOperation, + LifetimeAction, + KeyProperties, + KeyUsageType, + SecretContentType +) +from ._polling import CreateCertificatePoller + +try: + from typing import TYPE_CHECKING +except ImportError: + TYPE_CHECKING = False + +if TYPE_CHECKING: + # pylint:disable=unused-import + from typing import Any, Dict, List, Optional, Iterable + + +class CertificateClient(KeyVaultClientBase): + """CertificateClient defines a high level interface for + managing certificates in the specified vault. + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START create_certificate_client] + :end-before: [END create_certificate_client] + :language: python + :caption: Create a new ``CertificateClient`` + :dedent: 4 + """ + + # pylint:disable=protected-access + + @distributed_trace + def create_certificate( + self, + name, # type: str + policy=None, # type: Optional[CertificatePolicy] + enabled=None, # type: Optional[bool] + tags=None, # type: Optional[Dict[str, str]] + **kwargs # type: **Any + ): + # type: (...) -> CertificateOperation + """Creates a new certificate. + + If this is the first version, the certificate resource is created. This + operation requires the certificates/create permission. + + :param name: The name of the certificate. + :type name: str + :param policy: The management policy for the certificate. + :type policy: + ~azure.security.keyvault.certificates._models.CertificatePolicy + :param bool enabled: Determines whether the object is enabled. + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict(str, str) + :returns: The created CertificateOperation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START create_certificate] + :end-before: [END create_certificate] + :language: python + :caption: Create a certificate + :dedent: 8 + """ + + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + + if not policy: + lifetime_actions = [LifetimeAction( + days_before_expiry=90, + action_type="AutoRenew" + )] + policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=True, + key_usage=[ + KeyUsageType.c_rl_sign, + KeyUsageType.data_encipherment, + KeyUsageType.digital_signature, + KeyUsageType.key_agreement, + KeyUsageType.key_cert_sign, + KeyUsageType.key_encipherment + ]), + issuer_name="Self", + lifetime_actions=lifetime_actions, + content_type=SecretContentType.PFX, + subject_name="CN=DefaultPolicy", + validity_in_months=12) + + self._client.create_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + certificate_attributes=attributes, + tags=tags, + **kwargs + ) + + command = partial( + self._client.get_certificate_operation, + vault_base_url=self.vault_url, + certificate_name=name, + **kwargs + ) + + create_certificate_polling = CreateCertificatePoller(unknown_issuer=(policy.issuer_name.lower() == 'unknown')) + return LROPoller( + command, + "inprogress", + None, + create_certificate_polling + ) + + + @distributed_trace + def get_certificate_with_policy(self, name, **kwargs): + # type: (str, **Any) -> Certificate + """Gets information about a certificate, which includes information about the + certificate's policy. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. Does not accept the version of the certificate + as a parameter. + + :param name: The name of the certificate in the given + vault. + :type name: str + :returns: An instance of Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START get_certificate] + :end-before: [END get_certificate] + :language: python + :caption: Get a certificate + :dedent: 8 + """ + bundle = self._client.get_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version="", + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def get_certificate(self, name, version, **kwargs): + # type: (str, str, **Any) -> Certificate + """Gets information about a certificate, which does not include the policy. + Version must be specified. + + Gets information about a specific certificate. This operation requires + the certificates/get permission. If you wish to not specify a version or to + get the certificate's policy as well, use the get_certificate_with_policy function. + + :param name: The name of the certificate in the given + vault. + :type name: str + :param version: The version of the certificate. + :type version: str + :returns: An instance of Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START get_certificate] + :end-before: [END get_certificate] + :language: python + :caption: Get a certificate + :dedent: 8 + """ + bundle = self._client.get_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version=version, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def delete_certificate(self, name, **kwargs): + # type: (str, **Any) -> DeletedCertificate + """Deletes a certificate from the key vault. + + Deletes all versions of a certificate object along with its associated + policy. Delete certificate cannot be used to remove individual versions + of a certificate object. This operation requires the + certificates/delete permission. + + :param name: The name of the certificate. + :type name: str + :returns: The deleted certificate + :rtype: ~azure.keyvault.certificates.models.DeletedCertificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START delete_certificate] + :end-before: [END delete_certificate] + :language: python + :caption: Delete a certificate + :dedent: 8 + """ + bundle = self._client.delete_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return DeletedCertificate._from_deleted_certificate_bundle(deleted_certificate_bundle=bundle) + + @distributed_trace + def get_deleted_certificate(self, name, **kwargs): + # type: (str, **Any) -> DeletedCertificate + """Retrieves information about the specified deleted certificate. + + Retrieves the deleted certificate information plus its attributes, + such as retention interval, scheduled permanent deletion, and the + current deletion recovery level. This operaiton requires the certificates/ + get permission. + + :param name: The name of the certificate. + :type name: str + :return: The deleted certificate + :rtype: ~azure.keyvault.certificates.models.DeletedCertificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START get_deleted_certificate] + :end-before: [END get_deleted_certificate] + :language: python + :caption: Get a deleted certificate + :dedent: 8 + """ + bundle = self._client.get_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return DeletedCertificate._from_deleted_certificate_bundle(deleted_certificate_bundle=bundle) + + @distributed_trace + def purge_deleted_certificate(self, name, **kwargs): + # type: (str, **Any) -> None + """Permanently deletes the specified deleted certificate. + + Performs an irreversible deletion of the specified certificate, without + possibility for recovery. The operation is not available if the recovery + level does not specified 'Purgeable'. This operation requires the + certificate/purge permission. + + :param name: The name of the certificate + :type name: str + :return: None + :rtype: None + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + """ + self._client.purge_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + + @distributed_trace + def recover_deleted_certificate(self, name, **kwargs): + # type: (str, **Any) -> Certificate + """Recovers the deleted certificate back to its current version under + /certificates. + + Performs the reversal of the Delete operation. THe operation is applicable + in vaults enabled for soft-delete, and must be issued during the retention + interval (available in the deleted certificate's attributes). This operation + requires the certificates/recover permission. + + :param name: The name of the deleted certificate + :type name: str + :return: The recovered certificate + :rtype ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the deleted certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_samples_keys.py + :start-after: [START recover_deleted_certificate] + :end-before: [END recover_deleted_certificate] + :language: python + :caption: Recover a deleted certificate + :dedent: 8 + """ + bundle = self._client.recover_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def import_certificate( + self, + name, # type: str + certificate_bytes, # type: bytes + password=None, # type: Optional[str] + policy=None, # type: Optional[CertificatePolicy] + enabled=None, # type: Optional[bool] + tags=None, # type: Optional[Dict[str, str]] + **kwargs # type: **Any + ): + # type: (...) -> Certificate + """Imports a certificate into a specified key vault. + + Imports an existing valid certificate, containing a private key, into + Azure Key Vault. The certificate to be imported can be in either PFX or + PEM format. If the certificate is in PEM format the PEM file must + contain the key as well as x509 certificates. This operation requires + the certificates/import permission. + + :param name: The name of the certificate. + :type name: str + :param certificate_bytes: Bytes of the ertificate object to import. + This certificate needs to contain the private key. + :type certificate_bytes: str + :param password: If the private key in base64EncodedCertificate is + encrypted, the password used for encryption. + :type password: str + :param policy: The management policy for the certificate. + :type policy: + ~azure.keyvault.certificates.models.CertificatePolicy + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value + pairs. + :type tags: dict[str, str] + :returns: The imported Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + base64_encoded_certificate = base64.b64encode(certificate_bytes).decode("utf-8") + bundle = self._client.import_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + base64_encoded_certificate=base64_encoded_certificate, + password=password, + certificate_policy=policy._to_certificate_policy_bundle(), + certificate_attributes=attributes, + tags=tags, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def get_policy(self, name, **kwargs): + # type: (str, **Any) -> CertificatePolicy + """Gets the policy for a certificate. + + Returns the specified certificate policy resources in the key + vault. This operation requires the certificates/get permission. + + :param name: The name of the certificate in a given key vault. + :type name: str + :return: The certificate policy + :rtype ~azure.keyvault.certificates.models.CertificatePolicy + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + """ + bundle = self._client.get_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificatePolicy._from_certificate_policy_bundle(certificate_policy_bundle=bundle) + + @distributed_trace + def update_policy(self, name, policy, **kwargs): + # type: (str, CertificatePolicy, **Any) -> CertificatePolicy + """Updates the policy for a certificate. + + Set specified members in the certificate policy. Leaves others as null. + This operation requires the certificates/update permission. + + :param name: The name of the certificate in the given vault. + :type name: str + :param policy: The policy for the certificate. + :type policy: ~azure.keyvault.certificates.models.CertificatePolicy + :return: The certificate policy + :rtype: ~azure.keyvault.certificates.models.CertificatePolicy + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + """ + bundle = self._client.update_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificatePolicy._from_certificate_policy_bundle(certificate_policy_bundle=bundle) + + @distributed_trace + def update_certificate( + self, + name, # type: str + version=None, # type: Optional[str] + enabled=None, # type: Optional[bool] + tags=None, # type: Optional[Dict[str, str]] + **kwargs # type: **Any + ): + # type: (...) -> Certificate + """Updates the specified attributes associated with the given certificate. + + The UpdateCertificate operation applies the specified update on the + given certificate; the only elements updated are the certificate's + attributes. This operation requires the certificates/update permission. + + :param name: The name of the certificate in the given key + vault. + :type name: str + :param version: The version of the certificate. + :type version: str + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict(str, str) + :returns: The updated Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START update_certificate] + :end-before: [END update_certificate] + :language: python + :caption: Update a certificate's attributes + :dedent: 8 + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + + bundle = self._client.update_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_version=version or "", + certificate_attributes=attributes, + tags=tags, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def backup_certificate(self, name, **kwargs): + # type: (str, **Any) -> bytes + """Backs up the specified certificate. + + Requests that a backup of the specified certificate be downloaded + to the client. All versions of the certificate will be downloaded. + This operation requires the certificates/backup permission. + + :param name: The name of the certificate. + :type name: str + :return: the backup blob containing the backed up certificate. + :rtype: bytes + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate doesn't exist + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START backup_certificate] + :end-before: [END backup_certificate] + :language: python + :caption: Get a certificate backup + :dedent: 8 + """ + backup_result = self._client.backup_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return backup_result.value + + @distributed_trace + def restore_certificate(self, backup, **kwargs): + # type: (bytes, **Any) -> Certificate + """Restores a backed up certificate to a vault. + + Restores a backed up certificate, and all its versions, to a vault. + this operation requires the certificates/restore permission. + + :param backup: The backup blob associated with a certificate bundle. + :type backup bytes + :return: The restored Certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: + ~azure.core.exceptions.ResourceExistsError if the backed up certificate's name is already in use + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START restore_certificate] + :end-before: [END restore_certificate] + :language: python + :caption: Restore a certificate backup + :dedent: 8 + """ + bundle = self._client.restore_certificate( + vault_base_url=self.vault_url, + certificate_bundle_backup=backup, + error_map={409: ResourceExistsError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def list_deleted_certificates(self, include_pending=None, **kwargs): + # type: (Optional[bool], **Any) -> Iterable[DeletedCertificate] + """Lists the deleted certificates in the specified vault currently + available for recovery. + + Retrieves the certificates in the current vault which are in a deleted + state and ready for recovery or purging. This operation includes + deletion-specific information. This operation requires the certificates/get/list + permission. This operation can only be enabled on soft-delete enabled vaults. + + :param include_pending: Specifies whether to include certificates which are not + completely provisioned. + :type include_pending: bool + :return: An iterator like instance of DeletedCertificate + :rtype: + typing.Generator[~azure.keyvault.certificates.models.DeletedCertificate] + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START list_deleted_certificates] + :end-before: [END list_deleted_certificates] + :language: python + :caption: List all the deleted certificates + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_deleted_certificates( + vault_base_url=self._vault_url, + maxresults=max_page_size, + include_pending=include_pending, + cls=lambda objs: [ + DeletedCertificate._from_deleted_certificate_item(deleted_certificate_item=x) + for x in objs + ], + **kwargs + ) + + @distributed_trace + def list_certificates(self, include_pending=None, **kwargs): + # type: (Optional[bool], **Any) -> Iterable[CertificateBase] + """List certificates in the key vault. + + The GetCertificates operation returns the set of certificates resources + in the key vault. This operation requires the + certificates/list permission. + + :param include_pending: Specifies whether to include certificates + which are not completely provisioned. + :type include_pending: bool + :returns: An iterator like instance of CertificateBase + :rtype: + typing.Generator[~azure.keyvault.certificates.models.CertificateBase] + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START list_certificates] + :end-before: [END list_certificates] + :language: python + :caption: List all certificates + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificates( + vault_base_url=self._vault_url, + maxresults=max_page_size, + include_pending=include_pending, + cls=lambda objs: [CertificateBase._from_certificate_item(certificate_item=x) for x in objs], + **kwargs + ) + + @distributed_trace + def list_certificate_versions(self, name, **kwargs): + # type: (str, **Any) -> Iterable[CertificateBase] + """List the versions of a certificate. + + The GetCertificateVersions operation returns the versions of a + certificate in the key vault. This operation requires the + certificates/list permission. + + :param name: The name of the certificate. + :type name: str + :returns: An iterator like instance of CertificateBase + :rtype: + typing.Generator[~azure.keyvault.certificates.models.CertificateBase] + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START list_certificate_versions] + :end-before: [END list_certificate_versions] + :language: python + :caption: List all versions of a certificate + :dedent: 8 + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificate_versions( + vault_base_url=self._vault_url, + certificate_name=name, + maxresults=max_page_size, + cls=lambda objs: [CertificateBase._from_certificate_item(certificate_item=x) for x in objs], + **kwargs) + + @distributed_trace + def create_contacts(self, contacts, **kwargs): + # type: (Iterable[Contact], **Any) -> List[Contact] + """Sets the certificate contacts for the key vault. + + Sets the certificate contacts for the key vault. This + operation requires the certificates/managecontacts permission. + + :param contacts: The contact list for the vault certificates. + :type contacts: list[~azure.keyvault.certificates.models.Contact] + :returns: The created list of contacts + :rtype: Iterator[~azure.keyvault.certificates.models.Contact] + """ + contacts = self._client.set_certificate_contacts( + vault_base_url=self.vault_url, + contact_list=[c._to_certificate_contacts_item() for c in contacts], + **kwargs + ) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace + def get_contacts(self, **kwargs): + # type: (**Any) -> List[Contact] + """Gets the certificate contacts for the key vault. + + Returns the set of certificate contact resources in the specified + key vault. This operation requires the certificates/managecontacts + permission. + + :return: The certificate contacts for the key vault. + :rtype: Iterator[azure.keyvault.certificates._models.Contact] + """ + contacts = self._client.get_certificate_contacts(vault_base_url=self._vault_url, **kwargs) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace + def delete_contacts(self, **kwargs): + # type: (**Any) -> List[Contact] + """Deletes the certificate contacts for the key vault. + + Deletes the certificate contacts for the key vault certificate. + This operation requires the certificates/managecontacts permission. + + :return: Contacts + :rtype: Iterator[~azure.certificates._models.Contact] + """ + contacts = self._client.delete_certificate_contacts(vault_base_url=self.vault_url, **kwargs) + return [Contact._from_certificate_contacts_item(contact_item=item) for item in contacts.contact_list] + + @distributed_trace + def get_certificate_operation(self, name, **kwargs): + # type: (str, **Any) -> CertificateOperation + """Gets the creation operation of a certificate. + + Gets the creation operation associated with a specified certificate. + This operation requires the certificates/get permission. + + :param name: The name of the certificate. + :type name: str + :returns: The created CertificateOperation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + + bundle = self._client.get_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace + def delete_certificate_operation(self, name, **kwargs): + # type: (str, **Any) -> CertificateOperation + """Deletes the creation operation for a specific certificate. + + Deletes the creation operation for a specified certificate that is in + the process of being created. The certificate is no longer created. + This operation requires the certificates/update permission. + + :param name: The name of the certificate. + :type name: str + :return: The deleted CertificateOperation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + bundle = self._client.delete_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace + def cancel_certificate_operation(self, name, **kwargs): + # type: (str, **Any) -> CertificateOperation + """Updates a certificate operation. + + Updates a certificate creation operation that is already in progress. + This operation requires the certificates/update permission. + + :param name: The name of the certificate. + :type name: str + :returns: The updated certificate operation + :rtype: ~azure.keyvault.certificates.models.CertificateOperation + :raises: ~azure.core.exceptions.ResourceNotFoundError if the certificate operation doesn't exist + """ + bundle = self._client.update_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + cancellation_requested=True, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return CertificateOperation._from_certificate_operation_bundle(certificate_operation_bundle=bundle) + + @distributed_trace + def merge_certificate( + self, + name, # type: str + x509_certificates, # type: List[bytearray] + enabled=None, # type: Optional[bool] + tags=None, # type: Optional[Dict[str, str]] + **kwargs # type: **Any + ): + # type: (...) -> Certificate + """Merges a certificate or a certificate chain with a key pair existing on the server. + + Performs the merging of a certificate or certificate chain with a key pair currently + available in the service. This operation requires the certificates/create permission. + + :param name: The name of the certificate + :type name: str + :param x509_certificates: The certificate or the certificate chain to merge. + :type x509_certificates: list[bytearray] + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :param tags: Application specific metadata in the form of key-value pairs. + :type tags: dict[str, str] + :return: The merged certificate + :rtype: ~azure.keyvault.certificates.models.Certificate + :raises: ~azure.core.exceptions.ResourceNotFoundError if the create certificate operation doesn't exist + """ + if enabled is not None: + attributes = self._client.models.CertificateAttributes( + enabled=enabled + ) + else: + attributes = None + bundle = self._client.merge_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + x509_certificates=x509_certificates, + certificate_attributes=attributes, + tags=tags, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def get_pending_certificate_signing_request( + self, + name, # type: str + **kwargs # type: **Any + ): + # type: (...) -> str + """Gets the Base64 pending certificate signing request (PKCS-10). + :param name: The name of the certificate + :type name: str + :param custom_headers: headers that will be added to the request + :type custom_headers: dict + :return: Base64 encoded pending certificate signing request (PKCS-10). + :rtype: str + :raises: ~azure.core.exceptions.ResourceNotFoundError if the pending csr doesn't exist + """ + error_map = {404: ResourceNotFoundError} + vault_base_url = self.vault_url + # Construct URL + url = '/certificates/{certificate-name}/pending' + path_format_arguments = { + 'vaultBaseUrl': self._client._serialize.url("vault_base_url", vault_base_url, 'str', skip_quote=True), + 'certificate-name': self._client._serialize.url("certificate_name", name, 'str') + } + url = self._client._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} + query_parameters['api-version'] = self._client._serialize.query( + name="self.api_version", + data=self._client.api_version, + data_type='str' + ) + + # Construct headers + header_parameters = {} + header_parameters['Accept'] = 'application/pkcs10' + if self._client._config.generate_client_request_id: + header_parameters['x-ms-client-request-id'] = str(uuid.uuid1()) + + # Construct and send request + request = self._client._client.get( + url=url, + params=query_parameters, + headers=header_parameters + ) + pipeline_response = self._client._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + self._client.map_error(status_code=response.status_code, response=response, error_map=error_map) + raise self._client.models.KeyVaultErrorException(response, self._client._deserialize) + + deserialized = None + + if response.status_code == 200: + deserialized = response.body() if hasattr(response, 'body') else response.content + + return deserialized + + @distributed_trace + def get_issuer(self, name, **kwargs): + # type: (str, **Any) -> Issuer + """Gets the specified certificate issuer. + + Returns the specified certificate issuer resources in the key vault. + This operation requires the certificates/manageissuers/getissuers permission. + + :param name: The name of the issuer. + :type name: str + :return: The specified certificate issuer. + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + issuer_bundle = self._client.get_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace + def create_issuer( + self, + name, # type: str, + provider, # type: str, + account_id=None, # type: Optional[str] + password=None, # type: Optional[str] + organization_id=None, # type: Optional[str] + admin_details=None, # type: Optional[List[AdministratorDetails]] + enabled=None, # type: Optional[bool] + **kwargs # type: **Any + ): + # type: (...) -> Issuer + """Sets the specified certificate issuer. + + The SetCertificateIssuer operation adds or updates the specified + certificate issuer. This operation requires the certificates/setissuers + permission. + + :param name: The name of the issuer. + :type name: str + :param provider: The issuer provider. + :type provider: str + :param account_id: The user name/account name/account id. + :type account_id: str + :param password: The password/secret/account key. + :type password: str + :param organization_id: Id of the organization. + :type organization_id: str + :param admin_details: Details of the organization administrators of the certificate issuer. + :type admin_details: Iterable[AdministratorDetails] + :param enabled: Determines whether the object is enabled. + :type enabled: bool + :returns: The created Issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + """ + if account_id or password: + issuer_credentials = self._client.models.IssuerCredentials(account_id=account_id, password=password) + else: + issuer_credentials = None + if admin_details and admin_details[0]: + admin_details_to_pass = [self._client.models.AdministratorDetails( + first_name=admin_detail.first_name, + last_name=admin_detail.last_name, + email_address=admin_detail.email, + phone=admin_detail.phone + ) for admin_detail in admin_details] + else: + admin_details_to_pass = admin_details + if organization_id or admin_details: + organization_details = self._client.models.OrganizationDetails( + id=organization_id, + admin_details=admin_details_to_pass + ) + else: + organization_details = None + if enabled is not None: + issuer_attributes = self._client.models.IssuerAttributes(enabled=enabled) + else: + issuer_attributes = None + issuer_bundle = self._client.set_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + provider=provider, + credentials=issuer_credentials, + organization_details=organization_details, + attributes=issuer_attributes, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace + def update_issuer( + self, + name, # type: str, + provider=None, # type: Optional[str], + account_id=None, # type: Optional[str] + password=None, # type: Optional[str] + organization_id=None, # type: Optional[str] + admin_details=None, # type: Optional[List[AdministratorDetails]] + enabled=None, # type: Optional[bool] + **kwargs # type: **Any + ): + # type: (...) -> Issuer + """Updates the specified certificate issuer. + + Performs an update on the specified certificate issuer entity. + THis operation requires the certificates/setissuers permission. + + :param name: The name of the issuer. + :type name: str + :param provider: The issuer provider. + :type provider: str + :param account_id: The username / account name / account key. + :type account_id: str + :param password: The password / secret / account key. + :type password: str + :param organization_id: Id of the organization + :type organization_id: str + :param admin_details: Details of the organization administrators of the certificate issuer. + :type admin_details: Iterable[AdministratorDetails] + :param enabled: Determines whether the issuer is enabled. + :type enabled: bool + :return: The updated issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + if account_id or password: + issuer_credentials = self._client.models.IssuerCredentials(account_id=account_id, password=password) + else: + issuer_credentials = None + if admin_details and admin_details[0]: + admin_details_to_pass = [self._client.models.AdministratorDetails( + first_name=admin_detail.first_name, + last_name=admin_detail.last_name, + email_address=admin_detail.email, + phone=admin_detail.phone + ) for admin_detail in admin_details] + else: + admin_details_to_pass = admin_details + if organization_id or admin_details: + organization_details = self._client.models.OrganizationDetails( + id=organization_id, + admin_details=admin_details_to_pass + ) + else: + organization_details = None + if enabled is not None: + issuer_attributes = self._client.models.IssuerAttributes(enabled=enabled) + else: + issuer_attributes = None + issuer_bundle = self._client.update_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + provider=provider, + credentials=issuer_credentials, + organization_details=organization_details, + attributes=issuer_attributes, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace + def delete_issuer(self, name, **kwargs): + # type: (str, **Any) -> Issuer + """Deletes the specified certificate issuer. + + Permanently removes the specified certificate issuer from the vault. + This operation requires the certificates/manageissuers/deleteissuers permission. + + :param name: The name of the issuer. + :type name: str + :return: Issuer + :rtype: ~azure.keyvault.certificates.models.Issuer + :raises: ~azure.core.exceptions.ResourceNotFoundError if the issuer doesn't exist + """ + issuer_bundle = self._client.delete_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + error_map={404: ResourceNotFoundError}, + **kwargs + ) + return Issuer._from_issuer_bundle(issuer_bundle=issuer_bundle) + + @distributed_trace + def list_issuers(self, **kwargs): + # type: (**Any) -> Iterable[IssuerBase] + """List certificate issuers for the key vault. + + Returns the set of certificate issuer resources in the key + vault. This operation requires the certificates/manageissuers/getissuers + permission. + + :return: An iterator like instance of Issuers + :rtype: Iterable[~azure.keyvault.certificates.models.Issuer] + """ + max_page_size = kwargs.pop("max_page_size", None) + return self._client.get_certificate_issuers( + vault_base_url=self.vault_url, + maxresults=max_page_size, + cls=lambda objs: [IssuerBase._from_issuer_item(issuer_item=x) for x in objs], + **kwargs + ) diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/enums.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/enums.py new file mode 100644 index 000000000000..d0b1283d3b87 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/enums.py @@ -0,0 +1,52 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from enum import Enum + + +class ActionType(str, Enum): + """The supported action types for the lifetime of a certificate""" + + email_contacts = "EmailContacts" + auto_renew = "AutoRenew" + + +class SecretContentType(str, Enum): + """Content type of the secrets as specified in Certificate Policy""" + + PFX = 'application/x-pkcs12' + PEM = 'application/x-pem-file' + + +class KeyUsageType(str, Enum): + """The supported types of key usages""" + + digital_signature = "digitalSignature" + non_repudiation = "nonRepudiation" + key_encipherment = "keyEncipherment" + data_encipherment = "dataEncipherment" + key_agreement = "keyAgreement" + key_cert_sign = "keyCertSign" + c_rl_sign = "cRLSign" + encipher_only = "encipherOnly" + decipher_only = "decipherOnly" + + +class JsonWebKeyType(str, Enum): + """Supported key types""" + + ec = "EC" #: Elliptic Curve + ec_hsm = "EC-HSM" #: Elliptic Curve with a private key which is not exportable from the HSM + rsa = "RSA" #: RSA (https://tools.ietf.org/html/rfc3447) + rsa_hsm = "RSA-HSM" #: RSA with a private key which is not exportable from the HSM + oct = "oct" #: Octet sequence (used to represent symmetric keys) + + +class JsonWebKeyCurveName(str, Enum): + """Supported elliptic curves""" + + p_256 = "P-256" #: The NIST P-256 elliptic curve, AKA SECG curve SECP256R1. + p_384 = "P-384" #: The NIST P-384 elliptic curve, AKA SECG curve SECP384R1. + p_521 = "P-521" #: The NIST P-521 elliptic curve, AKA SECG curve SECP521R1. + p_256_k = "P-256K" #: The SECG SECP256K1 elliptic curve. diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/models.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/models.py new file mode 100644 index 000000000000..63ca7a29cae4 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/models.py @@ -0,0 +1,1426 @@ +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint:disable=too-many-lines + +from datetime import datetime + +from ._shared import parse_vault_id +from ._shared._generated.v7_0 import models +from .enums import ActionType, KeyUsageType, JsonWebKeyCurveName, JsonWebKeyType, SecretContentType + +try: + from typing import TYPE_CHECKING +except ImportError: + TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import Any, Dict, Optional + + +class AdministratorDetails(object): + """Details of the organization administrator of the certificate issuer. + + :param first_name: First name of the issuer. + :type first_name: str + :param last_name: Last name of the issuer. + :type last_name: str + :param email: email of the issuer. + :type email: str + :param phone: phone number of the issuer. + :type phone: str + """ + + def __init__(self, first_name=None, last_name=None, email=None, phone=None): + # type: (Optional[str], Optional[str], Optional[str], Optional[str]) -> None + self._first_name = first_name + self._last_name = last_name + self._phone = phone + self._email = email + + @classmethod + def _from_admin_details_bundle(cls, admin_details_bundle): + # type: (models.AdministratorDetails) -> AdministratorDetails + """Construct a AdministratorDetails from an autorest-generated AdministratorDetailsBundle""" + return cls( + email=admin_details_bundle.email_address, + first_name=admin_details_bundle.first_name, + last_name=admin_details_bundle.last_name, + phone=admin_details_bundle.phone + ) + + @property + def email(self): + # type: () -> str + """:rtype: str""" + return self._email + + @property + def first_name(self): + # type: () -> str + """:rtype: str""" + return self._first_name + + @property + def last_name(self): + # type: () -> str + """:rtype: str""" + return self._last_name + + @property + def phone(self): + # type: () -> str + """:rtype: str""" + return self._phone + + +class Error(object): + """The key vault server error. + + :param code: The error code. + :type code: str + :param message: The error message. + :type message: str + :param inner_error: The error object itself + :type inner_error: ~azure.keyvault.certificates.Error + """ + + def __init__(self, code, message, inner_error): + # type: (str, str, models.Error, **Any) -> None + self._code = code + self._message = message + self._inner_error = inner_error + + @property + def code(self): + # type: () -> str + """The error code. + + :rtype: str + """ + return self._code + + @property + def message(self): + # type: () -> str + """The error message. + + :rtype: str + """ + return self._message + + @property + def inner_error(self): + # type: () -> Error + """The error itself + + :return models.Error: + """ + return self._inner_error + + +class CertificateBase(object): + """Certificate base consists of a certificates metadata. + + :param attributes: The certificate management attributes. + :type attributes: ~azure.keyvault.certificates.CertificateAttributes + :param cert_id: The certificate id. + :type cert_id: str + :param thumbprint: Thumpbrint of the certificate + :type thumbprint: bytes + """ + def __init__(self, attributes=None, cert_id=None, thumbprint=None, **kwargs): + # type: (Optional[models.CertificateAttributes], Optional[str], Optional[bytes], **Any) -> None + self._attributes = attributes + self._id = cert_id + self._vault_id = parse_vault_id(cert_id) + self._thumbprint = thumbprint + self._tags = kwargs.get("tags", None) + + @classmethod + def _from_certificate_item(cls, certificate_item): + # type: (models.CertificateItem) -> CertificateBase + """Construct a CertificateBase from an autorest-generated CertificateItem""" + return cls( + attributes=certificate_item.attributes, + cert_id=certificate_item.id, + thumbprint=certificate_item.x509_thumbprint, + tags=certificate_item.tags, + ) + + @property + def id(self): + # type: () -> str + """Certificate identifier. + + :rtype: str + """ + return self._id + + @property + def name(self): + # type: () -> str + """The name of the certificate. + + :rtype: str + """ + return self._vault_id.name + + @property + def enabled(self): + # type: () -> bool + """Whether the certificate is enabled or not. + + :rtype: bool + """ + return self._attributes.enabled if self._attributes else None + + @property + def not_before(self): + # type: () -> datetime + """The datetime before which the certificate is not valid. + + :rtype: datetime + """ + return self._attributes.not_before if self._attributes else None + + @property + def expires(self): + # type: () -> datetime + """The datetime when the certificate expires. + + :rtype: datetime + """ + return self._attributes.expires if self._attributes else None + + @property + def created(self): + # type: () -> datetime + """The datetime when the certificate is created. + + :rtype: datetime + """ + return self._attributes.created if self._attributes else None + + @property + def updated(self): + # type: () -> datetime + """The datetime when the certificate was last updated. + + :rtype: datetime + """ + return self._attributes.updated if self._attributes else None + + @property + def recovery_level(self): + # type: () -> models.DeletionRecoveryLevel + """The deletion recovery level currently in effect for the certificate. + + :rtype: models.DeletionRecoveryLevel + """ + return self._attributes.recovery_level if self._attributes else None + + @property + def vault_url(self): + # type: () -> str + """The name of the vault that the certificate is created in. + + :rtype: str + """ + return self._vault_id.vault_url + + @property + def thumbprint(self): + # type: () -> bytes + """Thumbprint of the certificate. + + :rtype: bytes + """ + return self._thumbprint + + @property + def tags(self): + # type: () -> Dict[str, str] + """Application specific metadata in the form of key-value pairs. + + :rtype: str + """ + return self._tags + + @property + def version(self): + # type: () -> str + """The version of the certificate + + :rtype: str + """ + return self._vault_id.version + + +class Certificate(CertificateBase): + """Consists of a certificate and its attributes + + :param policy: The management policy for the certificate. + :type policy: ~azure.keyvault.certificates.CertificatePolicy + :param cert_id: The certificate id. + :type cert_id: str + :param thumbprint: Thumpbrint of the certificate + :type thumbprint: bytes + :param key_id: The key id. + :type key_id: str + :param secret_id: The secret id. + :type secret_id: str + :param attributes: The certificate attributes. + :type attributes: ~azure.keyvault.certificates.CertificateAttributes + :param cer: CER contents of the X509 certificate. + :type cer: bytearray + """ + def __init__( + self, + policy, # type: models.CertificatePolicy + cert_id, # type: Optional[str] + thumbprint=None, # type: Optional[bytes] + key_id=None, # type: Optional[str] + secret_id=None, # type: Optional[str] + attributes=None, # type: Optional[CertificateAttributes] + cer=None, # type: Optional[bytes] + **kwargs # type: **Any + ): + # type: (...) -> None + super(Certificate, self).__init__(attributes=attributes, cert_id=cert_id, thumbprint=thumbprint, **kwargs) + self._key_id = key_id + self._secret_id = secret_id + self._policy = policy + self._cer = cer + + @classmethod + def _from_certificate_bundle(cls, certificate_bundle): + # type: (models.CertificateBundle) -> Certificate + """Construct a certificate from an autorest-generated certificateBundle""" + # pylint:disable=protected-access + return cls( + attributes=certificate_bundle.attributes, + cert_id=certificate_bundle.id, + thumbprint=certificate_bundle.x509_thumbprint, + key_id=certificate_bundle.kid, + secret_id=certificate_bundle.sid, + policy=CertificatePolicy._from_certificate_policy_bundle(certificate_bundle.policy), + cer=certificate_bundle.cer, + tags=certificate_bundle.tags, + ) + + @property + def key_id(self): + # type: () -> str + """:rtype: str""" + return self._key_id + + @property + def secret_id(self): + # type: () -> str + """:rtype: str""" + return self._secret_id + + @property + def policy(self): + # type: () -> CertificatePolicy + """The management policy of the certificate. + + :rtype: CertificatePolicy + """ + return self._policy + + @property + def cer(self): + # type: () -> bytes + """The CER contents of the certificate. + + :rtype: bytes + """ + return self._cer + + +class CertificateOperation(object): + # pylint:disable=too-many-instance-attributes + """A certificate operation is returned in case of asynchronous requests. + + :param cert_operation_id: The certificate id. + :type cert_operation_id: str + :param issuer_name: Name of the operation's issuer object or reserved names; + for example, 'Self' or 'Unknown + :type issuer_name: str + :param certificate_type: Type of certificate requested from the issuer provider. + :type certificate_type: str + :param certificate_transparency: Indicates if the certificate this operation is + running for is published to certificate transparency logs. + :type certificate_transparency: bool + :param csr: The certificate signing request (CSR) that is being used in the certificate + operation. + :type csr: bytearray + :param cancellation_requested: Indicates if cancellation was requested on the certificate + operation. + :type cancellation_requested: bool + :param status: Status of the certificate operation. + :type status: str + :param status_details: The status details of the certificate operation + :type status_details: str + :param error: Error encountered, if any, during the certificate operation. + :type ~azure.keyvault.certificates.Error + :param target: Location which contains the result of the certificate operation. + :type target: str + :param request_id: Identifier for the certificate operation. + :type request_id: str + """ + def __init__( + self, + cert_operation_id=None, # type: Optional[str] + issuer_name=None, # type: Optional[str] + certificate_type=None, # type: Optional[str] + certificate_transparency=False, # type: Optional[bool] + csr=None, # type: Optional[bytes] + cancellation_requested=False, # type: Optional[bool] + status=None, # type: Optional[str] + status_details=None, # type: Optional[str] + error=None, # type: Optional[models.Error] + target=None, # type: Optional[str] + request_id=None # type: Optional[str] + ): + # type: (...) -> None + self._id = cert_operation_id + self._vault_id = parse_vault_id(cert_operation_id) + self._issuer_name = issuer_name + self._certificate_type = certificate_type + self._certificate_transparency = certificate_transparency + self._csr = csr + self._cancellation_requested = cancellation_requested + self._status = status + self._status_details = status_details + self._error = error + self._target = target + self._request_id = request_id + + @classmethod + def _from_certificate_operation_bundle(cls, certificate_operation_bundle): + # type: (models.CertificateOperation) -> CertificateOperation + """Construct a CertificateOperation from an autorest-generated CertificateOperation""" + return cls( + cert_operation_id=certificate_operation_bundle.id, + issuer_name=(certificate_operation_bundle.issuer_parameters.name + if certificate_operation_bundle.issuer_parameters else None), + certificate_type=(certificate_operation_bundle.issuer_parameters.certificate_type + if certificate_operation_bundle.issuer_parameters else None), + certificate_transparency=(certificate_operation_bundle.issuer_parameters.certificate_transparency + if certificate_operation_bundle.issuer_parameters else None), + csr=certificate_operation_bundle.csr, + cancellation_requested=certificate_operation_bundle.cancellation_requested, + status=certificate_operation_bundle.status, + status_details=certificate_operation_bundle.status_details, + error=certificate_operation_bundle.error, + target=certificate_operation_bundle.target, + request_id=certificate_operation_bundle.request_id, + ) + + @property + def id(self): + # type: () -> str + """:rtype: str""" + return self._id + + @property + def name(self): + # type: () -> str + """:rtype: str""" + return self._vault_id.name + + @property + def issuer_name(self): + # type: () -> str + """The name of the issuer of the certificate. + + :rtype: str + """ + return self._issuer_name + + @property + def certificate_type(self): + # type: () -> str + """Type of certificate to be requested from the issuer provider. + + :rtype: str + """ + return self._certificate_type + + @property + def certificate_transparency(self): + # type: () -> bool + """Whether certificates generated under this policy should be published to certificate + transparency logs. + + :rtype: bool + """ + return self._certificate_transparency + + @property + def csr(self): + # type: () -> bytes + """The certificate signing request that is being used in this certificate operation. + + :rtype: bytes + """ + return self._csr + + @property + def cancellation_requested(self): + # type: () -> bool + """Whether cancellation was requested on the certificate operation. + + :rtype: bool + """ + return self._cancellation_requested + + @property + def status(self): + # type: () -> str + """:rtype: str""" + return self._status + + @property + def status_details(self): + # type: () -> str + """:rtype: str""" + return self._status_details + + @property + def error(self): + # type: () -> models.Error + """:rtype: models.Error""" + return self._error + + @property + def target(self): + # type: () -> str + """Location which contains the result of the certificate operation. + + :rtype: str + """ + return self._target + + @property + def request_id(self): + # type: () -> str + """Identifier for the certificate operation. + + :rtype: str + """ + return self._request_id + + +class CertificatePolicy(object): + """Management policy for a certificate. + + :param attributes: the certificate attributes. + :type attributes: ~azure.keyvault.certificates.models.CertificateAttributes + :param cert_policy_id: The certificate id. + :type cert_policy_id: str + :param key_properties: Properties of the key backing the certificate. + :type key_properties: ~azure.keyvault.certificates.models.KeyProperties + :param content_type: The media type (MIME type) of the secret backing the certificate. + :type content_type: ~azure.keyvault.certificates.SecretContentType or str + :param subject_name: The subject name of the certificate. Should be a valid X509 + distinguished name. + :type subject_name: str + :param validity_in_months: The duration that the certificate is valid in months. + :type validity_in_months: int + :param lifetime_actions: Actions that will be performed by Key Vault over the lifetime + of a certificate + :type lifetime_actions: Iterable[~azure.keyvault.certificates.LifetimeAction] + :param issuer_name: Name of the referenced issuer object or reserved names; for example, + 'Self' or 'Unknown" + :type issuer_name: str + :param certificate_type: Type of certificate to be requested from the issuer provider. + :type certificate_type: str + :param certificate_transparency: Indicates if the certificates generated under this policy + should be published to certificate transparency logs. + :type certificate_transparency: bool + :param san_emails: Subject alternative emails of the X509 object. Only one out of san_emails, + san_dns_names, and san_upns may be set. + :type san_emails: Iterable[str] + :param san_dns_names: Subject alternative DNS names of the X509 object. Only one out of + san_emails, san_dns_names, and san_upns may be set. + :type san_dns_names: Iterable[str] + :param san_upns: Subject alternative user principal names. Only one out of san_emails, + san_dns_names, and san_upns may be set. + :type san_upns: Iterable[str] + """ + # pylint:disable=too-many-instance-attributes + def __init__( + self, + attributes=None, # type: Optional[models.CertificateAttributes] + cert_policy_id=None, # type: Optional[str] + key_properties=None, # type: Optional[KeyProperties] + content_type=None, # type: Optional[models.SecretContentType] or str + subject_name=None, # type: Optional[str] + validity_in_months=None, # type: Optional[int] + lifetime_actions=None, # type: Optional[list[LifetimeAction]] + issuer_name=None, # type: Optional[str] + certificate_type=None, # type: Optional[str] + certificate_transparency=None, # type: Optional[bool] + **kwargs # type: **Any + ): + # type: (...) -> None + self._attributes = attributes + self._id = cert_policy_id + self._key_properties = key_properties + self._content_type = content_type + self._subject_name = subject_name + self._validity_in_months = validity_in_months + self._lifetime_actions = lifetime_actions + self._issuer_name = issuer_name + self._certificate_type = certificate_type + self._certificate_transparency = certificate_transparency + self._san_emails = kwargs.pop('san_emails', None) + self._san_dns_names = kwargs.pop('san_dns_names', None) + self._san_upns = kwargs.pop('san_upns', None) + + sans = [self._san_emails, self._san_upns, self._san_dns_names] + if len([x for x in sans if x is not None]) > 1: + raise ValueError("You can only set at most one of san_emails, san_dns_names, and san_upns") + + def _to_certificate_policy_bundle(self): + # type: (CertificatePolicy) -> models.CertificatePolicy + + """Construct a version emulating the generated CertificatePolicy from a wrapped CertificatePolicy""" + if self.issuer_name or self.certificate_type or self.certificate_transparency: + issuer_parameters = models.IssuerParameters( + name=self.issuer_name, + certificate_type=self.certificate_type, + certificate_transparency=self.certificate_transparency + ) + else: + issuer_parameters = None + + # pylint:disable=too-many-boolean-expressions + if (self.enabled is not None or + self.not_before is not None or + self.expires is not None or + self.created is not None or + self.updated is not None + or self.recovery_level): + attributes = models.CertificateAttributes( + enabled=self.enabled, + not_before=self.not_before, + expires=self.expires, + created=self.enabled, + updated=self.updated, + recovery_level=self.recovery_level + ) + else: + attributes = None + + if self.lifetime_actions: + lifetime_actions = [] + for lifetime_action in self.lifetime_actions: + lifetime_actions.append( + models.LifetimeAction( + trigger=models.Trigger( + lifetime_percentage=lifetime_action.lifetime_percentage, + days_before_expiry=lifetime_action.days_before_expiry + ), + action=models.Action(action_type=lifetime_action.action_type.value + if not isinstance(lifetime_action.action_type, str) + and lifetime_action.action_type + else lifetime_action.action_type) + ) + ) + else: + lifetime_actions = None + + # pylint:disable=too-many-boolean-expressions + if(self.subject_name or + (self.key_properties and self.key_properties.ekus) or + (self.key_properties and self.key_properties.key_usage) or + self.san_emails or + self.san_upns or + self.san_dns_names or + self.validity_in_months): + if self.key_properties and self.key_properties.key_usage: + key_usage = [k.value if not isinstance(k, str) else k for k in self.key_properties.key_usage] + else: + key_usage = None + + sans = [self._san_emails, self._san_upns, self._san_dns_names] + if len([x for x in sans if x is not None]) > 1: + raise ValueError("You can only set at most one of san_emails, san_dns_names, and san_upns") + + x509_certificate_properties = models.X509CertificateProperties( + subject=self.subject_name, + ekus=self.key_properties.ekus if self.key_properties else None, + subject_alternative_names=models.SubjectAlternativeNames( + emails=self.san_emails, + upns=self.san_upns, + dns_names=self.san_dns_names + ), + key_usage=key_usage, + validity_in_months=self.validity_in_months + ) + else: + x509_certificate_properties = None + + if (self.key_properties and + (self.key_properties.exportable or + self.key_properties.key_type or + self.key_properties.key_size or + self.key_properties.reuse_key or + self.key_properties.curve)): + key_properties = models.KeyProperties( + exportable=self.key_properties.exportable, + key_type=(self.key_properties.key_type.value + if not isinstance(self.key_properties.key_type, str) and self.key_properties.key_type + else self.key_properties.key_type), + key_size=self.key_properties.key_size, + reuse_key=self.key_properties.reuse_key, + curve=(self.key_properties.curve.value + if not isinstance(self.key_properties.curve, str) and self.key_properties.curve + else self.key_properties.curve) + ) + else: + key_properties = None + + if self.content_type: + secret_properties = models.SecretProperties(content_type=self.content_type.value + if not isinstance(self.content_type, str) and self.content_type + else self.content_type) + else: + secret_properties = None + + policy_bundle = models.CertificatePolicy( + id=self.id, + key_properties=key_properties, + secret_properties=secret_properties, + x509_certificate_properties=x509_certificate_properties, + lifetime_actions=lifetime_actions, + issuer_parameters=issuer_parameters, + attributes=attributes + ) + return policy_bundle + + @classmethod + def _from_certificate_policy_bundle(cls, certificate_policy_bundle): + # type: (models.CertificatePolicy) -> CertificatePolicy + """Construct a CertificatePolicy from an autorest-generated CertificatePolicy""" + if certificate_policy_bundle.lifetime_actions: + lifetime_actions = [ + LifetimeAction( + action_type=(ActionType(item.action.action_type) + if item.action.action_type else None), + lifetime_percentage=item.trigger.lifetime_percentage, + days_before_expiry=item.trigger.days_before_expiry, + ) + for item in certificate_policy_bundle.lifetime_actions + ] + else: + lifetime_actions = None + key_properties_bundle = certificate_policy_bundle.key_properties + # pylint:disable=too-many-boolean-expressions + if key_properties_bundle: + if certificate_policy_bundle.x509_certificate_properties and \ + certificate_policy_bundle.x509_certificate_properties.key_usage: + key_usage = [KeyUsageType(k) for k in certificate_policy_bundle.x509_certificate_properties.key_usage] + else: + key_usage = None + + key_properties = KeyProperties( + exportable=certificate_policy_bundle.key_properties.exportable, + key_type=(JsonWebKeyType(certificate_policy_bundle.key_properties.key_type) + if certificate_policy_bundle.key_properties.key_type else None), + key_size=certificate_policy_bundle.key_properties.key_size, + reuse_key=certificate_policy_bundle.key_properties.reuse_key, + curve=(JsonWebKeyCurveName(certificate_policy_bundle.key_properties.curve) + if certificate_policy_bundle.key_properties.curve else None), + ekus=(certificate_policy_bundle.x509_certificate_properties.ekus + if certificate_policy_bundle.x509_certificate_properties else None), + key_usage=key_usage, + ) + else: + key_properties = None + return cls( + attributes=certificate_policy_bundle.attributes, + cert_policy_id=certificate_policy_bundle.id, + issuer_name=(certificate_policy_bundle.issuer_parameters.name + if certificate_policy_bundle.issuer_parameters else None), + certificate_type=(certificate_policy_bundle.issuer_parameters.certificate_type + if certificate_policy_bundle.issuer_parameters else None), + certificate_transparency=(certificate_policy_bundle.issuer_parameters.certificate_transparency + if certificate_policy_bundle.issuer_parameters else None), + lifetime_actions=lifetime_actions, + subject_name=(certificate_policy_bundle.x509_certificate_properties.subject + if certificate_policy_bundle.x509_certificate_properties else None), + key_properties=key_properties, + content_type=(SecretContentType(certificate_policy_bundle.secret_properties.content_type) + if certificate_policy_bundle.secret_properties else None), + san_emails=(certificate_policy_bundle.x509_certificate_properties.subject_alternative_names.emails + if certificate_policy_bundle.x509_certificate_properties and + certificate_policy_bundle.x509_certificate_properties.subject_alternative_names else None), + san_upns=(certificate_policy_bundle.x509_certificate_properties.subject_alternative_names.upns + if certificate_policy_bundle.x509_certificate_properties and + certificate_policy_bundle.x509_certificate_properties.subject_alternative_names else None), + san_dns_names=(certificate_policy_bundle.x509_certificate_properties.subject_alternative_names.dns_names + if certificate_policy_bundle.x509_certificate_properties and + certificate_policy_bundle.x509_certificate_properties.subject_alternative_names else None), + validity_in_months=(certificate_policy_bundle.x509_certificate_properties.validity_in_months + if certificate_policy_bundle.x509_certificate_properties else None) + ) + + @property + def id(self): + # type: () -> str + """:rtype: str""" + return self._id + + @property + def key_properties(self): + # type: () -> models.KeyProperties + """Properties of the key backing the certificate. + + :rtype: KeyProperties + """ + return self._key_properties + + @property + def content_type(self): + # type: () -> models.SecretContentType + """The media type (MIME type). + + :rtype: SecretContentType + """ + return self._content_type + + @property + def subject_name(self): + # type: () -> str + """:rtype: str""" + return self._subject_name + + @property + def san_emails(self): + # type: () -> list[str] + """The subject alternative email addresses. + + :rtype: list[str] + """ + return self._san_emails + + @property + def san_dns_names(self): + # type: () -> list[str] + """The subject alternative domain names. + + :rtype: list[str] + """ + return self._san_dns_names + + @property + def san_upns(self): + # type: () -> list[str] + """The subject alternative user principal names. + + :rtype: list[str] + """ + return self._san_upns + + @property + def validity_in_months(self): + # type: () -> int + """The duration that the certificate is valid for in months. + + :rtype: int + """ + return self._validity_in_months + + @property + def lifetime_actions(self): + # type: () -> list[LifetimeAction] + """Actions and their triggers that will be performed by Key Vault over + the lifetime of the certificate. + + :rtype: list[LifetimeAction] + """ + return self._lifetime_actions + + @property + def issuer_name(self): + # type: () -> str + """Name of the referenced issuer object or reserved names for the issuer + of the certificate. + + :rtype: str + """ + return self._issuer_name + + @property + def certificate_type(self): + # type: () -> str + """Type of certificate requested from the issuer provider. + + :rtype: str + """ + return self._certificate_type + + @property + def certificate_transparency(self): + # type: () -> bool + """Whether the certificates generated under this policy should be published + to certificate transparency logs. + + :rtype: bool + """ + return self._certificate_transparency + + @property + def enabled(self): + # type: () -> bool + """Whether the certificate is enabled or not. + + :rtype: bool + """ + return self._attributes.enabled if self._attributes else None + + @property + def not_before(self): + # type: () -> datetime + """The datetime before which the certificate is not valid. + + :rtype: datetime + """ + return self._attributes.not_before if self._attributes else None + + @property + def expires(self): + # type: () -> datetime + """The datetime when the certificate expires. + + :rtype: datetime + """ + return self._attributes.expires if self._attributes else None + + @property + def created(self): + # type: () -> datetime + """The datetime when the certificate is created. + + :rtype: datetime + """ + return self._attributes.created if self._attributes else None + + @property + def updated(self): + # type: () -> datetime + """The datetime when the certificate was last updated. + + :rtype: datetime + """ + return self._attributes.updated if self._attributes else None + + @property + def recovery_level(self): + # type: () -> models.DeletionRecoveryLevel + """The deletion recovery level currently in effect for the certificate. + + :rtype: DeletionRecoveryLevel + """ + return self._attributes.recovery_level if self._attributes else None + + +class Contact(object): + """The contact information for the vault certificates. + + :param email: Email address of a contact for the certificate. + :type email: str + :param name: Name of a contact for the certificate. + :type name: str + :param phone: phone number of a contact for the certificate. + :type phone: str + """ + + def __init__(self, email=None, name=None, phone=None): + # type: (Optional[str], Optional[str], Optional[str]) -> None + self._email = email + self._name = name + self._phone = phone + + def _to_certificate_contacts_item(self): + # type: (Contact) -> models.Contact + return models.Contact( + email_address=self.email, + name=self.name, + phone=self.phone + ) + + @classmethod + def _from_certificate_contacts_item(cls, contact_item): + # type: (models.Contact) -> Contact + """Construct a Contact from an autorest-generated ContactItem.""" + return cls(email=contact_item.email_address, name=contact_item.name, phone=contact_item.phone) + + @property + def email(self): + # type: () -> str + """:rtype: str""" + return self._email + + @property + def name(self): + # type: () -> str + """:rtype: str""" + return self._name + + @property + def phone(self): + # type: () -> str + """:rtype: str""" + return self._phone + + +class IssuerBase(object): + """The base for the issuer containing the issuer metadata. + + :param issuer_id: the ID of the issuer. + :type issuer_id: str + """ + def __init__(self, issuer_id=None, provider=None): + # type: (Optional[str], Optional[str]) -> None + self._id = issuer_id + self._vault_id = parse_vault_id(issuer_id) + self._provider = provider + + @classmethod + def _from_issuer_item(cls, issuer_item): + # type: (models.CertificateIssuerItem) -> IssuerBase + """Construct a IssuerBase from an autorest-generated CertificateIssuerItem""" + return cls(issuer_id=issuer_item.id, provider=issuer_item.provider) + + @property + def id(self): + # type: () -> str + """:rtype: str""" + return self._id + + @property + def name(self): + # type: () -> str + # Issuer name is listed under version under vault_id + """:rtype: str""" + return self._vault_id.version + + @property + def provider(self): + # type: () -> str + """:rtype: str""" + return self._provider + + @property + def vault_url(self): + # type: () -> str + """The name of the vault with this issuer. + + :rtype: str + """ + return self._vault_id.vault_url + + +class Issuer(IssuerBase): + """The issuer for a Key Vault certificate. + + :param attributes: Attributes of the issuer object. Only populated by server. + :type attributes: ~azure.keyvault.v7_0.models.IssuerAttributes + :param provider: The issuer provider. + :type provider: str + :param issuer_id: The ID of the issuer. + :type issuer_id: str + :param account_id: The username / account name / account id. + :type account_id: str + :param password: The password / secret / account key. + :type password: str + :param organization_id: The ID of the organization. + :type organization_id: str + :param admin_details: Details of the organization administrator. + :type admin_details: List[~azure.keyvault.certificates.AdministratorDetails] + """ + def __init__( + self, + attributes=None, # type: Optional[models.IssuerAttributes] + provider=None, # type: Optional[str] + issuer_id=None, # type: Optional[str] + account_id=None, # type: Optional[str] + password=None, # type: Optional[str] + organization_id=None, # type: Optional[str] + admin_details=None, # type: Optional[List[AdministratorDetails]] + **kwargs # type: **Any + ): + # type: (...) -> None + super(Issuer, self).__init__(issuer_id=issuer_id, provider=provider, **kwargs) + self._attributes = attributes + self._account_id = account_id + self._password = password + self._organization_id = organization_id + self._admin_details = admin_details + + @classmethod + def _from_issuer_bundle(cls, issuer_bundle): + # type: (models.IssuerBundle) -> Issuer + """Construct a Issuer from an autorest-generated IssuerBundle""" + admin_details = [] + admin_details_service = issuer_bundle.organization_details.admin_details + if admin_details_service: + # pylint:disable=protected-access + for admin_detail in admin_details_service: + admin_details.append(AdministratorDetails._from_admin_details_bundle(admin_detail)) + return cls( + attributes=issuer_bundle.attributes, + issuer_id=issuer_bundle.id, + provider=issuer_bundle.provider, + account_id=issuer_bundle.credentials.account_id if issuer_bundle.credentials else None, + password=issuer_bundle.credentials.password if issuer_bundle.credentials else None, + organization_id=issuer_bundle.organization_details.id if issuer_bundle.organization_details else None, + admin_details=admin_details + ) + + @property + def enabled(self): + # type: () -> bool + """Whether the certificate is enabled or not. + + :rtype: bool + """ + return self._attributes.enabled if self._attributes else None + + @property + def created(self): + # type: () -> datetime + """The datetime when the certificate is created. + + :rtype: datetime + """ + return self._attributes.created if self._attributes else None + + @property + def updated(self): + # type: () -> datetime + """The datetime when the certificate was last updated. + + :rtype: datetime + """ + return self._attributes.updated if self._attributes else None + + @property + def account_id(self): + # type: () -> str + """THe username/ account name/ account id. + + :rtype: str + """ + return self._account_id + + @property + def password(self): + # type: () -> str + """The password / secret / account key. + + :rtype: str + """ + return self._password + + @property + def organization_id(self): + # type: () -> str + """:rtype: str""" + return self._organization_id + + @property + def admin_details(self): + # type: () -> List[AdministratorDetails] + """Details of the organization administrator of this issuer. + + :rtype: List[AdministratorDetails] + """ + return self._admin_details + + +class KeyProperties(object): + """Properties of the key pair backing a certificate. + + :param exportable: Indicates if the private key can be exported. + :type exportable: bool + :param key_type: The type of key pair to be used for the certificate. + Possible values include: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct' + :type str or ~azure.keyvault.certificates.enums.JsonWebKeyType + :param key_size: The key size in bits. For example: 2048, 3072, or 4096 + for RSA. + :type key_size: int + :param reuse_key: Indicates if the same key pair will be used on certificate + renewal. + :type reuse_key: bool + :param curve: Elliptic curve name. For valid values, see JsonWebKeyCurveName. + Possible values include: 'P-256', 'P-384', 'P-521', 'P-256K' + :type curve: str or ~azure.keyvault.certificates.enums.JsonWebKeyCurveName + :param ekus: The enhanced key usages. + :type ekus: list[str] + :param key_usage: List of key usages. + :type key_usage: list[str or ~azure.keyvault.certificates.KeyUsageType] + """ + def __init__( + self, + exportable=None, # type: Optional[bool] + key_type=None, # type: Optional[JsonWebKeyType] + key_size=None, # type: Optional[str] + reuse_key=None, # type: Optional[bool] + curve=None, # type: Optional[JsonWebKeyCurveName] + ekus=None, # type: Optional[list[str]] + key_usage=None # type: Optional[list[KeyUsageType]] + ): + # type: (...) -> None + self._exportable = exportable + self._key_type = key_type + self._key_size = key_size + self._reuse_key = reuse_key + self._curve = curve + self._ekus = ekus + self._key_usage = key_usage + + @property + def exportable(self): + # type: () -> bool + """Whether the private key can be exported. + + :rtype: bool + """ + return self._exportable + + @property + def key_type(self): + # type: () -> models.JsonWebKeyType + """The type of key pair to be used for the certificate. + + :rtype: models.JsonWebKeyType + """ + return self._key_type + + @property + def key_size(self): + # type: () -> int + """The key size in bits. + + :rtype: int + """ + return self._key_size + + @property + def reuse_key(self): + # type: () -> bool + """Whether the same key pair will be used on certificate renewal. + + :rtype: bool + """ + return self._reuse_key + + @property + def curve(self): + # type: () -> models.JsonWebKeyCurveName + """Elliptic curve name. + + :rtype: models.JsonWebKeyCurveName + """ + return self._curve + + @property + def ekus(self): + # type: () -> list[str] + """The enhanced key usage. + + :rtype: list[str] + """ + return self._ekus + + @property + def key_usage(self): + # type: () -> list[KeyUsageType] + """List of key usages. + + :rtype: list[KeyUsageType] + """ + return self._key_usage + + +class LifetimeAction(object): + """Action and its trigger that will be performed by certificate Vault over the + lifetime of a certificate. + + :param action_type: The type of the action. Possible values include: 'EmailContacts', + 'AutoRenew' + :type action_type: str or ~azure.keyvault.certificates.enums.ActionType + :param lifetime_percentage: Percentage of lifetime at which to trigger. Value + should be between 1 and 99. + :type lifetime_percentage: int + :param days_before_expiry: Days before expiry to attempt renewal. Value should be between + 1 and validity_in_months multiplied by 27. I.e., if validity_in_months is 36, then value + should be between 1 and 972 (36 * 27). + :type days_before_expiry: int + """ + + def __init__(self, action_type, lifetime_percentage=None, days_before_expiry=None): + # type: (ActionType, Optional[int], Optional[int]) -> None + self._lifetime_percentage = lifetime_percentage + self._days_before_expiry = days_before_expiry + self._action_type = action_type + + @property + def lifetime_percentage(self): + # type: () -> int + """Percentage of lifetime at which to trigger. + + :rtype: int + """ + return self._lifetime_percentage + + @property + def days_before_expiry(self): + # type: () -> int + """Days before expiry to attempt renewal. + + :rtype: int + """ + return self._days_before_expiry + + @property + def action_type(self): + # type: () -> str + """The type of the action that will be executed. + Valid values are "EmailContacts" and "AutoRenew" + + :rtype: str or models.ActionType + """ + return self._action_type + + +class DeletedCertificate(Certificate): + """A Deleted Certificate consisting of its previous id, attributes and its + tags, as well as information on when it will be purged. + + :param attributes: The certificate attributes + :type attributes: ~azure.keyvault.certifictaes.CertificateAttributes + :param cert_id: The certificate id. + :type cert_id: str + :param thumbprint: Thumbprint of the certificate. + :type thumbprint: bytes + :param key_id: The key id. + :type key_id: str + :param secret_id: The secret id. + :type secret_id: str + :param policy: The management policy of the deleted certificate. + :type policy: ~azure.keyvault.certificates.CertificatePolicy + :param cer: CER contents of the X509 certificate. + :type cer: bytearray + :param deleted_date: The time when the certificate was deleted, in UTC + :type deleted_date: datetime + :param recovery_id: The url of the recovery object, used to identify and + recover the deleted certificate. + :type recovery_id: str + :param scheduled_purge_date: The time when the certificate is scheduled to + be purged, in UTC + :type scheduled_purge_date: datetime + """ + + def __init__( + self, + attributes=None, # type: Optional[CertificateAttributes] + cert_id=None, # type: Optional[str] + thumbprint=None, # type: Optional[bytes] + key_id=None, # type: Optional[str] + secret_id=None, # type: Optional[str] + policy=None, # type: Optional[CertificatePolicy] + cer=None, # type: Optional[bytes] + deleted_date=None, # type: Optional[datetime] + recovery_id=None, # type: Optional[str] + scheduled_purge_date=None, # type: Optional[datetime] + **kwargs # type: **Any + ): + # type: (...) -> None + super(DeletedCertificate, self).__init__( + policy=policy, + cert_id=cert_id, + thumbprint=thumbprint, + key_id=key_id, + secret_id=secret_id, + attributes=attributes, + cer=cer, + **kwargs + ) + self._deleted_date = deleted_date + self._recovery_id = recovery_id + self._scheduled_purge_date = scheduled_purge_date + + @classmethod + def _from_deleted_certificate_item(cls, deleted_certificate_item): + # type: (models.DeletedCertificateItem) -> DeletedCertificate + """Construct a DeletedCertificate from an autorest-generated DeletedCertificateItem""" + return cls( + attributes=deleted_certificate_item.attributes, + cert_id=deleted_certificate_item.id, + thumbprint=deleted_certificate_item.x509_thumbprint, + key_id=None, + secret_id=None, + policy=None, + cer=None, + deleted_date=deleted_certificate_item.deleted_date, + recovery_id=deleted_certificate_item.recovery_id, + scheduled_purge_date=deleted_certificate_item.scheduled_purge_date, + tags=deleted_certificate_item.tags, + ) + + @classmethod + def _from_deleted_certificate_bundle(cls, deleted_certificate_bundle): + # type: (models.DeletedCertificateBundle) -> DeletedCertificate + """Construct a DeletedCertificate from an autorest-generated DeletedCertificateItem""" + # pylint:disable=protected-access + return cls( + attributes=deleted_certificate_bundle.attributes, + cert_id=deleted_certificate_bundle.id, + thumbprint=deleted_certificate_bundle.x509_thumbprint, + key_id=deleted_certificate_bundle.kid, + secret_id=deleted_certificate_bundle.sid, + policy=CertificatePolicy._from_certificate_policy_bundle(deleted_certificate_bundle.policy), + cer=deleted_certificate_bundle.cer, + deleted_date=deleted_certificate_bundle.deleted_date, + recovery_id=deleted_certificate_bundle.recovery_id, + scheduled_purge_date=deleted_certificate_bundle.scheduled_purge_date, + tags=deleted_certificate_bundle.tags, + ) + + @property + def deleted_date(self): + # type: () -> datetime + """The datetime that the certificate was deleted. + + :rtype: datetime + """ + return self._deleted_date + + @property + def recovery_id(self): + # type: () -> str + """The url of the recovery object, used to identify and recover the deleted certificate. + + :rtype: str + """ + return self._recovery_id + + @property + def scheduled_purge_date(self): + # type: () -> datetime + """The datetime when the certificate is scheduled to be purged. + + :rtype: str + """ + return self._scheduled_purge_date diff --git a/sdk/keyvault/azure-keyvault-certificates/conftest.py b/sdk/keyvault/azure-keyvault-certificates/conftest.py new file mode 100644 index 000000000000..581f07a0c251 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/conftest.py @@ -0,0 +1,39 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import sys +import os + +# Ignore async tests for Python < 3.5 +collect_ignore_glob = [] +if sys.version_info < (3, 5): + collect_ignore_glob.append("tests/*_async.py") + +# get the run identifier for unique test runs +dirname = os.path.dirname(os.path.abspath(__file__)) +seed_filename = os.path.abspath(os.path.join(dirname, "tests", "seed.txt")) + +run_identifier_set = False + +try: + with open(seed_filename, "r") as f: + if os.path.getsize(seed_filename): + os.environ['RUN_IDENTIFIER'] = f.readline().strip() + run_identifier_set = True + + # if file exists but is empty + if not run_identifier_set: + if "RUN_IDENTIFIER" not in os.environ: + print("Please set your RUN_IDENTIFIER environment variable in seed.txt") + raise NameError + with open(seed_filename, "w") as f: + f.write(os.environ["RUN_IDENTIFIER"]) + +except FileNotFoundError: + # if file has not yet been created + if "RUN_IDENTIFIER" not in os.environ: + print("Please set your RUN_IDENTIFIER environment variable in seed.txt") + raise NameError + with open(seed_filename, "w") as f: + f.write(os.environ["RUN_IDENTIFIER"]) diff --git a/sdk/keyvault/azure-keyvault-certificates/dev_requirements.txt b/sdk/keyvault/azure-keyvault-certificates/dev_requirements.txt new file mode 100644 index 000000000000..e4a2fc1ce4b2 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/dev_requirements.txt @@ -0,0 +1,7 @@ +-e ../../core/azure-core +-e ../../../tools/azure-devtools +-e ../../../tools/azure-sdk-tools +-e ../../identity/azure-identity +-e ../azure-mgmt-keyvault +aiohttp>=3.0; python_version >= '3.5' +pytest-asyncio>=0.8.0; python_version > '3.4' diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations.py b/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations.py new file mode 100644 index 000000000000..1f55b29ac9b8 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations.py @@ -0,0 +1,88 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +from azure.keyvault.certificates import CertificateClient +from azure.identity import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic backup and restore operations on a vault(certificates) resource for Azure Key Vault +# +# 1. Create a certificate (create_certificate) +# +# 2. Backup a certificate (backup_certificate) +# +# 3. Delete a certificate (delete_certificate) +# +# 4. Purge a deleted certificate (purge_deleted_certificate) +# +# 5. Restore a certificate (restore_certificate) +# ---------------------------------------------------------------------------------------------------------- + +def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + + print("\n1. Create Certificate") + cert_name = 'BackupRestoreCertificate' + + # Let's create a certificate for your key vault. + # if the certificate already exists in the Key Vault, then a new version of the certificate is created. + # A long running poller is returned for the create certificate operation. + create_certificate_poller = client.create_certificate(name=cert_name) + + # the wait call awaits the completion of the create certificate operation + create_certificate_poller.wait() + print("Certificate with name '{0}' created.".format(cert_name)) + + # Backups are good to have, if in case certificates gets deleted accidentally. + # For long term storage, it is ideal to write the backup to a file. + print("\n2. Create a backup for an existing certificate") + certificate_backup = client.backup_certificate(name=cert_name) + print("Backup created for certificate with name '{0}'.".format(cert_name)) + + # The storage account certificate is no longer in use, so you can delete it. + client.delete_certificate(name=cert_name) + print("Deleted Certificate with name '{0}'".format(cert_name)) + + # In future, if the certificate is required again, we can use the backup value to restore it in the Key Vault. + print("\n3. Restore the certificate using the backed up certificate bytes") + certificate = client.restore_certificate(certificate_backup) + print("Restored Certificate with name '{0}'".format(certificate.name)) + + except HttpResponseError as e: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + run_sample() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations_async.py new file mode 100644 index 000000000000..f49cedef1202 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/backup_restore_operations_async.py @@ -0,0 +1,99 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +import time +import os +from azure.keyvault.certificates.aio import CertificateClient +from azure.identity.aio import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic backup and restore operations on a vault(certificates) resource for Azure Key Vault +# +# 1. Create a certificate (create_certificate) +# +# 2. Backup a certificate (backup_certificate) +# +# 3. Delete a certificate (delete_certificate) +# +# 4. Purge a deleted certificate (purge_deleted_certificate) +# +# 5. Restore a certificate (restore_certificate) +# ---------------------------------------------------------------------------------------------------------- + +async def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + + print("\n1. Create Certificate") + cert_name = 'BackupRestoreCertificate' + + # Let's create a certificate for your key vault. + # if the certificate already exists in the Key Vault, then a new version of the certificate is created. + # An async poller is returned + create_certificate_poller = await client.create_certificate(name=cert_name) + await create_certificate_poller + print("Certificate with name '{0}' created.".format(cert_name)) + + # Backups are good to have, if in case certificates gets deleted accidentally. + # For long term storage, it is ideal to write the backup to a file. + print("\n2. Create a backup for an existing certificate") + certificate_backup = await client.backup_certificate(name=cert_name) + print("Backup created for certificate with name '{0}'.".format(cert_name)) + + # The storage account certificate is no longer in use, so you can delete it. + await client.delete_certificate(name=cert_name) + print("Deleted Certificate with name '{0}'".format(cert_name)) + + # Even though the certificate is deleted, it can still be recovered so its name cannot be reused. + # In order to be able to reuse the name during restoration, we must purge the certificate + # after the initial deletion. + print ("\nPurging certificate...") + await client.purge_deleted_certificate(name=cert_name) + # To ensure certificate is purged on the server side. + time.sleep(30) + print("Purged Certificate with name '{0}'".format(cert_name)) + + # In future, if the certificate is required again, we can use the backup value to restore it in the Key Vault. + print("\n3. Restore the certificate using the backed up certificate bytes") + certificate = await client.restore_certificate(certificate_backup) + print("Restored Certificate with name '{0}'".format(certificate.name)) + + except HttpResponseError as e: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + loop = asyncio.get_event_loop() + loop.run_until_complete(run_sample()) + loop.close() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/hello_world.py b/sdk/keyvault/azure-keyvault-certificates/samples/hello_world.py new file mode 100644 index 000000000000..2b18cca14b21 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/hello_world.py @@ -0,0 +1,115 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import datetime +import os +from azure.identity import DefaultAzureCredential +from azure.keyvault.certificates import CertificateClient, CertificatePolicy, KeyProperties, SecretContentType +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic CRUD operations on a vault(certificate) resource for Azure Key Vault +# +# 1. Create a new certificate (create_certificate) +# +# 2. Get an existing certificate (get_certificate) +# +# 3. Update an existing certificate (update_certificate) +# +# 4. Delete a certificate (delete_certificate) +# +# ---------------------------------------------------------------------------------------------------------- + +def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create a certificate for holding bank account credentials valid for 1 year. + # if the certificate already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificate") + + # Before creating your certificate, let's create the management policy for your certificate. + # Here you specify the properties of the key, secret, and issuer backing your certificate, + # the X509 component of your certificate, and any lifetime actions you would like to be taken + # on your certificate + + # Alternatively, if you would like to use our default policy, don't pass a policy parameter to + # our certificate creation method + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + cert_name = "HelloWorldCertificate" + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + create_certificate_poller = client.create_certificate(name=cert_name, policy=cert_policy, expires=expires) + create_certificate_poller.wait() + print("Certificate with name '{0}' created".format(cert_name)) + + # Let's get the bank certificate using its name + print("\n2. Get a Certificate by name") + bank_certificate = client.get_certificate(name=cert_name) + print("Certificate with name '{0}' was found with expiration date '{1}'.".format( + bank_certificate.name, + bank_certificate.expires) + ) + + # After one year, the bank account is still active, we need to update the expiry time of the certificate. + # The update method can be used to update the expiry attribute of the certificate. + print("\n3. Update a Certificate by name") + expires = bank_certificate.expires + datetime.timedelta(days=365) + updated_certificate = client.update_certificate(name=bank_certificate.name, expires=expires) + print("Certificate with name '{0}' was updated on date '{1}'".format( + bank_certificate.name, + updated_certificate.updated) + ) + print("Certificate with name '{0}' was updated to expire on '{1}'".format( + bank_certificate.name, + updated_certificate.expires) + ) + + # The bank account was closed, need to delete its credentials from the Key Vault. + print("\n4. Delete Certificate") + deleted_certificate = client.delete_certificate(name=bank_certificate.name) + print("Deleting Certificate..") + print("Certificate with name '{0}' was deleted.".format(deleted_certificate.name)) + + except HttpResponseError as e: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + run_sample() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/hello_world_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/hello_world_async.py new file mode 100644 index 000000000000..df8a0bf95058 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/hello_world_async.py @@ -0,0 +1,110 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +import datetime +import os +from azure.identity.aio import DefaultAzureCredential +from azure.keyvault.certificates.aio import CertificateClient +from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic CRUD operations on a vault(certificate) resource for Azure Key Vault +# +# 1. Create a new certificate (create_certificate) +# +# 2. Get an existing certificate (get_certificate) +# +# 3. Update an existing certificate (update_certificate) +# +# 4. Delete a certificate (delete_certificate) +# +# ---------------------------------------------------------------------------------------------------------- + +async def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create a certificate for holding bank account credentials valid for 1 year. + # if the certificate already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificate") + + # Before creating your certificate, let's create the management policy for your certificate. + # Here you specify the properties of the key, secret, and issuer backing your certificate, + # the X509 component of your certificate, and any lifetime actions you would like to be taken + # on your certificate + + # Alternatively, if you would like to use our default policy, don't pass a policy parameter to + # our certificate creation method + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + cert_name="HelloWorldCertificate" + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + create_certificate_poller = await client.create_certificate(name=cert_name, policy=cert_policy, expires=expires) + await create_certificate_poller + print("Certificate with name '{0}' created".format(cert_name)) + + # Let's get the bank certificate using its name + print("\n2. Get a Certificate by name") + bank_certificate = await client.get_certificate(name=cert_name) + print("Certificate with name '{0}' was found with expiration date '{1}'.".format(bank_certificate.name, bank_certificate.expires)) + + # After one year, the bank account is still active, we need to update the expiry time of the certificate. + # The update method can be used to update the expiry attribute of the certificate. + print("\n3. Update a Certificate by name") + expires = bank_certificate.expires + datetime.timedelta(days=365) + updated_certificate = await client.update_certificate(name=bank_certificate.name, expires=expires) + print("Certificate with name '{0}' was updated on date '{1}'".format(bank_certificate.name, updated_certificate.updated)) + print("Certificate with name '{0}' was updated to expire on '{1}'".format(bank_certificate.name, updated_certificate.expires)) + + # The bank account was closed, need to delete its credentials from the Key Vault. + print("\n4. Delete Certificate") + deleted_certificate = await client.delete_certificate(name=bank_certificate.name) + print("Deleting Certificate..") + print("Certificate with name '{0}' was deleted.".format(deleted_certificate.name)) + + except HttpResponseError as e: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + loop = asyncio.get_event_loop() + loop.run_until_complete(run_sample()) + loop.close() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/list_operations.py b/sdk/keyvault/azure-keyvault-certificates/samples/list_operations.py new file mode 100644 index 000000000000..c5e21ce7b7d7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/list_operations.py @@ -0,0 +1,126 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import datetime +import os +from azure.keyvault.certificates import CertificateClient +from azure.identity import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic list operations on a vault(certificate) resource for Azure Key Vault. +# The vault has to be soft-delete enabled to perform one of the following operations: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete +# +# 1. Create certificate (create_certificate) +# +# 2. List certificates from the Key Vault (list_certificates) +# +# 3. List certificate versions from the Key Vault (list_certificate_versions) +# +# 4. List deleted certificates from the Key Vault (list_deleted_certificates). The vault has to be soft-delete enabled +# to perform this operation. +# +# ---------------------------------------------------------------------------------------------------------- + +def run_sample(): + # Instantiate a certificate client that will be used to call the service. Notice that the client is using default + # Azure credentials. To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create a certificate for holding storage and bank accounts credentials. If the certificate + # already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificate") + bank_cert_name = "BankListCertificate" + storage_cert_name = "StorageListCertificate" + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + + bank_certificate_poller = client.create_certificate(name=bank_cert_name, expires=expires) + storage_certificate_poller = client.create_certificate(name=storage_cert_name) + + # await the creation of the bank and storage certificate + bank_certificate_poller.wait() + storage_certificate_poller.wait() + + print("Certificate with name '{0}' was created.".format(bank_cert_name)) + print("Certificate with name '{0}' was created.".format(storage_cert_name)) + + # Let's list the certificates. + print("\n2. List certificates from the Key Vault") + certificates = client.list_certificates() + for certificate in certificates: + print("Certificate with name '{0}' was found.".format(certificate.name)) + + # You find the bank certificate needs to change the expiration date because the bank account credentials will be + # valid for an extra year. Calling create_certificate on an existing certificate creates a new version of the + # certificate in the Key Vault with the new value. + + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + + client.create_certificate( + name=bank_cert_name, + expires=expires + ).wait() + print( + "Certificate with name '{0}' was updated with expiration date '{1}'".format( + bank_cert_name, + expires + ) + ) + + # You need to check all the different expiration dates your bank account certificate had previously. Let's print + # all the versions of this certificate. + print("\n3. List versions of the certificate using its name") + certificate_versions = client.list_certificate_versions(bank_cert_name) + for certificate_version in certificate_versions: + print("Bank Certificate with name '{0}' with version '{1}' has expiration date: '{2}'.".format( + certificate_version.name, + certificate_version.version, + certificate_version.expires)) + + # The bank acoount and storage accounts got closed. Let's delete bank and storage accounts certificates. + client.delete_certificate(name=bank_cert_name) + client.delete_certificate(name=storage_cert_name) + + # You can list all the deleted and non-purged certificates, assuming Key Vault is soft-delete enabled. + print("\n3. List deleted certificates from the Key Vault") + deleted_certificates = client.list_deleted_certificates() + for deleted_certificate in deleted_certificates: + print("Certificate with name '{0}' has recovery id '{1}'".format( + deleted_certificate.name, + deleted_certificate.recovery_id)) + + except HttpResponseError as e: + if "(NotSupported)" in e.message: + print("\n{0} Please enable soft delete on Key Vault to perform this operation.".format(e.message)) + else: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + run_sample() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/list_operations_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/list_operations_async.py new file mode 100644 index 000000000000..215198a576b9 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/list_operations_async.py @@ -0,0 +1,123 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +import datetime +import time +import os +from azure.keyvault.certificates.aio import CertificateClient +from azure.identity.aio import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic list operations on a vault(certificate) resource for Azure Key Vault. +# The vault has to be soft-delete enabled to perform one of the following operations: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete +# +# 1. Create certificate (create_certificate) +# +# 2. List certificates from the Key Vault (list_certificates) +# +# 3. List certificate versions from the Key Vault (list_certificate_versions) +# +# 4. List deleted certificates from the Key Vault (list_deleted_certificates). The vault has to be soft-delete enabled to perform this operation. +# +# ---------------------------------------------------------------------------------------------------------- + +async def run_sample(): + # Instantiate a certificate client that will be used to call the service. Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create a certificate for holding storage and bank accounts credentials. If the certificate + # already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificate") + bank_cert_name = "BankListCertificate" + storage_cert_name = "StorageListCertificate" + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + + bank_certificate_poller = await client.create_certificate(name=bank_cert_name, expires=expires) + storage_certificate_poller = await client.create_certificate(name=storage_cert_name) + + # await the creation of the bank and storage certificate + await bank_certificate_poller + await storage_certificate_poller + + print("Certificate with name '{0}' was created.".format(bank_cert_name)) + print("Certificate with name '{0}' was created.".format(storage_cert_name)) + + # Let's list the certificates. + print("\n2. List certificates from the Key Vault") + certificates = client.list_certificates() + async for certificate in certificates: + print("Certificate with name '{0}' was found.".format(certificate.name)) + + # You find the bank certificate needs to change the expiration date because the bank account credentials will be valid for an extra year. + # Calling create_certificate on an existing certificate creates a new version of the certificate in the Key Vault with the new value. + + expires = datetime.datetime.utcnow() + datetime.timedelta(days=365) + + updated_bank_certificate_poller = await client.create_certificate(name=bank_cert_name, expires=expires) + await updated_bank_certificate_poller + print( + "Certificate with name '{0}' was updated with expiration date '{1}'".format(bank_cert_name, expires) + ) + + # You need to check all the different expiration dates your bank account certificate had previously. Lets print all the versions of this certificate. + print("\n3. List versions of the certificate using its name") + certificate_versions = client.list_certificate_versions(bank_cert_name) + async for certificate_version in certificate_versions: + print("Bank Certificate with name '{0}' with version '{1}' has expiration date: '{2}'.".format(certificate_version.name, certificate_version.version, certificate_version.expires)) + + # The bank acoount and storage accounts got closed. Let's delete bank and storage accounts certificates. + await client.delete_certificate(name=bank_cert_name) + await client.delete_certificate(name=storage_cert_name) + + # To ensure certificate is deleted on the server side. + print("Deleting certificates...") + time.sleep(30) + + # You can list all the deleted and non-purged certificates, assuming Key Vault is soft-delete enabled. + print("\n3. List deleted certificates from the Key Vault") + deleted_certificates = client.list_deleted_certificates() + async for deleted_certificate in deleted_certificates: + print( + "Certificate with name '{0}' has recovery id '{1}'".format(deleted_certificate.name, deleted_certificate.recovery_id) + ) + + except HttpResponseError as e: + if "(NotSupported)" in e.message: + print("\n{0} Please enable soft delete on Key Vault to perform this operation.".format(e.message)) + else: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + loop = asyncio.get_event_loop() + loop.run_until_complete(run_sample()) + loop.close() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations.py b/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations.py new file mode 100644 index 000000000000..d713f5d44554 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations.py @@ -0,0 +1,101 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +from azure.keyvault.certificates import CertificateClient +from azure.identity import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic recover and purge operations on a vault(certificate) resource for Azure Key Vault +# +# 1. Create a certificate (create_certificate) +# +# 2. Delete a certificate (delete_certificate) +# +# 3. Recover a deleted certificate (recover_deleted_certificate) +# +# 4. Purge a deleted certificate (purge_deleted_certificate) +# ---------------------------------------------------------------------------------------------------------- + + +def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create certificates holding storage and bank accounts credentials. If the certificate + # already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificates") + + bank_cert_name = "BankRecoverCertificate" + storage_cert_name = "ServerRecoverCertificate" + + bank_certificate_poller = client.create_certificate(name=bank_cert_name) + storage_certificate_poller = client.create_certificate(name=storage_cert_name) + + bank_certificate_poller.wait() + storage_certificate_poller.wait() + print("Certificate with name '{0}' was created.".format(bank_cert_name)) + print("Certificate with name '{0}' was created.".format(storage_cert_name)) + + # The storage account was closed, need to delete its credentials from the Key Vault. + print("\n2. Delete a Certificate") + deleted_bank_certificate = client.delete_certificate(name=bank_cert_name) + + print("Certificate with name '{0}' was deleted on date {1}.".format( + deleted_bank_certificate.name, + deleted_bank_certificate.deleted_date) + ) + + # We accidentally deleted the bank account certificate. Let's recover it. + # A deleted certificate can only be recovered if the Key Vault is soft-delete enabled. + print("\n3. Recover Deleted Certificate") + recovered_bank_certificate = client.recover_deleted_certificate(deleted_bank_certificate.name) + print("Recovered Certificate with name '{0}'.".format(recovered_bank_certificate.name)) + + # Let's delete the storage certificate now. + # If the keyvault is soft-delete enabled, then for permanent deletion deleted certificate needs to be purged. + client.delete_certificate(name=storage_cert_name) + + # To ensure permanent deletion, we might need to purge the secret. + print("\n4. Purge Deleted Certificate") + client.purge_deleted_certificate(name=storage_cert_name) + print("Certificate has been permanently deleted.") + + except HttpResponseError as e: + if "(NotSupported)" in e.message: + print("\n{0} Please enable soft delete on Key Vault to perform this operation.".format(e.message)) + else: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + run_sample() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations_async.py new file mode 100644 index 000000000000..75888e2b2d33 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/recover_purge_operations_async.py @@ -0,0 +1,102 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +import os +from azure.keyvault.certificates.aio import CertificateClient +from azure.identity.aio import DefaultAzureCredential +from azure.core.exceptions import HttpResponseError + +# ---------------------------------------------------------------------------------------------------------- +# Prerequistes - +# +# 1. An Azure Key Vault- +# https://docs.microsoft.com/en-us/azure/key-vault/quick-create-cli +# +# 2. Microsoft Azure Key Vault PyPI package - +# https://pypi.python.org/pypi/azure-keyvault-certificates/ +# +# 3. Microsoft Azure Identity package - +# https://pypi.python.org/pypi/azure-identity/ +# +# 4. Set Environment variables AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET, VAULT_URL. +# How to do this - https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates#createget-credentials) +# +# ---------------------------------------------------------------------------------------------------------- +# Sample - demonstrates the basic recover and purge operations on a vault(certificate) resource for Azure Key Vault +# +# 1. Create a certificate (create_certificate) +# +# 2. Delete a certificate (delete_certificate) +# +# 3. Recover a deleted certificate (recover_deleted_certificate) +# +# 4. Purge a deleted certificate (purge_deleted_certificate) +# ---------------------------------------------------------------------------------------------------------- + + +async def run_sample(): + # Instantiate a certificate client that will be used to call the service. + # Notice that the client is using default Azure credentials. + # To make default credentials work, ensure that environment variables 'AZURE_CLIENT_ID', + # 'AZURE_CLIENT_SECRET' and 'AZURE_TENANT_ID' are set with the service principal credentials. + VAULT_URL = os.environ["VAULT_URL"] + credential = DefaultAzureCredential() + client = CertificateClient(vault_url=VAULT_URL, credential=credential) + try: + # Let's create certificates holding storage and bank accounts credentials. If the certificate + # already exists in the Key Vault, then a new version of the certificate is created. + print("\n1. Create Certificates") + bank_cert_name = "BankRecoverCertificate" + storage_cert_name = "ServerRecoverCertificate" + + bank_certificate_poller = await client.create_certificate(name=bank_cert_name) + storage_certificate_poller = await client.create_certificate(name=storage_cert_name) + + await bank_certificate_poller + await storage_certificate_poller + print("Certificate with name '{0}' was created.".format(bank_cert_name)) + print("Certificate with name '{0}' was created.".format(storage_cert_name)) + + # The storage account was closed, need to delete its credentials from the Key Vault. + print("\n2. Delete a Certificate") + deleted_bank_certificate = await client.delete_certificate(name=bank_cert_name) + print("Certificate with name '{0}' was deleted on date {1}.".format( + deleted_bank_certificate.name, + deleted_bank_certificate.deleted_date) + ) + + # We accidentally deleted the bank account certificate. Let's recover it. + # A deleted certificate can only be recovered if the Key Vault is soft-delete enabled. + print("\n3. Recover Deleted Certificate") + recovered_bank_certificate = await client.recover_deleted_certificate(deleted_bank_certificate.name) + print("Recovered Certificate with name '{0}'.".format(recovered_bank_certificate.name)) + + # Let's delete storage account now. + # If the keyvault is soft-delete enabled, then for permanent deletion deleted certificate needs to be purged. + await client.delete_certificate(name=storage_cert_name) + + # To ensure permanent deletion, we might need to purge the secret. + print("\n4. Purge Deleted Certificate") + await client.purge_deleted_certificate(name=storage_cert_name) + print("Certificate has been permanently deleted.") + + except HttpResponseError as e: + if "(NotSupported)" in e.message: + print("\n{0} Please enable soft delete on Key Vault to perform this operation.".format(e.message)) + else: + print("\nrun_sample has caught an error. {0}".format(e.message)) + + finally: + print("\nrun_sample done") + + +if __name__ == "__main__": + try: + loop = asyncio.get_event_loop() + loop.run_until_complete(run_sample()) + loop.close() + + except Exception as e: + print("Top level Error: {0}".format(str(e))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/seed.txt b/sdk/keyvault/azure-keyvault-certificates/seed.txt new file mode 100644 index 000000000000..799fcfa589bf --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/seed.txt @@ -0,0 +1 @@ +iscai-msft \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/setup.cfg b/sdk/keyvault/azure-keyvault-certificates/setup.cfg new file mode 100644 index 000000000000..3c6e79cf31da --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal=1 diff --git a/sdk/keyvault/azure-keyvault-certificates/setup.py b/sdk/keyvault/azure-keyvault-certificates/setup.py new file mode 100644 index 000000000000..fdec6b0617d0 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/setup.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# pylint:disable=missing-docstring + +import re +import os.path +from io import open +from setuptools import find_packages, setup + +# Change the PACKAGE_NAME only to change folder and different name +PACKAGE_NAME = "azure-keyvault-certificates" +PACKAGE_PPRINT_NAME = "Key Vault Certificates" + +# a-b-c => a/b/c +PACKAGE_FOLDER_PATH = PACKAGE_NAME.replace("-", "/") +# a-b-c => a.b.c +NAMESPACE_NAME = PACKAGE_NAME.replace("-", ".") + +# azure v0.x is not compatible with this package +# azure v0.x used to have a __version__ attribute (newer versions don't) +try: + import azure + + try: + VER = azure.__version__ # type: ignore + raise Exception( + "This package is incompatible with azure=={}. ".format(VER) + 'Uninstall it with "pip uninstall azure".' + ) + except AttributeError: + pass +except ImportError: + pass + +# Version extraction inspired from 'requests' +with open(os.path.join(PACKAGE_FOLDER_PATH, "_version.py"), "r") as fd: + VERSION = re.search(r'^VERSION\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1) + +if not VERSION: + raise RuntimeError("Cannot find version information") + +with open("README.md", encoding="utf-8") as f: + README = f.read() +with open("HISTORY.md", encoding="utf-8") as f: + HISTORY = f.read() + +setup( + name=PACKAGE_NAME, + version=VERSION, + description="Microsoft Azure {} Client Library for Python".format(PACKAGE_PPRINT_NAME), + long_description=README + "\n\n" + HISTORY, + long_description_content_type="text/markdown", + license="MIT License", + author="Microsoft Corporation", + author_email="azurekeyvault@microsoft.com", + url="https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-certificates", + classifiers=[ + "Development Status :: 4 - Beta", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "License :: OSI Approved :: MIT License", + ], + zip_safe=False, + packages=find_packages( + exclude=[ + "samples", + "tests", + # Exclude packages that will be covered by PEP420 or nspkg + "azure", + ] + ), + install_requires=["azure-core<2.0.0,>=1.0.0b2", "azure-common~=1.1", "msrest>=0.5.0"], + extras_require={":python_version<'3.0'": ["azure-nspkg"], ":python_version<'3.5'": ["typing"]}, +) diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/ca.crt b/sdk/keyvault/azure-keyvault-certificates/tests/ca.crt new file mode 100644 index 000000000000..fb1103ac034f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/ca.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDazCCAlOgAwIBAgIUYju9zymmCCF7rCaROzfZs0pNgmkwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA4MjgyMjU0MTNaFw0xOTA5 +MjcyMjU0MTNaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQD0YrMz5atoPmTTxLtCO69kM3E97bdjJgyAVZJS9mP3 +HQyHkFNb09eDeAAzcZLR5nYXX7yweowTWVcIe3k9+Z/tUeVrAlOVe2COaIHAUZIh +jELq/u8257/8MqqbKXhsyrWNAVDyKndDgvbbgxNsUTbMoAe9BCL/5fzowsnPLaCI +MCYRaQJUySbIoTmKi11hF09CFFSkL9nvfQODFyEde6JHPWrVRse2lioPLJeC9LoU +GNNZnbqry+UbHp4vORPp6OQTqBTm1ZVWPzCuYuWUmEe27K7zghEJr/Yx0OLq9kI5 +H960CSOkdhsOTcBkORfhivSQnmOn2RnCPIEsUTzjwXNZAgMBAAGjUzBRMB0GA1Ud +DgQWBBQIAunu6y1BmFSDfFNfTnqFggB0gzAfBgNVHSMEGDAWgBQIAunu6y1BmFSD +fFNfTnqFggB0gzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAr ++RM7gbqWRXnWJwE/hV/ZI2hXAhDN4RYQ4fWMJfg/E9wcLeqqRtJhXbqpJW08IZWp +QKcWfrFcfZ3ZxVAi5Ey+iuvD2VeBf9v5RZI4c9JqswS9xG2A1x/BeGcUk1y/q9E5 +4whf5fLSJQVxK+C53yemoHPrBg8zVhLJv5SG7Uw7jcqiQvu2aHGGWPLiO7mmMPtP +qO/I+6FjXuBpNomTqM897MY3Qzg43rpoCilpOpkRtMHknfhFxt05p+Fn73Fb60ru +ZsFRA52lsEBxGmI0QmXGjwkUZFwQTXEDUWwId3VJxoHRZwv1gmHfwhkYt+mNWJDa +mU7AMDzlQRwGC8hpWJRT +-----END CERTIFICATE----- diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/ca.key b/sdk/keyvault/azure-keyvault-certificates/tests/ca.key new file mode 100644 index 000000000000..b9432bead164 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/ca.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA9GKzM+WraD5k08S7QjuvZDNxPe23YyYMgFWSUvZj9x0Mh5BT +W9PXg3gAM3GS0eZ2F1+8sHqME1lXCHt5Pfmf7VHlawJTlXtgjmiBwFGSIYxC6v7v +Nue//DKqmyl4bMq1jQFQ8ip3Q4L224MTbFE2zKAHvQQi/+X86MLJzy2giDAmEWkC +VMkmyKE5iotdYRdPQhRUpC/Z730DgxchHXuiRz1q1UbHtpYqDyyXgvS6FBjTWZ26 +q8vlGx6eLzkT6ejkE6gU5tWVVj8wrmLllJhHtuyu84IRCa/2MdDi6vZCOR/etAkj +pHYbDk3AZDkX4Yr0kJ5jp9kZwjyBLFE848FzWQIDAQABAoIBAHrhegv5SrOy083r +mODX0/wFJcam1dRD2HtbC6UtgNxLPfaYKmH85duUJj23uMRUJkLgf6cZJ3+/J1T7 +iN4Ru0mAKWQiGlcKX2WbxMon+dtmhGtW3n90DgPIkiJMuuGxF5Kb+9CYa7mFi4ya +ntSTDYPcX6e6AcM8KGv9La4/2f0/hQKCN3jZbnQ/GqjnJdxrAV1KV0IMoNPpZmat +Sa0EZ9eiR57/xAe1OxceEt0nO7hAl+jX7tFEGvaNClKG2OMgZ+oHOxI+s9jW8DyD +wRJbd0hxUl/KXLxzyeFTBdLxB+SQtlcr4w5khyt3AvlKd4Iveqkq2FBCtfATYitt ++Ic61IUCgYEA/j4mMdo+qokzACmGJWEquC6yNoUI5aYsHTRVvX0sLpBX7MapIEwM +zHdvMEFBxw8rs7ll1xELW+dnbIZqj/ou43E3+PSgovdFGOA8kQlPpcIIutTEZQh7 +dlWzvAVZr0iO4xfXY2gFQot41fY4yRy8Q14ayo/VjQK4uKlnGqqlmwsCgYEA9hMc +FIAYpit7779tKD+O4vEkMoTkIxqSAZUuOZ5qB5UaF4Y/+MIGZUnrjJlGLnoFQmsP +CVPVMOQKV7yjg0LBadeDHEjESwHJNk0qxPSXWuXGlu01yVkqUehNumSBdnSLBmjR +jNIxPVEmW9d6+eAzIFiTkwqM9cAuLb75DL++iasCgYEAxhqzNEE0dzl0zfmNF29B +FEb+glDi/96dnRv8eywf0yCSAmNBwXLAvkmKD/WpRWxixyX9XrlfOntzMTMDsbBl +/L9pt8kVqiY2Zw3C49h3gVdR6hKD/Z3AZhKdfDJHEbfd7sHTCRgykQmQXFgBI2QK +pguboJ627atjODB3sGWrqMUCgYEA2QoJ3lsNYqM/8TpaQQGuOaSPVK+5uOyakyLN +XqzGwGFWXiFfEz2u/m+wfpZCPIQLV4WuAYAbrb+1D6WmYwPiLESVs8DKwY2Vt3tg +mc9SIC5CdqRKqIkoto264Qf82En6xXB2Q0qxe2+z8ZWhNfv1nDYEE9FeevNCx76F +VCVbHXkCgYEA4+FD1q6iwl9wsAOKFVo+W044/MhKHDsyIED3YOzeRTAWRl2w/KX0 +c5ty2KecGu0cVXoAv2YUttHsuMZfm/QdosZr9UB4CR2lmzRys3LSx6QzCkZeMb/s +QOMs6SYCPXggdXCAu9EVf5+TtYQg7aQNTTuYErlyq2g/tk3un8bHTwI= +-----END RSA PRIVATE KEY----- diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_preparer.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_preparer.py new file mode 100644 index 000000000000..4c04cde8a44b --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_preparer.py @@ -0,0 +1,36 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +from unittest.mock import Mock + +from azure.core.credentials import AccessToken +from azure.core.pipeline.transport import AioHttpTransport +from azure.identity.aio import EnvironmentCredential + +from multidict import CIMultiDict, CIMultiDictProxy + +from certificates_preparer import VaultClientPreparer + +from certificates_vault_client_async import VaultClient + + +class AiohttpTestTransport(AioHttpTransport): + """Workaround to vcrpy bug: https://github.com/kevin1024/vcrpy/pull/461 + """ + async def send(self, request, **config): + response = await super(AiohttpTestTransport, self).send(request, **config) + if not isinstance(response.headers, CIMultiDictProxy): + response.headers = CIMultiDictProxy(CIMultiDict(response.internal_response.headers)) + response.content_type = response.headers.get("content-type") + return response + + +class AsyncVaultClientPreparer(VaultClientPreparer): + def create_vault_client(self, vault_uri): + if self.is_live: + credential = EnvironmentCredential() + else: + credential = Mock(get_token=asyncio.coroutine(lambda _: AccessToken("fake-token", 0))) + return VaultClient(vault_uri, credential, transport=AiohttpTestTransport()) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_test_case.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_test_case.py new file mode 100644 index 000000000000..fa5faa223ed8 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_async_test_case.py @@ -0,0 +1,53 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import asyncio +import functools + +from certificates_test_case import KeyVaultTestCase + + +class AsyncKeyVaultTestCase(KeyVaultTestCase): + @staticmethod + def await_prepared_test(test_fn): + """Synchronous wrapper for async test methods. Used to avoid making changes + upstream to AbstractPreparer (which doesn't await the functions it wraps) + """ + + @functools.wraps(test_fn) + def run(test_class_instance, *args, **kwargs): + vault_client = kwargs.get("vault_client") + loop = asyncio.get_event_loop() + return loop.run_until_complete(test_fn(test_class_instance, vault_client)) + + return run + + async def _poll_until_no_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3): + """polling helper for live tests because some operations take an unpredictable amount of time to complete""" + + for name in resource_names: + for i in range(max_retries): + try: + # TODO: better for caller to apply args to fn; could also gather + await fn(name) + break + except expected_exception: + if i == max_retries - 1: + raise + if self.is_live: + await asyncio.sleep(retry_delay) + + async def _poll_until_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3): + """polling helper for live tests because some operations take an unpredictable amount of time to complete""" + + for name in resource_names: + for _ in range(max_retries): + try: + # TODO: better for caller to apply args to fn; could also gather + await fn(name) + if self.is_live: + await asyncio.sleep(retry_delay) + except expected_exception: + return + self.fail("expected exception {expected_exception} was not raised") \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_helpers.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_helpers.py new file mode 100644 index 000000000000..8acb3d5f646b --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_helpers.py @@ -0,0 +1,72 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import json + +try: + from unittest import mock +except ImportError: # python < 3.3 + import mock # type: ignore + + +class Request: + def __init__( + self, url=None, url_substring=None, method=None, required_headers={}, required_data={}, required_params={} + ): + self.method = method + self.url = url + self.url_substring = url_substring + self.required_headers = required_headers + self.required_data = required_data + self.required_params = required_params + + def assert_matches(self, request): + if self.url: + assert request.url.split("?")[0] == self.url + if self.url_substring: + assert self.url_substring in request.url + if self.method: + assert request.method == self.method + for param, expected_value in self.required_params.items(): + assert request.query.get(param) == expected_value + for header, expected_value in self.required_headers.items(): + assert request.headers.get(header) == expected_value + for field, expected_value in self.required_data.items(): + assert request.body.get(field) == expected_value + + +def mock_response(status_code=200, headers={}, json_payload=None): + response = mock.Mock(status_code=status_code, headers=headers) + if json_payload is not None: + response.text = lambda: json.dumps(json_payload) + response.headers["content-type"] = "application/json" + response.content_type = ["application/json"] + return response + + +def validating_transport(requests, responses): + if len(requests) != len(responses): + raise ValueError("each request must have one response") + + sessions = zip(requests, responses) + sessions = (s for s in sessions) # 2.7's zip returns a list, and nesting a generator doesn't break it for 3.x + + def validate_request(request, **kwargs): + expected_request, response = next(sessions) + expected_request.assert_matches(request) + return response + + return mock.Mock(send=validate_request) + + +try: + import asyncio + + def async_validating_transport(requests, responses): + sync_transport = validating_transport(requests, responses) + return mock.Mock(send=asyncio.coroutine(sync_transport.send)) + + +except ImportError: + pass diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_preparer.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_preparer.py new file mode 100644 index 000000000000..fb4f3d3ae6c2 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_preparer.py @@ -0,0 +1,151 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import time +import os + +try: + from unittest.mock import Mock +except ImportError: # python < 3.3 + from mock import Mock + +from azure.core.credentials import AccessToken +from azure.identity import EnvironmentCredential + +from azure.mgmt.keyvault import KeyVaultManagementClient +from azure.mgmt.keyvault.models import ( + SecretPermissions, + KeyPermissions, + CertificatePermissions, + StoragePermissions, + Permissions, + Sku, + SkuName, + AccessPolicyEntry, + VaultProperties, + VaultCreateOrUpdateParameters, +) +from azure_devtools.scenario_tests.exceptions import AzureTestError + +from devtools_testutils import AzureMgmtPreparer, ResourceGroupPreparer +from devtools_testutils.resource_testcase import RESOURCE_GROUP_PARAM + +from certificates_vault_client import VaultClient + + +DEFAULT_PERMISSIONS = Permissions( + keys=[perm.value for perm in KeyPermissions], + secrets=[perm.value for perm in SecretPermissions], + certificates=[perm.value for perm in CertificatePermissions], + storage=[perm.value for perm in StoragePermissions], +) +DEFAULT_SKU = SkuName.premium.value + + +class VaultClientPreparer(AzureMgmtPreparer): + def __init__( + self, + sku=None, + permissions=None, + enabled_for_deployment=True, + enabled_for_disk_encryption=True, + enabled_for_template_deployment=True, + enable_soft_delete=None, + name_prefix="vault", + location="westus", + parameter_name="vault_client", + resource_group_parameter_name=RESOURCE_GROUP_PARAM, + disable_recording=True, + playback_fake_resource=None, + client_kwargs=None, + ): + # incorporate a unicode integer representation of run identifier into key vault name for uniqueness + name_prefix += ''.join(str(ord(c)) for c in os.environ['RUN_IDENTIFIER'])[:10] + + super(VaultClientPreparer, self).__init__( + name_prefix, + 24, + disable_recording=disable_recording, + playback_fake_resource=playback_fake_resource, + client_kwargs=client_kwargs, + ) + self.sku = sku or DEFAULT_SKU + self.permissions = permissions or DEFAULT_PERMISSIONS + self.enabled_for_deployment = enabled_for_deployment + self.enabled_for_disk_encryption = enabled_for_disk_encryption + self.enabled_for_template_deployment = enabled_for_template_deployment + self.enable_soft_delete = enable_soft_delete + self.location = location + self.resource_group_parameter_name = resource_group_parameter_name + self.parameter_name = parameter_name + self.creds_parameter = "credentials" + self.parameter_name_for_location = "location" + + def _get_resource_group(self, **kwargs): + try: + return kwargs[self.resource_group_parameter_name] + except KeyError: + template = ( + "To create a key vault a resource group is required. Please add " + "decorator @{} in front of this storage account preparer." + ) + raise AzureTestError(template.format(ResourceGroupPreparer.__name__)) + + def create_resource(self, name, **kwargs): + if self.is_live: + # create a vault with the management client + group = self._get_resource_group(**kwargs).name + access_policies = [ + AccessPolicyEntry( + tenant_id=self.test_class_instance.settings.TENANT_ID, + object_id=self.test_class_instance.settings.CLIENT_OID, + permissions=self.permissions, + ) + ] + properties = VaultProperties( + tenant_id=self.test_class_instance.settings.TENANT_ID, + sku=Sku(name=self.sku), + access_policies=access_policies, + vault_uri=None, + enabled_for_deployment=self.enabled_for_deployment, + enabled_for_disk_encryption=self.enabled_for_disk_encryption, + enabled_for_template_deployment=self.enabled_for_template_deployment, + enable_soft_delete=self.enable_soft_delete, + enable_purge_protection=None, + ) + parameters = VaultCreateOrUpdateParameters(location=self.location, properties=properties) + + self.management_client = self.create_mgmt_client(KeyVaultManagementClient) + + # ARM may return not found at first even though the resource group has been created + retries = 4 + for i in range(retries): + try: + vault = self.management_client.vaults.create_or_update(group, name, parameters).result() + except Exception as ex: + if "ResourceGroupNotFound" not in str(ex) or i == retries - 1: + raise + time.sleep(3) + vault_uri = vault.properties.vault_uri + else: + # playback => we need only the uri used in the recording + vault_uri = "https://{}.vault.azure.net/".format(name) + + client = self.create_vault_client(vault_uri) + + return {self.parameter_name: client} + + def create_vault_client(self, vault_uri): + if self.is_live: + credential = EnvironmentCredential() + else: + credential = Mock(get_token=lambda _: AccessToken("fake-token", 0)) + return VaultClient(vault_uri, credential) + + def remove_resource(self, name, **kwargs): + if self.is_live: + group = self._get_resource_group(**kwargs).name + self.management_client.vaults.delete(group, name) + if self.enable_soft_delete: + self.management_client.vaults.purge_deleted(name, self.location).wait() diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_test_case.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_test_case.py new file mode 100644 index 000000000000..273e8540fdd3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_test_case.py @@ -0,0 +1,41 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import time + +from devtools_testutils import AzureMgmtTestCase + + +class KeyVaultTestCase(AzureMgmtTestCase): + def setUp(self): + self.list_test_size = 7 + super(KeyVaultTestCase, self).setUp() + + def tearDown(self): + super(KeyVaultTestCase, self).tearDown() + + def _poll_until_no_exception(self, fn, expected_exception, max_retries=20, retry_delay=3): + """polling helper for live tests because some operations take an unpredictable amount of time to complete""" + + for i in range(max_retries): + try: + return fn() + except expected_exception: + if i == max_retries - 1: + raise + if self.is_live: + time.sleep(retry_delay) + + def _poll_until_exception(self, fn, expected_exception, max_retries=20, retry_delay=3): + """polling helper for live tests because some operations take an unpredictable amount of time to complete""" + + for _ in range(max_retries): + try: + fn() + if self.is_live: + time.sleep(retry_delay) + except expected_exception: + return + + self.fail("expected exception {expected_exception} was not raised") \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client.py new file mode 100644 index 000000000000..c3a606776598 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client.py @@ -0,0 +1,33 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +try: + from typing import TYPE_CHECKING +except ImportError: + TYPE_CHECKING = False + +from azure.keyvault.certificates._shared import KeyVaultClientBase +from azure.keyvault.certificates import CertificateClient + +if TYPE_CHECKING: + # pylint:disable=unused-import + from azure.core.credentials import TokenCredential + from azure.core.pipeline.transport import HttpTransport + from typing import Any, Optional + + +class VaultClient(KeyVaultClientBase): + def __init__(self, vault_url, credential, transport=None, api_version=None, **kwargs): + # type: (str, TokenCredential, Optional[HttpTransport], Optional[str], **Any) -> None + super(VaultClient, self).__init__( + vault_url, credential, transport=transport, api_version=api_version, **kwargs + ) + self._certificates = CertificateClient(self.vault_url, credential, generated_client=self._client, **kwargs) + + @property + def certificates(self): + """ + :rtype: ~azure.keyvault.certificates.CertificateClient + """ + return self._certificates \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client_async.py b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client_async.py new file mode 100644 index 000000000000..58c4c4472c3c --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_vault_client_async.py @@ -0,0 +1,37 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from typing import Any, TYPE_CHECKING +from azure.core.pipeline.transport import HttpTransport + +from azure.keyvault.certificates.aio import CertificateClient +from azure.keyvault.certificates._shared import AsyncKeyVaultClientBase + +if TYPE_CHECKING: + try: + from azure.core.credentials import TokenCredential + except ImportError: + # TokenCredential is a typing_extensions.Protocol; we don't depend on that package + pass + +KEY_VAULT_SCOPE = "https://vault.azure.net/.default" + + +class VaultClient(AsyncKeyVaultClientBase): + def __init__( + self, + vault_url: str, + credential: "TokenCredential", + transport: HttpTransport = None, + api_version: str = None, + **kwargs: Any + ) -> None: + super(VaultClient, self).__init__( + vault_url, credential, transport=transport, api_version=api_version, **kwargs + ) + self._certificates = CertificateClient(self.vault_url, credential, generated_client=self._client, **kwargs) + + @property + def certificates(self): + return self._certificates \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_async_request_cancellation_and_deletion.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_async_request_cancellation_and_deletion.yaml new file mode 100644 index 000000000000..0963c8d359c5 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_async_request_cancellation_and_deletion.yaml @@ -0,0 +1,239 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:36 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuXdQCfMz7TZJf12Q2rT/1YSJMu6R+P9uu7iPIwWWtpFBctjrM+yD+20efGM025ErGB0kvppU8dowp1sA9DVFZdvbTlbkqWMhuc+D46nAu4IdNoHkaXxfEuVDa7BMTlQxFW+HbpXb3ktpZh9uMOEuSWUKH13zRwFG7tN3DXxb3ohK8mp6WVVqcvFwdmAX/J1KsWx0ULtl4D/2BUGmmxdedLJX+r4UJ30jGCjiKIEAgny+ec6hQPuyV0nJ+Dz8q2VyrJejUQw7a+R9UJZqaZnPaNAQO/zvCsV3B4Tkj1aJi1MxnNAstG1IZxcdPVi3ExXpLPabA+1mTDJBy8DkTb02QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKxoMvRA/+AmbaOrGD/0SdoUCwSPUfagIgb279MV6WwqxgoZK4E2qa69UG9GJN9WS0YdVj6MDBX89qNN7dcvJHcGFSN+yGdH9aeLvdhCsguB51LtJJaVFoS+J5tUW6W0hzg35Meg15/iMV9bo9k+NtNhXVnMjGLXowSm0HuKqqzHErLYdHMpWRFQ3lJVf7jTSABJS7uxubx9RlrLxTvLMgIbRCHJuIDBYsPHbyvZKlj2ZsAjfVcoTrBp6ht/huJW59/OUm6KhEuZZxXlwkwwZjFoXJMPC+h3Or/8GGV8Ar38o5zOveUUzYItxfLxWf+rzE7fg+eMJLM9keWZ9HdiSc8=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"68f9cb3739f940a497ebb70db267f75b"}'} + headers: + cache-control: [no-cache] + content-length: ['1357'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:37 GMT'] + expires: ['-1'] + location: ['https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0&request_id=68f9cb3739f940a497ebb70db267f75b'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: '{"cancellation_requested": true}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['32'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuXdQCfMz7TZJf12Q2rT/1YSJMu6R+P9uu7iPIwWWtpFBctjrM+yD+20efGM025ErGB0kvppU8dowp1sA9DVFZdvbTlbkqWMhuc+D46nAu4IdNoHkaXxfEuVDa7BMTlQxFW+HbpXb3ktpZh9uMOEuSWUKH13zRwFG7tN3DXxb3ohK8mp6WVVqcvFwdmAX/J1KsWx0ULtl4D/2BUGmmxdedLJX+r4UJ30jGCjiKIEAgny+ec6hQPuyV0nJ+Dz8q2VyrJejUQw7a+R9UJZqaZnPaNAQO/zvCsV3B4Tkj1aJi1MxnNAstG1IZxcdPVi3ExXpLPabA+1mTDJBy8DkTb02QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKxoMvRA/+AmbaOrGD/0SdoUCwSPUfagIgb279MV6WwqxgoZK4E2qa69UG9GJN9WS0YdVj6MDBX89qNN7dcvJHcGFSN+yGdH9aeLvdhCsguB51LtJJaVFoS+J5tUW6W0hzg35Meg15/iMV9bo9k+NtNhXVnMjGLXowSm0HuKqqzHErLYdHMpWRFQ3lJVf7jTSABJS7uxubx9RlrLxTvLMgIbRCHJuIDBYsPHbyvZKlj2ZsAjfVcoTrBp6ht/huJW59/OUm6KhEuZZxXlwkwwZjFoXJMPC+h3Or/8GGV8Ar38o5zOveUUzYItxfLxWf+rzE7fg+eMJLM9keWZ9HdiSc8=","cancellation_requested":true,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"68f9cb3739f940a497ebb70db267f75b"}'} + headers: + cache-control: [no-cache] + content-length: ['1356'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:39 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuXdQCfMz7TZJf12Q2rT/1YSJMu6R+P9uu7iPIwWWtpFBctjrM+yD+20efGM025ErGB0kvppU8dowp1sA9DVFZdvbTlbkqWMhuc+D46nAu4IdNoHkaXxfEuVDa7BMTlQxFW+HbpXb3ktpZh9uMOEuSWUKH13zRwFG7tN3DXxb3ohK8mp6WVVqcvFwdmAX/J1KsWx0ULtl4D/2BUGmmxdedLJX+r4UJ30jGCjiKIEAgny+ec6hQPuyV0nJ+Dz8q2VyrJejUQw7a+R9UJZqaZnPaNAQO/zvCsV3B4Tkj1aJi1MxnNAstG1IZxcdPVi3ExXpLPabA+1mTDJBy8DkTb02QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKxoMvRA/+AmbaOrGD/0SdoUCwSPUfagIgb279MV6WwqxgoZK4E2qa69UG9GJN9WS0YdVj6MDBX89qNN7dcvJHcGFSN+yGdH9aeLvdhCsguB51LtJJaVFoS+J5tUW6W0hzg35Meg15/iMV9bo9k+NtNhXVnMjGLXowSm0HuKqqzHErLYdHMpWRFQ3lJVf7jTSABJS7uxubx9RlrLxTvLMgIbRCHJuIDBYsPHbyvZKlj2ZsAjfVcoTrBp6ht/huJW59/OUm6KhEuZZxXlwkwwZjFoXJMPC+h3Or/8GGV8Ar38o5zOveUUzYItxfLxWf+rzE7fg+eMJLM9keWZ9HdiSc8=","cancellation_requested":true,"status":"cancelled","request_id":"68f9cb3739f940a497ebb70db267f75b"}'} + headers: + cache-control: [no-cache] + content-length: ['1191'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:48 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuXdQCfMz7TZJf12Q2rT/1YSJMu6R+P9uu7iPIwWWtpFBctjrM+yD+20efGM025ErGB0kvppU8dowp1sA9DVFZdvbTlbkqWMhuc+D46nAu4IdNoHkaXxfEuVDa7BMTlQxFW+HbpXb3ktpZh9uMOEuSWUKH13zRwFG7tN3DXxb3ohK8mp6WVVqcvFwdmAX/J1KsWx0ULtl4D/2BUGmmxdedLJX+r4UJ30jGCjiKIEAgny+ec6hQPuyV0nJ+Dz8q2VyrJejUQw7a+R9UJZqaZnPaNAQO/zvCsV3B4Tkj1aJi1MxnNAstG1IZxcdPVi3ExXpLPabA+1mTDJBy8DkTb02QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKxoMvRA/+AmbaOrGD/0SdoUCwSPUfagIgb279MV6WwqxgoZK4E2qa69UG9GJN9WS0YdVj6MDBX89qNN7dcvJHcGFSN+yGdH9aeLvdhCsguB51LtJJaVFoS+J5tUW6W0hzg35Meg15/iMV9bo9k+NtNhXVnMjGLXowSm0HuKqqzHErLYdHMpWRFQ3lJVf7jTSABJS7uxubx9RlrLxTvLMgIbRCHJuIDBYsPHbyvZKlj2ZsAjfVcoTrBp6ht/huJW59/OUm6KhEuZZxXlwkwwZjFoXJMPC+h3Or/8GGV8Ar38o5zOveUUzYItxfLxWf+rzE7fg+eMJLM9keWZ9HdiSc8=","cancellation_requested":true,"status":"cancelled","request_id":"68f9cb3739f940a497ebb70db267f75b"}'} + headers: + cache-control: [no-cache] + content-length: ['1191'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:53 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuuXdQCfMz7TZJf12Q2rT/1YSJMu6R+P9uu7iPIwWWtpFBctjrM+yD+20efGM025ErGB0kvppU8dowp1sA9DVFZdvbTlbkqWMhuc+D46nAu4IdNoHkaXxfEuVDa7BMTlQxFW+HbpXb3ktpZh9uMOEuSWUKH13zRwFG7tN3DXxb3ohK8mp6WVVqcvFwdmAX/J1KsWx0ULtl4D/2BUGmmxdedLJX+r4UJ30jGCjiKIEAgny+ec6hQPuyV0nJ+Dz8q2VyrJejUQw7a+R9UJZqaZnPaNAQO/zvCsV3B4Tkj1aJi1MxnNAstG1IZxcdPVi3ExXpLPabA+1mTDJBy8DkTb02QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKxoMvRA/+AmbaOrGD/0SdoUCwSPUfagIgb279MV6WwqxgoZK4E2qa69UG9GJN9WS0YdVj6MDBX89qNN7dcvJHcGFSN+yGdH9aeLvdhCsguB51LtJJaVFoS+J5tUW6W0hzg35Meg15/iMV9bo9k+NtNhXVnMjGLXowSm0HuKqqzHErLYdHMpWRFQ3lJVf7jTSABJS7uxubx9RlrLxTvLMgIbRCHJuIDBYsPHbyvZKlj2ZsAjfVcoTrBp6ht/huJW59/OUm6KhEuZZxXlwkwwZjFoXJMPC+h3Or/8GGV8Ar38o5zOveUUzYItxfLxWf+rzE7fg+eMJLM9keWZ9HdiSc8=","cancellation_requested":true,"status":"cancelled","request_id":"68f9cb3739f940a497ebb70db267f75b"}'} + headers: + cache-control: [no-cache] + content-length: ['1191'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:54 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"error":{"code":"PendingCertificateNotFound","message":"Pending + certificate not found: asyncCanceledDeletedCert"}}'} + headers: + cache-control: [no-cache] + content-length: ['115'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:54 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/0bf600da458d481c9cae04183cd4c1e2","attributes":{"enabled":false,"nbf":1567640977,"exp":1630799977,"created":1567641578,"updated":1567641578,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997e1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567641578,"updated":1567641578}}}'} + headers: + cache-control: [no-cache] + content-length: ['942'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:59:54 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_backup_restore.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_backup_restore.yaml new file mode 100644 index 000000000000..2364e733f01e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_backup_restore.yaml @@ -0,0 +1,243 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {}, "validity_months": + 24}, "lifetime_actions": [{"trigger": {"lifetime_percentage": 2}, "action": + {"action_type": "EmailContacts"}}], "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['375'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1OV0z4yLSrVQi7kpAB9VCuxtd1JvdtpsY2vJQr17r/mB8XSu3xwN0ASTPA25br0QJCJ8sSDdi9xcvdlkR2dJIp2NQzrTkK3vEgz5LizBM42IqdtRwz6avFfe7rH0c+FHUNEkte6L1UAOZ+ZmaiONlXO+B9BKAVjIwz/Obbm/FMNJL5aBQTP/uDTv3yQoRm+e/Vl+++BtonKzuZ+eXUq79WHk7PkGYyz7ByxYxsYFpcYg8qBavsX2FYBNQTR3G19VjgzrRHqgHmn9+0eOzchFL5/yI/yp0+hzQrdb0Pb2tN2uSG8m5Z8PtZzxeHGcHssGryZ1dRB5LB4Ad4avINa9XQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKZ1WODbQcoL1q3ALUvbLR3RxkrfM0AY5A9bgTVmuvnwJbjop2RXp/lHGRPgdP6llMMTh7CXlIfxb23jgTZn1UnleEZyudskvQVGigiHztExe8sg3Fz6lAmQEgs7QkWT7/AqEYDe1767EuzK7yvz8bUyqnja96HaizHBtdeUouUqRr5FUU6Dz0M0td4ENtJofwf+G76Y3nb3HZ88ksg6efbnUoF560uInJE5x9nOwL4/N1A1OUfrcmsYLI9pYV8HQDBRNYSLFdzCpUm7AJgchq26+nTPsySy65xFM9PYtlLK+CueWR44rlwQcL8zItvFUtSPFG8kFGLxp17wkJjfZeo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d96877fff2664cdfad57127b48fbf023"}'} + headers: + cache-control: [no-cache] + content-length: ['1305'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + location: ['https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0&request_id=d96877fff2664cdfad57127b48fbf023'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1OV0z4yLSrVQi7kpAB9VCuxtd1JvdtpsY2vJQr17r/mB8XSu3xwN0ASTPA25br0QJCJ8sSDdi9xcvdlkR2dJIp2NQzrTkK3vEgz5LizBM42IqdtRwz6avFfe7rH0c+FHUNEkte6L1UAOZ+ZmaiONlXO+B9BKAVjIwz/Obbm/FMNJL5aBQTP/uDTv3yQoRm+e/Vl+++BtonKzuZ+eXUq79WHk7PkGYyz7ByxYxsYFpcYg8qBavsX2FYBNQTR3G19VjgzrRHqgHmn9+0eOzchFL5/yI/yp0+hzQrdb0Pb2tN2uSG8m5Z8PtZzxeHGcHssGryZ1dRB5LB4Ad4avINa9XQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKZ1WODbQcoL1q3ALUvbLR3RxkrfM0AY5A9bgTVmuvnwJbjop2RXp/lHGRPgdP6llMMTh7CXlIfxb23jgTZn1UnleEZyudskvQVGigiHztExe8sg3Fz6lAmQEgs7QkWT7/AqEYDe1767EuzK7yvz8bUyqnja96HaizHBtdeUouUqRr5FUU6Dz0M0td4ENtJofwf+G76Y3nb3HZ88ksg6efbnUoF560uInJE5x9nOwL4/N1A1OUfrcmsYLI9pYV8HQDBRNYSLFdzCpUm7AJgchq26+nTPsySy65xFM9PYtlLK+CueWR44rlwQcL8zItvFUtSPFG8kFGLxp17wkJjfZeo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d96877fff2664cdfad57127b48fbf023"}'} + headers: + cache-control: [no-cache] + content-length: ['1305'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1OV0z4yLSrVQi7kpAB9VCuxtd1JvdtpsY2vJQr17r/mB8XSu3xwN0ASTPA25br0QJCJ8sSDdi9xcvdlkR2dJIp2NQzrTkK3vEgz5LizBM42IqdtRwz6avFfe7rH0c+FHUNEkte6L1UAOZ+ZmaiONlXO+B9BKAVjIwz/Obbm/FMNJL5aBQTP/uDTv3yQoRm+e/Vl+++BtonKzuZ+eXUq79WHk7PkGYyz7ByxYxsYFpcYg8qBavsX2FYBNQTR3G19VjgzrRHqgHmn9+0eOzchFL5/yI/yp0+hzQrdb0Pb2tN2uSG8m5Z8PtZzxeHGcHssGryZ1dRB5LB4Ad4avINa9XQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKZ1WODbQcoL1q3ALUvbLR3RxkrfM0AY5A9bgTVmuvnwJbjop2RXp/lHGRPgdP6llMMTh7CXlIfxb23jgTZn1UnleEZyudskvQVGigiHztExe8sg3Fz6lAmQEgs7QkWT7/AqEYDe1767EuzK7yvz8bUyqnja96HaizHBtdeUouUqRr5FUU6Dz0M0td4ENtJofwf+G76Y3nb3HZ88ksg6efbnUoF560uInJE5x9nOwL4/N1A1OUfrcmsYLI9pYV8HQDBRNYSLFdzCpUm7AJgchq26+nTPsySy65xFM9PYtlLK+CueWR44rlwQcL8zItvFUtSPFG8kFGLxp17wkJjfZeo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d96877fff2664cdfad57127b48fbf023"}'} + headers: + cache-control: [no-cache] + content-length: ['1305'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:27 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1OV0z4yLSrVQi7kpAB9VCuxtd1JvdtpsY2vJQr17r/mB8XSu3xwN0ASTPA25br0QJCJ8sSDdi9xcvdlkR2dJIp2NQzrTkK3vEgz5LizBM42IqdtRwz6avFfe7rH0c+FHUNEkte6L1UAOZ+ZmaiONlXO+B9BKAVjIwz/Obbm/FMNJL5aBQTP/uDTv3yQoRm+e/Vl+++BtonKzuZ+eXUq79WHk7PkGYyz7ByxYxsYFpcYg8qBavsX2FYBNQTR3G19VjgzrRHqgHmn9+0eOzchFL5/yI/yp0+hzQrdb0Pb2tN2uSG8m5Z8PtZzxeHGcHssGryZ1dRB5LB4Ad4avINa9XQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKZ1WODbQcoL1q3ALUvbLR3RxkrfM0AY5A9bgTVmuvnwJbjop2RXp/lHGRPgdP6llMMTh7CXlIfxb23jgTZn1UnleEZyudskvQVGigiHztExe8sg3Fz6lAmQEgs7QkWT7/AqEYDe1767EuzK7yvz8bUyqnja96HaizHBtdeUouUqRr5FUU6Dz0M0td4ENtJofwf+G76Y3nb3HZ88ksg6efbnUoF560uInJE5x9nOwL4/N1A1OUfrcmsYLI9pYV8HQDBRNYSLFdzCpUm7AJgchq26+nTPsySy65xFM9PYtlLK+CueWR44rlwQcL8zItvFUtSPFG8kFGLxp17wkJjfZeo=","cancellation_requested":false,"status":"completed","target":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a","request_id":"d96877fff2664cdfad57127b48fbf023"}'} + headers: + cache-control: [no-cache] + content-length: ['1225'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:37 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLkt3V28xNE55V3k0YURwczJVV2pKUjZ6U2VlQXZpRU9YUGdCZXp1RS0teWpIZFd1YS04bG5WVDA4T1NPeV9aWUN0MC03ZUpsbUxKcS0tYmlJRWIzR19zWmE2bFRZb3R6bGdEWkFrbGcyUmRSYUxSRTE1UmtCYmdNYTl3eE81UGJ5N19TNkNVMEdYM2l0X0xzR3JCSmZQSW8xMWpPelVoeDdncHJyakh3dXBncGhmTzl5by1HM2xGUDd2Wm1mUjNoVjF1R0hJTFlteldxc09Rb1I4T3FaX19XYkZkOFJNaG9iWlVuZlFsNkMxQm43alBfTlBFcUpHeHg4bDdMRWNMa1ZXWlZMRUkzRWNvQ0ZzRjFXck5Tdjh0YlBvb1lpeHhfRlVnS1ZCMnlaMXA5bWk4X3h3TlhsSEdOeEpFZ3d3V2Rxb3luMUFyUVh1eXl4VEZSYy1Vd3VNZy51VTQxdk03NVZ1c1E2ZmlYRTgtSFpnLkFjUExXSDdhSHhoZkpWQ05IWUhhNEZadkxRemxIdktGc0xLeW9TaWRtUGZTaS0yQVdGX1RGV0daZmVWTi0yeHlSZlJYazdXR1VkYlNTZWx2c2l3U0YzZmdqTGJBeU01M0VwSFZyVWhnalJjRzdQeEZaVEhTVldybFFkRTZSZWE1STdKNDYwcDk0SUNSaHFkRWt4Mlk0cm1GcFVWck0taXVKaGpWSkF2cjNCX1FrbGxKaFhpWk4xVldsVnVrSWVVOWNfZ2hvVEpxeDVUcThSN2hWOFVfNmVfeDJKRm5nLWMxalg4NWgxS2ZmQnpEbW1CNmZjUWw3ZE9XRnV3MGxKMWpnNWZRMm9xRGxIaDlvTFh3ZS1QbDRnVGhCTVc3RUEydXpJX2lQUUFaVlhDM0xtei1YdWxEZjN4d19ieFVMc3VJM0RhTUptdWdsWlltbTNSYy0xbl9HV0hvV3VybjRfTThweUd5LWRWeFcwUDJqQUVyUXZ6cUo2b0NFcF9mc05UelZkcTUxaWRxa3pkSGtIdGkyZFFDd3FoclZLWWxtN0FRTnM4elZfQlFycnRSNjdSVVNjWExqSlJ4TUhHTEpteFh4QkRnLU1oM01ua1VGUjl5XzRMWG0tcGpwbnhYYTI1QWtpWmJuUFY5QWtnclhoMlI4SzUyMDRzQmhMaUdheUpiOHJpTC01VUVkZVdoQUQyUlk0cGd3cFI5TEhBdmlNVk8yMjQ2SFU3SHY4MHk1a2M3Q2VKN05BR2ctWG0ybXJob0NYSXFoR1NzampUNm1Pa3VMV000cVIxTm9zM0NOeVJSZ3lwdDc5dzV0dmtmNWhPRThaMnlUYmNURHlWUGpPRHJIMnFaMmFqQmNwcnNTZHQ1UzBLWURQLWw0R0ZMMldTR0dLdzEtNWNIRDkxSHRZdTMyODFtUWVhOXM3a0paaEpXaWE1OUFFYURDeE5IVDFNUWY5LUJ0S1VuU0tLZjBOc3JoVlgxSUhERnBaOXRWMzU0U0lUU0tubXZQRlJSbUdyZDdIdjRVb0g5SUJSbS1VNnJvZ2RtRXZPdjdqZlFMcUljRkl4dnVPaWtZSXhyVG4tM1IzOEF0SjdEOVU0Vi1CRTNGS0N3WUgyQkx5NkFuY2VvUmpJLVNYWEhsUEM5RXdycW5maW93MjluNVNmTzAzSUJKX0hiRExTOTczMjc2SUZEMFFoQkllbFk5WjUzeElsa1gtTkhxcHBzdzRWSERGQ0RPaHFWOFRJSVhGVFBzM0FQYlZmZW5kLUlJRFVZbUF1R1RjSXM0bWJ4VXY5eE5wY3U2NWR6eUlHN3BIX0dtMVVQSGFWeHhJcGpmQmlCMHZ6WE51UFhfMnhLLTRVT0tUVGxlVFA4WEFzZEIzSHg3U19fOFc5OHNoNGkxS1JWWWd5TS1sV3FkOUlOa0dWMDE2bFVtdmpyVnQ5cTFSV29CTmVXRE5JbGVPZ0k1S0Y0aGhJMDUxWndhV2xiRnhLVkdnZl9ieEUxb3FiVU9TYkh6QV8zV3pLWW83MWhVWkJOZTZubjJ5UjJITzZuS3o4ajcyTHJham10OHBUb01LOThta1VqSmtxWXhHVWhsckREeDBKS1Z0ZHQ0dEdIQU5wTXZCajA1Sk1WSE0yZ0FoOUZwRjB3cWpGZjJLdjNkcVRCRm5PWXZhLVZfcnZzS2RSNDhkWlVCZnM4bVFENUxQMmRIRS15NUFocTdrY2JUU0VsbFB0T1lpWHVoVmlUQnZVSHk1QmJoQndRdWpzUklGd091VHlMWmw1Z1FfYndHY1dBTlZ3allDR1otRlJPMHRjMXNfSXVVUWRzcUxMcVFkdDRBRUNqdEZYME4zaEw2TlpJTUJLRTZYQUhLNFYyQ1NWeGZjYXcyLUwyTVE0UV9kTHAyUG1uZ1c0TkZiblBxT3ZPemlTUlFDTUZyLXY3cjR1ZHlnbWNETWt2dVZrSVE2Nkc5eDBqZ3hEeVNIMFJyN3VMWHNVVW1MS0hkVmx4SXBaWjEzd0Y5WTJwSVVEMnpGTkF4Mk95bFJLTmJKd1VGWmxoU3ZMWGl4VWpLUk83dkREWFFCNThGNFpkMV9xVm5lb3ptVWhGM0JCdkNjeDE0YXE4NUNPYnR4c0t0blN0WDlJR1ZPUWwyNTBpb1ZKOFFHMEhjY3k3c3RZNFZYeUZFaUNpSTdta0RKZi1rMWpaS01mZGo3TFQyTUpCU3ZRWVBLci1kRm13RzdnTU1rUUlWbHVSV1RYNEU4eF9WY1NJWmhwWmlCbnBSX08yUXVJWnBWdUM3YVUtRHhQd0VNQzAyanVzYkd0eVU5VjIyU1cwTVJPN0RKcU1QOWEyWDNUS2pjNUhobFpGRkY3aHpGdFFXVU5ncnhzUTVLOHUzTmR4V3pocGJ6SjdLNFc4SnJFVUhLYlZUcGxEZ3lwMU1qa1lPc0pwdFNEaUozc3J4dWg4aElLbTJnSFpoMmZ2MkllZFA0c084OURRNENHQjVhNVNMVmlUM1hObzUtV0RabEVMbHNhZHd1Sy16Q0w5OXhlQXppWkpzRTV2cS1ucVdUTU00cUVGSGprZUUzOV9aNm94TE13Y0JlMmIta3NGcE14NWdENHkxWTV4QTNZWGRNQVMtbTZiaGM2QmJNaFFSdG5WYV9ZU2M5Z0NYYnhDb21hY3pmY1djYk9Kd1JxN1pfX1U5b1JyeERndndIY2NfYWVmZzR2QzY2ZmlDekFhR0NjcndlN0d5bDZOMG5ZTWttYVFMbHhBZWdoeVJ4dDBnZ3FTelZKUm1aTkR2NjNDTXBsNDJMa3BzNmRiNzJsdWRwQWJNS0FYSEx4OVY1UlVGZzYzMkRkQmdDSVF6UEdTNjc2aUJNbUtlajV0ZEhHcHktTHdUZlBBYm9oS0l1X1NnMklTdFRWd3BsNTMybVh5dF9QZ2hFc3ZIQl92RFZtWENHeWxTMjJhRkpUWVBjWHg2QWNKM0ozNG9FbE1WUzRKUFRwRTlkS1VLQ0RVUUtXV0RCUE9DWFVMSUNLVnJyQUFreVpPMW1yaFhGb0pLR2xzdHh5LURnUWsyUzdJcFZNWnBQWkoxNUJybVZldlhaV3lXaVBfSUJfZ0RvdUFrb1FnZURBSTRFbHBhNVBQNl9pTnVpMXJvOGlTbjlwLUZVMzJSTW5BamdYREE3cFBSdFItTVcxOEZZc0VXckZFdlNsOWZZMG5rYlJxN2xFcjd2aTNsSTRVU2FKYlRRSUFjdGM3TzBfOF9nWFR1YlVFZjBSbDMteXhTcXJRcVRNYlVYWDlJbmJnMzc5bG1vd2xHUVE0ODBoTGVsclhuZXF1d0RQUEFmeFJqQVlLMnlrdk9saEpfMF9Wdy16dFFhNDhZRXpvRkFBTV9HbkdmYjM0Wkh0di1rQlJqZkZXaTdJZlFvdU9NeFZWZU91anBaODROemY5bHhTaTkzMWNMX3NwMzhqa1lzTHh5SmFXdUJrdzMtcm95N2wybWJHZDVRRGlKR3FhRlY0VXJDa3o1dFB0M0pPbUFkX3JaSVNXMllTR3hhS0VTQnJSUEI3TXV2b2VKbVlpNGYwaHNPb0IwMmFmUHFjMWlXYW5GOW9fblM2MTVyb2dYdktjRURqWWJEMUZiMUYwMmR6QlVWZXg0MmZYeXhySXNoMXNoUi1KX29sdVBNc1Z4UllhZkR1Nk9DSG02RG5VTEl3NDR1dm9sR3lhVFJCX2hDb1BJcnZTZTZqYXM4MHFQYndMbUhrcjY3YmM4MmF2MUtpUzFZZmt6aDFBU1hBUmFmNWVvUHlFSGlXZ3BKWDVJLXMyUXp1WkZISTlJUmhtbVJ6QTBza3kwejJCZDk3bF9lakUtYlBMNzhWN2ZQVkRiVm52d0w1Q3RnRWwtaVRyV0U1U2QxQzRNNkxNb0hTT2tGd09iTUlEeE9tNE5VcndqcE5HVTNDTnU5ck1WZHdpT3JJdjNkMldhVFpSSDN2UEJkQ1dyVWJkM3ZUeE5NRzBGUEhfNzh1SGp2ZEhTR2Q4NWFXSU5iSXpQc2hVb1JEZlpTdHhOb2ZGWGQ4WWhMZGlSV0pmS0lHUEUtcFFqV2h0UWhvMkU4dkJsd1FRQ0xKMFlkRTJNeVdyZWFmaWRrMkxFWXhDMXFQRmFwSk1mVXBwd1YyRHpncEQ4YXRaNGZRNmpPeGZPOW05aVYtelN2MTBRRW9hTTB5ZmNpdVc1NWN5VTRQejQ5RjMwVEJEMllwWVBycXk1cTdMU0M5OTczbXdQUU8tdElLZzJDSklKajZCamU2TjF3Q0RVMlByc1c2ckY0aXhEdW5NSS1xekhzZUJxMGg2WVNna2tQRzVlbGZXUmxubkpnZlh1NlByYmtlQ1pZMVVDZmJvdFNsTUl3bnVxZHhjTkhZV1dOS0lMVWhSWjF2eDNwaVFSdUZpbHdzT3g0YjNTWnJqWHZUVlZLYWIybDVjYThLdUhJWWtHZWpFRVVRLThRSkFRYWx2eEY2SFJDNnNLZmR3M1lpR05mazZEcWJyWkIxOWUtWGpBTkg1TWF3VkRRcktGWW5CVXpuNERxeFpJMThNT3V3YXZuN3EzcEhrZm8xMDZSRnBBQW1rRnQ1V1dFeXU3Njl3Y1h1b3ZBaWRsUmx6U3pHY2YwYnY3Zng4RkNKeXlnM19oTFZjSTdJb0djSGtaRi1ITzRuOFRRc0hib09oSUFjdzBfUi1kREZQLUFSaVU1RUlQMWl3bElNNDBGSHl6ZWdpVTF1M0xzcVRzdDBVVWdaRGVLZi1NUEdieW5yeTdwY3hkWGxwQUNiVFdWVy1HX2l1bm9wSngxTjJ2Rl9xMVpZampKQWlYTWxyeWVFaG5YaWJpYk12cGpwcmVaTVYwalFnRV9pajFnMVJRWFZCNnRWeXFUNjZhckd3WHBBbXdmNWtXREFOa3NockR0LU9mNXRYaE9SS2dLajBzZllocm9fRkpiSkhRUG90Sl90a0Z2VnpMSlpjUWJ3NlZ3R01LTHBRZTd4TURTTGlodTRwakVzN1FqNkFnRU15aUI3SzNWbGx2aFZKR2tDWnNmRWlNTmFfSjlEdWs1dDZ1UTMyMTFNYV92SmNmb0YwNmh1c1dpX2JUUU1JWllOeUdvNlRaUXBQTk5rTGRsUk1MZ1lrbUEwcHcxZEk1Z3VsUDJkdjlZRjU1T2U0RFh5Y1pkMWtLVzNkVEZmMTl4MTU2b1NfRzN5bU1MQmVibWM2M0owRE1PVkFqRndMY29RcXktdHN5MHpyM0FfelBQd0ZCXzhSMWJKanlzekxPQ0puNDBzNFBhZUlUU1JsNmI3cjFPeWQteUYtRmNUNzZ0QnFURlpaRlR3NEREcFE2V3ZFSi1LX2FJVWRjY2JrUWhrNWFDVFlmdlBmZ0I0SXZicVliRVdEZ2dHdVRQbEFDZnVfUEJXckoybEJ0aktHOUZyVWFrbUp6X2ZScXdlT0tlNUh5M3JzMWpxWHJhUTI2YzJjSDlyVmFweF9MR01XZWdwdEN6RjNsTlVyaDgyTkg3SHFzc25mTldDU084bFQ0TWVBOTVIX1BfdnRYRFgwaTJpd1Z2RllPMHJ0VlZMdzBmVDJpNDZLR0FHR3Y4bjM5Q2hJTV9GcnpjLTBOSmVGVEwwQTVybS1hYklqSlgtME1vNVBiVjdrcjZJVTYzUU16MVUxOTJaNHFSRU1OYTNtckNzaG1LLTRJYTlfQ2lVWG14RWxzNlhuYVNZb01EeklZcDI0blFrYk13X0Q3TUdRTHdTZUNaOS1LdHlWbzg0MEZHeE8zUDBia3NRRmw5Wjk5a2w1T0VjbGhISFFTcUlOUXhFZFA5d2s5MFRDb2lQSk96UmQ2RkQzbC1wMEp4NEZ0MnU1bWR0WWJscWZteXZjRnd4R1Q4SlNPZF90akU3d0xlMmdncllpQXV2djRGb2hzdkVQb2JBQ0ZuRG1UaVhNNk9vNWJ6S2xqT3d5dlhlQzJaTTRaU1E2VjVGNXhtVHNHVS1KdzcxRmwtblRGQS13Yl91U194TGFCTWxvaHZoX01LOGNqX2JYUTJsdjNWRmp0YTlsRzFOUi1NVUk2QW8zZGpxVWtiSnFWbnVqWFE4STFzZEtpU2haaWhTOXZPZUtoMDNMMEFCQkwxRm5mT3VjZ0hCdmxRVEUxTWd3ZVQtMElzTWdIX2N3QWl5b2MzRHhrYmNWVUJ4V0FqZk1zN3JuYmxCV2ZCNEc3RXlzOVZzLTlULTA1Qkp6c01Zb25OZ0VVRjRVMzZzTVV3bnZ0LV90SU1tN01PaVRTTEdJUldUU3ctWm1ad0FpRlJSTEx3d2dFOEc3WndsNWRVbXRTbmR2Rzg1RjZFc2JoREZPQW91WDI0REp4Vi1ZOHZiX1c5eEJWUERkVHIxUnVuOC02bFZnaTRJOU1QVEhUWlZXaDh0Wi02dEFmang5T2JIU3BJaVBCQVRqdmNzOFNhNHFDaGNveWFpcmVsYm44c1ZoeUE5Q1hIRTljSzhwQTR0UWxZM3JfTU1NNVFSOXBjbE1zOFVjMWg5d0c4eFoyQjNLWjdSYWFzdm5WQUZHS3ZUVG5MVm1tYlA3YTlWOTFfcmVOc2ZydHNPbTllMkFaWHY4dlRMNFY1RmU3U1hyanNaNTIzWUR0YXBsTzhvV1RWblMwdzVubEozUEZ0TVRjQktmVXhHNlc4NFh1cGVjam16LTlnYXVVUHdXV0NlMXlSaFpnaXRoRHlZWGFYYUhLdFBEa1pjQ2x0Q3dWTXM5RFg0X2E5ZWZCRkNQQ2ltWGJ6Uzl3OXIwSnRMXzBLTTVxNE5uOFhIU3NWQkE3dWltYjUxYTMzVUVnQ3JpTDQtYU96WGNEVDZwTkh1VlZWaEVJOTJ6QWtCcVZsenlyaHRKd1YwVzZSQlB5VVozNmFzS1dkM2FqQUNrLVM0NTkzQzQ4dkV3TzV5ZjJpWjJXSzIxYnkySW5GNHhCWDVtOHdzZE1YN3VkQU11TnJId0VhQjJpMmFjbjRJS3drcXkwd0p0cjBIbHBzVGVlLVJYYmJkMm1KQ0pHSzVNbGFWOW94ZVFncEdPVlhsRWtmYzVsMUFRY0Jkak82VnRaNi1LeTFoWDZpS29jbzhrWDBhbEY1RUNDa1N5ZXZyaGh6M01YQzBqZlBLM2JoYVFZQkpFakw4RDJuQW9wY0F3NHdZcjJLZGJwbmx5dW56cV9MZS0yU3lJYnA4OHVXVHA1RkR0NHVFRU8tOWJVN1ExeDh1VjJZcEQ4V1J2WEhGVnRZSXowb2JOUndSSFBSWlpaRVpmZmpITTBCVXdfb2JPRWhCcFk0RlpkeVM1UE9rUndPQUZoZlBQbEpaQkt0c1YxUlhvb2pHa0w2dUd5QWhXN0FVNW1PYVVUZGJsYXVtZTh5SS12WDhxYk81a1psUXFzbXlrRGZMOGlwZEFkdjNLMTk1TVdKc1c1TmVwMko1ZGU4QXFScUlvTmNXaGVybTZabW9SWnNRRElhMnJ6MUhDcFRtQV9abEtGZUQ2UXNYNG1reERZOVdWNXdXUnhZdmhVS1FvUXNLR0JvY0RPOHNZRzlyM2xDODJDUHhQbnVmcTBCd1VfdGJ3Ykp0cVRGQ1A1eERWWklDWDZNRWZQQXpzV0hGZ1J1dDg1OTNlTlE2Q3BpSzN1eWJJZ1JOYWVZaURqMHM3eEVfQ2prcG9BQjFFOGJfdE40bnBMeHhWOGlSTmZETkZYal9BOUNEX0hRMmhfUktJNXQ1OGJGODBVR0JtbUhxZTZUSl9HdVZKRHA0UExEMld4a3B1WFIzX0pVT0luWnlrS25OcEFaODhpcTljUEVRVWZsREtiMkhIRzIxcWFOZm9vN3BkWXZNT1ZzQzZnQjBROS1WM3RMTGZmeTEzQWxTakY2UEQ2bEdUS1UyYVlpZV85NF9oVWpLbng0OUxrbXBNTUFSQ3I1XzJ4NnFxNFdSLVBLemlSdWhsV29kWm5BQjFFVFR0U0pGM0FGV3ZzSFc0UEtQY3JjMDNKVHBzRmNqN092d1JqblFmTVpFdWlJaFdwZGYtZXg2TG5UQWw4SUpHV0p2M0M5cWlCR0hJRjdkcVlub0hVbXNJM0h2R0ZnMDdZeHRHTk05cnh5SHhVVzF3cGNjck9oSWloR1JuLXpJQzhrQUoya1BhMkJfZFdZZTFzazVESXpmVDk2b2h4Rks2enBkdl9LZnZrYWNqSjM3clRjY2NaWWxiSWw5YUtzYlhXQjVzZHkyTlNnRzltS1VtNzVCc2puUEJuTnAwRUJkRVhKTUhidlMxc1k0SVEyUVpTX1c0QkQ3NjZ4YWlXQjhUUW1LNlE5VHh1VTMxQzNaVXNBWHBtc2p6X2NObWRNa0dZb19OVm1Od09seUtNNmdzQUxNZGV2c0twNmMtUkFtTTc4Wmp2MUx2VGV2MUFHZW5Yd3M1WUxaOE81RWFVbm5vUWNoakRQN2tiSVRSWkc2eW5adEljc3dBSjJ6eHNwWThkdmZ0c3BoTFlEbVJNcnZ1Snp4MklhZk82cXBxWlNQVkp5dnJaOEJub3praFQ4WlUwNGpMdllySkwwZ0poYk1LYUt3SmFiaUhKMko1RmU2S0pPVTNyX19aZE43UWJEelp1aVFaUlJ4dXFwbTQ3cTQ0N1Y1YUZadlZZeWJ3TE91MlA4RnVROUQxQUlaSXRpRlJoOV9uRWdOSWdDcGpHUzR2M2YyT2M3ME9rcElRbnptZDhzMWhvVmdnNDZEMC1lWXZhTTV3SjhxdTNVb1Z6b2pvVFZ6U0FjYlNjTUIwNWhOMUFnWDk3S2ttQWtBRWh5NXhITnMwQVphRUFkenN4S1p2cmNwQ1pTYURrcExyTzJUNVdLTV92aVVERUQtODdodWpuSDdQVERaTS1pdl9jbjBuQWZoTWNYVTcyMkJ6VHhKdW1nWWtmM1NudlhBSWgwUmpiSUFhV1VjMW5uTGhLcF9xem1MZzVkUEVZeVRmMGxQOXdnSG9lUG1RZXRfNDNkTG85dnhKQm9neU9DUHUySkoySVQyZjBUS0d2ZE5kOXpxYTJveU5HYVhvb1dQR2d5ekNlLUJ5V05EbTBucS1zdUZScmNOYmR6U2JMZlAwb3V6M2FFdWZwODkya1hsVmRQNjlyU3FMZlR3ZzdjcnQ4Qk9abGs0V1lDcGozUWxuLUVoZTdLV1dyc09tRUs4cExKblE1YV9Jbk1UMkhtYzRwNUNFbkFfQnAyaDRtdTZYUnFYR1haY184Ynh2OU9yOFdXVGlkU25EWlRfLXZrcmdBYlI0ZzNRa3U1WjFreEpMU21ZUjhJZkJyTUFSTldBbmxmSDhDZDBtaTcwUWpmVC1KTXVHSkRxQmkzenQ3Q3FNel9LcFhjcjBIMGxhRXhwN3pJOXRJcjlaekNKUXlLN0VUTklULVJ6Q0V5X3hneUVYTWxJS0x5UVA1REJCSXZaRHlzWFhkc1p0OHppb2dGenNNUko0R2tMOEF3bE1nY081bGlITnp0U3dFN3dEYnppTmN5d3g4Vl9JenJ4N0tGb05rZS1ZakxiSDdjdUg1NzZyUDhPdUVITURHWE5DVXNVYXZ1M2xJNkExUGl3c19JQjBkVlpIMHd5Znp2ZHVWWlJyQjlodE1uMnRrV1dtVjhUMnVTaU5UOEFaU1pQTC1DaEZPNFh6MG5zZ2J2SlQtOF83ejVhT2FSdkx1RkdZc1F6cEJ4M01vb0FZTGg4c1lHaW40MkZoRkVYeXRUUUdIZW9rSDNMZkc0YzNHX09RRXRORGd3c2w3SGtrNjEzNEV4dGdFVEY1QUNtbHVaNUk4UHZEdjJZdV9iZ3ZIYXgxREEzOFFOZ1UyVWxPM0dlLUdaRUQwZ1BGLU0wejNaemhjUXFEdHNkNUtyWXdGeW9xY1FuWXBYQVFnY3NwWFZ1WkxZaEdaQTBnQWFIaUFjcTljV3lLLWhZSHlFdnFjRmw3eTJDQ3d1bllObV9tWk9OV3pxUlFwZURndF9KYkJvejlxVDY2aWR5NU4wMDVTSDcyQkpwa2pOeWFOODVhb2ROdmt3NTlRWlJQOFA1Z0c4RzJlbm92NG5sS2RqWnEyX1Zid3djYXN3VzZJT0JtVk5yTnVyWmVaQWV3cmZkMUhNTldQV0hQOVZNbjFKZXhXS1FtUXUyZm90eFc0NHMzMVFGSV9FdWxwT2JlLXNVUHpkVGlQVG1QY3k4MnFGTWNBNGhGNzU2TklQUXVGa0xkb0NfdTVrd0NVNWZIcWI3MnAxUE16NFh4VUM1QlctbjBlSTRla0llM2NULVRLRjBDQVVaRk5QWlpuQU5hYkptRkNtT1hIdzI5dnBPZUhoMGJZQXBCUEp4TmgzSW9CYlhibFNpclVLbEtIajh0OUVNTVNILXl2UVR2N0JtSVdISFhGd0ktUWpQRWwwU3FRa1JMaWI4QmYwMFUzTFBLNGxrRTRmZl9lTEFxRVFyTDE4czJOSmotMFlaMEYxTExTcTJ0TTg2ZHFCbVdkZ2hQem9qWm0wTGoyam9pWDlnRnppVnN2cXVVWC1pZ3VpcEtCTExFeG1hYXo1YkdYNjdKUUxRaWlEaVNrTUFNY0Q2OWtEcFVwaUQtRGpWSmNWYWtpX2l5Uzh0bG9kTXZDdXRWeUkyZUhPNDJOQk1zYzVQR1cxNkVsQ1dmdVE3NVNxWGJjZFh3TWxhczNGT2w3d2RHYXVCVmlUMkN2VUR1UXBKb0xYUURHc25YV1Nnb1NXTnBIUld0THc2eUttTmpkd05Ka0NybndEM3FwOEJpRDBhbXZzMmRRTTFUYnpWMmExMDJfeXJKUFJoc25oM0g4OVVId2V0R0RUeDB6OHhWR3VLeWJ5TEp1SGJQVGZucmVBM192WVlac0Z2RjFMNTMzOXdHaUhtVUJabTZ5b1EybjJFeUF1MWQwQkJ2TDZzMGRkbkp4dGVNU0ZYOGhzUlVrU21ObWNFVnhMWDNiTlMwbzBFRFBINnBiMlY4WkprNTZrcTFodDlodU9DSVpDUWJtcGgxZy14SnBaZWZBLUNjMzdzLW9RUXBjd1hfanV1TVcxVk5RRUhkdFFORGJuYWF4MmFuTk9vZzlOb2NVSlZ2ODRKbGxXZTI2eUpQQmNMd0tEdm5TaVp5b0FZNUlyN3pvblViNmNkYlBscHdQcnhZakp2dUtrZGxSRndZLUJxR1E4ZTVlQWV4emF4ajlCUFJCclYzc01DWnhoNm5iLTZZcVpkMjdlNWRrUTJYSmNpbVhUMjlvclZ6Y1NhRUo3VHR3TmFBTnN0RVJRV3RJaDhhdXR3NTV6VFMzdHY5bHhzYnBXVWd2X1IwVlNhWXp3RldZT0l5bG1FMWJVbzd6bV9EZ2lVTWVPMzhZd196aHQxT1NVN1czaS1QUzNOODJaNlc2ZUhEbWZLX1Z6N3pqSS1MOTZOUlhCdVZaQm1DN2hxazVpMVpQT0hZcEhmT1QyVGh0VWdKc2JBREFKbVFjbDkzcVdxbGxqa294Tm1TeEJlb0dwNjVGNnhnZVdXaEFrcWMtcDljRWU5Y1JnaHlsWkxodk05allic01BSG5VdGxibk9sNVI4LTVXZHZObEFpNmlNdUtPQTZzWVB2RXpNaDNldnJ0cTVjekRjenBGZlpKbngwSE00UzVTdkx3aTE5NFVENTRhOFRsNl9JQ0lWd0NtdTNRdGlkOS16OERSNHA2WjRkX0todHV3MlVha3lKUnVCV0VBaFBvWndnWnlfbm56djhfTVI2N1dEaXpuWF9Rd0RySnlSNFNPV3RhdU9PbEpvdHZHVnJsUlNDTzFXY2cyUlgyRDNOak9TSHlpa2QtSy1hcjNXOWJJSTZRRGtnX1hJSUtBaHNNb0RJbzR6VTBLdXlmNmVkdjFzd3M2ZndNRE9SVkJqT0htYTAyZllhbEcwT3ktWTBDb19fUWE0OHBpaUpDLUQ5QmZrS0o1RlIxa01yWTZzcFlnY3dDcUVYaFpaZEVHRUVVczVqcGhPY2lZVlA2TTRabzZLQVFwcWxKdWwtOS1xaHc2QW9DMXhPWV94R0NDTzFQaHVvdUpSc1BIVnZ1dm01WENSeUZUMThtclIxeEhrUzk4ZmQ5a1JDNVhZUzJZQUxGMnIyUnRtVmhzZ2dYV0ZaTU16bldBZ0NZQXhSVG9ZSFQwMjIxMEo5dTNpWEwxd2U1VTlqeGJqVlNPU0lpYXVMSl9lOFpuaEVwY3k2akVzRHlwRk1FUmJKNnBVZ1RENU5XM0FuUnM0SlBWYnpxVkw1YTNsMjQ4TEM3S0NxRUdHVGZFNnBGSHlMYnJhMnRnempzLThtaVdYdUdNaWRlZm9UMW9fRWV1QnZfSmkybmJKbnpQNFdmeXZhWnpkTUVUdGh1TkhHM0xFQktzNmZLN0d1RDB1cXJsdjhISTRKZHlJc295WXp5TFp4UUNXbFFxbmdoVUxNaVYxdEVLeEptLUU0d21BS2s3alFnd2dkdkhSM3QtXzNZQ05jYWVVWTBhZlVWd0tRaDZ5cUd0Z1RZX0VKMDVNcFk0V191MWZtM1VRRXlEUzVVS2F5aFlURTNadkxoOXhOOEN5bkhtaEV5WUdIOWYyTHFYMEhCZFNOYkp1OFh1T1JaUVBMLXUzVVdfeGlMR2xlekw0Uko5Z3ZleVlZQVdoRUJrTU5mMF9FLWVUQ1RISW04dENZQmdfc3dHcW1YMnoxM2Z0cDF5UG0wRzA3djBSUUZHem5DX05SNlBzLWZOWnBfRXdZMlFreGtYdWtPNHN5T3JxeHVNV1FndEl4ZlEzZExXVEUzWnRQWm1EaXNEQV9BalU0SzBmQzJmZ1dqTTJvdFlxUlgxaW1OQmpIbXRlSHpLQkNPY0E5a01Dc0lSaFgxb2s5RmduUmFqdkg5MTg3RmE4b2duMDdfTmNxdTNxcmVZLVViM0o1aDZSelJ6bU1KQ3ctNkdWMjZlcUp2ajFVdU4zcHZoYjZhVG5GenVRVG16ZXlhQlBPODMyeG9NdEFjelpZQW1URU04ekdYS0t3R0w5RXhwUWEtSFE4d2VsOHN2dWlBdkpYeUE3LUUtSWxPS3RBQThmMGxVWnZ6Q3N1S2JfWG1DLXlrSGVSYzByMjdBMEIxT3RDelVEUEtMV2I3dkVjSXFZT2FWdVY5Tnlqa016VHVSc1cwYlJjX1RwTS14dElsTVBqVDhBc1pmZmpXNVpsamxvcHFIbmI0NjlONkxvVWhFN0NCLWQwVE1NQ3k1SmhNSWxqQ0JtMy1qNFNSblJDWTdYN2dxU2UxVDI1QXZ4ME9PbGVfZXJYWHFyVFU1QmF1Wk9nNW1zOUYtUTFuNGZfLThvOXZLNzVhSHBZX3hPTVIxOWV3alNSMlgxdlJYNlQwSFZORXpsU0F2M1NyMzJod2MySTlMUElmeFplRkc1NFhzbmhRUGI4cmgtckxpNmVETHd3YlY1Smozb1N0VVNYOHViTFc3Nkhqb1RLMDU4MmQ1dVFlS0loZmdkSUc4OXgxbFR1WUcxdmZ3Tko0U0g1dTQ3R0MwYTlLTXFEekt2S3AwaU4zUTZzbFZTWW11QUFScXM5SnhSWGw1UXdfQS1uSUNNMFI2blVKc2V6MkhhVk0wd3FHTDItLXBlQmJTSzJ6Y2xEWXZGZjNpRXBoTHJaOHhzX1p6OHg3Q3B5cEVVbmRDMEUzaXhSRWxXdTRUMVR2Y29wdktta0JJdW5YYm10aWUwUG1oWHFxZTNpR0lBX0QyUVVfLXVfUlhna3FhU3lONWdzUEhlMUpacFhUeUk5Y0o4Ym10cERLWk5VVzZ2dG9tV2x0eUJnQzR2RlZOTXhrVHdNUDZCd0NBUENqbTBiWDRUcFE1ZWVPaVl2OVlyZHFTRE1odkxsN01ZcV9XNHhFakg0amhmUmk3c1pnZXpGVHFJQUJXYmtvazZoRFVrTHJZWWRMR1NmV09ZVWc4TTktS0puSjF3eDZJZS1TSjBxa0RMMllzNjNBVy12MktLY0RJYVhpblVhbFBBTWNRblZ3RUc3WHd0RXIteW12aFg2MTk5SVB3ZFV4WVRBVGE2WE93Q0hBMXdDQTh3NXlfVUNudnk1Z0pHTl85VU0tNmFScmFGa09LY1J4SXJBVHhQVmtWN0tUQTktdTkwNDFJSGF3U1UyUHI1UmtEelBWa0VacVByeVlzU3c1dmhneXQ5d1pYaGFBb28xSnV4RTVrdzV0TTRhRTcwZWdxMlItd2pGMDRhQkZaSXliQkhQcUtTR3liZlRsZGg1TURlbE1falNvbG4wYUtIbnFOZGZyXzI4R0gtdnZnbHVfT3lNU2ZNYjktcld5NnRiVld5dmtySF9mU1NSVFBNemU4RVQybVVoaXBkVXhuMVE2VUJXaUpUZi11X3ZTOGQzX3duRlRUUWFwTmhad2VTRy1kYmNYQnI2U2ZEQ0JXcEZ1ZEw0SnF2a01tUTVwWmpuc0NjTUxHSW1xVkZ4SlNtWGo4QlF4QjU3VzVuMlBJTldRakhiMFRIQkthT290WFBaWFFNbjY4b0l4WjNPNklBcktwWm1rNlhZYmkwVElwdnQ5NVAta1M2ZTlLN1JsdWtJVTN6Um5hVkMwNVVLd0JjbUVUcXBNV1JGaWtZdE1lejlBN0hBWjJqWHJNeGJIemx5RmEybEp5SC1FQmladWtsbGN4QUNWdFNiVmY4blhCOHU5TFNoUHRSOVlQc0huMkhkMzJoU3c4M2JOY1FiM05GN1h4RzZMZWZFd0dVdlc5SEhUeWJSWVVmTzU1ZkpKdkxKd1Q5djIwZ3U4T1M1b0NaY3ppZndYbFM3c09lc3QwemY5ejkzOGIxXzZxS1hQODIwdVV2aEZjOXNmdkFuOXZVV29kWU51UEtXcDJLMXV4dUpwUXVOTlNON1ZENG1zOEtldmxvYTVTSVRDTmljcWJJVEs3aXpRbHdtaWdKeFpadmxHbFQwZkFCMUlUcWlJZ3JQendDd0RKZWl1WTdNdEdpZm45b2gtcm9qLVhLeXFqWEVlN3dzLVprVzByUUhTbVF2MkF0azNlVE42SEFsdVhON0RkQXdScktwc3NkWWdkVVRUTFYweWZINGkxcVNTbkJIM3drMlVGSnRBTEJBLWtnWi1YTjBwcjNJaWkxeE00WF9pUTc5Ry1iREJfeVJ3ZTlPN3k1aW1reTM4U3h4ZG9qSFhTSkdWd0d2N3VuX1cxRF90R0IxQ1RNdXhVZm1HcU5DTER6YVZiNzVpYzgtb0ZxQjZMT1lnRFVYUjlDRjlPUTNMQ2ZuWnk4S0NLUWxuNWR2em5BdnBGeGJPMXBnTGZkTjVaQ2Rlejk3MVJ1SmFPUXhsWDhNajJ3aFdjYlBBUzVZQWxPanFsUWlPNnptLWFXNWdEdl9MSGZPdVplcGc0WnJwVWhfZ1RCNXBUSkY3ZmZrVF9sVlVrR2Rzd0lUWEFRNURwNzViZS02SnBlLXJmYTBSaUhhdC1wSFZUSkg1eUUxcmpwdFVJQUNic0ZuZXAxRThrdTZ0QVZjWXF5ZHNrZHhPN0lNTmNHdk1hNk5IR3c0VV9ZY1RCby1iN0FqaE1oYnJIVHJGaGpuN1FpZFJjZkxrUzg5TmhKWkZ6OUVUZjVNeTkzaGhLVmdZUTFheHhLRlk4cFBNTXlJSDNpS0oxVHBLSDRNRG12N2JaZFhiRC15M0ptZXM1V3dnZWU3b1ZtSUVrbjJsS3pkS05nODBBM3RweDgxYW8ybU0xNTAzdHhtUVR1VGJXblpLbFgtRmFnaVJVM29UME8yd2lmUWxmUl9rdWoxc2ZqMnU4TFJXc2NMc3gyeHhEbVI2ZXQ1QndSUHJialgwYWFBUGlValFQbDJ6Y3ktSmZDaGJHX0lmTF85ODFCNG5rSlNLUHlDVDczVll3NWJrbG1sOXFockFqb2ZhVFpfRTN3RWN6QlRGaHFidTE4YVdpMjFpS3ViOElZUlRueU8ycThEVEdBa08zbDBxVDI3cmx3cmVPMlBrcDdlVHZ4aTg4ZkRIYVB1c1h5ZzRmUzlZaHZnZWtZVUJUeVJCVGVIUmwtZERzdTB5WnJKT1djWnJob0cxeUNtSFBBR2V1X21mQXNkUjMwMzhoamZnUU1TM3YzLXo2TjN5Wm0xTlFseTRHVlBjM2xBckJJYl85d0FJS0wwRmgyMnMwM3k5YWFBX3NpeWhnTGVYN25NT014X0pvUWV2YmZOWXUwSDlvcXVVcnNOOXkydlJJaVNmNlM0QURTLUFRcVVzRmd1QU9EZW5xYk9GVW16Rmw5UVI5OW5lR0ZNNy02QndvVUNMX01BZmlHM3BmSzJwbzlpai1NcnVyS08zNnlCMHZXd0xCdl94U0locTk4OGIxR2pBa2pZbTBpLV9uNWRBQnpyVHRhZ2RobFItZXVUWmh5cmpsaGNzNm9yNS00dUdoR0FtcjFiNFFlSDdhUDFfd0NxRlFIblUxckxKS2pQQ0s1aDU3SUU4TG42MGUtRlJTN3hIUXYwYmdEakZsWkdZYlEza3BLc2wtVm13NWV4UGZ5c25lWUUwbkR2eVNHc1VVNlA4QjBpNkVyNjdLV1pFSHB2M0YxNHhMR3oxc0V1SGsyZ1hIVjFGRVV1TnNWT2FXRWJFd2hXd3F5QVZMeklZRi12Nk5PZkhSSTF6enR3NzUyM01TV3dvQlFaZVJiNnpsZ2VOQ0dGa1pPbndnRWFxNU94WUlCdzJwcEVrbVZOblZtX1hQMGRUdEQ0T1llWEtKdGN2U1FJaDN3cGkxRm9xdjF0dVpBUWd1R0xzSHJUTFBCNmdhNHlDRjVxVFBLNHVIampNT1hpWkJtSXVOaW1NVm1oTnhQU0I3Sl96RGM3eC1ITVcxUzJoYmlqUzVwQWFNbjlUUjdtNkFiMmR3cWdxWHhoMG9VTk9lVmF5eEl5LVVWb3NkSVVwcFp3b3JWbVlOR0ZPaXhHZzhJSHhIS3VhUDFIVTFvOHRlQlRlQjJpOFU1X2pucnZhY283aEN5d25VNUxIbE10SEhMOEFNNjdxZzJPSDM4Rzd3X2Z5Q3ZsRGdiQU1YWkxsdEE4WHpFREN1SWhRcVNVUFNIMTVIR3UyeTg3eGctQU1TTE1iZzNILUJKNHZWSmx6VEhYS3lWVG1XcF9QTTc5X0tpVnFJTm11Qkt0endIYWRUeE9LUHJJWS0zbmNfSXhqMnZydzRRcFFqZHdEWjdOVXlvSk5lVlMxLTl2MDdyMnBuUm9GR0d2ay0tU3ZnZ1NKWWpVUFZpUWdBcDRWUzZEazBYOU50U0JCeEpjbXNGaGtuNlJlRUdQRXExZGlORWlMNVpvTHBhNHlqaDdFWHhBOVJjaE9NQTZuWTR3aUIxeXZvWWdRUldoUnJmOVdoYzN0alZQTGxFM2tMMngtSEpRYUVNaW5FcnoyZ2w3dkNGMnN6cS1DZ1lfM2gtbExCU1RxeDVDMDVNRDZ3TDdmWEhUOVhDdFdHNE5fUHFMc1B0cXBUTVBZUUxsRk5yVm83bzhhQnRNUm9BR2pVXzcwU1RKR0ZrcEdzTDd1cUVjNWpqT294bURzR1g5YkhoRnVGRktMLWNtUE9oN1hoa2FDS2J4Zkc4UDNrMTU1UzJyVTlJdmg2ejZTNWgwaGM3bE01U1ZJbzVvbHZvSmNoUlF1aE8tejM4Mnh3MHBXNE1rbkY0MlluVEE3ckhhdlA5M284TGJYMkYtb1FHYWpRNUxBSlZFN2czM0V4MXE1NXcxR1lWbEVrX3JMeDRNbWRBUk1kbXJOWTVqMlhPb2Z6d2wxOTBVWkJONFlrSFJNaHdHRFZ1Njl2YkIwQTFGVkhsZlZpY1d1bDBkcmlNNmNzdHRIRnB2Q1hpc1hkZDFVQzNsUTNQeWdzQWc4MFN0SkpXZWZ5TXRZRGlPendTVERUOEUyUnBacndvWkZuR1hpREowdGI3ZGtneF8zMlIwb09zdm50UE55cEJEZVNRejZ3Ui1ieFVtRnNRdV9zdFhTbkJzU3B2WTZFWW1uU0lhOFRiZW56Ql9Mel9mSmtMb2JHMjVfSDd6WWNTTi1Fa0tJTmFsLUtWMkVsV3JvTkhGUTJfalRNMkhZZXhMbDJrQnlQbjNuVTJMTVVVNWJzQzZ6UEtPdENzQ1l1UzBEanI5XzkxYlY4cjRLNGs3d2R1U2tIN0pFV1ZuVFJYMGx2YjQ4LVJ2aXl3QjJjRDRkNHlJdTVjaVgwbVg2OWVqSG0zQ3J0NFFXUmd0RjRkTmRab092bm9PUnNKaTVxMGVrUU9RbUhWMVJ2M1d5eXRjdHpwVWJhUFdSZ1dGREwtWTRralFUVEJid0dRR3gtM1RrbUhYQlFyYW05a0VMcUNEMlNPcW95UnNBYm9qZGs1aEdIYWRyaVo3N1I1amI1XzVLVV9iNXJVN2g0NnpjaDZLYWZkYzUwU1FRRlMtTV9obzI3OFpXdnMyc0pITHJLTnBsOW0tR0JBWHpmZVVmNlJwR0ZkX0dEaHk4YkxkaWlIZFoyM3liaEdCZXQ2bUo5SFh5WW9DZkJ0ZDBrekRIQ1NhX1Q3Uk5OYzB4YzdsdnBRWlV5MmhscVd1bE9zT0xYVEtNcG5nYlNxbDVhUTVBRW11MFg1VzEybXFLVFZ3T3I2VGl2aEtoRG9sNTR1eXZ0TlAya3d1NmlJSVo0Tm5kSnVPWkR0eWxvZGU4US1xLXgxbjk5MEJyczVoTU5BWW5LMU1zMGU0VzlfNkVOVEFnbVgyNlpEdENYeXZJd2E0WnJDVmh5ZjctYUJLNl9Tck1TQXNUQXdTRDZ6dFBLMTlxOWlibjk0ODVrVDBBd2hRbFlMRmRmSl83Mm1FV1p6WG5QWlpDMUV5N2gzWWhKY3l4VjVvTEtvZE5xVkFIVlVwT0stOXh0TnIyVVJSVUJrckpnYTVLUGc1dEtGeEpnTXYxbDdnVWxORlFXN2tuRHdMQXFPNVY2UTNrRVd4elpTUDROdmFicS1YZ3RvNV9iOS1hcTFpYmwxcDVKQ3FiRFhGQm5ycHhlVU00LXRWSjBxa2NzQ2pWcXRUR1lFZkt0QVJtYkQ5VWtpU2tVUEdIMUlWcU9NbTRtZ1NHQkFQWEs5SGkybWd4aGJEbU5oSXlMM0l6dU5vWWdrX2lCbXVscnhRelJlUFBHVTdUUERVSFZfY0tzYXowR21YWm03Z0JGeFIzYjlVUGpnclZqaTd5cDVjQ3NTb0VzREFmSWVibWZ4MkdxLUwzWXVEbXViTHA5Ni1QZDFDZ1F2cThRejdVcW85Q2w0T3B1SFlHMnYxcjk2SkJ2Ym1pdzNRSzJudlpfT2hrSXB0QWMwb3NOV0Q1cjRrWlhuYkYxU3VVN3ZQV0VtME5QS2ItZk5zVUFKdnJPZ0xBY1RKOV9Va3dhcWdNcXJOR0d3WTRhVEFLTi1oa0cxbWFPY0RfdjFrOUxqN19fM3h5X0YyUVhsNDZEYVVMMjNiZTJheG54bm41WWYxcDFRUjJpZTlaYVllMWFnRV9rRkFHV21vT2VBRGI2WExhXzNqTjhUamFXNWEybUhZVDNmMHpSSS1Jc1g2WWpjWnZBOU56ZmFVdDJDVDRYZER2OUwtdGpKYVNaX2MwbXRPcUg4RXhKNzlWNWNMdS1PaWJxNFA2a0sxZWRLWG9DSGIxN0FGT1dFNTVtb0ZPVU0wQ3ZibHBPYkc3dFZRSnNYcjBiUm1lTUtGTGhGX2NZRDVFWVk4RDNQUDNoR2N4bXhYTHdHUklXYmpVYnA0WkItaFdraElEX0dIbmp6ZXIxeFRjRnlibk94WUhkTVVrRXZyRjA2UU40QjBoemdUc3dXTmFaUzRNREhTT2tWSzlhZV9HYnNZRm1vS0hEdGk3WmRCSTROVHYwSDlNM2xXVzZMRzRZeU5HMHgxNmk5MjZNT3hseVd2WUVxVW80QkRGVjY1Z1JYd1VQbnkzekZWak5DQ3N6X0hwdHcycDdRdl9iaDlSNm82dEw1R2tBR3daYS1lMFdrYW12c0R6YWdlZ1Z0WG1QX0pselRTaFN5cWRDRWp5V3RIYVhoQWtIQXVBbnV6ZkVIbC10aEJSMlpxWWowVnNBYk1pZ3NOSzVybWplbkt2dWpJRkJYaWpQQkdzdzNqRjRZVXhGeE83SUlUSFpCMHYzOGY1eUhGVVJudHZTLTBIYTBQYWdJMzBHcUpMZ0dOOXc0NlRBNW8wcWQ4NUdLVFU5Tk5YSXY2WVpZb2NKMmVFVWQ5a25pTE1QT3pmMHNPcEtEdWtpOHBBVXdlZHVqRjdka2RXeUdobU1PQUJIdFJEZGpHbVpzSlpjeTFtV1dwZEpWLU5CNEk2dkNRY2JyeUhCUktZMmMzNEtNT0tVU2VYYVFjb3N4R0JzcW1LVl93QzIzUk0wYW5aa2t0Qy1nSVNMRFRsX3ZncGFfSFJSTjNOMWNPc3lyelFMN1Z2Zmw1TXJDRzNMcm5CbWRXNXUzTVNPVURDS1ViNG1zbEJtcE1XZ08zQkFjSzBMVmZ5cVVqU25BNzYtWnNSNk1Rcm9UVmFlWUdGdHY5YnVKaTBGOGZ3UWItdkxYalREazVpQVVwcmphQUdMNWRSMURRbF9oTVkteVRneU56VHRxSnhkd1V2OE9EdDZQU1pIRGltVWkxeHg5U3U5cm1kSWd1SXpfSF96SXJRenJHdmNPS1dNZVVuNm5nMS1KRGFqamF0dVJFUGx4bE82dVpYd3R5Tm9hMjNCZkQtYTVCUmRTU2hBSXFvQzJxdFhMTVhva0JEZVZIa0xoenQ3czN5OWhRTTJGWTJMbGVSYThheVZXMnBjRlhKd2Q4a3RFNW5sSnIzVVFrMW82c081Y0xZN3BNM3hqbDdyQ0M1eGdDWGwwZ2Y0ak5seTZoWDNNV2VId0ItTmNqeFpEQTRHLVc1b08xeTh5YldUeWcyaXpad0Zmcmt0OFZMaUJlRk1UU0pqQjlPT3hVNl9XNkJ5RnFTT3JZeTB0NG9EaDdjbGNRejI3d0ZUbkhJQlNxeEotNTdNUTJtTEM5eU84UVBtVGxWai1rMEhrWWpka1MxUlJlOEg2c0dfXzJtUGxYZHlQSDVfcHFQcjI2VWloa29tU0VJOXV6QzUxS1JfR2piaFJSMl9DMTFJYnVCUVdNR3N6YUZ1THMwb2huLV90QlJERmE5aEdPRTk5dDZvT00wSG11d1Bma3c3TGZQT0VKM0YyVXF0Q3AtOVN1bG54RWRwZ3RlMDZvRjZ0dUFRa1h2dWo0bVBKSlhpUWFwZl9DckhaUVU3bzRfVTFod1JyYWFUWHh5QlcwbGdGSU50Yjl2WEpydHhzYy1CMEdXYVlEUm1XYTR0UFE2QURIM2lQRXhuWTY0NGd1S1lSMkNJeGJRNUVKbTlmZWF3ZHhaQ05lcFFKYVBFS05heEhHVGVSVnctSXM0RzJsU2RZc2VIMDRJRWlWUmpYQktNcXBxUmxybTNma2pKZWpXRzJUQ3FURFRJSHdjUmNGME9MR3FqUjd5bjFfRHZvdVdwQ2RiWUEwMklVNjVia2RxeDZ1Nlc0SnpTZUhhV0pXcXIxcFp4Sk5Ha2V2U3FqbVJPY1lQY1BNZ3hKdVBoYVA5UEZtb1k5Nzc2cGtYV3ZYYkozZ09mM3RhMVpEOHZoSHlSRVVrTXBhVDJfWi10SkZLT0p6cVZteFUyTGVvQzJ2N2JlWHJPYmRxSFkzZ293UjZDZ005Ym5nX045YVJiek5UdU5kS2U1U25xLW1uOEQtTlVUZ2I2Y2g2RlVBRzdmNzlOaWVrMmpVQjV4S1FxaHFnV2s2bWdyaVE0aHFMQm5HM3ktbVRnOHJVT1N5UFBUemtxYTcyLWpJRkV1Mzd4bzhlb1ZaWVVoeUtqdlhKZTlMZ0ExN1NVbHhFMzJZYzRaVzJlaF9uOU05bTVMVWF1YWR4LTlydHI0YlBPQklzVGd5WmUwc3NqOWRRUkFOaWRIOEx2QzIyUFdoSkstWDRORXJrUmRsX3dXbkUwcnktVk1MZ1FOZGpGTm1abXFpNEVjZ2RqQ1VsZEdYMG5uRVFWam5wWlRCZEwzMWR1c19pcGU3OEY3V3JVYzRCdzFKS0lEVmdyX2RSNU9hajlXV3hNaWJua0hNZWhNcGF1ZzRCNjZUSTJad0VvdUd0LUJ1dTBUOGNGc28wT3dSS0dSaWZ6RnBFNUotUVBPMWlsTFNYZXV3NWxNcDZkbnl3LXFyOWc2S25TNW9tYTRjTXgxMHJrWXV1SDM3WDZiZ1RRSWNFZXhOMk1PLUNaZlJoWG5yS0tFX1RmVy1NOGdvQW1sTTc0MmkzVFZJeGxYRkNSMmJyYlN6TUdfLUlSX25BVF9PaUxBdGl6WVc1MnpKNmxweUg2RmVXVjFfT2xKR1FUTUV6c2ozVGwzZzV2emUzcjFsT1c0M2xEai0xcHZPLWpqR3ZiY0xObnd0MVpVVG5tTmNnbEVNLVlQN0Z5N09QSlRnTks4LWlHZ3RRVVpkU3JqMWZlUzhldl9kbTBsYWhnaHI0TWt1U2tmVVhEUThfajd6MzRURTNSZGV6c1c3aVEtSjN0SWxBWVhqZmlORk85TmhhZUtlT3VTT2RnYVczNTRJUWVOVFlDQkt4SFcxaHF1YndlQnVmMXR6MHM2aGZESTJIV2l2N080YnpvXzg1TkNvUjJUUnoyWDFJREkxUHFYVWpvZGs3LVE0c18zVnNWb0hDMU5fZEtELUpPeUFoVkpHWE9QYnVBZFgydzB3cjJKcFRVZkV4Z0NsMmt6YS1aQkZYQXlFa3RaOU1kclRyalZzT2JVX2RGUzdWZ0N5WnFXbmlWTHF3N3pYRXJmWmVaZ3hBUGJOdldpSGZ3Rjk5ODFYZ2xGRktCcXdiaC11aWlPS0RrNGJlbXhQMnpyck93LUM5R0FBRk9qVDk3dmIxNy1aM00wdkE0bGFfY3Y2SXY0a21GcU5wbmdzSDItbkxoeGpJM0VidWlZRUpXOWJabXk4R0JLX0VMUTdlQjYwNHZXbHFidS12VU1Ea2Z1ZEVzTmlDNTFwN2VCcXlVWEJvcW5EM0F1cjlHNjlVLXk1bE83WjRrMndRQ0V1MkxXU19CVkROU0ZvNnM4dkVEbFdQS1FSTjJ0WTNRZXlUSWJmTkpxOG91NWx0SFJfNlJVWkFTNERCYWNBN2VmZW4zamJMeDM3aTJMSHVUa2VTZFlodUtFVUV4TlYzLXJmMkt3VFJhOUVKNV85YVpJR0FtcHBlVE1NVUtGajNZajByU0x0RE9CMEVVN2hlYWViS2lWamM1RVNTTjJjT2IxMGtHWlNTdjNSUXUyenpyZ09BWUk3WjJEd1g3a0xpLWRhM3NLUWxPTXhCaHlxd2o3LVpfMHFJMTlfeV9qeVdUelljb1RseEdxTzBTRFJMNGVTV2ItUHJGd2hZSjB4R2VUT2MxR3VwVVpQdWEzSWdScHJxaHlManZKaGE0LWxudVhfTE1sckVvcUVSb3JhdW5KbEhsTlNwOUw1YnVDWkNVeVdhb1FvckR6SnB6b0oyN244azBSNTdaSWxPaWgzbGJhYnNUSkJnSGZjODdNUU1GRmdERmlUX0w3RU1BYUk1SUVDT3F3eHZuNGNLSFFKMmNuZVNVb2RRZ05kS1JyQTZHaC1ucmZsRGlDalNyWURDM1ZvNWg0OUVHeTBMNS1UR0JPREFBdDRJaUpwWjN5Qm92YThDb3Nzejhob3BzSnNLNWJQUDNRaDBBVXo2LU9FX3djd1VWRlFxbUFjMTdJeC14dGRFWEN4UC1BTkM3V19mWE5Sb2pKMS1laFhxaE15TUNUQUFpQ3lhbk5jT3F6S2N3V1dSdE1YRDZmZWlRdHNWRGlDM21XZEJROUFpbWVlNVFFb1JEM3BCcGVQM2ZwYzhQRDd5bTNNb29uMDduMU1ROFlRVlNLbXAyX1R6SllUNXNyOElYWjV2cV9NTDRoaVZnSnUybUNHd1VEU3p5d0QzN1FYaV9iamhXbF91T3I4TDBxSkhURWZBZ3hjbHVSM3FZcVRXY3NEXzZvVDVRcExkT0xDRWtWeW4zRFRnOXkxS2YzUHoxaFA5cFFUeTVrQVNXVXNsb3RJTTE1WGxSdWN2S3hjQlJaTnNRX25hTEUyekZBQjgydzNUenRieFN4WDB3TTZuY2ZyYjRIbTRBNzlSQzV5MndKWjk2VG1nZmd6WE1yczdsVEtFdmJrZkVnWm1QNV9QN0lvVkZwQ0tZcFh3cW9iUnVtek5SQTlUQUZEeU1YTWFhYmRJOHExdm9rYVZMUWprVUxWQkpHcTJOa3pDX1B1bklZTFpDam0xQThfTnlmMUV4cndDNlZIRGNLNGhnY0YyNXp1QzR6d3NzNVpYeXVQeWdLR0VhUkxPU0hPN084WHRsQURmdExtTm1PcFlZRkFhOFBZa3dJMWJzc05iX3RvUFhTQkRNWlFrcHlfSnRSaVc3X1BoZHhPdjNyMUV6SmpCTW8tekhqTy1OTlRFOFVJZGFjV25KLWZCRVdJVVhCZE5TcE05V3VxUXI0dWlmY19mZTZyb18wVS1CTUVRQy1Gb0EwaXFrdGNkZms2OTZjZno3TmhUZkY0aHZEcGYteWNoX3V5d1ZpTEpFWXAyVUd4SlRwVFpHYVlOU0dzSjhEeEVQMERSUUFqTXIxVWs3U0g5eFR1Tzl6b2ZnY2d2ZURlS21rY0t0MVlNQ1N2T1JFZm0yWlk2aHpMN1JORlk1WEdjajhqanZ0SW9laGRTNFh6SHFkNzhQbjZUT08tZTFFbTR1WHp5QkNTUnhibXp0RkJ6WGRzSjAwYXB1NDJFR3dVQXJhMS1ubHJRLVJ1NTM0OEZQaGNqeVEwbzREWWFydkE0dkdySVlINUR2RmxSYnVTN2RoRXpiVFBwSkZlZ1dfQzYtSEdBbDBULVZ6U3RpRGdHR0dyLXhYUjQyeXZmQndMZzVUNnhLclVVX3Fsa3U1b1UtcVFubU82VlVxalh1SXVwVlgwRGpfREdIM3prSThzZFJkUGJzci1NQ0dKcjZiQmJTd3JnWE8tc0tJenJIZm1jZ2ZfUmQ0bi15XzZyWXZkWmo4RlBMdThtVFlFYUdqRnlDcVdzSFQ2bFY2NWdCZHNPS1g2NHRyX0hsWU40M3FFbUJTUzZOSUNvT3g0TGFGY3NiOVFJbUN6RWhRSFRjRlBYZUdrZmhrOWgtVVl6Nl9jLXVhN2ZCQnVFTXdvZUdTVXdtRDFydmJYa0ZVYVpvNFk5TERJWkdNRXFPTnc2eDNTNFYwMEhrdUR3R3FwVnN4OXZKMWJqR3Z3bkVYUlpxX2Q3WDkyTC04eGJYMlQyQi1aZzFmZnVzMnh5bGl4cy10a3FxUDVVRXNhYzhJMW5TUFJEUTNCWEgxeUVxTEtHTERla2J0SzZKNlJGVzBJcmZLT28yb1JEcnNVanZLMDU1ZGpMMjk2Wm53Z2hKQzR1TS1Qd19OU3J4RHNyeDh1NTV1TnVaalVOZlNiWnhEQzdwclJSWV9qb3FDaGd0dC11d1BBOXdwQTdKOFZKM2Y2elktRkJhSkpIcHZSZ2MzTnljV2xYM0cwekVvQU1JemRsQWN1ekVwRm9BQ2gwdG5ndU5vRllrNUdzV0JWRV9oQWlBa0FCRmZNOHd2UWtXVTVMWTBWMGRmX04xQ1E4eUlRb1JGSEZxRnhFb2tzVDdPekFfMWU5OWNiUnFxOGszWTloNnJ6S2Y0ODdCSDBzanprRV9oWFJWOHdqT05LSF90WnpjeWJOSGF5dzBQMVlZb3RIbFB0bnl5QW44SlpYYy0yLU1OeFNKWTVfWTFtWWdmUFBHWVREcjU1dHE4RVJUWmZpc1VYOEUzeWg3eHZzeFc1X0hRZ0t0NEptVnYzWmNvVjRDSmpoMDhDZU1aVTNHMkdhdWlETUtYUnJXb1hPdmFZdkw5NVlXLWM4U1VERklSNW1PcVk2cnFGTXdhTjQ1VmJLcHpSckFpcjlIaDc2TTFIYS1rcGVsZDNhdlUtMDdJVDhGcHlBWWZ5T0ZKbkgzM0VJaE5tOFphTUtXc1pucm9WTDZla1RacEFFb09ucnVTQU9nOW83VFNxQmtlNkdWTUMzX3cyZHJMdU9KcGE1djE3cWpoY2VITEVoVEFSNzU4WE9BOUg0b3VlWlg0WDBheVcxYlZXNXc4TFNUWXRFV3RDeEZfcW5TTFN5eUJjUnZJTWg2LVFtX05CLWNHTmFBcENiZ3JqSUl3S25EMWpCYjJaTHZiaU5jMFNLZ2VIcnNxM014QjVUcERpdE1ZUDQ4bzhGMGRpcmRfUFkyMnBXVjBjY1gtSi12MGNQQ1U0TWhZSTQxQThKQjJOZ3VleTM5ZUtQUU16dGxCdTRid1M0SDFkZGVtaVpVLXh3czBEcDlWQk03cDNYV0RWQ1Q2bHc1RmlnaDc3dW5DMHVZZFRqbUJ6eUo3V0J4c3RlM2J3clRfb3d0X09vUmVOYlZTS2Nma3cyQkZKck55QTlVQVhuZXBLWUEzZmV1X1laVGpjNjRleHl1YjVzZDV5TnBiWHpWdURsdUk1Z3IxbzJ3NmFsY184VmltV0doQ3VtTU5zUXJZWmFaVzhiek14MkFaZmI1RGY3REZlLW44R2hrTXY2RElOQkZDSktQWTRweWc2NmI0NHNhdlV1eFFETGhScWszY2JZelliYW9iSll0MUs2YjJISUw3TlNDMkd0UXY1aHFpVWZEd0M2UU1SNmhSdE1naEpvMVQtb2ZpY1JCaVhvY1ljRTc3eFRtUHR4MXJkd3QzWTZ0d0lvc1dxREhpenpCa1BySTRXT1dEbVhIT1RNbkRVa2xUdEJISjFHd0NMRmh0M21vOUNMd0pYb0lhTk1zOFNMR3RkdWJVZU5nWElNU1VGaVZOYU5yUGx1UVkzT2QwS2p0N2JBZWx5T0V1WHVyMlV1ZmpNSjRzSFVpOXdZZDlWeWdkNmZXLUExTEtDc3RCVkNnbnduSmhxNmtGVFczMklYdlJJenRiNHNrTkE0V18zN2xDZVMydnhRRk5fNkt1Z0pvX1ZvdXNnbVVkV3VKcGtzRUNBa3RnNDNSR2Yza2NwbFFrWTdVUHhpQnFyR2ZZMnFQNmZ5aFZMTVVQOEcxYW1QSXVCN0phdXFKR0M0VlBTYVNjNUQ5ZldhckdDc1dQUWYzQkViUHppN0lKWEVxc0trdU5ka2lJdnBGSEdoTkFsaDBLSGVCVk5XZEJlYjloZVdVOW1nNU5GMTk1RzdacXdhYWM4YVIzYjM1NzdfcFN5VlNNcTRvZFJHRHFqdGZzY2ljanZMMUF2MUJEMFA1VWF0dk5wc29ReDZWZ19wQ0IxTW50WjRBTUgyWlFwbnZFd1hOczdXVUV5YTExUzV3YUZvMnA5aWlBWV9faTNsUENJWnFndlVLeXRibmliakltQ0JwUkhxLUhlT2E2Y2xkb3hXX3EyTl9YUUNaT3VmMEhnSzhGS0ZZZFhFY1BjeUNaZ0ZvazRRR0xuREszSURyVkphd2hZMFhNQ3p1SWlsQ2h5aVNUUmFocngwTTlIMW5DMmFvTmtCaHptMnlrMXdzMENTQjlBLVRacC1WakR4a0RGenRxdHRXaFFuRmdheE5nams5WkxEdFg2aVFodkhpR253NjBaWUZKd0hRUHlTWjBVbGRtLXJXbGxBRFlOOXZCcS1XQjRsRm1VRi05d0FwUHE0VGJncWZEdVBHZWE2cjg1eExuYTNiMFFPaGtib25hRWRLNGFSU2I3Zkc0ZjFvX2FRSzJkT2c4bVJhaXB0alRyWFpZNTQ5UENZNFE0YkxBaVZOQmk1dGNBckpKWVhxbkhYZFhBUTV5UnZURjBVODZNakhJbFlsRWdKX01reTgyYUJKQ0U5X2FVRFpZU2tJSkhlTHdyWmRWeGxpbmwtSndGOWhhQzhhZ0p1ZWl3RDZaOTBkeHZPNkxNeHMtQVo1bXREaWs4RTR5RFJsUHpCMU5XdlNDcUdCX2tpYkpTNmZGVUd5QS1JUUpXTGVOeVhhcU5pYV81VVY1Tl8ySDVTenlvUXhmSkdJOFF4UG4wX19wcUF3djVadk55UlZ4R29PbkJqem0tMWk1djVHS3JXeFoxUGR5UTctUXhleGY0TVptQ0YyT0NCTEdUcjVWeHdsQll2LTVBY3J6cGN6OVZpWWY3Z01ja0ZqNlduMDI3cGQ0ZGtiTEIyZk5aNHVVcmFPZTYtM1dSRkk2T1NXVkpmUXJ5bjRVVm9WVlczeU9BX0lJcnNGdmpBZ2F2OXF3YS1mTENkRl9TV2JVZG5zOWk1RTNvV05kcV9YS0VrbEpkcFJKYTlsNjBZOWZwM2hZNzdXTDRBZS1oeW1QN1d3SXl2alFYTUZlelVQQVN1Ul9wY3RBbjViV191c0lmQ0g0WFVTUGNRU3l2Q3lwYWlJUWlJd1MtSlJ1NXpuaXdtdEhpTFp4dE5EazdDR3lFUk5TeldEZ2RBa01VN1pZRVpxMXlmZTRfNXIta3NvdC1zVWNFejQxV09KdHVsMUFkeXVuYVN6WjZiQTVJMnlfd19JOHdQVE5VX2FFNGRHd213bkc4Z3lDeW5tWDJYc281TFI0WTQyVDFtNmhyMk5xdV9MbndfYmZVYzBTTmpOWDNaUGZLTmpncjJkbnVhQzhMWkV1cUtqSlJfTDRraHpVZEJjdWpYcWpQTFQ5clFmb3k3VlZnZmtRNkloVGcxYmxPSktiR1dVczJzelRmV2ZaTUY0ZEJLdXJqeVNxUkY0ZmpVbGtTY1M2QS05YXd4ckpGa0t1NmtVc0JEX0hxNlpBOW5pOUpWR09WakZKNjcwZl9vSFlDOEhDd082aEJNa2VsX3NhMHFFd2NhZW80YVV3NlhlZlUzNVV3NFBHbWlvaFlTY1g0YzJRaS1NUmtBMkJUQzlwTlpTUzBVSWU1RElYVW1HM1VBTm9sVnh5Uk9PekExcTFJR0o2bnVkQmdjY3VJYktoVzR0amdxZENNa004M01Qa0Jxd25GcUxFUGcyeXo4NnNsYUJSMUV5eXZUdHhfVm5jcERKOTZwcHNUbzUzcXZGQm92aGtQWXN4bTFmQlhxNFB3UTRvZXBNMlNfZlcxUUp0MENZLWFxQVZZOHZyZ3ZtdnMxRGFBMmFyNlYwd3dmdFo2TVJnRDFHSkQwRFpDa2sxTUgwb2RfY1BONmFzLWlRaDdNYUNnQXhuODdBTFdIeXI2dWQteEQ0Y2N4dnJFUGMxZlNPTkFIQ05hVEgxbHE3TE5IZkZTVFJKZ295U0Z1ZHYxYWdQSHg0NjNrRHBTOTd6ZHkzdkJRcVp6S2Iyc1gtUUJheHh3REdRMS1waUI3LXYxQVNtekluMnRRY0M5SmVMNmZHcVRROXBzMnpWeFJRNmhBaERrN1I3cFJVdEhlOFMtTWlEeXViQktuTFBTUFhYYzVlUGhheXcydzYxWno4YkhBSnEwRXFnRUJWRHFOQnNqODNnRUNMT2hJXy0tVDV6emR5c2pHNzhVNUw2STBSLTBVWnMwSURMWkJfNVpDYTU2aklkcC14NFhPTjNoUDNDbHd0b19iZjhRM1BEZ2NrNVFRR0NuOXpDc3lDVE1MTXFRcDNFR0xuZ1NpZUVjYXlaTDRpeENDNUczMFo5cG9GV2NQNXVvWFpjOVNGMXFIQW5KUkVzdjdlNDNsUU0yVm1yUlpnVmZMRUVZTjVCc292ZEplSU5Kb0hzMDB4SmlKZmVJWXpJQk1LRHBiQlRwbzR4SDg4VFZKRm5qNEtfZTJ6M2pIQkVmRXZ5dFpiTzl2cXlVdEdjcnVINVo2OFpzZjVPbnBuNlhWaG9ISU1VSGYyVmdZQmtDeTJxdXJIeWJpYno0Y3EtTkpUakVQRHplZWljX0NsUmNoNlVHNEZUOWVzNUZaM0YxeWYxcUxObk55ZEJXVnFVbkxWWVBISkVaOXNzcDZlT0pxYVRnTTR4UEtNSmhCYTY5dG1UU3NFa2F6R3I1ZmJ1RzBHR1FYZTZfRjlrdlhWNlp0UFRUM0NHYnZWdEEzQ0dzbTJhX3djVldQY2RiSU01YVcyaHBjV0dJU29SdVQxck1CSjQ5QjNZV0w4ZEpwNlR1d1Y3RDdSX01DODFES1E1LXpMTTFEcFg4SnQyUk9wSVdNQi1McG1lSkFDQnd3Rkd6SS1EcEk0ODlvYXE2ZnpBNzNKa0s3WkkxOXVSTEUtSDN6empHX1pUSVdmY1FVc1hOZEFKZnM3Tk5LVjBSa1NQVW5sNU9faExHckdpcFNOUWpGd09HUGtKSzFINGNvWmtuM2ZrclVFdHB6cEdzNzR4YzliTnRkZzdac203RGtjRGdqY3ExTi1uVEhWZnhGUWNIb3hyNE1kTTZPdERRQ0dpcWRHQ3hoaDdtQVUxMVQzWHREWXdYemxOTU91alhqVmljc0tVWkszOGFIVzhZbmp2LUdaLUdtS2pCQlNfdzhmZ05rSUc4X1BBRE9tM0oyRmpSUEgzZ2syUndlR1JRNE5pNTRwaFlLSmZrUFQ0OVFXbFVyWkxxQjB1elQ2cTdtSERyOWxBR21qbm1aamJJbm84SGswRFNONTNZWlBpYS1CUnZCb0FuVzNzYTFhWFdFRlZZQnRka1B3X0xsb2dwQkNxcnJMb2pIYkVKY3BGTGs0SzVBSnVha1dqZWFIUzZFeS1ySUM0aFBIbHRpTDQ3ekV4SWRYSjJtdFJLWkNCT0N5bmtiS0lUbm15NjNpU0doRHVOY0VuS3RaV1I3eU5HenlfUk8yR2JIa25fZUpHbGNrdmczTnVkald5dEJTVGViMVRQV1N3a2t3a1JMNzhBSGZ1dmxfLUwyY3dHT1ZWZUNxb19iTFVOUWRGZy1jRGx4eE1ZQzEzdGNVQ0tHZXRkUG9OaUhBTFpEY2dpRG9JODJ0WmVTYmZSbEM2YnVTYUFMU3hfZ1Q0cHpiSTFEbWVmdEQwcUNMOEVySjUzVVM3bzc4ekwySmpKSURHMWsxZzRmc25kV1VRWXcxb2FWQjNHdUp4dmJvUk14TXdRdmJHX24zTEd1VXdOd0lCaFh1WDg0NFZzN2dZYzZhSFY1RmRWYVVmM1JRN24tY3VoMjhGTG9LaEprODR1ZUVnbUd0cHNNN0dsQXRNSWFLcmY1RG9peHdxN2k3aWFhV0VmU0o3Y1M5UE9iVWl2YXgzX2dabkU4a1FQNXZVZ2lnaXhzem81VG96OTJkSzN1cHpibHlKNjdVNmp0N3Zoam9GbS1oU25wWFdtSTZGcDJDX1JpNXI5T091MHBqVGhWaFNCNHJFUENGNjFVQy1FOXU1YmtZLVBQZ3F1U0pnY0Q1V1hRT0FTaEp4a09PZ0RZZ0pVNVk5cUJKa0lSMUhaa2JLQktnRWV3YlZ4QmpRWWtJOTExR0hXVFpLUERUQnlKZkFsMm5hdTZfYUVpVkZCdktHM2IzeDN5cDlfclpKSUdrYTM4SEtITzNKNE5tRlhBelpJd3RncTlKWDZPQ0xxdl9fYkdyUl9obklCblFMNlNpWWxPbWVycUVpWlF0ZHNyN2FnU0pnUWQ3RnhHWGprbDlwbUxMMi1OZGFieWdReTNPY3piVU9pUEdEWHRCU1c0aHU3aS1jUnpFMFVyUUt4a3p0NFRVaFFvMXZqdEpReGp2b1d0enhnR0ZhRUxNVDAwV015TjNCU18xbVdQeEFsRmVqY3IxRFZ6dWMxMDVxbHM3UmZKYUtJLXdaQlZFbjd6b21nYW9nQXJWai1MSlk5WkNuRmN0REM3aUg1QlVyU2FSUXdzd3JQOXI0X01pYW15ZGtvOFV1WlFXUC1uU1pCWTk5Y25vUGU4QXhQS3NCVjNhRV9yMUtDRkZOSTRhanUxMTl5RE1La1M5bXFDd1h4SUI0aVBtYWJ4ckFIZmlxcDJhaHZTb1BnLTRzV1dIcV9hQkNRZF83WEpHcUp1OERSSEpuN0hFRXM4RE1DdjRJMkFPMHNybENLRmVzbm1LNjQ4WTdpdnhucEVuNGZzM2REbDBuazBNVGl3WmVtMVR6WU15NG5nSm5xTDJwNEQ3c2o4bEk3YkN3ZzNGLUMyQUh5NVZpeFJ6UnFjTjRqYVVjZnFSd1pKOHlJME9TRkF4S1BmV3dRWnRucXAxUlU1MXZmMUFDUkFRVGplWTUyYjl1eVpzbDdoRFd2anU4eTlmNGFmRUl2bUdtaXhwNnFpTkNxR0ZnNXZpeVdsLXNvYnhOUmhONjlueTZYRmIzRnhkenV0VmFmUUw1UkI2RmZMdjJ3WkF6Ulc1Nk9MeFVocVJZcVJ6YWJTdXRLaVMxTWVKazh2dzB3QksxaFBLOHJBYTJxZmx5WTVtdThINkY1Q2RhTTJFX2RCbmRRNHhkQWlraTF6WlF0alVSTk1SUy0wUzJvYnA2TG9xd1F5bVJBT056UzFGV3NpM1BycmcwMWQ1SEo4WkRGR0tMRGJjM29KSE1FUWhTVE54dDBQSjFHMExOQ0VOV0ExaGNDVmZsZTlTR3FtVmxCdWh3WmVFeHJHVjV5dWMwUEZ4OVFMdFlwRHpiTGoxYkkwTFRuMWhvb1Y2cF9UWkpJT3NWLThSeEExcTBrUVFNN0ZFMzMwUkh2X3BoNmdiWG9NZkl1OFpwX1RNWHNjNTk3LWV6MkJMSzQ0ckNGYUs5NjdtMklGbDVZdVo1WXU1cEhNd2hmcGxMZEVsWVZvbm50UkdtRjkwTXkzSGlwOUpvSk5MNVc2dTlER1ZnVXRkcFlXbU1sTmVqN0hrNi14cjlIX19iRFVzSEh1ZTA3a216WlpjbGVyTHI1SE1kVTJjRzV4TnN6QV80SXFNQ0hfODBCVzJKaUNxMTFFd2dMNWhuSHZzSUxTZi00ZFpVYlpHbmIzSnFYbm0yV1NyOHY5QVIyVDI3TFZEMUtwMUY2Q2JjT2FxeHJQZHhDZWhfemZSQkgyZWkzQmlmcXl3bjdDOVVXNHdJRXRSQUVfY25xeGJnSEZjaGp2MFY5TmROQVI3bG9VSXdNTkZqVGNwX290VnJsMVk0WlBCeHVJVVY3Q0dTMVQtR2RWd0tZQUE5YVV6RlQ3ZF92cFlRS1pkeDNRWDctQjJBNDFkSFdiSkw0MUEwTmpyLXp2RjVVUjJzdkQwV09rajR2bmltX0VNZGNIUVptblhrT0tHTFhfZzFsZHItYkxjNHpVclpXbEV5TTMtUjBmTzNBN0U1MHpMNVV2dHJxQXE1aUdMVmc0LVV3ellTOFluaDZadDRHdWw0OWp6NmtISk5uVjNWSHI1d0UwZm5Lc3Y1YTlOQ2xKZnBSQUtsdnBqVkpHWEoxVlVaNkhEcWJDV0YxTWtKZG9SZnZyZUt1dnFMRHlRc2U3QVNzejFWc3ZRWWRnT29qYm5vTzdvYzVYbTdsWEhpYTFtbTR6SUNWYjUtbWJ3bzM3UE41YTZwV3hjOTQ0SUIzcDc4aS1FNkdXUmw2V2N6eTVTcGFtcWQwcThTQU1HMnlxV3BDSmtPRWl1LUFHT2c3cThSRnpWVFM3TFdnbjhSV29xaEdSaFI2N3poSzFtRWdaSXVzN2diWUcteF92M0puTzJSYXEzUnFqM3BlSGpGeDBoOWpfMDJhSnhKNkRnMlBWaWdKTGFVdnFHbkZaQm1ncThKbWVVODdRdTBqT1NIWkFueTFFWWF0N1Nsb2FTS1ppUFhDR1JQQThXTHM2UFJGWWFuYzhvam9fVHlUT0RfWHB1Vk1BQ2tQYXZiVmRNdWh2MVZjZkNUMklzVFlIZXBsY1VtTnE1WnpDZXZIRFZycjM3YUVTNHJRM2FyeFR5MXRnbWl5cTdOZ2FvcE9NNk5FcDJSSkJnM2RVaXJIek9KQWlsb1dsMGFlTHF4SUh4TE9GU1hIR25CcnByZHAzQjIzUkVnUEFIVm1la3pNbDVEQzlUOHNxTml4UEVPV1JyTWZUTzVrMXZFSU10eDJzaDJlSjRDWmlxTmc0S0VsVWxNbXBVZkw1YkJFR1ZfY3FkSWV2LTBxMDljTnB5YnJPY1VoWFpCZ0VrQzBDd1NqaFoyYUxRdl9wOE5KMTJWTFRFN3hZTHdINktqMkRCalNoMlZqTk1ycl9ZWEVYWWRURHZFeUxBeXNvM1paUDBTX3VzNk5FNV9oSkRub0Y1dWlWdDE3dWEyT1VsMmNhTWRJLVZCaFBBaGlKY3UxWXA1UlR6ZVpxSTVHZHp3Z21DQ1M2OEg3djNPVDlheFc5QkpjTERqeWFRWGtqQTJoMUcxT0puNzBKVTlYZkNja3pJclRVYWM5QWZIVFo1NUE5OGlaQzIzbUR6UC1jRkNnUGdDbEdlQmVqZ0kzVGZhd2dFWl9SVTdaQWxmbWRFNjdiSDM2eVlsQnlfb2MwMW1seDhlZGFuZGJYc0JIVU5CVkZXOFNEUkR0ZXBpcXVQcFRFS1puWGsyRlgyQ3dXaUVBVHhXRF96VlRGVV94M1ZGR1ZjNTZXYXlYWUthNGpIekJ4RXdPbzRSZFFzOXViaG9makVnWDBMRVVwQURZQ3hZQldJVHJBYU9jVzhtSzJPd1NCYlJXWTJOSlpJeXZTTDFMb0RHd0hzRnBLZTF3N0Z4V0xxdmhRVlJxWEM1czZ5emdyVkxKZWZaeFB0WEJNd1pHOUNWUWNieXZNNm5hcGctRUpXOTYzZ1lTc2ZLalUtdXpSdWdnajZydDV0eGU0bzhlSFpxQUpYMHhNbVVUYnROR2d4djlENkFOWEZDb09KSExDa0NaakN2SFBPWldhRzhpWnlHeFpQSXJjZElPUGotUFJTRHRLT1BiYU1SRjFFZXZETnd0dVNXZmxWeVItQXNOcFVWb2VtSmZ5VHB1Ym5Ccml4TmN2X05ZdzJlWUtTQUZiZHVGWHM5YnZqdWE3dERBMHNaQ3R1TnNUWjVyQmtMM09uQWxxZGtnVHRYaUx2Q1Q0QlVhdHZXckk5bGVnWlAwUnRiWXpKNG1nRWJkNmhfOWc4TjlMNjVGRFp5clFkYmNJU0RVMWwzODIxemZZUklIMjNRbjEwS2s3c0Z1NklrTkF2OVhuRDFOLWtqM1B6ZmFzTEpzam1iQ3FsR25SanhSLUN5YVM2NWZYTU9FRXY3a2RKdGVqR3cwTk1pVzVOQ29Fbl9vUGhFU0ZzVzliZFN6SW5BSWxvZ1kxUzIyX3BZNzhuWmJaalVkSUQ1NWc5c1JUeENjOTRBdm5FX1d3YlR4RzJUWVlXNDRPTF9odWdsOUJtTk9FWUF6NnMwX1ZHMUhvdGZNcnVfTmdWZElYb2lBYzZNTXM1dHFidi1RbHgybUhWRDJBUWRRb3JILWZQY0NpdmJON1ZGaml1Nm9JT1pBcG1RS0pRT3BDQnhkbTB2Qzlyam9JcEZHSE5FMVlWdzMtclRkOTByVTdFVFYxXzdLVS15WjhULXNJZHcwTHBjeWExY3lfYUM2bTdLN0tEWm93QlJKOWpTTWRreFZ4QTIxX01UUzVZaXhhcktObzhldHcyRnpNTkZBaE9IV01nWjhSV1dBVGMzSnpWcVpCRmJndDJGZlZXX2p2LTFUb3ZCcHR4cHFPclNTb0hJMHY3aGMzWFZ3M2l4T25BUUh5UHktZnFSd2ZxSm5IOUlPXzlkWEZBLTRxZFZlUjZXLVRWNS1lRGFHYVJUOTIwRWJEY0VGblNVbjhFRGJ6RkJnT3V1OFRFN1FMX1QzM0MxN2xCOFVtckd1OVVQbUhZazFZS29rR0s1S2lPQjJJc1pTLUJUZlRWRWl5STZOMEdrV2hpemNxYi11LXlDdG9UQXVzaEN2N1ZaOXJHMktFRV9mWEdhSHdib1lsR1RUNXdicVVWUU4tZzlVRk1ta2NoNC03NkVCczZMRHNEYTVteDRSdmNWS0taR2RMUExLV3RNV2N5VV9meUM5UFI0Ty1GRzltaWNMTzNiam5HVDR5aFZjdXNkQmhFdWJqNW9nYldKbVhTa21HckZLR1RLM2ZUa1NldEhzTFJzdVF4Yng5QldCUmFuVWpjQ2dSUUVrUXl2NFNEWWUyMjIyYTRuNWh6TXdkb0RVbGtOSnQ4TUp5eXpOMjJST1F0S0VZcERybnRnR183RC0wcjFYWE9vVFFDUGcxelhObVZkcXdCZ3QwUU5kSi1oY1ZOODNnekhTWlAzUFdrajcyeFZRT0FyR1I4REdORTI2Z3RzdFgzZUl3Z2h6c25sRXluVzI3a2o2VnB6WEt1dHdYODBfc05mRW50eDBDckp3Nl9iT0VCaS05cl80Q09ESmVEbWJzZWUyR3lFYzlOTXhOVGVXVFhISE5hWDIxMXQ2c1k2VFJRbEJJaXBfa0VLT0tSQnNvSGVMaTl4Vm41T28yaWppTWU1R0ZwbGRXUWdRN0t6bGd1blZ4dU9tUTBXdFRHNHFVNlp0NGhUdFVISVczS0swa1FfU2VIdkJzc2VzRlM5X1pXc0ZOLUtQS1NEb1h0QUxRWndVMWpPX1NKb2FqRDFmSDg4eXBnZEdydllrLXM5YV8tcVFWMjF4TnRrS1g0XzBwZHZjdElueFJvNV9fa1hpZEcxV0h6MHlDX0w0eUlOcWJndmE4VW1WRmdqWFhfajY4bzN0bnM4bHJobE1HdzNhXzVLODVZelhWQk45eFkxdTZRU0VMUloyY3E3QXRfRWt4Zmk1dldQNk5qbEU2Tlp5Nm83VzBISEJHT3hkVGV2YTdDU3BHd0dMZkRYd0dHVlI4QkNSLWF0OTBlQVZwV2FqV1l1U0xQNDhrOGROeDhySldpazRWeFZxeU5BSHNnaTYzaFMwNlEzaE1MT2NvRkxDX3ptOTRNWnk5Q1Z6cFp1NWJ1dzdWZGFBcHNkMkdUNWNNZWZqekhQMVZ3U2ZqMmJBNlF0QkZ0SFAwa2U1LU02OTNieXdxVVBzQmRvUnRwWk0yN25EaUNIOUpiMnlHUzlxYTlkNmM0Z0tIQmZrcVRKRERoSm9zQmtDWDUxVFJNeFpEVkFNajVKVEg0dHlzZXFTMFNlcTdja19DYWVEWWI0d24ydExVaW1DRk5sUi1Qc1ROdWhodGlNTUo2RGJQdFR4NlFfU2VvMFhCVkhvenpTV1lkcDBNRVYwaHluczRJcC1uaWFhUWRtVjFZSTNLUk9pX2hfa3BZOGhvVTZCblFCSWZMMUJScU84RFA4OWRPVXBKdVNiemVlMEhuU1BnVEdFTk1xWUZoM244LXpjSm1Cb1NscHRMOHBuc3E2bTR6WTFPaHc1NlJwcXJ3N0p1TlJ6Q1g0OFllMEN1WWxJLUZOS1RTclU2UmxHOG44SGliNjBzd2tHT0M4VDFlX2UwNDRkdEd0R0FCUGRUSkhkaDd2WmNyZm5sR2FVZTlwTHFsRE5ORFVac3IxWkxiNURTRng5bVduRmJmVVpmQ3pFWkh0a0h1NDl1aXFQVlN3NWFBZHdlMlJrc2Y2SDNKNE9hcHdkcHBqSWZHUTNBNXRSaUR4OVlRMXhhLWg0M254bkZiSXJfS0pQNXZ6U05pSEEwWXY1WVctNTRtVnFrOTU0ekYxUVpJd2FRQVhXMXlCUEE5aVlHV0hJajNIR0NtX3RBZDNVM1RnbGVzS05BOTRIUGRGVzMzUUVRRnpqMk5ZVnpaamVGcnZJUjdRRWlBc2oyY3dPdWJmdUtjMFVfZ19jRzUtUTQzRmlZekY3RHhob0xRVW1YbldGSDV1QzlQd1prMUdzUFZVVU1rWnB4SC1YeV9QY1RWZktrZUFreHY3RFZhbWpMb0hBOFRINmpIOVJJSTFCYUJEdzJwOVd6OHhrX3A0MkVVcTdYZzhOSjdsM3luM3ZmNExFa0xha2V0M0EyRXM1ZG03ZTVtbGlaMXV5cGpEWFpJVmpmNnlfZDFaZ2FBc1NKOVZxdXRsT3pyUE1pSms1bDNnUktQMlJhTGlqdlBaekhVWHZ5ZUs0UGdJX2Y5dU95aTJWRDQyVDhDVWphdzFnUDM3b3VYV2hFVDlTSmhZYzJJcnVIa2FrV2hJS1p6TE53akM1dGJsdFNIOWJXSTlFNXpMOVI1VDNwVnBaRzJEeEVjTU14N1lEeTQ3Q0RrQ3FiOHdhU2lHeVdkVjNUTHAtZFB0XzdibGdlUVY2dkdpVmp1RlRwaWItQXZxX0ZEdEpSRHo4emxBbk9WT1B1VlRQSUx5M1pUZUc1eFVESENBTXdEUUxWTkVfRjdFeWJ1NEJ1bDhGcEwzeFF0VmtmLThEejJWb1FtNTVCQ3hrU2JVY29HcFFoM2FqbHZ3UElpc1FxTC1GYm52RnRkQzg4cjF1emFtOXdOdkRweTZZdHZaTlJVWXRxdlUyQ2l1dVIwT2lkX2RGYXVPeU1JYy1LZ0ZUSDl1ZkZTUHF0YS1UY185VFRKWDRrTmxCQmk2dTNyM0YzTWd1bjFvS1MxaWk0ZHVVSC1kYm5JZWdEMDQ4dTgwbk4xT0Q4aEZkV2JkMEpqTm81a2ZkSXMxcUNFVkVvY1FXMmFlR1ZrYVhXLVZiZDNOUFVyWjFROGhNeHFQbVo4ZTFrMjdXMHA0a0xfZU5yamJobXZuNlRkZm1JRXY3ZlVEZkZGVW1sNmdfMVBNNUtQWWZkNXY0VVltaEZZM3dCUXNHLUhIUVFBWGlfVUVnQ05wT20xZWx4WHlTTkJ2WmJnOHhFNEdESXoxZ2g5TG1ub08xbEFiUkZ6S0o1VlV1cU9PV3ByTmJuVWlCaWt2aTAxWmZzMm1fcWE4bzhmTVpaOTlUTVNkb0JYV252UVZFTzBCamVMemh6MnhZZHlRNlNzcS1zUklqMm5ScXV4QkFtLXotejZZVm9GVlF5endmSldhbVpSWVdxZnlhdGJWczFPaHlyRTlMcXNjTHp4M0xmNFhhWFJubVhibi0yYW5aNHVTNWc5azRETkFPdnpHenJ4dHF6ME9WdlZIcmtCcjBtYjJsRDlYOTBSeTlfaXpfdGtiZ0t5Nkh2dkx5QkdpdzRfQThJeHp0Znp6TjBfSGp4dFhvMUFmbVNvZGl6bnpkdGpSTFc0dlZzVlNvbVhJVGtVN3pEWmRxYU9tS2RtNWVvZGtGVVdLdWo1Mnk2N1l5MExkdnJXZmhMRHBDS1IxZ01Nc3hnSWpBWUlzT1o4bEkxRlU2OFZXYU10TE5XaGN1aFVfMWVaZzVZa09HWWJDM0NXYkV6cVpOWnY5MUZfM3VXaE8yTVVPRkVYbGRWdWtJRDYwcUJyNHFybHF5N0Jic2ZyM21wdWlJUFZhY2JJZ0lPS0pHaDRlYlFRYVJjekwxeFZrdG4wZGZwaC11YmNYeVdkUDRYNU9hQmZoOWZDVzRjUnQtYUE1SDBWekpUYzBQNmQtS01pcVc3Qm0xc2lXN0VKNFZCNkpKTzVZUDBMS1dUaWNvcnBKTlkyZHBiWnltZlVsdDgwcllLRHVqdzZQOW9aZERNMEhhbDkxbnkyamttT0xSekFNbjFUZjRSZnpWejFFOWpNYXdFeHFXbWtWYlNOMWQ4dE1pcFRuYUlGVHBUck5Nckh4M3F6VzNJN1Brd2EtYWZqQTB5S2tBNkt4c2FwdERlSGo1T2hDQWNoYkxvZHVmMnc2Nzc4MHhuQzZXQnktUXZzZ3BuWHpQdXFJTUNYT3JaTmVORFhmY1ZTUFVnT1BTVHpJdGt0RzZObVQ0SjI2Uk4wVGJySTRsNXNieE9mUGJCQ19tT2JfeThHa0Myem1QbDlya0xTd2pFUU1DTzVKSTJtcUw1UmgxUnBSdHZvWm9qVXhDSkczV3hIZzVtb1FFNlRKejljT3FUTDZjNTM1WjR2Ny1LLW5DdkhTUlV6Um53SlVzNEtrTEZPVXRWQ3lPOXktcEZzNjlFNWYwQU1HSmY0bk83SVltUjhKU01oWlF2eThPZ2w3UTVTR3pmVWxvcGh2NE1hY3dPNENYd09sUmFlalRMemh1WV9aOVFOa29PMkptRGFFUEY2X2s4NHdYd3RKTjNYQjlSRmgtd2xWVGk2VzV6WWxQdTZ5eHV4SGlGaGJISEVRWHI3NGFTQ1lMYi1fQl8xOFlzMDRVYnR1SWZBc2p2MndSWHlYaG9UNUxrd0c3MmFJeG5IdWc3a1J3S0E5dVNDTzVUR1E2bUJ3Q3d3TV92YVUxRW1ONG53S0JRSXM5OThFT3p6RkRxYjl3UmJFSGtSX2Z3UE1IeVJ3MXBKSmhYS0lSR3Z3N1VwZ2NIWjRLd0pWQmtjOTZSWHlLYUl4d2gtUk03cGc4YTducDJNQ2diOE9ydzF4ZGpFVG51dHJHZlI3cUFRZ0hHVGVnTFdhaG42dnZDVEhlWjRnNlhWcWZEOGV2RVliQ1hNWmN5MFc2MkFNTDdwZ1FjSjBGQ0hYWjZUMVR1ODFjb1ZiNEZKNmJDRlRWa00xUGJaLWtYYnZuSF9sRVlSOEZGaTVaQ2NfRXZ3T3RabWJKcDZKQS1EWjVMRHdtcWIxZmNfQUhNM3lYX1ptWHJ6QUlEaW5nemROQTV6ak5VbXdlZnpXallDc2VBVG1vNjVxdjhrVDFDc0ZzYTJoTmVKLTZwWEl1clVUWFF2ME93QmpyWFBkMXRLQVVnMGtxUTJJZTFsVlo4NWFRU2l6NExwT21tRWxWNzhEODl0dUt0eWdYZlgxLWNJRXRRS3dkYkZLS0xrUzRhWXU4SkFhZkhjd0p5N0diMmh1bUttWDhsdzhFdFpMQ0ZWM1k2Q3B5dTBPTUFwMVJuc0dEM1lzVFFISS1mRjgxWjgyUTVrZDh3V2JVUExSZDVvdExtZWY0eFdPQm90dUFfaWxDWjY1eFdqay1Ga2Z2bnVGR0xFZGRqWHJGbHB1WDBqMGFGSTFmMDlyVGlDVngxQlY0Sml2X19hMU1nbExDcXc4Y1JYcHo3aDNCbUkyd2N4NnUwVUFqcnROTFNBOW9BYlE3Q2pwdjhUTWVlc2N3VG9ZMWxOVlF1dFhDWERidTEtdE5mT0h4ekdYSWtqQWdjZkJucVVpZlJsZ0xKUEJGU3piUGYzS1FSRFNndjNvbWhYUzh0RVF4MXhpVWgwQzMtMUJfM2FNR3B1VGNlME9QMkd1Szg2Y1h5M2ZmaWIwVFpLM3BXc29DTnQzbUY1TlpMNEM4VzlLWGFDcXJOSWxRb081S0JCOC1IYjVTc01hdkZLRmNFMnVVWnpMSGx2RG9mVklrNlpPUjlpTTE0WFozMHlpVGxsN010bWxIWV9GQ0pfbVlWWW1GblhiNWFhRl9QbEpyUEpfNUs0LXBES3F6RXMtXzlVVHN6Zk1TSzVqZ2dHajNsMEhGUG5TVUZGd3JGRWpyTTFiVWVuWm1aMFQySUJGaE5zaDYxNE4ybVVoUThZSFczMHE2Y1pnblQtWmlqNmt3bUhZaEZVUTN5VkdTZ2RTaVhoUE96WEhGRENPMmYwTFROS1JYSXJQNDNwM2hNZ19uR1ZsTEozWDZGdTgyX1V0aVBzUjdHOEhORkJYNGdSRGJHbnhtYjBWOU5xbmVkMm01U3NZTlJiQWNLUHVGNXc2a1JjQVpHLUVONDgwZmtmMUpEOUd1TVloUzZ4aDhOcjI4ZzRBU29Rbm9Hc2xXQUFyREdBMlJ0MHBteGRUM3NkT3BudEpITndZWXZROGctRjNES3c2MjFtQkdnb09hTkJNWVVBb3E2R1AtNzI1eEo3WTRTS0lWSVlkVjhsWVA1NDNrVlljZm1sWGJSNUszal9KR2F0X3VLcXkxR21MRk93el9WYzZKMGk3Wk5SVHlVdDV2cXdjZ2wydk9IWk5PeUtwMV9aQkRVRHdxd2lBakczY2oxZFZJampXSFVhLW5EVTVTdVh6bEZMS0x3Nk5PU3pXcURjZ2MwM3l4eGpidGQ0V2ttblBHT2FYM2pQYXAwMXRNTVJyaXFLWVY4Rnl0R01fb1RKX25aVWtfM0FMNEx4ZXpaUG1Ib3pkbzd1LWlBRnEtUzNlY2Mzb2ZZWTRYUUJ0Z0NoX2RuS2NSQlUybFdhSGRPdUhmNGc2N251YVNSNWtuVzVJMUs2b3NSaFREQ3VuZGxickVjR0E1Mk90TXFoeURXOG41a1hWY1Y5aUkzTFptOU9CMU9nbTIxbTZkYzBhRnp0MFBLNnd0R2ZwRzhtdU5QVUMzTm9IUkhRX0U5MF9nam5BOElWSk1sZTMxb2RDWGdQQWlwOFdkLV93UEp5cnhmdmtlcy5Xc0tpQktCZWhIeTRPcWllb2lpZk1R"}'} + headers: + cache-control: [no-cache] + content-length: ['42692'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:42 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/b0c12a088c7945a4ab7167916bd62033","kid":"https://vault105115999796da121a.vault.azure.net/keys/cert96da121a/b0c12a088c7945a4ab7167916bd62033","sid":"https://vault105115999796da121a.vault.azure.net/secrets/cert96da121a/b0c12a088c7945a4ab7167916bd62033","x5t":"8e1PyG6osgreirsHjmBBcctrmx0","cer":"MIIDOjCCAiKgAwIBAgIQSe/9Sj+kQjeUQZo58T572DANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMwOTMzWhcNMjEwOTA0MjMxOTMzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDU5XTPjItKtVCLuSkAH1UK7G13Um922mxja8lCvXuv+YHxdK7fHA3QBJM8DbluvRAkInyxIN2L3Fy92WRHZ0kinY1DOtOQre8SDPkuLMEzjYip21HDPpq8V97usfRz4UdQ0SS17ovVQA5n5mZqI42Vc74H0EoBWMjDP85tub8Uw0kvloFBM/+4NO/fJChGb579WX774G2icrO5n55dSrv1YeTs+QZjLPsHLFjGxgWlxiDyoFq+xfYVgE1BNHcbX1WODOtEeqAeaf37R47NyEUvn/Ij/KnT6HNCt1vQ9va03a5Ibyblnw+1nPF4cZweywavJnV1EHksHgB3hq8g1r1dAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBRUagEIj9+9zEWdIxotcYUaDDdmuDAdBgNVHQ4EFgQUVGoBCI/fvcxFnSMaLXGFGgw3ZrgwDQYJKoZIhvcNAQELBQADggEBAL2Y2HETAn86u4zN6lRi111iDAviWBLDKg6pbFpqivx7z1gld4a4PHGINRJHgu2pN2+TUVuMSkfR8DmH3JUG3CQX25iuSia0Y4uE51Da2WCWc1ip6qfT4Qwep2m/MffjpA4fLY0oC0ychfKdCTciUa4oU0QdMKVzRTw3bl2WQsA5IWAbiLvx9FDkDY37Vfdv9XbXRWhSPDU8IugpQZ68JUuJ0nULvlrGIoefGiw9ZuTBGS8i6ycUVA0fZ+TLB/dFuw2Nw9j93dCyLZUv6v03t9Ql3uUov60Rj3WkEHlD+MkgIKej5ahtRtm7nCc8UmNu7m6sNqCeFohH9V1b4pepnUs=","attributes":{"enabled":true,"nbf":1567638573,"exp":1630797573,"created":1567639174,"updated":1567639174,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":2},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}},"pending":{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2358'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:43 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLkt3V28xNE55V3k0YURwczJVV2pKUjZ6U2VlQXZpRU9YUGdCZXp1RS0teWpIZFd1YS04bG5WVDA4T1NPeV9aWUN0MC03ZUpsbUxKcS0tYmlJRWIzR19zWmE2bFRZb3R6bGdEWkFrbGcyUmRSYUxSRTE1UmtCYmdNYTl3eE81UGJ5N19TNkNVMEdYM2l0X0xzR3JCSmZQSW8xMWpPelVoeDdncHJyakh3dXBncGhmTzl5by1HM2xGUDd2Wm1mUjNoVjF1R0hJTFlteldxc09Rb1I4T3FaX19XYkZkOFJNaG9iWlVuZlFsNkMxQm43alBfTlBFcUpHeHg4bDdMRWNMa1ZXWlZMRUkzRWNvQ0ZzRjFXck5Tdjh0YlBvb1lpeHhfRlVnS1ZCMnlaMXA5bWk4X3h3TlhsSEdOeEpFZ3d3V2Rxb3luMUFyUVh1eXl4VEZSYy1Vd3VNZy51VTQxdk03NVZ1c1E2ZmlYRTgtSFpnLkFjUExXSDdhSHhoZkpWQ05IWUhhNEZadkxRemxIdktGc0xLeW9TaWRtUGZTaS0yQVdGX1RGV0daZmVWTi0yeHlSZlJYazdXR1VkYlNTZWx2c2l3U0YzZmdqTGJBeU01M0VwSFZyVWhnalJjRzdQeEZaVEhTVldybFFkRTZSZWE1STdKNDYwcDk0SUNSaHFkRWt4Mlk0cm1GcFVWck0taXVKaGpWSkF2cjNCX1FrbGxKaFhpWk4xVldsVnVrSWVVOWNfZ2hvVEpxeDVUcThSN2hWOFVfNmVfeDJKRm5nLWMxalg4NWgxS2ZmQnpEbW1CNmZjUWw3ZE9XRnV3MGxKMWpnNWZRMm9xRGxIaDlvTFh3ZS1QbDRnVGhCTVc3RUEydXpJX2lQUUFaVlhDM0xtei1YdWxEZjN4d19ieFVMc3VJM0RhTUptdWdsWlltbTNSYy0xbl9HV0hvV3VybjRfTThweUd5LWRWeFcwUDJqQUVyUXZ6cUo2b0NFcF9mc05UelZkcTUxaWRxa3pkSGtIdGkyZFFDd3FoclZLWWxtN0FRTnM4elZfQlFycnRSNjdSVVNjWExqSlJ4TUhHTEpteFh4QkRnLU1oM01ua1VGUjl5XzRMWG0tcGpwbnhYYTI1QWtpWmJuUFY5QWtnclhoMlI4SzUyMDRzQmhMaUdheUpiOHJpTC01VUVkZVdoQUQyUlk0cGd3cFI5TEhBdmlNVk8yMjQ2SFU3SHY4MHk1a2M3Q2VKN05BR2ctWG0ybXJob0NYSXFoR1NzampUNm1Pa3VMV000cVIxTm9zM0NOeVJSZ3lwdDc5dzV0dmtmNWhPRThaMnlUYmNURHlWUGpPRHJIMnFaMmFqQmNwcnNTZHQ1UzBLWURQLWw0R0ZMMldTR0dLdzEtNWNIRDkxSHRZdTMyODFtUWVhOXM3a0paaEpXaWE1OUFFYURDeE5IVDFNUWY5LUJ0S1VuU0tLZjBOc3JoVlgxSUhERnBaOXRWMzU0U0lUU0tubXZQRlJSbUdyZDdIdjRVb0g5SUJSbS1VNnJvZ2RtRXZPdjdqZlFMcUljRkl4dnVPaWtZSXhyVG4tM1IzOEF0SjdEOVU0Vi1CRTNGS0N3WUgyQkx5NkFuY2VvUmpJLVNYWEhsUEM5RXdycW5maW93MjluNVNmTzAzSUJKX0hiRExTOTczMjc2SUZEMFFoQkllbFk5WjUzeElsa1gtTkhxcHBzdzRWSERGQ0RPaHFWOFRJSVhGVFBzM0FQYlZmZW5kLUlJRFVZbUF1R1RjSXM0bWJ4VXY5eE5wY3U2NWR6eUlHN3BIX0dtMVVQSGFWeHhJcGpmQmlCMHZ6WE51UFhfMnhLLTRVT0tUVGxlVFA4WEFzZEIzSHg3U19fOFc5OHNoNGkxS1JWWWd5TS1sV3FkOUlOa0dWMDE2bFVtdmpyVnQ5cTFSV29CTmVXRE5JbGVPZ0k1S0Y0aGhJMDUxWndhV2xiRnhLVkdnZl9ieEUxb3FiVU9TYkh6QV8zV3pLWW83MWhVWkJOZTZubjJ5UjJITzZuS3o4ajcyTHJham10OHBUb01LOThta1VqSmtxWXhHVWhsckREeDBKS1Z0ZHQ0dEdIQU5wTXZCajA1Sk1WSE0yZ0FoOUZwRjB3cWpGZjJLdjNkcVRCRm5PWXZhLVZfcnZzS2RSNDhkWlVCZnM4bVFENUxQMmRIRS15NUFocTdrY2JUU0VsbFB0T1lpWHVoVmlUQnZVSHk1QmJoQndRdWpzUklGd091VHlMWmw1Z1FfYndHY1dBTlZ3allDR1otRlJPMHRjMXNfSXVVUWRzcUxMcVFkdDRBRUNqdEZYME4zaEw2TlpJTUJLRTZYQUhLNFYyQ1NWeGZjYXcyLUwyTVE0UV9kTHAyUG1uZ1c0TkZiblBxT3ZPemlTUlFDTUZyLXY3cjR1ZHlnbWNETWt2dVZrSVE2Nkc5eDBqZ3hEeVNIMFJyN3VMWHNVVW1MS0hkVmx4SXBaWjEzd0Y5WTJwSVVEMnpGTkF4Mk95bFJLTmJKd1VGWmxoU3ZMWGl4VWpLUk83dkREWFFCNThGNFpkMV9xVm5lb3ptVWhGM0JCdkNjeDE0YXE4NUNPYnR4c0t0blN0WDlJR1ZPUWwyNTBpb1ZKOFFHMEhjY3k3c3RZNFZYeUZFaUNpSTdta0RKZi1rMWpaS01mZGo3TFQyTUpCU3ZRWVBLci1kRm13RzdnTU1rUUlWbHVSV1RYNEU4eF9WY1NJWmhwWmlCbnBSX08yUXVJWnBWdUM3YVUtRHhQd0VNQzAyanVzYkd0eVU5VjIyU1cwTVJPN0RKcU1QOWEyWDNUS2pjNUhobFpGRkY3aHpGdFFXVU5ncnhzUTVLOHUzTmR4V3pocGJ6SjdLNFc4SnJFVUhLYlZUcGxEZ3lwMU1qa1lPc0pwdFNEaUozc3J4dWg4aElLbTJnSFpoMmZ2MkllZFA0c084OURRNENHQjVhNVNMVmlUM1hObzUtV0RabEVMbHNhZHd1Sy16Q0w5OXhlQXppWkpzRTV2cS1ucVdUTU00cUVGSGprZUUzOV9aNm94TE13Y0JlMmIta3NGcE14NWdENHkxWTV4QTNZWGRNQVMtbTZiaGM2QmJNaFFSdG5WYV9ZU2M5Z0NYYnhDb21hY3pmY1djYk9Kd1JxN1pfX1U5b1JyeERndndIY2NfYWVmZzR2QzY2ZmlDekFhR0NjcndlN0d5bDZOMG5ZTWttYVFMbHhBZWdoeVJ4dDBnZ3FTelZKUm1aTkR2NjNDTXBsNDJMa3BzNmRiNzJsdWRwQWJNS0FYSEx4OVY1UlVGZzYzMkRkQmdDSVF6UEdTNjc2aUJNbUtlajV0ZEhHcHktTHdUZlBBYm9oS0l1X1NnMklTdFRWd3BsNTMybVh5dF9QZ2hFc3ZIQl92RFZtWENHeWxTMjJhRkpUWVBjWHg2QWNKM0ozNG9FbE1WUzRKUFRwRTlkS1VLQ0RVUUtXV0RCUE9DWFVMSUNLVnJyQUFreVpPMW1yaFhGb0pLR2xzdHh5LURnUWsyUzdJcFZNWnBQWkoxNUJybVZldlhaV3lXaVBfSUJfZ0RvdUFrb1FnZURBSTRFbHBhNVBQNl9pTnVpMXJvOGlTbjlwLUZVMzJSTW5BamdYREE3cFBSdFItTVcxOEZZc0VXckZFdlNsOWZZMG5rYlJxN2xFcjd2aTNsSTRVU2FKYlRRSUFjdGM3TzBfOF9nWFR1YlVFZjBSbDMteXhTcXJRcVRNYlVYWDlJbmJnMzc5bG1vd2xHUVE0ODBoTGVsclhuZXF1d0RQUEFmeFJqQVlLMnlrdk9saEpfMF9Wdy16dFFhNDhZRXpvRkFBTV9HbkdmYjM0Wkh0di1rQlJqZkZXaTdJZlFvdU9NeFZWZU91anBaODROemY5bHhTaTkzMWNMX3NwMzhqa1lzTHh5SmFXdUJrdzMtcm95N2wybWJHZDVRRGlKR3FhRlY0VXJDa3o1dFB0M0pPbUFkX3JaSVNXMllTR3hhS0VTQnJSUEI3TXV2b2VKbVlpNGYwaHNPb0IwMmFmUHFjMWlXYW5GOW9fblM2MTVyb2dYdktjRURqWWJEMUZiMUYwMmR6QlVWZXg0MmZYeXhySXNoMXNoUi1KX29sdVBNc1Z4UllhZkR1Nk9DSG02RG5VTEl3NDR1dm9sR3lhVFJCX2hDb1BJcnZTZTZqYXM4MHFQYndMbUhrcjY3YmM4MmF2MUtpUzFZZmt6aDFBU1hBUmFmNWVvUHlFSGlXZ3BKWDVJLXMyUXp1WkZISTlJUmhtbVJ6QTBza3kwejJCZDk3bF9lakUtYlBMNzhWN2ZQVkRiVm52d0w1Q3RnRWwtaVRyV0U1U2QxQzRNNkxNb0hTT2tGd09iTUlEeE9tNE5VcndqcE5HVTNDTnU5ck1WZHdpT3JJdjNkMldhVFpSSDN2UEJkQ1dyVWJkM3ZUeE5NRzBGUEhfNzh1SGp2ZEhTR2Q4NWFXSU5iSXpQc2hVb1JEZlpTdHhOb2ZGWGQ4WWhMZGlSV0pmS0lHUEUtcFFqV2h0UWhvMkU4dkJsd1FRQ0xKMFlkRTJNeVdyZWFmaWRrMkxFWXhDMXFQRmFwSk1mVXBwd1YyRHpncEQ4YXRaNGZRNmpPeGZPOW05aVYtelN2MTBRRW9hTTB5ZmNpdVc1NWN5VTRQejQ5RjMwVEJEMllwWVBycXk1cTdMU0M5OTczbXdQUU8tdElLZzJDSklKajZCamU2TjF3Q0RVMlByc1c2ckY0aXhEdW5NSS1xekhzZUJxMGg2WVNna2tQRzVlbGZXUmxubkpnZlh1NlByYmtlQ1pZMVVDZmJvdFNsTUl3bnVxZHhjTkhZV1dOS0lMVWhSWjF2eDNwaVFSdUZpbHdzT3g0YjNTWnJqWHZUVlZLYWIybDVjYThLdUhJWWtHZWpFRVVRLThRSkFRYWx2eEY2SFJDNnNLZmR3M1lpR05mazZEcWJyWkIxOWUtWGpBTkg1TWF3VkRRcktGWW5CVXpuNERxeFpJMThNT3V3YXZuN3EzcEhrZm8xMDZSRnBBQW1rRnQ1V1dFeXU3Njl3Y1h1b3ZBaWRsUmx6U3pHY2YwYnY3Zng4RkNKeXlnM19oTFZjSTdJb0djSGtaRi1ITzRuOFRRc0hib09oSUFjdzBfUi1kREZQLUFSaVU1RUlQMWl3bElNNDBGSHl6ZWdpVTF1M0xzcVRzdDBVVWdaRGVLZi1NUEdieW5yeTdwY3hkWGxwQUNiVFdWVy1HX2l1bm9wSngxTjJ2Rl9xMVpZampKQWlYTWxyeWVFaG5YaWJpYk12cGpwcmVaTVYwalFnRV9pajFnMVJRWFZCNnRWeXFUNjZhckd3WHBBbXdmNWtXREFOa3NockR0LU9mNXRYaE9SS2dLajBzZllocm9fRkpiSkhRUG90Sl90a0Z2VnpMSlpjUWJ3NlZ3R01LTHBRZTd4TURTTGlodTRwakVzN1FqNkFnRU15aUI3SzNWbGx2aFZKR2tDWnNmRWlNTmFfSjlEdWs1dDZ1UTMyMTFNYV92SmNmb0YwNmh1c1dpX2JUUU1JWllOeUdvNlRaUXBQTk5rTGRsUk1MZ1lrbUEwcHcxZEk1Z3VsUDJkdjlZRjU1T2U0RFh5Y1pkMWtLVzNkVEZmMTl4MTU2b1NfRzN5bU1MQmVibWM2M0owRE1PVkFqRndMY29RcXktdHN5MHpyM0FfelBQd0ZCXzhSMWJKanlzekxPQ0puNDBzNFBhZUlUU1JsNmI3cjFPeWQteUYtRmNUNzZ0QnFURlpaRlR3NEREcFE2V3ZFSi1LX2FJVWRjY2JrUWhrNWFDVFlmdlBmZ0I0SXZicVliRVdEZ2dHdVRQbEFDZnVfUEJXckoybEJ0aktHOUZyVWFrbUp6X2ZScXdlT0tlNUh5M3JzMWpxWHJhUTI2YzJjSDlyVmFweF9MR01XZWdwdEN6RjNsTlVyaDgyTkg3SHFzc25mTldDU084bFQ0TWVBOTVIX1BfdnRYRFgwaTJpd1Z2RllPMHJ0VlZMdzBmVDJpNDZLR0FHR3Y4bjM5Q2hJTV9GcnpjLTBOSmVGVEwwQTVybS1hYklqSlgtME1vNVBiVjdrcjZJVTYzUU16MVUxOTJaNHFSRU1OYTNtckNzaG1LLTRJYTlfQ2lVWG14RWxzNlhuYVNZb01EeklZcDI0blFrYk13X0Q3TUdRTHdTZUNaOS1LdHlWbzg0MEZHeE8zUDBia3NRRmw5Wjk5a2w1T0VjbGhISFFTcUlOUXhFZFA5d2s5MFRDb2lQSk96UmQ2RkQzbC1wMEp4NEZ0MnU1bWR0WWJscWZteXZjRnd4R1Q4SlNPZF90akU3d0xlMmdncllpQXV2djRGb2hzdkVQb2JBQ0ZuRG1UaVhNNk9vNWJ6S2xqT3d5dlhlQzJaTTRaU1E2VjVGNXhtVHNHVS1KdzcxRmwtblRGQS13Yl91U194TGFCTWxvaHZoX01LOGNqX2JYUTJsdjNWRmp0YTlsRzFOUi1NVUk2QW8zZGpxVWtiSnFWbnVqWFE4STFzZEtpU2haaWhTOXZPZUtoMDNMMEFCQkwxRm5mT3VjZ0hCdmxRVEUxTWd3ZVQtMElzTWdIX2N3QWl5b2MzRHhrYmNWVUJ4V0FqZk1zN3JuYmxCV2ZCNEc3RXlzOVZzLTlULTA1Qkp6c01Zb25OZ0VVRjRVMzZzTVV3bnZ0LV90SU1tN01PaVRTTEdJUldUU3ctWm1ad0FpRlJSTEx3d2dFOEc3WndsNWRVbXRTbmR2Rzg1RjZFc2JoREZPQW91WDI0REp4Vi1ZOHZiX1c5eEJWUERkVHIxUnVuOC02bFZnaTRJOU1QVEhUWlZXaDh0Wi02dEFmang5T2JIU3BJaVBCQVRqdmNzOFNhNHFDaGNveWFpcmVsYm44c1ZoeUE5Q1hIRTljSzhwQTR0UWxZM3JfTU1NNVFSOXBjbE1zOFVjMWg5d0c4eFoyQjNLWjdSYWFzdm5WQUZHS3ZUVG5MVm1tYlA3YTlWOTFfcmVOc2ZydHNPbTllMkFaWHY4dlRMNFY1RmU3U1hyanNaNTIzWUR0YXBsTzhvV1RWblMwdzVubEozUEZ0TVRjQktmVXhHNlc4NFh1cGVjam16LTlnYXVVUHdXV0NlMXlSaFpnaXRoRHlZWGFYYUhLdFBEa1pjQ2x0Q3dWTXM5RFg0X2E5ZWZCRkNQQ2ltWGJ6Uzl3OXIwSnRMXzBLTTVxNE5uOFhIU3NWQkE3dWltYjUxYTMzVUVnQ3JpTDQtYU96WGNEVDZwTkh1VlZWaEVJOTJ6QWtCcVZsenlyaHRKd1YwVzZSQlB5VVozNmFzS1dkM2FqQUNrLVM0NTkzQzQ4dkV3TzV5ZjJpWjJXSzIxYnkySW5GNHhCWDVtOHdzZE1YN3VkQU11TnJId0VhQjJpMmFjbjRJS3drcXkwd0p0cjBIbHBzVGVlLVJYYmJkMm1KQ0pHSzVNbGFWOW94ZVFncEdPVlhsRWtmYzVsMUFRY0Jkak82VnRaNi1LeTFoWDZpS29jbzhrWDBhbEY1RUNDa1N5ZXZyaGh6M01YQzBqZlBLM2JoYVFZQkpFakw4RDJuQW9wY0F3NHdZcjJLZGJwbmx5dW56cV9MZS0yU3lJYnA4OHVXVHA1RkR0NHVFRU8tOWJVN1ExeDh1VjJZcEQ4V1J2WEhGVnRZSXowb2JOUndSSFBSWlpaRVpmZmpITTBCVXdfb2JPRWhCcFk0RlpkeVM1UE9rUndPQUZoZlBQbEpaQkt0c1YxUlhvb2pHa0w2dUd5QWhXN0FVNW1PYVVUZGJsYXVtZTh5SS12WDhxYk81a1psUXFzbXlrRGZMOGlwZEFkdjNLMTk1TVdKc1c1TmVwMko1ZGU4QXFScUlvTmNXaGVybTZabW9SWnNRRElhMnJ6MUhDcFRtQV9abEtGZUQ2UXNYNG1reERZOVdWNXdXUnhZdmhVS1FvUXNLR0JvY0RPOHNZRzlyM2xDODJDUHhQbnVmcTBCd1VfdGJ3Ykp0cVRGQ1A1eERWWklDWDZNRWZQQXpzV0hGZ1J1dDg1OTNlTlE2Q3BpSzN1eWJJZ1JOYWVZaURqMHM3eEVfQ2prcG9BQjFFOGJfdE40bnBMeHhWOGlSTmZETkZYal9BOUNEX0hRMmhfUktJNXQ1OGJGODBVR0JtbUhxZTZUSl9HdVZKRHA0UExEMld4a3B1WFIzX0pVT0luWnlrS25OcEFaODhpcTljUEVRVWZsREtiMkhIRzIxcWFOZm9vN3BkWXZNT1ZzQzZnQjBROS1WM3RMTGZmeTEzQWxTakY2UEQ2bEdUS1UyYVlpZV85NF9oVWpLbng0OUxrbXBNTUFSQ3I1XzJ4NnFxNFdSLVBLemlSdWhsV29kWm5BQjFFVFR0U0pGM0FGV3ZzSFc0UEtQY3JjMDNKVHBzRmNqN092d1JqblFmTVpFdWlJaFdwZGYtZXg2TG5UQWw4SUpHV0p2M0M5cWlCR0hJRjdkcVlub0hVbXNJM0h2R0ZnMDdZeHRHTk05cnh5SHhVVzF3cGNjck9oSWloR1JuLXpJQzhrQUoya1BhMkJfZFdZZTFzazVESXpmVDk2b2h4Rks2enBkdl9LZnZrYWNqSjM3clRjY2NaWWxiSWw5YUtzYlhXQjVzZHkyTlNnRzltS1VtNzVCc2puUEJuTnAwRUJkRVhKTUhidlMxc1k0SVEyUVpTX1c0QkQ3NjZ4YWlXQjhUUW1LNlE5VHh1VTMxQzNaVXNBWHBtc2p6X2NObWRNa0dZb19OVm1Od09seUtNNmdzQUxNZGV2c0twNmMtUkFtTTc4Wmp2MUx2VGV2MUFHZW5Yd3M1WUxaOE81RWFVbm5vUWNoakRQN2tiSVRSWkc2eW5adEljc3dBSjJ6eHNwWThkdmZ0c3BoTFlEbVJNcnZ1Snp4MklhZk82cXBxWlNQVkp5dnJaOEJub3praFQ4WlUwNGpMdllySkwwZ0poYk1LYUt3SmFiaUhKMko1RmU2S0pPVTNyX19aZE43UWJEelp1aVFaUlJ4dXFwbTQ3cTQ0N1Y1YUZadlZZeWJ3TE91MlA4RnVROUQxQUlaSXRpRlJoOV9uRWdOSWdDcGpHUzR2M2YyT2M3ME9rcElRbnptZDhzMWhvVmdnNDZEMC1lWXZhTTV3SjhxdTNVb1Z6b2pvVFZ6U0FjYlNjTUIwNWhOMUFnWDk3S2ttQWtBRWh5NXhITnMwQVphRUFkenN4S1p2cmNwQ1pTYURrcExyTzJUNVdLTV92aVVERUQtODdodWpuSDdQVERaTS1pdl9jbjBuQWZoTWNYVTcyMkJ6VHhKdW1nWWtmM1NudlhBSWgwUmpiSUFhV1VjMW5uTGhLcF9xem1MZzVkUEVZeVRmMGxQOXdnSG9lUG1RZXRfNDNkTG85dnhKQm9neU9DUHUySkoySVQyZjBUS0d2ZE5kOXpxYTJveU5HYVhvb1dQR2d5ekNlLUJ5V05EbTBucS1zdUZScmNOYmR6U2JMZlAwb3V6M2FFdWZwODkya1hsVmRQNjlyU3FMZlR3ZzdjcnQ4Qk9abGs0V1lDcGozUWxuLUVoZTdLV1dyc09tRUs4cExKblE1YV9Jbk1UMkhtYzRwNUNFbkFfQnAyaDRtdTZYUnFYR1haY184Ynh2OU9yOFdXVGlkU25EWlRfLXZrcmdBYlI0ZzNRa3U1WjFreEpMU21ZUjhJZkJyTUFSTldBbmxmSDhDZDBtaTcwUWpmVC1KTXVHSkRxQmkzenQ3Q3FNel9LcFhjcjBIMGxhRXhwN3pJOXRJcjlaekNKUXlLN0VUTklULVJ6Q0V5X3hneUVYTWxJS0x5UVA1REJCSXZaRHlzWFhkc1p0OHppb2dGenNNUko0R2tMOEF3bE1nY081bGlITnp0U3dFN3dEYnppTmN5d3g4Vl9JenJ4N0tGb05rZS1ZakxiSDdjdUg1NzZyUDhPdUVITURHWE5DVXNVYXZ1M2xJNkExUGl3c19JQjBkVlpIMHd5Znp2ZHVWWlJyQjlodE1uMnRrV1dtVjhUMnVTaU5UOEFaU1pQTC1DaEZPNFh6MG5zZ2J2SlQtOF83ejVhT2FSdkx1RkdZc1F6cEJ4M01vb0FZTGg4c1lHaW40MkZoRkVYeXRUUUdIZW9rSDNMZkc0YzNHX09RRXRORGd3c2w3SGtrNjEzNEV4dGdFVEY1QUNtbHVaNUk4UHZEdjJZdV9iZ3ZIYXgxREEzOFFOZ1UyVWxPM0dlLUdaRUQwZ1BGLU0wejNaemhjUXFEdHNkNUtyWXdGeW9xY1FuWXBYQVFnY3NwWFZ1WkxZaEdaQTBnQWFIaUFjcTljV3lLLWhZSHlFdnFjRmw3eTJDQ3d1bllObV9tWk9OV3pxUlFwZURndF9KYkJvejlxVDY2aWR5NU4wMDVTSDcyQkpwa2pOeWFOODVhb2ROdmt3NTlRWlJQOFA1Z0c4RzJlbm92NG5sS2RqWnEyX1Zid3djYXN3VzZJT0JtVk5yTnVyWmVaQWV3cmZkMUhNTldQV0hQOVZNbjFKZXhXS1FtUXUyZm90eFc0NHMzMVFGSV9FdWxwT2JlLXNVUHpkVGlQVG1QY3k4MnFGTWNBNGhGNzU2TklQUXVGa0xkb0NfdTVrd0NVNWZIcWI3MnAxUE16NFh4VUM1QlctbjBlSTRla0llM2NULVRLRjBDQVVaRk5QWlpuQU5hYkptRkNtT1hIdzI5dnBPZUhoMGJZQXBCUEp4TmgzSW9CYlhibFNpclVLbEtIajh0OUVNTVNILXl2UVR2N0JtSVdISFhGd0ktUWpQRWwwU3FRa1JMaWI4QmYwMFUzTFBLNGxrRTRmZl9lTEFxRVFyTDE4czJOSmotMFlaMEYxTExTcTJ0TTg2ZHFCbVdkZ2hQem9qWm0wTGoyam9pWDlnRnppVnN2cXVVWC1pZ3VpcEtCTExFeG1hYXo1YkdYNjdKUUxRaWlEaVNrTUFNY0Q2OWtEcFVwaUQtRGpWSmNWYWtpX2l5Uzh0bG9kTXZDdXRWeUkyZUhPNDJOQk1zYzVQR1cxNkVsQ1dmdVE3NVNxWGJjZFh3TWxhczNGT2w3d2RHYXVCVmlUMkN2VUR1UXBKb0xYUURHc25YV1Nnb1NXTnBIUld0THc2eUttTmpkd05Ka0NybndEM3FwOEJpRDBhbXZzMmRRTTFUYnpWMmExMDJfeXJKUFJoc25oM0g4OVVId2V0R0RUeDB6OHhWR3VLeWJ5TEp1SGJQVGZucmVBM192WVlac0Z2RjFMNTMzOXdHaUhtVUJabTZ5b1EybjJFeUF1MWQwQkJ2TDZzMGRkbkp4dGVNU0ZYOGhzUlVrU21ObWNFVnhMWDNiTlMwbzBFRFBINnBiMlY4WkprNTZrcTFodDlodU9DSVpDUWJtcGgxZy14SnBaZWZBLUNjMzdzLW9RUXBjd1hfanV1TVcxVk5RRUhkdFFORGJuYWF4MmFuTk9vZzlOb2NVSlZ2ODRKbGxXZTI2eUpQQmNMd0tEdm5TaVp5b0FZNUlyN3pvblViNmNkYlBscHdQcnhZakp2dUtrZGxSRndZLUJxR1E4ZTVlQWV4emF4ajlCUFJCclYzc01DWnhoNm5iLTZZcVpkMjdlNWRrUTJYSmNpbVhUMjlvclZ6Y1NhRUo3VHR3TmFBTnN0RVJRV3RJaDhhdXR3NTV6VFMzdHY5bHhzYnBXVWd2X1IwVlNhWXp3RldZT0l5bG1FMWJVbzd6bV9EZ2lVTWVPMzhZd196aHQxT1NVN1czaS1QUzNOODJaNlc2ZUhEbWZLX1Z6N3pqSS1MOTZOUlhCdVZaQm1DN2hxazVpMVpQT0hZcEhmT1QyVGh0VWdKc2JBREFKbVFjbDkzcVdxbGxqa294Tm1TeEJlb0dwNjVGNnhnZVdXaEFrcWMtcDljRWU5Y1JnaHlsWkxodk05allic01BSG5VdGxibk9sNVI4LTVXZHZObEFpNmlNdUtPQTZzWVB2RXpNaDNldnJ0cTVjekRjenBGZlpKbngwSE00UzVTdkx3aTE5NFVENTRhOFRsNl9JQ0lWd0NtdTNRdGlkOS16OERSNHA2WjRkX0todHV3MlVha3lKUnVCV0VBaFBvWndnWnlfbm56djhfTVI2N1dEaXpuWF9Rd0RySnlSNFNPV3RhdU9PbEpvdHZHVnJsUlNDTzFXY2cyUlgyRDNOak9TSHlpa2QtSy1hcjNXOWJJSTZRRGtnX1hJSUtBaHNNb0RJbzR6VTBLdXlmNmVkdjFzd3M2ZndNRE9SVkJqT0htYTAyZllhbEcwT3ktWTBDb19fUWE0OHBpaUpDLUQ5QmZrS0o1RlIxa01yWTZzcFlnY3dDcUVYaFpaZEVHRUVVczVqcGhPY2lZVlA2TTRabzZLQVFwcWxKdWwtOS1xaHc2QW9DMXhPWV94R0NDTzFQaHVvdUpSc1BIVnZ1dm01WENSeUZUMThtclIxeEhrUzk4ZmQ5a1JDNVhZUzJZQUxGMnIyUnRtVmhzZ2dYV0ZaTU16bldBZ0NZQXhSVG9ZSFQwMjIxMEo5dTNpWEwxd2U1VTlqeGJqVlNPU0lpYXVMSl9lOFpuaEVwY3k2akVzRHlwRk1FUmJKNnBVZ1RENU5XM0FuUnM0SlBWYnpxVkw1YTNsMjQ4TEM3S0NxRUdHVGZFNnBGSHlMYnJhMnRnempzLThtaVdYdUdNaWRlZm9UMW9fRWV1QnZfSmkybmJKbnpQNFdmeXZhWnpkTUVUdGh1TkhHM0xFQktzNmZLN0d1RDB1cXJsdjhISTRKZHlJc295WXp5TFp4UUNXbFFxbmdoVUxNaVYxdEVLeEptLUU0d21BS2s3alFnd2dkdkhSM3QtXzNZQ05jYWVVWTBhZlVWd0tRaDZ5cUd0Z1RZX0VKMDVNcFk0V191MWZtM1VRRXlEUzVVS2F5aFlURTNadkxoOXhOOEN5bkhtaEV5WUdIOWYyTHFYMEhCZFNOYkp1OFh1T1JaUVBMLXUzVVdfeGlMR2xlekw0Uko5Z3ZleVlZQVdoRUJrTU5mMF9FLWVUQ1RISW04dENZQmdfc3dHcW1YMnoxM2Z0cDF5UG0wRzA3djBSUUZHem5DX05SNlBzLWZOWnBfRXdZMlFreGtYdWtPNHN5T3JxeHVNV1FndEl4ZlEzZExXVEUzWnRQWm1EaXNEQV9BalU0SzBmQzJmZ1dqTTJvdFlxUlgxaW1OQmpIbXRlSHpLQkNPY0E5a01Dc0lSaFgxb2s5RmduUmFqdkg5MTg3RmE4b2duMDdfTmNxdTNxcmVZLVViM0o1aDZSelJ6bU1KQ3ctNkdWMjZlcUp2ajFVdU4zcHZoYjZhVG5GenVRVG16ZXlhQlBPODMyeG9NdEFjelpZQW1URU04ekdYS0t3R0w5RXhwUWEtSFE4d2VsOHN2dWlBdkpYeUE3LUUtSWxPS3RBQThmMGxVWnZ6Q3N1S2JfWG1DLXlrSGVSYzByMjdBMEIxT3RDelVEUEtMV2I3dkVjSXFZT2FWdVY5Tnlqa016VHVSc1cwYlJjX1RwTS14dElsTVBqVDhBc1pmZmpXNVpsamxvcHFIbmI0NjlONkxvVWhFN0NCLWQwVE1NQ3k1SmhNSWxqQ0JtMy1qNFNSblJDWTdYN2dxU2UxVDI1QXZ4ME9PbGVfZXJYWHFyVFU1QmF1Wk9nNW1zOUYtUTFuNGZfLThvOXZLNzVhSHBZX3hPTVIxOWV3alNSMlgxdlJYNlQwSFZORXpsU0F2M1NyMzJod2MySTlMUElmeFplRkc1NFhzbmhRUGI4cmgtckxpNmVETHd3YlY1Smozb1N0VVNYOHViTFc3Nkhqb1RLMDU4MmQ1dVFlS0loZmdkSUc4OXgxbFR1WUcxdmZ3Tko0U0g1dTQ3R0MwYTlLTXFEekt2S3AwaU4zUTZzbFZTWW11QUFScXM5SnhSWGw1UXdfQS1uSUNNMFI2blVKc2V6MkhhVk0wd3FHTDItLXBlQmJTSzJ6Y2xEWXZGZjNpRXBoTHJaOHhzX1p6OHg3Q3B5cEVVbmRDMEUzaXhSRWxXdTRUMVR2Y29wdktta0JJdW5YYm10aWUwUG1oWHFxZTNpR0lBX0QyUVVfLXVfUlhna3FhU3lONWdzUEhlMUpacFhUeUk5Y0o4Ym10cERLWk5VVzZ2dG9tV2x0eUJnQzR2RlZOTXhrVHdNUDZCd0NBUENqbTBiWDRUcFE1ZWVPaVl2OVlyZHFTRE1odkxsN01ZcV9XNHhFakg0amhmUmk3c1pnZXpGVHFJQUJXYmtvazZoRFVrTHJZWWRMR1NmV09ZVWc4TTktS0puSjF3eDZJZS1TSjBxa0RMMllzNjNBVy12MktLY0RJYVhpblVhbFBBTWNRblZ3RUc3WHd0RXIteW12aFg2MTk5SVB3ZFV4WVRBVGE2WE93Q0hBMXdDQTh3NXlfVUNudnk1Z0pHTl85VU0tNmFScmFGa09LY1J4SXJBVHhQVmtWN0tUQTktdTkwNDFJSGF3U1UyUHI1UmtEelBWa0VacVByeVlzU3c1dmhneXQ5d1pYaGFBb28xSnV4RTVrdzV0TTRhRTcwZWdxMlItd2pGMDRhQkZaSXliQkhQcUtTR3liZlRsZGg1TURlbE1falNvbG4wYUtIbnFOZGZyXzI4R0gtdnZnbHVfT3lNU2ZNYjktcld5NnRiVld5dmtySF9mU1NSVFBNemU4RVQybVVoaXBkVXhuMVE2VUJXaUpUZi11X3ZTOGQzX3duRlRUUWFwTmhad2VTRy1kYmNYQnI2U2ZEQ0JXcEZ1ZEw0SnF2a01tUTVwWmpuc0NjTUxHSW1xVkZ4SlNtWGo4QlF4QjU3VzVuMlBJTldRakhiMFRIQkthT290WFBaWFFNbjY4b0l4WjNPNklBcktwWm1rNlhZYmkwVElwdnQ5NVAta1M2ZTlLN1JsdWtJVTN6Um5hVkMwNVVLd0JjbUVUcXBNV1JGaWtZdE1lejlBN0hBWjJqWHJNeGJIemx5RmEybEp5SC1FQmladWtsbGN4QUNWdFNiVmY4blhCOHU5TFNoUHRSOVlQc0huMkhkMzJoU3c4M2JOY1FiM05GN1h4RzZMZWZFd0dVdlc5SEhUeWJSWVVmTzU1ZkpKdkxKd1Q5djIwZ3U4T1M1b0NaY3ppZndYbFM3c09lc3QwemY5ejkzOGIxXzZxS1hQODIwdVV2aEZjOXNmdkFuOXZVV29kWU51UEtXcDJLMXV4dUpwUXVOTlNON1ZENG1zOEtldmxvYTVTSVRDTmljcWJJVEs3aXpRbHdtaWdKeFpadmxHbFQwZkFCMUlUcWlJZ3JQendDd0RKZWl1WTdNdEdpZm45b2gtcm9qLVhLeXFqWEVlN3dzLVprVzByUUhTbVF2MkF0azNlVE42SEFsdVhON0RkQXdScktwc3NkWWdkVVRUTFYweWZINGkxcVNTbkJIM3drMlVGSnRBTEJBLWtnWi1YTjBwcjNJaWkxeE00WF9pUTc5Ry1iREJfeVJ3ZTlPN3k1aW1reTM4U3h4ZG9qSFhTSkdWd0d2N3VuX1cxRF90R0IxQ1RNdXhVZm1HcU5DTER6YVZiNzVpYzgtb0ZxQjZMT1lnRFVYUjlDRjlPUTNMQ2ZuWnk4S0NLUWxuNWR2em5BdnBGeGJPMXBnTGZkTjVaQ2Rlejk3MVJ1SmFPUXhsWDhNajJ3aFdjYlBBUzVZQWxPanFsUWlPNnptLWFXNWdEdl9MSGZPdVplcGc0WnJwVWhfZ1RCNXBUSkY3ZmZrVF9sVlVrR2Rzd0lUWEFRNURwNzViZS02SnBlLXJmYTBSaUhhdC1wSFZUSkg1eUUxcmpwdFVJQUNic0ZuZXAxRThrdTZ0QVZjWXF5ZHNrZHhPN0lNTmNHdk1hNk5IR3c0VV9ZY1RCby1iN0FqaE1oYnJIVHJGaGpuN1FpZFJjZkxrUzg5TmhKWkZ6OUVUZjVNeTkzaGhLVmdZUTFheHhLRlk4cFBNTXlJSDNpS0oxVHBLSDRNRG12N2JaZFhiRC15M0ptZXM1V3dnZWU3b1ZtSUVrbjJsS3pkS05nODBBM3RweDgxYW8ybU0xNTAzdHhtUVR1VGJXblpLbFgtRmFnaVJVM29UME8yd2lmUWxmUl9rdWoxc2ZqMnU4TFJXc2NMc3gyeHhEbVI2ZXQ1QndSUHJialgwYWFBUGlValFQbDJ6Y3ktSmZDaGJHX0lmTF85ODFCNG5rSlNLUHlDVDczVll3NWJrbG1sOXFockFqb2ZhVFpfRTN3RWN6QlRGaHFidTE4YVdpMjFpS3ViOElZUlRueU8ycThEVEdBa08zbDBxVDI3cmx3cmVPMlBrcDdlVHZ4aTg4ZkRIYVB1c1h5ZzRmUzlZaHZnZWtZVUJUeVJCVGVIUmwtZERzdTB5WnJKT1djWnJob0cxeUNtSFBBR2V1X21mQXNkUjMwMzhoamZnUU1TM3YzLXo2TjN5Wm0xTlFseTRHVlBjM2xBckJJYl85d0FJS0wwRmgyMnMwM3k5YWFBX3NpeWhnTGVYN25NT014X0pvUWV2YmZOWXUwSDlvcXVVcnNOOXkydlJJaVNmNlM0QURTLUFRcVVzRmd1QU9EZW5xYk9GVW16Rmw5UVI5OW5lR0ZNNy02QndvVUNMX01BZmlHM3BmSzJwbzlpai1NcnVyS08zNnlCMHZXd0xCdl94U0locTk4OGIxR2pBa2pZbTBpLV9uNWRBQnpyVHRhZ2RobFItZXVUWmh5cmpsaGNzNm9yNS00dUdoR0FtcjFiNFFlSDdhUDFfd0NxRlFIblUxckxKS2pQQ0s1aDU3SUU4TG42MGUtRlJTN3hIUXYwYmdEakZsWkdZYlEza3BLc2wtVm13NWV4UGZ5c25lWUUwbkR2eVNHc1VVNlA4QjBpNkVyNjdLV1pFSHB2M0YxNHhMR3oxc0V1SGsyZ1hIVjFGRVV1TnNWT2FXRWJFd2hXd3F5QVZMeklZRi12Nk5PZkhSSTF6enR3NzUyM01TV3dvQlFaZVJiNnpsZ2VOQ0dGa1pPbndnRWFxNU94WUlCdzJwcEVrbVZOblZtX1hQMGRUdEQ0T1llWEtKdGN2U1FJaDN3cGkxRm9xdjF0dVpBUWd1R0xzSHJUTFBCNmdhNHlDRjVxVFBLNHVIampNT1hpWkJtSXVOaW1NVm1oTnhQU0I3Sl96RGM3eC1ITVcxUzJoYmlqUzVwQWFNbjlUUjdtNkFiMmR3cWdxWHhoMG9VTk9lVmF5eEl5LVVWb3NkSVVwcFp3b3JWbVlOR0ZPaXhHZzhJSHhIS3VhUDFIVTFvOHRlQlRlQjJpOFU1X2pucnZhY283aEN5d25VNUxIbE10SEhMOEFNNjdxZzJPSDM4Rzd3X2Z5Q3ZsRGdiQU1YWkxsdEE4WHpFREN1SWhRcVNVUFNIMTVIR3UyeTg3eGctQU1TTE1iZzNILUJKNHZWSmx6VEhYS3lWVG1XcF9QTTc5X0tpVnFJTm11Qkt0endIYWRUeE9LUHJJWS0zbmNfSXhqMnZydzRRcFFqZHdEWjdOVXlvSk5lVlMxLTl2MDdyMnBuUm9GR0d2ay0tU3ZnZ1NKWWpVUFZpUWdBcDRWUzZEazBYOU50U0JCeEpjbXNGaGtuNlJlRUdQRXExZGlORWlMNVpvTHBhNHlqaDdFWHhBOVJjaE9NQTZuWTR3aUIxeXZvWWdRUldoUnJmOVdoYzN0alZQTGxFM2tMMngtSEpRYUVNaW5FcnoyZ2w3dkNGMnN6cS1DZ1lfM2gtbExCU1RxeDVDMDVNRDZ3TDdmWEhUOVhDdFdHNE5fUHFMc1B0cXBUTVBZUUxsRk5yVm83bzhhQnRNUm9BR2pVXzcwU1RKR0ZrcEdzTDd1cUVjNWpqT294bURzR1g5YkhoRnVGRktMLWNtUE9oN1hoa2FDS2J4Zkc4UDNrMTU1UzJyVTlJdmg2ejZTNWgwaGM3bE01U1ZJbzVvbHZvSmNoUlF1aE8tejM4Mnh3MHBXNE1rbkY0MlluVEE3ckhhdlA5M284TGJYMkYtb1FHYWpRNUxBSlZFN2czM0V4MXE1NXcxR1lWbEVrX3JMeDRNbWRBUk1kbXJOWTVqMlhPb2Z6d2wxOTBVWkJONFlrSFJNaHdHRFZ1Njl2YkIwQTFGVkhsZlZpY1d1bDBkcmlNNmNzdHRIRnB2Q1hpc1hkZDFVQzNsUTNQeWdzQWc4MFN0SkpXZWZ5TXRZRGlPendTVERUOEUyUnBacndvWkZuR1hpREowdGI3ZGtneF8zMlIwb09zdm50UE55cEJEZVNRejZ3Ui1ieFVtRnNRdV9zdFhTbkJzU3B2WTZFWW1uU0lhOFRiZW56Ql9Mel9mSmtMb2JHMjVfSDd6WWNTTi1Fa0tJTmFsLUtWMkVsV3JvTkhGUTJfalRNMkhZZXhMbDJrQnlQbjNuVTJMTVVVNWJzQzZ6UEtPdENzQ1l1UzBEanI5XzkxYlY4cjRLNGs3d2R1U2tIN0pFV1ZuVFJYMGx2YjQ4LVJ2aXl3QjJjRDRkNHlJdTVjaVgwbVg2OWVqSG0zQ3J0NFFXUmd0RjRkTmRab092bm9PUnNKaTVxMGVrUU9RbUhWMVJ2M1d5eXRjdHpwVWJhUFdSZ1dGREwtWTRralFUVEJid0dRR3gtM1RrbUhYQlFyYW05a0VMcUNEMlNPcW95UnNBYm9qZGs1aEdIYWRyaVo3N1I1amI1XzVLVV9iNXJVN2g0NnpjaDZLYWZkYzUwU1FRRlMtTV9obzI3OFpXdnMyc0pITHJLTnBsOW0tR0JBWHpmZVVmNlJwR0ZkX0dEaHk4YkxkaWlIZFoyM3liaEdCZXQ2bUo5SFh5WW9DZkJ0ZDBrekRIQ1NhX1Q3Uk5OYzB4YzdsdnBRWlV5MmhscVd1bE9zT0xYVEtNcG5nYlNxbDVhUTVBRW11MFg1VzEybXFLVFZ3T3I2VGl2aEtoRG9sNTR1eXZ0TlAya3d1NmlJSVo0Tm5kSnVPWkR0eWxvZGU4US1xLXgxbjk5MEJyczVoTU5BWW5LMU1zMGU0VzlfNkVOVEFnbVgyNlpEdENYeXZJd2E0WnJDVmh5ZjctYUJLNl9Tck1TQXNUQXdTRDZ6dFBLMTlxOWlibjk0ODVrVDBBd2hRbFlMRmRmSl83Mm1FV1p6WG5QWlpDMUV5N2gzWWhKY3l4VjVvTEtvZE5xVkFIVlVwT0stOXh0TnIyVVJSVUJrckpnYTVLUGc1dEtGeEpnTXYxbDdnVWxORlFXN2tuRHdMQXFPNVY2UTNrRVd4elpTUDROdmFicS1YZ3RvNV9iOS1hcTFpYmwxcDVKQ3FiRFhGQm5ycHhlVU00LXRWSjBxa2NzQ2pWcXRUR1lFZkt0QVJtYkQ5VWtpU2tVUEdIMUlWcU9NbTRtZ1NHQkFQWEs5SGkybWd4aGJEbU5oSXlMM0l6dU5vWWdrX2lCbXVscnhRelJlUFBHVTdUUERVSFZfY0tzYXowR21YWm03Z0JGeFIzYjlVUGpnclZqaTd5cDVjQ3NTb0VzREFmSWVibWZ4MkdxLUwzWXVEbXViTHA5Ni1QZDFDZ1F2cThRejdVcW85Q2w0T3B1SFlHMnYxcjk2SkJ2Ym1pdzNRSzJudlpfT2hrSXB0QWMwb3NOV0Q1cjRrWlhuYkYxU3VVN3ZQV0VtME5QS2ItZk5zVUFKdnJPZ0xBY1RKOV9Va3dhcWdNcXJOR0d3WTRhVEFLTi1oa0cxbWFPY0RfdjFrOUxqN19fM3h5X0YyUVhsNDZEYVVMMjNiZTJheG54bm41WWYxcDFRUjJpZTlaYVllMWFnRV9rRkFHV21vT2VBRGI2WExhXzNqTjhUamFXNWEybUhZVDNmMHpSSS1Jc1g2WWpjWnZBOU56ZmFVdDJDVDRYZER2OUwtdGpKYVNaX2MwbXRPcUg4RXhKNzlWNWNMdS1PaWJxNFA2a0sxZWRLWG9DSGIxN0FGT1dFNTVtb0ZPVU0wQ3ZibHBPYkc3dFZRSnNYcjBiUm1lTUtGTGhGX2NZRDVFWVk4RDNQUDNoR2N4bXhYTHdHUklXYmpVYnA0WkItaFdraElEX0dIbmp6ZXIxeFRjRnlibk94WUhkTVVrRXZyRjA2UU40QjBoemdUc3dXTmFaUzRNREhTT2tWSzlhZV9HYnNZRm1vS0hEdGk3WmRCSTROVHYwSDlNM2xXVzZMRzRZeU5HMHgxNmk5MjZNT3hseVd2WUVxVW80QkRGVjY1Z1JYd1VQbnkzekZWak5DQ3N6X0hwdHcycDdRdl9iaDlSNm82dEw1R2tBR3daYS1lMFdrYW12c0R6YWdlZ1Z0WG1QX0pselRTaFN5cWRDRWp5V3RIYVhoQWtIQXVBbnV6ZkVIbC10aEJSMlpxWWowVnNBYk1pZ3NOSzVybWplbkt2dWpJRkJYaWpQQkdzdzNqRjRZVXhGeE83SUlUSFpCMHYzOGY1eUhGVVJudHZTLTBIYTBQYWdJMzBHcUpMZ0dOOXc0NlRBNW8wcWQ4NUdLVFU5Tk5YSXY2WVpZb2NKMmVFVWQ5a25pTE1QT3pmMHNPcEtEdWtpOHBBVXdlZHVqRjdka2RXeUdobU1PQUJIdFJEZGpHbVpzSlpjeTFtV1dwZEpWLU5CNEk2dkNRY2JyeUhCUktZMmMzNEtNT0tVU2VYYVFjb3N4R0JzcW1LVl93QzIzUk0wYW5aa2t0Qy1nSVNMRFRsX3ZncGFfSFJSTjNOMWNPc3lyelFMN1Z2Zmw1TXJDRzNMcm5CbWRXNXUzTVNPVURDS1ViNG1zbEJtcE1XZ08zQkFjSzBMVmZ5cVVqU25BNzYtWnNSNk1Rcm9UVmFlWUdGdHY5YnVKaTBGOGZ3UWItdkxYalREazVpQVVwcmphQUdMNWRSMURRbF9oTVkteVRneU56VHRxSnhkd1V2OE9EdDZQU1pIRGltVWkxeHg5U3U5cm1kSWd1SXpfSF96SXJRenJHdmNPS1dNZVVuNm5nMS1KRGFqamF0dVJFUGx4bE82dVpYd3R5Tm9hMjNCZkQtYTVCUmRTU2hBSXFvQzJxdFhMTVhva0JEZVZIa0xoenQ3czN5OWhRTTJGWTJMbGVSYThheVZXMnBjRlhKd2Q4a3RFNW5sSnIzVVFrMW82c081Y0xZN3BNM3hqbDdyQ0M1eGdDWGwwZ2Y0ak5seTZoWDNNV2VId0ItTmNqeFpEQTRHLVc1b08xeTh5YldUeWcyaXpad0Zmcmt0OFZMaUJlRk1UU0pqQjlPT3hVNl9XNkJ5RnFTT3JZeTB0NG9EaDdjbGNRejI3d0ZUbkhJQlNxeEotNTdNUTJtTEM5eU84UVBtVGxWai1rMEhrWWpka1MxUlJlOEg2c0dfXzJtUGxYZHlQSDVfcHFQcjI2VWloa29tU0VJOXV6QzUxS1JfR2piaFJSMl9DMTFJYnVCUVdNR3N6YUZ1THMwb2huLV90QlJERmE5aEdPRTk5dDZvT00wSG11d1Bma3c3TGZQT0VKM0YyVXF0Q3AtOVN1bG54RWRwZ3RlMDZvRjZ0dUFRa1h2dWo0bVBKSlhpUWFwZl9DckhaUVU3bzRfVTFod1JyYWFUWHh5QlcwbGdGSU50Yjl2WEpydHhzYy1CMEdXYVlEUm1XYTR0UFE2QURIM2lQRXhuWTY0NGd1S1lSMkNJeGJRNUVKbTlmZWF3ZHhaQ05lcFFKYVBFS05heEhHVGVSVnctSXM0RzJsU2RZc2VIMDRJRWlWUmpYQktNcXBxUmxybTNma2pKZWpXRzJUQ3FURFRJSHdjUmNGME9MR3FqUjd5bjFfRHZvdVdwQ2RiWUEwMklVNjVia2RxeDZ1Nlc0SnpTZUhhV0pXcXIxcFp4Sk5Ha2V2U3FqbVJPY1lQY1BNZ3hKdVBoYVA5UEZtb1k5Nzc2cGtYV3ZYYkozZ09mM3RhMVpEOHZoSHlSRVVrTXBhVDJfWi10SkZLT0p6cVZteFUyTGVvQzJ2N2JlWHJPYmRxSFkzZ293UjZDZ005Ym5nX045YVJiek5UdU5kS2U1U25xLW1uOEQtTlVUZ2I2Y2g2RlVBRzdmNzlOaWVrMmpVQjV4S1FxaHFnV2s2bWdyaVE0aHFMQm5HM3ktbVRnOHJVT1N5UFBUemtxYTcyLWpJRkV1Mzd4bzhlb1ZaWVVoeUtqdlhKZTlMZ0ExN1NVbHhFMzJZYzRaVzJlaF9uOU05bTVMVWF1YWR4LTlydHI0YlBPQklzVGd5WmUwc3NqOWRRUkFOaWRIOEx2QzIyUFdoSkstWDRORXJrUmRsX3dXbkUwcnktVk1MZ1FOZGpGTm1abXFpNEVjZ2RqQ1VsZEdYMG5uRVFWam5wWlRCZEwzMWR1c19pcGU3OEY3V3JVYzRCdzFKS0lEVmdyX2RSNU9hajlXV3hNaWJua0hNZWhNcGF1ZzRCNjZUSTJad0VvdUd0LUJ1dTBUOGNGc28wT3dSS0dSaWZ6RnBFNUotUVBPMWlsTFNYZXV3NWxNcDZkbnl3LXFyOWc2S25TNW9tYTRjTXgxMHJrWXV1SDM3WDZiZ1RRSWNFZXhOMk1PLUNaZlJoWG5yS0tFX1RmVy1NOGdvQW1sTTc0MmkzVFZJeGxYRkNSMmJyYlN6TUdfLUlSX25BVF9PaUxBdGl6WVc1MnpKNmxweUg2RmVXVjFfT2xKR1FUTUV6c2ozVGwzZzV2emUzcjFsT1c0M2xEai0xcHZPLWpqR3ZiY0xObnd0MVpVVG5tTmNnbEVNLVlQN0Z5N09QSlRnTks4LWlHZ3RRVVpkU3JqMWZlUzhldl9kbTBsYWhnaHI0TWt1U2tmVVhEUThfajd6MzRURTNSZGV6c1c3aVEtSjN0SWxBWVhqZmlORk85TmhhZUtlT3VTT2RnYVczNTRJUWVOVFlDQkt4SFcxaHF1YndlQnVmMXR6MHM2aGZESTJIV2l2N080YnpvXzg1TkNvUjJUUnoyWDFJREkxUHFYVWpvZGs3LVE0c18zVnNWb0hDMU5fZEtELUpPeUFoVkpHWE9QYnVBZFgydzB3cjJKcFRVZkV4Z0NsMmt6YS1aQkZYQXlFa3RaOU1kclRyalZzT2JVX2RGUzdWZ0N5WnFXbmlWTHF3N3pYRXJmWmVaZ3hBUGJOdldpSGZ3Rjk5ODFYZ2xGRktCcXdiaC11aWlPS0RrNGJlbXhQMnpyck93LUM5R0FBRk9qVDk3dmIxNy1aM00wdkE0bGFfY3Y2SXY0a21GcU5wbmdzSDItbkxoeGpJM0VidWlZRUpXOWJabXk4R0JLX0VMUTdlQjYwNHZXbHFidS12VU1Ea2Z1ZEVzTmlDNTFwN2VCcXlVWEJvcW5EM0F1cjlHNjlVLXk1bE83WjRrMndRQ0V1MkxXU19CVkROU0ZvNnM4dkVEbFdQS1FSTjJ0WTNRZXlUSWJmTkpxOG91NWx0SFJfNlJVWkFTNERCYWNBN2VmZW4zamJMeDM3aTJMSHVUa2VTZFlodUtFVUV4TlYzLXJmMkt3VFJhOUVKNV85YVpJR0FtcHBlVE1NVUtGajNZajByU0x0RE9CMEVVN2hlYWViS2lWamM1RVNTTjJjT2IxMGtHWlNTdjNSUXUyenpyZ09BWUk3WjJEd1g3a0xpLWRhM3NLUWxPTXhCaHlxd2o3LVpfMHFJMTlfeV9qeVdUelljb1RseEdxTzBTRFJMNGVTV2ItUHJGd2hZSjB4R2VUT2MxR3VwVVpQdWEzSWdScHJxaHlManZKaGE0LWxudVhfTE1sckVvcUVSb3JhdW5KbEhsTlNwOUw1YnVDWkNVeVdhb1FvckR6SnB6b0oyN244azBSNTdaSWxPaWgzbGJhYnNUSkJnSGZjODdNUU1GRmdERmlUX0w3RU1BYUk1SUVDT3F3eHZuNGNLSFFKMmNuZVNVb2RRZ05kS1JyQTZHaC1ucmZsRGlDalNyWURDM1ZvNWg0OUVHeTBMNS1UR0JPREFBdDRJaUpwWjN5Qm92YThDb3Nzejhob3BzSnNLNWJQUDNRaDBBVXo2LU9FX3djd1VWRlFxbUFjMTdJeC14dGRFWEN4UC1BTkM3V19mWE5Sb2pKMS1laFhxaE15TUNUQUFpQ3lhbk5jT3F6S2N3V1dSdE1YRDZmZWlRdHNWRGlDM21XZEJROUFpbWVlNVFFb1JEM3BCcGVQM2ZwYzhQRDd5bTNNb29uMDduMU1ROFlRVlNLbXAyX1R6SllUNXNyOElYWjV2cV9NTDRoaVZnSnUybUNHd1VEU3p5d0QzN1FYaV9iamhXbF91T3I4TDBxSkhURWZBZ3hjbHVSM3FZcVRXY3NEXzZvVDVRcExkT0xDRWtWeW4zRFRnOXkxS2YzUHoxaFA5cFFUeTVrQVNXVXNsb3RJTTE1WGxSdWN2S3hjQlJaTnNRX25hTEUyekZBQjgydzNUenRieFN4WDB3TTZuY2ZyYjRIbTRBNzlSQzV5MndKWjk2VG1nZmd6WE1yczdsVEtFdmJrZkVnWm1QNV9QN0lvVkZwQ0tZcFh3cW9iUnVtek5SQTlUQUZEeU1YTWFhYmRJOHExdm9rYVZMUWprVUxWQkpHcTJOa3pDX1B1bklZTFpDam0xQThfTnlmMUV4cndDNlZIRGNLNGhnY0YyNXp1QzR6d3NzNVpYeXVQeWdLR0VhUkxPU0hPN084WHRsQURmdExtTm1PcFlZRkFhOFBZa3dJMWJzc05iX3RvUFhTQkRNWlFrcHlfSnRSaVc3X1BoZHhPdjNyMUV6SmpCTW8tekhqTy1OTlRFOFVJZGFjV25KLWZCRVdJVVhCZE5TcE05V3VxUXI0dWlmY19mZTZyb18wVS1CTUVRQy1Gb0EwaXFrdGNkZms2OTZjZno3TmhUZkY0aHZEcGYteWNoX3V5d1ZpTEpFWXAyVUd4SlRwVFpHYVlOU0dzSjhEeEVQMERSUUFqTXIxVWs3U0g5eFR1Tzl6b2ZnY2d2ZURlS21rY0t0MVlNQ1N2T1JFZm0yWlk2aHpMN1JORlk1WEdjajhqanZ0SW9laGRTNFh6SHFkNzhQbjZUT08tZTFFbTR1WHp5QkNTUnhibXp0RkJ6WGRzSjAwYXB1NDJFR3dVQXJhMS1ubHJRLVJ1NTM0OEZQaGNqeVEwbzREWWFydkE0dkdySVlINUR2RmxSYnVTN2RoRXpiVFBwSkZlZ1dfQzYtSEdBbDBULVZ6U3RpRGdHR0dyLXhYUjQyeXZmQndMZzVUNnhLclVVX3Fsa3U1b1UtcVFubU82VlVxalh1SXVwVlgwRGpfREdIM3prSThzZFJkUGJzci1NQ0dKcjZiQmJTd3JnWE8tc0tJenJIZm1jZ2ZfUmQ0bi15XzZyWXZkWmo4RlBMdThtVFlFYUdqRnlDcVdzSFQ2bFY2NWdCZHNPS1g2NHRyX0hsWU40M3FFbUJTUzZOSUNvT3g0TGFGY3NiOVFJbUN6RWhRSFRjRlBYZUdrZmhrOWgtVVl6Nl9jLXVhN2ZCQnVFTXdvZUdTVXdtRDFydmJYa0ZVYVpvNFk5TERJWkdNRXFPTnc2eDNTNFYwMEhrdUR3R3FwVnN4OXZKMWJqR3Z3bkVYUlpxX2Q3WDkyTC04eGJYMlQyQi1aZzFmZnVzMnh5bGl4cy10a3FxUDVVRXNhYzhJMW5TUFJEUTNCWEgxeUVxTEtHTERla2J0SzZKNlJGVzBJcmZLT28yb1JEcnNVanZLMDU1ZGpMMjk2Wm53Z2hKQzR1TS1Qd19OU3J4RHNyeDh1NTV1TnVaalVOZlNiWnhEQzdwclJSWV9qb3FDaGd0dC11d1BBOXdwQTdKOFZKM2Y2elktRkJhSkpIcHZSZ2MzTnljV2xYM0cwekVvQU1JemRsQWN1ekVwRm9BQ2gwdG5ndU5vRllrNUdzV0JWRV9oQWlBa0FCRmZNOHd2UWtXVTVMWTBWMGRmX04xQ1E4eUlRb1JGSEZxRnhFb2tzVDdPekFfMWU5OWNiUnFxOGszWTloNnJ6S2Y0ODdCSDBzanprRV9oWFJWOHdqT05LSF90WnpjeWJOSGF5dzBQMVlZb3RIbFB0bnl5QW44SlpYYy0yLU1OeFNKWTVfWTFtWWdmUFBHWVREcjU1dHE4RVJUWmZpc1VYOEUzeWg3eHZzeFc1X0hRZ0t0NEptVnYzWmNvVjRDSmpoMDhDZU1aVTNHMkdhdWlETUtYUnJXb1hPdmFZdkw5NVlXLWM4U1VERklSNW1PcVk2cnFGTXdhTjQ1VmJLcHpSckFpcjlIaDc2TTFIYS1rcGVsZDNhdlUtMDdJVDhGcHlBWWZ5T0ZKbkgzM0VJaE5tOFphTUtXc1pucm9WTDZla1RacEFFb09ucnVTQU9nOW83VFNxQmtlNkdWTUMzX3cyZHJMdU9KcGE1djE3cWpoY2VITEVoVEFSNzU4WE9BOUg0b3VlWlg0WDBheVcxYlZXNXc4TFNUWXRFV3RDeEZfcW5TTFN5eUJjUnZJTWg2LVFtX05CLWNHTmFBcENiZ3JqSUl3S25EMWpCYjJaTHZiaU5jMFNLZ2VIcnNxM014QjVUcERpdE1ZUDQ4bzhGMGRpcmRfUFkyMnBXVjBjY1gtSi12MGNQQ1U0TWhZSTQxQThKQjJOZ3VleTM5ZUtQUU16dGxCdTRid1M0SDFkZGVtaVpVLXh3czBEcDlWQk03cDNYV0RWQ1Q2bHc1RmlnaDc3dW5DMHVZZFRqbUJ6eUo3V0J4c3RlM2J3clRfb3d0X09vUmVOYlZTS2Nma3cyQkZKck55QTlVQVhuZXBLWUEzZmV1X1laVGpjNjRleHl1YjVzZDV5TnBiWHpWdURsdUk1Z3IxbzJ3NmFsY184VmltV0doQ3VtTU5zUXJZWmFaVzhiek14MkFaZmI1RGY3REZlLW44R2hrTXY2RElOQkZDSktQWTRweWc2NmI0NHNhdlV1eFFETGhScWszY2JZelliYW9iSll0MUs2YjJISUw3TlNDMkd0UXY1aHFpVWZEd0M2UU1SNmhSdE1naEpvMVQtb2ZpY1JCaVhvY1ljRTc3eFRtUHR4MXJkd3QzWTZ0d0lvc1dxREhpenpCa1BySTRXT1dEbVhIT1RNbkRVa2xUdEJISjFHd0NMRmh0M21vOUNMd0pYb0lhTk1zOFNMR3RkdWJVZU5nWElNU1VGaVZOYU5yUGx1UVkzT2QwS2p0N2JBZWx5T0V1WHVyMlV1ZmpNSjRzSFVpOXdZZDlWeWdkNmZXLUExTEtDc3RCVkNnbnduSmhxNmtGVFczMklYdlJJenRiNHNrTkE0V18zN2xDZVMydnhRRk5fNkt1Z0pvX1ZvdXNnbVVkV3VKcGtzRUNBa3RnNDNSR2Yza2NwbFFrWTdVUHhpQnFyR2ZZMnFQNmZ5aFZMTVVQOEcxYW1QSXVCN0phdXFKR0M0VlBTYVNjNUQ5ZldhckdDc1dQUWYzQkViUHppN0lKWEVxc0trdU5ka2lJdnBGSEdoTkFsaDBLSGVCVk5XZEJlYjloZVdVOW1nNU5GMTk1RzdacXdhYWM4YVIzYjM1NzdfcFN5VlNNcTRvZFJHRHFqdGZzY2ljanZMMUF2MUJEMFA1VWF0dk5wc29ReDZWZ19wQ0IxTW50WjRBTUgyWlFwbnZFd1hOczdXVUV5YTExUzV3YUZvMnA5aWlBWV9faTNsUENJWnFndlVLeXRibmliakltQ0JwUkhxLUhlT2E2Y2xkb3hXX3EyTl9YUUNaT3VmMEhnSzhGS0ZZZFhFY1BjeUNaZ0ZvazRRR0xuREszSURyVkphd2hZMFhNQ3p1SWlsQ2h5aVNUUmFocngwTTlIMW5DMmFvTmtCaHptMnlrMXdzMENTQjlBLVRacC1WakR4a0RGenRxdHRXaFFuRmdheE5nams5WkxEdFg2aVFodkhpR253NjBaWUZKd0hRUHlTWjBVbGRtLXJXbGxBRFlOOXZCcS1XQjRsRm1VRi05d0FwUHE0VGJncWZEdVBHZWE2cjg1eExuYTNiMFFPaGtib25hRWRLNGFSU2I3Zkc0ZjFvX2FRSzJkT2c4bVJhaXB0alRyWFpZNTQ5UENZNFE0YkxBaVZOQmk1dGNBckpKWVhxbkhYZFhBUTV5UnZURjBVODZNakhJbFlsRWdKX01reTgyYUJKQ0U5X2FVRFpZU2tJSkhlTHdyWmRWeGxpbmwtSndGOWhhQzhhZ0p1ZWl3RDZaOTBkeHZPNkxNeHMtQVo1bXREaWs4RTR5RFJsUHpCMU5XdlNDcUdCX2tpYkpTNmZGVUd5QS1JUUpXTGVOeVhhcU5pYV81VVY1Tl8ySDVTenlvUXhmSkdJOFF4UG4wX19wcUF3djVadk55UlZ4R29PbkJqem0tMWk1djVHS3JXeFoxUGR5UTctUXhleGY0TVptQ0YyT0NCTEdUcjVWeHdsQll2LTVBY3J6cGN6OVZpWWY3Z01ja0ZqNlduMDI3cGQ0ZGtiTEIyZk5aNHVVcmFPZTYtM1dSRkk2T1NXVkpmUXJ5bjRVVm9WVlczeU9BX0lJcnNGdmpBZ2F2OXF3YS1mTENkRl9TV2JVZG5zOWk1RTNvV05kcV9YS0VrbEpkcFJKYTlsNjBZOWZwM2hZNzdXTDRBZS1oeW1QN1d3SXl2alFYTUZlelVQQVN1Ul9wY3RBbjViV191c0lmQ0g0WFVTUGNRU3l2Q3lwYWlJUWlJd1MtSlJ1NXpuaXdtdEhpTFp4dE5EazdDR3lFUk5TeldEZ2RBa01VN1pZRVpxMXlmZTRfNXIta3NvdC1zVWNFejQxV09KdHVsMUFkeXVuYVN6WjZiQTVJMnlfd19JOHdQVE5VX2FFNGRHd213bkc4Z3lDeW5tWDJYc281TFI0WTQyVDFtNmhyMk5xdV9MbndfYmZVYzBTTmpOWDNaUGZLTmpncjJkbnVhQzhMWkV1cUtqSlJfTDRraHpVZEJjdWpYcWpQTFQ5clFmb3k3VlZnZmtRNkloVGcxYmxPSktiR1dVczJzelRmV2ZaTUY0ZEJLdXJqeVNxUkY0ZmpVbGtTY1M2QS05YXd4ckpGa0t1NmtVc0JEX0hxNlpBOW5pOUpWR09WakZKNjcwZl9vSFlDOEhDd082aEJNa2VsX3NhMHFFd2NhZW80YVV3NlhlZlUzNVV3NFBHbWlvaFlTY1g0YzJRaS1NUmtBMkJUQzlwTlpTUzBVSWU1RElYVW1HM1VBTm9sVnh5Uk9PekExcTFJR0o2bnVkQmdjY3VJYktoVzR0amdxZENNa004M01Qa0Jxd25GcUxFUGcyeXo4NnNsYUJSMUV5eXZUdHhfVm5jcERKOTZwcHNUbzUzcXZGQm92aGtQWXN4bTFmQlhxNFB3UTRvZXBNMlNfZlcxUUp0MENZLWFxQVZZOHZyZ3ZtdnMxRGFBMmFyNlYwd3dmdFo2TVJnRDFHSkQwRFpDa2sxTUgwb2RfY1BONmFzLWlRaDdNYUNnQXhuODdBTFdIeXI2dWQteEQ0Y2N4dnJFUGMxZlNPTkFIQ05hVEgxbHE3TE5IZkZTVFJKZ295U0Z1ZHYxYWdQSHg0NjNrRHBTOTd6ZHkzdkJRcVp6S2Iyc1gtUUJheHh3REdRMS1waUI3LXYxQVNtekluMnRRY0M5SmVMNmZHcVRROXBzMnpWeFJRNmhBaERrN1I3cFJVdEhlOFMtTWlEeXViQktuTFBTUFhYYzVlUGhheXcydzYxWno4YkhBSnEwRXFnRUJWRHFOQnNqODNnRUNMT2hJXy0tVDV6emR5c2pHNzhVNUw2STBSLTBVWnMwSURMWkJfNVpDYTU2aklkcC14NFhPTjNoUDNDbHd0b19iZjhRM1BEZ2NrNVFRR0NuOXpDc3lDVE1MTXFRcDNFR0xuZ1NpZUVjYXlaTDRpeENDNUczMFo5cG9GV2NQNXVvWFpjOVNGMXFIQW5KUkVzdjdlNDNsUU0yVm1yUlpnVmZMRUVZTjVCc292ZEplSU5Kb0hzMDB4SmlKZmVJWXpJQk1LRHBiQlRwbzR4SDg4VFZKRm5qNEtfZTJ6M2pIQkVmRXZ5dFpiTzl2cXlVdEdjcnVINVo2OFpzZjVPbnBuNlhWaG9ISU1VSGYyVmdZQmtDeTJxdXJIeWJpYno0Y3EtTkpUakVQRHplZWljX0NsUmNoNlVHNEZUOWVzNUZaM0YxeWYxcUxObk55ZEJXVnFVbkxWWVBISkVaOXNzcDZlT0pxYVRnTTR4UEtNSmhCYTY5dG1UU3NFa2F6R3I1ZmJ1RzBHR1FYZTZfRjlrdlhWNlp0UFRUM0NHYnZWdEEzQ0dzbTJhX3djVldQY2RiSU01YVcyaHBjV0dJU29SdVQxck1CSjQ5QjNZV0w4ZEpwNlR1d1Y3RDdSX01DODFES1E1LXpMTTFEcFg4SnQyUk9wSVdNQi1McG1lSkFDQnd3Rkd6SS1EcEk0ODlvYXE2ZnpBNzNKa0s3WkkxOXVSTEUtSDN6empHX1pUSVdmY1FVc1hOZEFKZnM3Tk5LVjBSa1NQVW5sNU9faExHckdpcFNOUWpGd09HUGtKSzFINGNvWmtuM2ZrclVFdHB6cEdzNzR4YzliTnRkZzdac203RGtjRGdqY3ExTi1uVEhWZnhGUWNIb3hyNE1kTTZPdERRQ0dpcWRHQ3hoaDdtQVUxMVQzWHREWXdYemxOTU91alhqVmljc0tVWkszOGFIVzhZbmp2LUdaLUdtS2pCQlNfdzhmZ05rSUc4X1BBRE9tM0oyRmpSUEgzZ2syUndlR1JRNE5pNTRwaFlLSmZrUFQ0OVFXbFVyWkxxQjB1elQ2cTdtSERyOWxBR21qbm1aamJJbm84SGswRFNONTNZWlBpYS1CUnZCb0FuVzNzYTFhWFdFRlZZQnRka1B3X0xsb2dwQkNxcnJMb2pIYkVKY3BGTGs0SzVBSnVha1dqZWFIUzZFeS1ySUM0aFBIbHRpTDQ3ekV4SWRYSjJtdFJLWkNCT0N5bmtiS0lUbm15NjNpU0doRHVOY0VuS3RaV1I3eU5HenlfUk8yR2JIa25fZUpHbGNrdmczTnVkald5dEJTVGViMVRQV1N3a2t3a1JMNzhBSGZ1dmxfLUwyY3dHT1ZWZUNxb19iTFVOUWRGZy1jRGx4eE1ZQzEzdGNVQ0tHZXRkUG9OaUhBTFpEY2dpRG9JODJ0WmVTYmZSbEM2YnVTYUFMU3hfZ1Q0cHpiSTFEbWVmdEQwcUNMOEVySjUzVVM3bzc4ekwySmpKSURHMWsxZzRmc25kV1VRWXcxb2FWQjNHdUp4dmJvUk14TXdRdmJHX24zTEd1VXdOd0lCaFh1WDg0NFZzN2dZYzZhSFY1RmRWYVVmM1JRN24tY3VoMjhGTG9LaEprODR1ZUVnbUd0cHNNN0dsQXRNSWFLcmY1RG9peHdxN2k3aWFhV0VmU0o3Y1M5UE9iVWl2YXgzX2dabkU4a1FQNXZVZ2lnaXhzem81VG96OTJkSzN1cHpibHlKNjdVNmp0N3Zoam9GbS1oU25wWFdtSTZGcDJDX1JpNXI5T091MHBqVGhWaFNCNHJFUENGNjFVQy1FOXU1YmtZLVBQZ3F1U0pnY0Q1V1hRT0FTaEp4a09PZ0RZZ0pVNVk5cUJKa0lSMUhaa2JLQktnRWV3YlZ4QmpRWWtJOTExR0hXVFpLUERUQnlKZkFsMm5hdTZfYUVpVkZCdktHM2IzeDN5cDlfclpKSUdrYTM4SEtITzNKNE5tRlhBelpJd3RncTlKWDZPQ0xxdl9fYkdyUl9obklCblFMNlNpWWxPbWVycUVpWlF0ZHNyN2FnU0pnUWQ3RnhHWGprbDlwbUxMMi1OZGFieWdReTNPY3piVU9pUEdEWHRCU1c0aHU3aS1jUnpFMFVyUUt4a3p0NFRVaFFvMXZqdEpReGp2b1d0enhnR0ZhRUxNVDAwV015TjNCU18xbVdQeEFsRmVqY3IxRFZ6dWMxMDVxbHM3UmZKYUtJLXdaQlZFbjd6b21nYW9nQXJWai1MSlk5WkNuRmN0REM3aUg1QlVyU2FSUXdzd3JQOXI0X01pYW15ZGtvOFV1WlFXUC1uU1pCWTk5Y25vUGU4QXhQS3NCVjNhRV9yMUtDRkZOSTRhanUxMTl5RE1La1M5bXFDd1h4SUI0aVBtYWJ4ckFIZmlxcDJhaHZTb1BnLTRzV1dIcV9hQkNRZF83WEpHcUp1OERSSEpuN0hFRXM4RE1DdjRJMkFPMHNybENLRmVzbm1LNjQ4WTdpdnhucEVuNGZzM2REbDBuazBNVGl3WmVtMVR6WU15NG5nSm5xTDJwNEQ3c2o4bEk3YkN3ZzNGLUMyQUh5NVZpeFJ6UnFjTjRqYVVjZnFSd1pKOHlJME9TRkF4S1BmV3dRWnRucXAxUlU1MXZmMUFDUkFRVGplWTUyYjl1eVpzbDdoRFd2anU4eTlmNGFmRUl2bUdtaXhwNnFpTkNxR0ZnNXZpeVdsLXNvYnhOUmhONjlueTZYRmIzRnhkenV0VmFmUUw1UkI2RmZMdjJ3WkF6Ulc1Nk9MeFVocVJZcVJ6YWJTdXRLaVMxTWVKazh2dzB3QksxaFBLOHJBYTJxZmx5WTVtdThINkY1Q2RhTTJFX2RCbmRRNHhkQWlraTF6WlF0alVSTk1SUy0wUzJvYnA2TG9xd1F5bVJBT056UzFGV3NpM1BycmcwMWQ1SEo4WkRGR0tMRGJjM29KSE1FUWhTVE54dDBQSjFHMExOQ0VOV0ExaGNDVmZsZTlTR3FtVmxCdWh3WmVFeHJHVjV5dWMwUEZ4OVFMdFlwRHpiTGoxYkkwTFRuMWhvb1Y2cF9UWkpJT3NWLThSeEExcTBrUVFNN0ZFMzMwUkh2X3BoNmdiWG9NZkl1OFpwX1RNWHNjNTk3LWV6MkJMSzQ0ckNGYUs5NjdtMklGbDVZdVo1WXU1cEhNd2hmcGxMZEVsWVZvbm50UkdtRjkwTXkzSGlwOUpvSk5MNVc2dTlER1ZnVXRkcFlXbU1sTmVqN0hrNi14cjlIX19iRFVzSEh1ZTA3a216WlpjbGVyTHI1SE1kVTJjRzV4TnN6QV80SXFNQ0hfODBCVzJKaUNxMTFFd2dMNWhuSHZzSUxTZi00ZFpVYlpHbmIzSnFYbm0yV1NyOHY5QVIyVDI3TFZEMUtwMUY2Q2JjT2FxeHJQZHhDZWhfemZSQkgyZWkzQmlmcXl3bjdDOVVXNHdJRXRSQUVfY25xeGJnSEZjaGp2MFY5TmROQVI3bG9VSXdNTkZqVGNwX290VnJsMVk0WlBCeHVJVVY3Q0dTMVQtR2RWd0tZQUE5YVV6RlQ3ZF92cFlRS1pkeDNRWDctQjJBNDFkSFdiSkw0MUEwTmpyLXp2RjVVUjJzdkQwV09rajR2bmltX0VNZGNIUVptblhrT0tHTFhfZzFsZHItYkxjNHpVclpXbEV5TTMtUjBmTzNBN0U1MHpMNVV2dHJxQXE1aUdMVmc0LVV3ellTOFluaDZadDRHdWw0OWp6NmtISk5uVjNWSHI1d0UwZm5Lc3Y1YTlOQ2xKZnBSQUtsdnBqVkpHWEoxVlVaNkhEcWJDV0YxTWtKZG9SZnZyZUt1dnFMRHlRc2U3QVNzejFWc3ZRWWRnT29qYm5vTzdvYzVYbTdsWEhpYTFtbTR6SUNWYjUtbWJ3bzM3UE41YTZwV3hjOTQ0SUIzcDc4aS1FNkdXUmw2V2N6eTVTcGFtcWQwcThTQU1HMnlxV3BDSmtPRWl1LUFHT2c3cThSRnpWVFM3TFdnbjhSV29xaEdSaFI2N3poSzFtRWdaSXVzN2diWUcteF92M0puTzJSYXEzUnFqM3BlSGpGeDBoOWpfMDJhSnhKNkRnMlBWaWdKTGFVdnFHbkZaQm1ncThKbWVVODdRdTBqT1NIWkFueTFFWWF0N1Nsb2FTS1ppUFhDR1JQQThXTHM2UFJGWWFuYzhvam9fVHlUT0RfWHB1Vk1BQ2tQYXZiVmRNdWh2MVZjZkNUMklzVFlIZXBsY1VtTnE1WnpDZXZIRFZycjM3YUVTNHJRM2FyeFR5MXRnbWl5cTdOZ2FvcE9NNk5FcDJSSkJnM2RVaXJIek9KQWlsb1dsMGFlTHF4SUh4TE9GU1hIR25CcnByZHAzQjIzUkVnUEFIVm1la3pNbDVEQzlUOHNxTml4UEVPV1JyTWZUTzVrMXZFSU10eDJzaDJlSjRDWmlxTmc0S0VsVWxNbXBVZkw1YkJFR1ZfY3FkSWV2LTBxMDljTnB5YnJPY1VoWFpCZ0VrQzBDd1NqaFoyYUxRdl9wOE5KMTJWTFRFN3hZTHdINktqMkRCalNoMlZqTk1ycl9ZWEVYWWRURHZFeUxBeXNvM1paUDBTX3VzNk5FNV9oSkRub0Y1dWlWdDE3dWEyT1VsMmNhTWRJLVZCaFBBaGlKY3UxWXA1UlR6ZVpxSTVHZHp3Z21DQ1M2OEg3djNPVDlheFc5QkpjTERqeWFRWGtqQTJoMUcxT0puNzBKVTlYZkNja3pJclRVYWM5QWZIVFo1NUE5OGlaQzIzbUR6UC1jRkNnUGdDbEdlQmVqZ0kzVGZhd2dFWl9SVTdaQWxmbWRFNjdiSDM2eVlsQnlfb2MwMW1seDhlZGFuZGJYc0JIVU5CVkZXOFNEUkR0ZXBpcXVQcFRFS1puWGsyRlgyQ3dXaUVBVHhXRF96VlRGVV94M1ZGR1ZjNTZXYXlYWUthNGpIekJ4RXdPbzRSZFFzOXViaG9makVnWDBMRVVwQURZQ3hZQldJVHJBYU9jVzhtSzJPd1NCYlJXWTJOSlpJeXZTTDFMb0RHd0hzRnBLZTF3N0Z4V0xxdmhRVlJxWEM1czZ5emdyVkxKZWZaeFB0WEJNd1pHOUNWUWNieXZNNm5hcGctRUpXOTYzZ1lTc2ZLalUtdXpSdWdnajZydDV0eGU0bzhlSFpxQUpYMHhNbVVUYnROR2d4djlENkFOWEZDb09KSExDa0NaakN2SFBPWldhRzhpWnlHeFpQSXJjZElPUGotUFJTRHRLT1BiYU1SRjFFZXZETnd0dVNXZmxWeVItQXNOcFVWb2VtSmZ5VHB1Ym5Ccml4TmN2X05ZdzJlWUtTQUZiZHVGWHM5YnZqdWE3dERBMHNaQ3R1TnNUWjVyQmtMM09uQWxxZGtnVHRYaUx2Q1Q0QlVhdHZXckk5bGVnWlAwUnRiWXpKNG1nRWJkNmhfOWc4TjlMNjVGRFp5clFkYmNJU0RVMWwzODIxemZZUklIMjNRbjEwS2s3c0Z1NklrTkF2OVhuRDFOLWtqM1B6ZmFzTEpzam1iQ3FsR25SanhSLUN5YVM2NWZYTU9FRXY3a2RKdGVqR3cwTk1pVzVOQ29Fbl9vUGhFU0ZzVzliZFN6SW5BSWxvZ1kxUzIyX3BZNzhuWmJaalVkSUQ1NWc5c1JUeENjOTRBdm5FX1d3YlR4RzJUWVlXNDRPTF9odWdsOUJtTk9FWUF6NnMwX1ZHMUhvdGZNcnVfTmdWZElYb2lBYzZNTXM1dHFidi1RbHgybUhWRDJBUWRRb3JILWZQY0NpdmJON1ZGaml1Nm9JT1pBcG1RS0pRT3BDQnhkbTB2Qzlyam9JcEZHSE5FMVlWdzMtclRkOTByVTdFVFYxXzdLVS15WjhULXNJZHcwTHBjeWExY3lfYUM2bTdLN0tEWm93QlJKOWpTTWRreFZ4QTIxX01UUzVZaXhhcktObzhldHcyRnpNTkZBaE9IV01nWjhSV1dBVGMzSnpWcVpCRmJndDJGZlZXX2p2LTFUb3ZCcHR4cHFPclNTb0hJMHY3aGMzWFZ3M2l4T25BUUh5UHktZnFSd2ZxSm5IOUlPXzlkWEZBLTRxZFZlUjZXLVRWNS1lRGFHYVJUOTIwRWJEY0VGblNVbjhFRGJ6RkJnT3V1OFRFN1FMX1QzM0MxN2xCOFVtckd1OVVQbUhZazFZS29rR0s1S2lPQjJJc1pTLUJUZlRWRWl5STZOMEdrV2hpemNxYi11LXlDdG9UQXVzaEN2N1ZaOXJHMktFRV9mWEdhSHdib1lsR1RUNXdicVVWUU4tZzlVRk1ta2NoNC03NkVCczZMRHNEYTVteDRSdmNWS0taR2RMUExLV3RNV2N5VV9meUM5UFI0Ty1GRzltaWNMTzNiam5HVDR5aFZjdXNkQmhFdWJqNW9nYldKbVhTa21HckZLR1RLM2ZUa1NldEhzTFJzdVF4Yng5QldCUmFuVWpjQ2dSUUVrUXl2NFNEWWUyMjIyYTRuNWh6TXdkb0RVbGtOSnQ4TUp5eXpOMjJST1F0S0VZcERybnRnR183RC0wcjFYWE9vVFFDUGcxelhObVZkcXdCZ3QwUU5kSi1oY1ZOODNnekhTWlAzUFdrajcyeFZRT0FyR1I4REdORTI2Z3RzdFgzZUl3Z2h6c25sRXluVzI3a2o2VnB6WEt1dHdYODBfc05mRW50eDBDckp3Nl9iT0VCaS05cl80Q09ESmVEbWJzZWUyR3lFYzlOTXhOVGVXVFhISE5hWDIxMXQ2c1k2VFJRbEJJaXBfa0VLT0tSQnNvSGVMaTl4Vm41T28yaWppTWU1R0ZwbGRXUWdRN0t6bGd1blZ4dU9tUTBXdFRHNHFVNlp0NGhUdFVISVczS0swa1FfU2VIdkJzc2VzRlM5X1pXc0ZOLUtQS1NEb1h0QUxRWndVMWpPX1NKb2FqRDFmSDg4eXBnZEdydllrLXM5YV8tcVFWMjF4TnRrS1g0XzBwZHZjdElueFJvNV9fa1hpZEcxV0h6MHlDX0w0eUlOcWJndmE4VW1WRmdqWFhfajY4bzN0bnM4bHJobE1HdzNhXzVLODVZelhWQk45eFkxdTZRU0VMUloyY3E3QXRfRWt4Zmk1dldQNk5qbEU2Tlp5Nm83VzBISEJHT3hkVGV2YTdDU3BHd0dMZkRYd0dHVlI4QkNSLWF0OTBlQVZwV2FqV1l1U0xQNDhrOGROeDhySldpazRWeFZxeU5BSHNnaTYzaFMwNlEzaE1MT2NvRkxDX3ptOTRNWnk5Q1Z6cFp1NWJ1dzdWZGFBcHNkMkdUNWNNZWZqekhQMVZ3U2ZqMmJBNlF0QkZ0SFAwa2U1LU02OTNieXdxVVBzQmRvUnRwWk0yN25EaUNIOUpiMnlHUzlxYTlkNmM0Z0tIQmZrcVRKRERoSm9zQmtDWDUxVFJNeFpEVkFNajVKVEg0dHlzZXFTMFNlcTdja19DYWVEWWI0d24ydExVaW1DRk5sUi1Qc1ROdWhodGlNTUo2RGJQdFR4NlFfU2VvMFhCVkhvenpTV1lkcDBNRVYwaHluczRJcC1uaWFhUWRtVjFZSTNLUk9pX2hfa3BZOGhvVTZCblFCSWZMMUJScU84RFA4OWRPVXBKdVNiemVlMEhuU1BnVEdFTk1xWUZoM244LXpjSm1Cb1NscHRMOHBuc3E2bTR6WTFPaHc1NlJwcXJ3N0p1TlJ6Q1g0OFllMEN1WWxJLUZOS1RTclU2UmxHOG44SGliNjBzd2tHT0M4VDFlX2UwNDRkdEd0R0FCUGRUSkhkaDd2WmNyZm5sR2FVZTlwTHFsRE5ORFVac3IxWkxiNURTRng5bVduRmJmVVpmQ3pFWkh0a0h1NDl1aXFQVlN3NWFBZHdlMlJrc2Y2SDNKNE9hcHdkcHBqSWZHUTNBNXRSaUR4OVlRMXhhLWg0M254bkZiSXJfS0pQNXZ6U05pSEEwWXY1WVctNTRtVnFrOTU0ekYxUVpJd2FRQVhXMXlCUEE5aVlHV0hJajNIR0NtX3RBZDNVM1RnbGVzS05BOTRIUGRGVzMzUUVRRnpqMk5ZVnpaamVGcnZJUjdRRWlBc2oyY3dPdWJmdUtjMFVfZ19jRzUtUTQzRmlZekY3RHhob0xRVW1YbldGSDV1QzlQd1prMUdzUFZVVU1rWnB4SC1YeV9QY1RWZktrZUFreHY3RFZhbWpMb0hBOFRINmpIOVJJSTFCYUJEdzJwOVd6OHhrX3A0MkVVcTdYZzhOSjdsM3luM3ZmNExFa0xha2V0M0EyRXM1ZG03ZTVtbGlaMXV5cGpEWFpJVmpmNnlfZDFaZ2FBc1NKOVZxdXRsT3pyUE1pSms1bDNnUktQMlJhTGlqdlBaekhVWHZ5ZUs0UGdJX2Y5dU95aTJWRDQyVDhDVWphdzFnUDM3b3VYV2hFVDlTSmhZYzJJcnVIa2FrV2hJS1p6TE53akM1dGJsdFNIOWJXSTlFNXpMOVI1VDNwVnBaRzJEeEVjTU14N1lEeTQ3Q0RrQ3FiOHdhU2lHeVdkVjNUTHAtZFB0XzdibGdlUVY2dkdpVmp1RlRwaWItQXZxX0ZEdEpSRHo4emxBbk9WT1B1VlRQSUx5M1pUZUc1eFVESENBTXdEUUxWTkVfRjdFeWJ1NEJ1bDhGcEwzeFF0VmtmLThEejJWb1FtNTVCQ3hrU2JVY29HcFFoM2FqbHZ3UElpc1FxTC1GYm52RnRkQzg4cjF1emFtOXdOdkRweTZZdHZaTlJVWXRxdlUyQ2l1dVIwT2lkX2RGYXVPeU1JYy1LZ0ZUSDl1ZkZTUHF0YS1UY185VFRKWDRrTmxCQmk2dTNyM0YzTWd1bjFvS1MxaWk0ZHVVSC1kYm5JZWdEMDQ4dTgwbk4xT0Q4aEZkV2JkMEpqTm81a2ZkSXMxcUNFVkVvY1FXMmFlR1ZrYVhXLVZiZDNOUFVyWjFROGhNeHFQbVo4ZTFrMjdXMHA0a0xfZU5yamJobXZuNlRkZm1JRXY3ZlVEZkZGVW1sNmdfMVBNNUtQWWZkNXY0VVltaEZZM3dCUXNHLUhIUVFBWGlfVUVnQ05wT20xZWx4WHlTTkJ2WmJnOHhFNEdESXoxZ2g5TG1ub08xbEFiUkZ6S0o1VlV1cU9PV3ByTmJuVWlCaWt2aTAxWmZzMm1fcWE4bzhmTVpaOTlUTVNkb0JYV252UVZFTzBCamVMemh6MnhZZHlRNlNzcS1zUklqMm5ScXV4QkFtLXotejZZVm9GVlF5endmSldhbVpSWVdxZnlhdGJWczFPaHlyRTlMcXNjTHp4M0xmNFhhWFJubVhibi0yYW5aNHVTNWc5azRETkFPdnpHenJ4dHF6ME9WdlZIcmtCcjBtYjJsRDlYOTBSeTlfaXpfdGtiZ0t5Nkh2dkx5QkdpdzRfQThJeHp0Znp6TjBfSGp4dFhvMUFmbVNvZGl6bnpkdGpSTFc0dlZzVlNvbVhJVGtVN3pEWmRxYU9tS2RtNWVvZGtGVVdLdWo1Mnk2N1l5MExkdnJXZmhMRHBDS1IxZ01Nc3hnSWpBWUlzT1o4bEkxRlU2OFZXYU10TE5XaGN1aFVfMWVaZzVZa09HWWJDM0NXYkV6cVpOWnY5MUZfM3VXaE8yTVVPRkVYbGRWdWtJRDYwcUJyNHFybHF5N0Jic2ZyM21wdWlJUFZhY2JJZ0lPS0pHaDRlYlFRYVJjekwxeFZrdG4wZGZwaC11YmNYeVdkUDRYNU9hQmZoOWZDVzRjUnQtYUE1SDBWekpUYzBQNmQtS01pcVc3Qm0xc2lXN0VKNFZCNkpKTzVZUDBMS1dUaWNvcnBKTlkyZHBiWnltZlVsdDgwcllLRHVqdzZQOW9aZERNMEhhbDkxbnkyamttT0xSekFNbjFUZjRSZnpWejFFOWpNYXdFeHFXbWtWYlNOMWQ4dE1pcFRuYUlGVHBUck5Nckh4M3F6VzNJN1Brd2EtYWZqQTB5S2tBNkt4c2FwdERlSGo1T2hDQWNoYkxvZHVmMnc2Nzc4MHhuQzZXQnktUXZzZ3BuWHpQdXFJTUNYT3JaTmVORFhmY1ZTUFVnT1BTVHpJdGt0RzZObVQ0SjI2Uk4wVGJySTRsNXNieE9mUGJCQ19tT2JfeThHa0Myem1QbDlya0xTd2pFUU1DTzVKSTJtcUw1UmgxUnBSdHZvWm9qVXhDSkczV3hIZzVtb1FFNlRKejljT3FUTDZjNTM1WjR2Ny1LLW5DdkhTUlV6Um53SlVzNEtrTEZPVXRWQ3lPOXktcEZzNjlFNWYwQU1HSmY0bk83SVltUjhKU01oWlF2eThPZ2w3UTVTR3pmVWxvcGh2NE1hY3dPNENYd09sUmFlalRMemh1WV9aOVFOa29PMkptRGFFUEY2X2s4NHdYd3RKTjNYQjlSRmgtd2xWVGk2VzV6WWxQdTZ5eHV4SGlGaGJISEVRWHI3NGFTQ1lMYi1fQl8xOFlzMDRVYnR1SWZBc2p2MndSWHlYaG9UNUxrd0c3MmFJeG5IdWc3a1J3S0E5dVNDTzVUR1E2bUJ3Q3d3TV92YVUxRW1ONG53S0JRSXM5OThFT3p6RkRxYjl3UmJFSGtSX2Z3UE1IeVJ3MXBKSmhYS0lSR3Z3N1VwZ2NIWjRLd0pWQmtjOTZSWHlLYUl4d2gtUk03cGc4YTducDJNQ2diOE9ydzF4ZGpFVG51dHJHZlI3cUFRZ0hHVGVnTFdhaG42dnZDVEhlWjRnNlhWcWZEOGV2RVliQ1hNWmN5MFc2MkFNTDdwZ1FjSjBGQ0hYWjZUMVR1ODFjb1ZiNEZKNmJDRlRWa00xUGJaLWtYYnZuSF9sRVlSOEZGaTVaQ2NfRXZ3T3RabWJKcDZKQS1EWjVMRHdtcWIxZmNfQUhNM3lYX1ptWHJ6QUlEaW5nemROQTV6ak5VbXdlZnpXallDc2VBVG1vNjVxdjhrVDFDc0ZzYTJoTmVKLTZwWEl1clVUWFF2ME93QmpyWFBkMXRLQVVnMGtxUTJJZTFsVlo4NWFRU2l6NExwT21tRWxWNzhEODl0dUt0eWdYZlgxLWNJRXRRS3dkYkZLS0xrUzRhWXU4SkFhZkhjd0p5N0diMmh1bUttWDhsdzhFdFpMQ0ZWM1k2Q3B5dTBPTUFwMVJuc0dEM1lzVFFISS1mRjgxWjgyUTVrZDh3V2JVUExSZDVvdExtZWY0eFdPQm90dUFfaWxDWjY1eFdqay1Ga2Z2bnVGR0xFZGRqWHJGbHB1WDBqMGFGSTFmMDlyVGlDVngxQlY0Sml2X19hMU1nbExDcXc4Y1JYcHo3aDNCbUkyd2N4NnUwVUFqcnROTFNBOW9BYlE3Q2pwdjhUTWVlc2N3VG9ZMWxOVlF1dFhDWERidTEtdE5mT0h4ekdYSWtqQWdjZkJucVVpZlJsZ0xKUEJGU3piUGYzS1FSRFNndjNvbWhYUzh0RVF4MXhpVWgwQzMtMUJfM2FNR3B1VGNlME9QMkd1Szg2Y1h5M2ZmaWIwVFpLM3BXc29DTnQzbUY1TlpMNEM4VzlLWGFDcXJOSWxRb081S0JCOC1IYjVTc01hdkZLRmNFMnVVWnpMSGx2RG9mVklrNlpPUjlpTTE0WFozMHlpVGxsN010bWxIWV9GQ0pfbVlWWW1GblhiNWFhRl9QbEpyUEpfNUs0LXBES3F6RXMtXzlVVHN6Zk1TSzVqZ2dHajNsMEhGUG5TVUZGd3JGRWpyTTFiVWVuWm1aMFQySUJGaE5zaDYxNE4ybVVoUThZSFczMHE2Y1pnblQtWmlqNmt3bUhZaEZVUTN5VkdTZ2RTaVhoUE96WEhGRENPMmYwTFROS1JYSXJQNDNwM2hNZ19uR1ZsTEozWDZGdTgyX1V0aVBzUjdHOEhORkJYNGdSRGJHbnhtYjBWOU5xbmVkMm01U3NZTlJiQWNLUHVGNXc2a1JjQVpHLUVONDgwZmtmMUpEOUd1TVloUzZ4aDhOcjI4ZzRBU29Rbm9Hc2xXQUFyREdBMlJ0MHBteGRUM3NkT3BudEpITndZWXZROGctRjNES3c2MjFtQkdnb09hTkJNWVVBb3E2R1AtNzI1eEo3WTRTS0lWSVlkVjhsWVA1NDNrVlljZm1sWGJSNUszal9KR2F0X3VLcXkxR21MRk93el9WYzZKMGk3Wk5SVHlVdDV2cXdjZ2wydk9IWk5PeUtwMV9aQkRVRHdxd2lBakczY2oxZFZJampXSFVhLW5EVTVTdVh6bEZMS0x3Nk5PU3pXcURjZ2MwM3l4eGpidGQ0V2ttblBHT2FYM2pQYXAwMXRNTVJyaXFLWVY4Rnl0R01fb1RKX25aVWtfM0FMNEx4ZXpaUG1Ib3pkbzd1LWlBRnEtUzNlY2Mzb2ZZWTRYUUJ0Z0NoX2RuS2NSQlUybFdhSGRPdUhmNGc2N251YVNSNWtuVzVJMUs2b3NSaFREQ3VuZGxickVjR0E1Mk90TXFoeURXOG41a1hWY1Y5aUkzTFptOU9CMU9nbTIxbTZkYzBhRnp0MFBLNnd0R2ZwRzhtdU5QVUMzTm9IUkhRX0U5MF9nam5BOElWSk1sZTMxb2RDWGdQQWlwOFdkLV93UEp5cnhmdmtlcy5Xc0tpQktCZWhIeTRPcWllb2lpZk1R"}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['42693'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999796da121a.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/b0c12a088c7945a4ab7167916bd62033","kid":"https://vault105115999796da121a.vault.azure.net/keys/cert96da121a/b0c12a088c7945a4ab7167916bd62033","sid":"https://vault105115999796da121a.vault.azure.net/secrets/cert96da121a/b0c12a088c7945a4ab7167916bd62033","x5t":"8e1PyG6osgreirsHjmBBcctrmx0","cer":"MIIDOjCCAiKgAwIBAgIQSe/9Sj+kQjeUQZo58T572DANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMwOTMzWhcNMjEwOTA0MjMxOTMzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDU5XTPjItKtVCLuSkAH1UK7G13Um922mxja8lCvXuv+YHxdK7fHA3QBJM8DbluvRAkInyxIN2L3Fy92WRHZ0kinY1DOtOQre8SDPkuLMEzjYip21HDPpq8V97usfRz4UdQ0SS17ovVQA5n5mZqI42Vc74H0EoBWMjDP85tub8Uw0kvloFBM/+4NO/fJChGb579WX774G2icrO5n55dSrv1YeTs+QZjLPsHLFjGxgWlxiDyoFq+xfYVgE1BNHcbX1WODOtEeqAeaf37R47NyEUvn/Ij/KnT6HNCt1vQ9va03a5Ibyblnw+1nPF4cZweywavJnV1EHksHgB3hq8g1r1dAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBRUagEIj9+9zEWdIxotcYUaDDdmuDAdBgNVHQ4EFgQUVGoBCI/fvcxFnSMaLXGFGgw3ZrgwDQYJKoZIhvcNAQELBQADggEBAL2Y2HETAn86u4zN6lRi111iDAviWBLDKg6pbFpqivx7z1gld4a4PHGINRJHgu2pN2+TUVuMSkfR8DmH3JUG3CQX25iuSia0Y4uE51Da2WCWc1ip6qfT4Qwep2m/MffjpA4fLY0oC0ychfKdCTciUa4oU0QdMKVzRTw3bl2WQsA5IWAbiLvx9FDkDY37Vfdv9XbXRWhSPDU8IugpQZ68JUuJ0nULvlrGIoefGiw9ZuTBGS8i6ycUVA0fZ+TLB/dFuw2Nw9j93dCyLZUv6v03t9Ql3uUov60Rj3WkEHlD+MkgIKej5ahtRtm7nCc8UmNu7m6sNqCeFohH9V1b4pepnUs=","attributes":{"enabled":true,"nbf":1567638573,"exp":1630797573,"created":1567639174,"updated":1567639174,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999796da121a.vault.azure.net/certificates/cert96da121a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":2},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}}}'} + headers: + cache-control: [no-cache] + content-length: ['2247'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:43 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_contacts.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_contacts.yaml new file mode 100644 index 000000000000..db8edc2e362f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_contacts.yaml @@ -0,0 +1,150 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:15 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"contacts": [{"email": "admin@contoso.com", "name": "John Doe", "phone": + "1111111111"}, {"email": "admin2@contoso.com", "name": "John Doe2", "phone": + "2222222222"}]}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['166'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997851e11ad.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: + cache-control: [no-cache] + content-length: ['231'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997851e11ad.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: + cache-control: [no-cache] + content-length: ['231'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997851e11ad.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: + cache-control: [no-cache] + content-length: ['231'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"error":{"code":"ContactsNotFound","message":"Contacts not found"}}'} + headers: + cache-control: [no-cache] + content-length: ['68'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_issuer.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_issuer.yaml new file mode 100644 index 000000000000..2ef485be9691 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_issuer.yaml @@ -0,0 +1,236 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser"}, "org_details": + {"admin_details": [{"first_name": "John", "last_name": "Doe", "email": "admin@microsoft.com", + "phone": "4255555555"}]}, "attributes": {"enabled": true}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['235'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639758,"updated":1567639758}}'} + headers: + cache-control: [no-cache] + content-length: ['351'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639758,"updated":1567639758}}'} + headers: + cache-control: [no-cache] + content-length: ['351'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser2"}, "org_details": + {"admin_details": [{"first_name": "John", "last_name": "Doe", "email": "admin@microsoft.com", + "phone": "4255555555"}]}, "attributes": {"enabled": true}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['236'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer2","provider":"Test","credentials":{"account_id":"keyvaultuser2"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639759,"updated":1567639759}}'} + headers: + cache-control: [no-cache] + content-length: ['353'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test"},{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['234'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"org_details": {"admin_details": [{"first_name": "Jane", "last_name": + "Doe", "email": "admin@microsoft.com", "phone": "4255555555"}]}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['135'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"Jane","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639758,"updated":1567639759}}'} + headers: + cache-control: [no-cache] + content-length: ['351'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"Jane","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639758,"updated":1567639759}}'} + headers: + cache-control: [no-cache] + content-length: ['351'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateIssuerNotFound","message":"Issuer + not found"}}'} + headers: + cache-control: [no-cache] + content-length: ['75'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:29:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_operations.yaml new file mode 100644 index 000000000000..0b17ea13af55 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_crud_operations.yaml @@ -0,0 +1,298 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": true}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=DefaultPolicy", "sans": {}, "key_usage": ["cRLSign", + "dataEncipherment", "digitalSignature", "keyAgreement", "keyCertSign", "keyEncipherment"], + "validity_months": 12}, "lifetime_actions": [{"trigger": {"days_before_expiry": + 90}, "action": {"action_type": "AutoRenew"}}], "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['484'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCy33MZZLXznU+HGfTzEp8qJboRp2/mo65mKRahFQvKPQBqxuBREKXx1NQUvCRnfyR0yj85SqYHABTigVe+LjuMSwsS3HuvIX+z9laJpsFDvEUKsAec2U1CeBW0ViWCrfgXuM9jnb3vBDHNPUJkOW9OqoOnsLa2F3qDsNMEjQKSDh6fZkKMzsXJLHfefNUTav+26I+unpboR7fuf9EEho02R2t9g0Ju/CMas0WB5Jha01hCBNS5w6RaMsyBE0X7YP15nWoMQEJbJ0VSeh4SvpX0oub4xqB/ZfTj6hzAB9gfa1j/YFflQJa3XKNc+PZ87c+2OYfe/GQEfJsXvSJcpsxS","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"0ad7a15761f54258972f474f1a25f64c"}'} + headers: + cache-control: [no-cache] + content-length: ['1301'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + location: ['https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0&request_id=0ad7a15761f54258972f474f1a25f64c'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCy33MZZLXznU+HGfTzEp8qJboRp2/mo65mKRahFQvKPQBqxuBREKXx1NQUvCRnfyR0yj85SqYHABTigVe+LjuMSwsS3HuvIX+z9laJpsFDvEUKsAec2U1CeBW0ViWCrfgXuM9jnb3vBDHNPUJkOW9OqoOnsLa2F3qDsNMEjQKSDh6fZkKMzsXJLHfefNUTav+26I+unpboR7fuf9EEho02R2t9g0Ju/CMas0WB5Jha01hCBNS5w6RaMsyBE0X7YP15nWoMQEJbJ0VSeh4SvpX0oub4xqB/ZfTj6hzAB9gfa1j/YFflQJa3XKNc+PZ87c+2OYfe/GQEfJsXvSJcpsxS","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"0ad7a15761f54258972f474f1a25f64c"}'} + headers: + cache-control: [no-cache] + content-length: ['1301'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCy33MZZLXznU+HGfTzEp8qJboRp2/mo65mKRahFQvKPQBqxuBREKXx1NQUvCRnfyR0yj85SqYHABTigVe+LjuMSwsS3HuvIX+z9laJpsFDvEUKsAec2U1CeBW0ViWCrfgXuM9jnb3vBDHNPUJkOW9OqoOnsLa2F3qDsNMEjQKSDh6fZkKMzsXJLHfefNUTav+26I+unpboR7fuf9EEho02R2t9g0Ju/CMas0WB5Jha01hCBNS5w6RaMsyBE0X7YP15nWoMQEJbJ0VSeh4SvpX0oub4xqB/ZfTj6hzAB9gfa1j/YFflQJa3XKNc+PZ87c+2OYfe/GQEfJsXvSJcpsxS","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"0ad7a15761f54258972f474f1a25f64c"}'} + headers: + cache-control: [no-cache] + content-length: ['1301'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:28 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCy33MZZLXznU+HGfTzEp8qJboRp2/mo65mKRahFQvKPQBqxuBREKXx1NQUvCRnfyR0yj85SqYHABTigVe+LjuMSwsS3HuvIX+z9laJpsFDvEUKsAec2U1CeBW0ViWCrfgXuM9jnb3vBDHNPUJkOW9OqoOnsLa2F3qDsNMEjQKSDh6fZkKMzsXJLHfefNUTav+26I+unpboR7fuf9EEho02R2t9g0Ju/CMas0WB5Jha01hCBNS5w6RaMsyBE0X7YP15nWoMQEJbJ0VSeh4SvpX0oub4xqB/ZfTj6hzAB9gfa1j/YFflQJa3XKNc+PZ87c+2OYfe/GQEfJsXvSJcpsxS","cancellation_requested":false,"status":"completed","target":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292","request_id":"0ad7a15761f54258972f474f1a25f64c"}'} + headers: + cache-control: [no-cache] + content-length: ['1221'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCy33MZZLXznU+HGfTzEp8qJboRp2/mo65mKRahFQvKPQBqxuBREKXx1NQUvCRnfyR0yj85SqYHABTigVe+LjuMSwsS3HuvIX+z9laJpsFDvEUKsAec2U1CeBW0ViWCrfgXuM9jnb3vBDHNPUJkOW9OqoOnsLa2F3qDsNMEjQKSDh6fZkKMzsXJLHfefNUTav+26I+unpboR7fuf9EEho02R2t9g0Ju/CMas0WB5Jha01hCBNS5w6RaMsyBE0X7YP15nWoMQEJbJ0VSeh4SvpX0oub4xqB/ZfTj6hzAB9gfa1j/YFflQJa3XKNc+PZ87c+2OYfe/GQEfJsXvSJcpsxS","cancellation_requested":false,"status":"completed","target":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292","request_id":"0ad7a15761f54258972f474f1a25f64c"}'} + headers: + cache-control: [no-cache] + content-length: ['1221'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:42 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/be2db5afe8254b12bfab6288356c6814","kid":"https://vault1051159997aa0f1292.vault.azure.net/keys/certaa0f1292/be2db5afe8254b12bfab6288356c6814","sid":"https://vault1051159997aa0f1292.vault.azure.net/secrets/certaa0f1292/be2db5afe8254b12bfab6288356c6814","x5t":"c9mMcpiL9GyrNCL0fRXobh-D1dE","cer":"MIIDNjCCAh6gAwIBAgIQRS2V4duQSEukqXtK6MyzZTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMDkzM1oXDTIwMDkwNDIzMTkzM1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNEaYaYSgQDmTip5+vSHeNlUXQ9FMB0GA1UdDgQWBBTRGmGmEoEA5k4qefr0h3jZVF0PRTANBgkqhkiG9w0BAQsFAAOCAQEAxRnNOPdrA5N+bOohh3/KYZ0fHfwDokTbPiae1GnkXGepydrpfp9A53iXL1k97/ZpxaO8IcIj3KA95aHbH68K9lzmz68gL2X7Zz3yxXc9XXkuYx61+4f1uvIrb2v9ZHioXWKedUj9zkNW8LmLg5rs2rjhP8RGMioAmZlb1/Bead0BQCjaj6Rz2WWGVfwkOl/GxgXgNBodUcsG3we+4N4CGOyZoswpYyNO3Hk9vtR3M43Hjm/E2IARHeZsca7WAE3EvlD7gyK6kB1+h1GyPtO4rY0WeMLR3JFIRm8uaBxUqu2uOKTJV6xHP6TX6VgyB9AI33iFk2YYnjpNLSSFlOQqng==","attributes":{"enabled":true,"nbf":1567638573,"exp":1599261573,"created":1567639173,"updated":1567639173,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}},"pending":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2405'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:43 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"tags": {"tag1": "updated_value1"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['36'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/be2db5afe8254b12bfab6288356c6814","kid":"https://vault1051159997aa0f1292.vault.azure.net/keys/certaa0f1292/be2db5afe8254b12bfab6288356c6814","sid":"https://vault1051159997aa0f1292.vault.azure.net/secrets/certaa0f1292/be2db5afe8254b12bfab6288356c6814","x5t":"c9mMcpiL9GyrNCL0fRXobh-D1dE","cer":"MIIDNjCCAh6gAwIBAgIQRS2V4duQSEukqXtK6MyzZTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMDkzM1oXDTIwMDkwNDIzMTkzM1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNEaYaYSgQDmTip5+vSHeNlUXQ9FMB0GA1UdDgQWBBTRGmGmEoEA5k4qefr0h3jZVF0PRTANBgkqhkiG9w0BAQsFAAOCAQEAxRnNOPdrA5N+bOohh3/KYZ0fHfwDokTbPiae1GnkXGepydrpfp9A53iXL1k97/ZpxaO8IcIj3KA95aHbH68K9lzmz68gL2X7Zz3yxXc9XXkuYx61+4f1uvIrb2v9ZHioXWKedUj9zkNW8LmLg5rs2rjhP8RGMioAmZlb1/Bead0BQCjaj6Rz2WWGVfwkOl/GxgXgNBodUcsG3we+4N4CGOyZoswpYyNO3Hk9vtR3M43Hjm/E2IARHeZsca7WAE3EvlD7gyK6kB1+h1GyPtO4rY0WeMLR3JFIRm8uaBxUqu2uOKTJV6xHP6TX6VgyB9AI33iFk2YYnjpNLSSFlOQqng==","attributes":{"enabled":true,"nbf":1567638573,"exp":1599261573,"created":1567639173,"updated":1567639183,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}},"pending":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2438'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:43 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/be2db5afe8254b12bfab6288356c6814","kid":"https://vault1051159997aa0f1292.vault.azure.net/keys/certaa0f1292/be2db5afe8254b12bfab6288356c6814","sid":"https://vault1051159997aa0f1292.vault.azure.net/secrets/certaa0f1292/be2db5afe8254b12bfab6288356c6814","x5t":"c9mMcpiL9GyrNCL0fRXobh-D1dE","cer":"MIIDNjCCAh6gAwIBAgIQRS2V4duQSEukqXtK6MyzZTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMDkzM1oXDTIwMDkwNDIzMTkzM1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANE7PJWZZ5y3ccM5lgl6b75S04htH9ejlyXpKXIHKV+YLOhLVWFUyrb2io/dzjPFVQr4L3rGWJn/WfaqvrWD/sFqHPIZt9F+ZfZKOyKhC93JwtvqE8mobu93caZBnsa0wRi5skXu0HouCdLIO6buDdjROXWuLfyjLdcPVx9nnyAT9Dxow2qwV7mtFj20RPMrkQhuFcc+D1ETLvbz4tnZ2WogD05MLWzqt5LY4KBBSfMvTa/Et4e6qnTt9NuxNQjVdQt/u8tiBorjTKeo3nHeMMaPdPHp6lPY/Idigg4Gcx4m4Y4iZW10HX3jd/fE1uO2Dx8ft/Ex9YNnDUuDDTnFfqkCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNEaYaYSgQDmTip5+vSHeNlUXQ9FMB0GA1UdDgQWBBTRGmGmEoEA5k4qefr0h3jZVF0PRTANBgkqhkiG9w0BAQsFAAOCAQEAxRnNOPdrA5N+bOohh3/KYZ0fHfwDokTbPiae1GnkXGepydrpfp9A53iXL1k97/ZpxaO8IcIj3KA95aHbH68K9lzmz68gL2X7Zz3yxXc9XXkuYx61+4f1uvIrb2v9ZHioXWKedUj9zkNW8LmLg5rs2rjhP8RGMioAmZlb1/Bead0BQCjaj6Rz2WWGVfwkOl/GxgXgNBodUcsG3we+4N4CGOyZoswpYyNO3Hk9vtR3M43Hjm/E2IARHeZsca7WAE3EvlD7gyK6kB1+h1GyPtO4rY0WeMLR3JFIRm8uaBxUqu2uOKTJV6xHP6TX6VgyB9AI33iFk2YYnjpNLSSFlOQqng==","attributes":{"enabled":true,"nbf":1567638573,"exp":1599261573,"created":1567639173,"updated":1567639183,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}},"pending":{"id":"https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2438'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:44 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa0f1292.vault.azure.net/certificates/certaa0f1292/be2db5afe8254b12bfab6288356c6814?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Certificate + not found: certaa0f1292/versions/be2db5afe8254b12bfab6288356c6814"}}'} + headers: + cache-control: [no-cache] + content-length: ['130'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:44 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_get_pending_certificate_signing_request.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_get_pending_certificate_signing_request.yaml new file mode 100644 index 000000000000..5ae1e0462349 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_get_pending_certificate_signing_request.yaml @@ -0,0 +1,239 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:04 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"3345089b55c44826834bfdc2ec1045e7"}'} + headers: + cache-control: [no-cache] + content-length: ['1350'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:05 GMT'] + expires: ['-1'] + location: ['https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0&request_id=3345089b55c44826834bfdc2ec1045e7'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"3345089b55c44826834bfdc2ec1045e7"}'} + headers: + cache-control: [no-cache] + content-length: ['1350'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:05 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"3345089b55c44826834bfdc2ec1045e7"}'} + headers: + cache-control: [no-cache] + content-length: ['1350'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:15 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert","request_id":"3345089b55c44826834bfdc2ec1045e7"}'} + headers: + cache-control: [no-cache] + content-length: ['1275'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:25 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/pkcs10] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=} + headers: + cache-control: [no-cache] + content-length: ['956'] + content-type: [application/pkcs10; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:31 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/N3pOz7/NgPk2khYGnX6CfM0uVfLWZ3/+DvnzahhrpaBi1SRBMIk7OiFcd8bx1PfMLQC/E9MD8LbHhAvQgehpmBvR8U2Kk7d3ndFoTSG/Q97qKJyxbq3JKBMLQhcwFUWkLD1ynmO/cKGc1H/aR8pZwZUKeDytHb8O1IWfe+fJUS5Y7lkZsq0o2WtUR6Ssr1ZaZdvAQ8YoHmjahQNHR+jqN9Xvriw8it2THzLkVneUF9znXWJaRpV4GoLcDW00NgvDx6xbLz05K8vcYJwurL8sl62zq732nFZLFtqeChsFd1ozRv1NiIYEc1ZDr7IWBHAjXWnJaePOsr8rxLK0rF1kwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFArkimvS6tFp0IaYgk7S83Zqxn5ovCL91scXY705MVDke3mslvW3R+UUfCGp6NEqsanUspxMSJsfLmcHU24JKQSzxfUlJkE/hFHZNAIRgseYJ5ZOvXds/jxo26a7CqlwL9IwdSRDHjRN5JPTbb7GwkBXjahCryvdJ2DMDLAz/ucDtiIRK7D7xQuFDH+UWyFDBA3ij45/qpwrBtOU7vxqnWHcQPwAL7mkrR0h1zuwpyLO8f3IRlf1gxhcr8IdtKeo0jPZcogfURygyjOxBqjhkCpalSDAT/Gg6KrEatQG21rL0YD/OdRPYxzQKcvGFBTyAzo3Zfbc5wrwP0utZ/64xE=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert","request_id":"3345089b55c44826834bfdc2ec1045e7"}'} + headers: + cache-control: [no-cache] + content-length: ['1275'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:31 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/c74aae98732c4f1dae1dd6c12efc5cef","kid":"https://vault1051159997dda41c5d.vault.azure.net/keys/unknownIssuerCert/c74aae98732c4f1dae1dd6c12efc5cef","sid":"https://vault1051159997dda41c5d.vault.azure.net/secrets/unknownIssuerCert/c74aae98732c4f1dae1dd6c12efc5cef","x5t":"zQtID9Qb0JVBh62VLQeFJVeduCg","cer":"MIIDWjCCAkKgAwIBAgIQYliWOO5RQriEVOpygj/fHDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA1MTYxNDIwWhcNMjEwOTA1MTYyNDIwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD83ek7Pv82A+TaSFgadfoJ8zS5V8tZnf/4O+fNqGGuloGLVJEEwiTs6IVx3xvHU98wtAL8T0wPwtseEC9CB6GmYG9HxTYqTt3ed0WhNIb9D3uoonLFurckoEwtCFzAVRaQsPXKeY79woZzUf9pHylnBlQp4PK0dvw7UhZ9758lRLljuWRmyrSjZa1RHpKyvVlpl28BDxigeaNqFA0dH6Oo31e+uLDyK3ZMfMuRWd5QX3OddYlpGlXgagtwNbTQ2C8PHrFsvPTkry9xgnC6svyyXrbOrvfacVksW2p4KGwV3WjNG/U2IhgRzVkOvshYEcCNdaclp486yvyvEsrSsXWTAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFJNsqSaROmEcfX/7UqvHW3hr+Em8MB0GA1UdDgQWBBSTbKkmkTphHH1/+1Krx1t4a/hJvDANBgkqhkiG9w0BAQsFAAOCAQEAb/2Tj0R+8l9rsUcEHY6djfMS5DlJiJz7lsSpmjjlfuAqOM2qFSt3lmnWzOi5e7+R8atvABH/aIziwgrU7iGlIBEJL7ALlkXLdBnhStVHuCN37qNJavI5FZMiUThFt0c8WC2OvcWTvuBXuX0YKpWgT6GZECLYS8ma2odcOg7fyytSgkKt+Y7hYcwVw1aV03EHegeOL+pmbYvhImX52nQAGaqJC4NraTnl6GCK5yBDb4iw133+thDeInJ9wgTCUMRUbeqJIAfm4SW4u8eMVsgIJQ2lWLp4IeHZhPWnGM1ZGXA04K3pGqiMhYiEXAW/t9a5Lz2dcJ+WRn1eAo0YuG0HiQ==","attributes":{"enabled":true,"nbf":1567700060,"exp":1630859060,"created":1567700660,"updated":1567700660,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567700645,"updated":1567700645}},"pending":{"id":"https://vault1051159997dda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2457'] + content-type: [application/json; charset=utf-8] + date: ['Thu, 05 Sep 2019 16:24:32 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list.yaml new file mode 100644 index 000000000000..8b1f0305ef79 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list.yaml @@ -0,0 +1,278 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert0f5650dfd/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert0f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert0f5650dfd/a8440275644e4c7db6b05ad4dd7ef495","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert0f5650dfd/a8440275644e4c7db6b05ad4dd7ef495","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert0f5650dfd/a8440275644e4c7db6b05ad4dd7ef495","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639157,"updated":1567639157,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert0f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert1f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert1f5650dfd/89cc3c94944344929ab98ebcc8b6c05e","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert1f5650dfd/89cc3c94944344929ab98ebcc8b6c05e","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert1f5650dfd/89cc3c94944344929ab98ebcc8b6c05e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert1f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639158}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert2f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert2f5650dfd/3d56ceb6aa4640d68366f63f90c8420b","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert2f5650dfd/3d56ceb6aa4640d68366f63f90c8420b","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert2f5650dfd/3d56ceb6aa4640d68366f63f90c8420b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert2f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639158}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert3f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert3f5650dfd/49291ed29e014e7fa2e5c605b02c5040","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert3f5650dfd/49291ed29e014e7fa2e5c605b02c5040","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert3f5650dfd/49291ed29e014e7fa2e5c605b02c5040","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert3f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639159,"updated":1567639159}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert4f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert4f5650dfd/c57d442a78c94b11b0977be867981481","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert4f5650dfd/c57d442a78c94b11b0977be867981481","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert4f5650dfd/c57d442a78c94b11b0977be867981481","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert4f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639159,"updated":1567639159}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert5f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert5f5650dfd/b47c72b0bc6647dbaff5a0c8fdbdf260","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert5f5650dfd/b47c72b0bc6647dbaff5a0c8fdbdf260","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert5f5650dfd/b47c72b0bc6647dbaff5a0c8fdbdf260","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert5f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639160,"updated":1567639160}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates/cert6f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert6f5650dfd/1628cb77ea0d488ca9d9a1b470194b4c","kid":"https://vault1051159997f5650dfd.vault.azure.net/keys/cert6f5650dfd/1628cb77ea0d488ca9d9a1b470194b4c","sid":"https://vault1051159997f5650dfd.vault.azure.net/secrets/cert6f5650dfd/1628cb77ea0d488ca9d9a1b470194b4c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert6f5650dfd/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639160,"updated":1567639160}}}'} + headers: + cache-control: [no-cache] + content-length: ['1834'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997f5650dfd.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert0f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639157,"updated":1567639157},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert1f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert2f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert3f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert4f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert5f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160},"subject":""},{"id":"https://vault1051159997f5650dfd.vault.azure.net/certificates/cert6f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['1700'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:20 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_certificate_versions.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_certificate_versions.yaml new file mode 100644 index 000000000000..b6a3992c8ddc --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_certificate_versions.yaml @@ -0,0 +1,278 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/f10a12d1e7b947419a4b1dfce77bd596","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/f10a12d1e7b947419a4b1dfce77bd596","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/f10a12d1e7b947419a4b1dfce77bd596","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639158}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/27babdb35bcd4157bba6b93133e7945f","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/27babdb35bcd4157bba6b93133e7945f","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/27babdb35bcd4157bba6b93133e7945f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639158}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/64e1841b1648463c8e301a53da6d3f3e","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/64e1841b1648463c8e301a53da6d3f3e","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/64e1841b1648463c8e301a53da6d3f3e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639159}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/d89d0db0dbb64a57973f8259f3315038","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/d89d0db0dbb64a57973f8259f3315038","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/d89d0db0dbb64a57973f8259f3315038","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639159}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/b37c81dcf5904c40a59c89ba060b1977","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/b37c81dcf5904c40a59c89ba060b1977","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/b37c81dcf5904c40a59c89ba060b1977","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639160}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:19 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/0281e0ffeda3447d8e9f91a6b3129f2b","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/0281e0ffeda3447d8e9f91a6b3129f2b","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/0281e0ffeda3447d8e9f91a6b3129f2b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639160}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:20 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/522e128240ff447aa3c936772e1b2dd1","kid":"https://vault105115999779c016b7.vault.azure.net/keys/certver79c016b7/522e128240ff447aa3c936772e1b2dd1","sid":"https://vault105115999779c016b7.vault.azure.net/secrets/certver79c016b7/522e128240ff447aa3c936772e1b2dd1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639158,"updated":1567639160}}}'} + headers: + cache-control: [no-cache] + content-length: ['1842'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:20 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/versions?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/0281e0ffeda3447d8e9f91a6b3129f2b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/27babdb35bcd4157bba6b93133e7945f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/522e128240ff447aa3c936772e1b2dd1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/64e1841b1648463c8e301a53da6d3f3e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/b37c81dcf5904c40a59c89ba060b1977","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639160,"updated":1567639160},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/d89d0db0dbb64a57973f8259f3315038","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639159,"updated":1567639159},"subject":""},{"id":"https://vault105115999779c016b7.vault.azure.net/certificates/certver79c016b7/f10a12d1e7b947419a4b1dfce77bd596","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639158,"updated":1567639158},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['1945'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:20 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_versions.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_versions.yaml new file mode 100644 index 000000000000..ef2f735ded20 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_list_versions.yaml @@ -0,0 +1,380 @@ +interactions: +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/40e7303d7e8e41d3a9127f549fdb1172","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/40e7303d7e8e41d3a9127f549fdb1172","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/40e7303d7e8e41d3a9127f549fdb1172","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401405,"updated":1563401405,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401405}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:06 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/eef3e63ac6d54529aa567664880a0c7c","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/eef3e63ac6d54529aa567664880a0c7c","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/eef3e63ac6d54529aa567664880a0c7c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401406,"updated":1563401406,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401406}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:06 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/072a06b649fd4c4f90ac9cf75217dce4","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/072a06b649fd4c4f90ac9cf75217dce4","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/072a06b649fd4c4f90ac9cf75217dce4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401407,"updated":1563401407,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401407}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:07 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/6d9c31e087d74638a62ee47dfae41608","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/6d9c31e087d74638a62ee47dfae41608","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/6d9c31e087d74638a62ee47dfae41608","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401407,"updated":1563401407,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401407}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:07 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/f853d025b860485b9b1fdafeb0465516","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/f853d025b860485b9b1fdafeb0465516","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/f853d025b860485b9b1fdafeb0465516","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401407,"updated":1563401407,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401407}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:07 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/64553d50d646465f928a59ce719f24b2","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/64553d50d646465f928a59ce719f24b2","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/64553d50d646465f928a59ce719f24b2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401408,"updated":1563401408,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401408}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:08 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/37bef912f0fc4f46bcd196c8b8513e2e","kid":"https://vault864e11d5.vault.azure.net/keys/certver864e11d5/37bef912f0fc4f46bcd196c8b8513e2e","sid":"https://vault864e11d5.vault.azure.net/secrets/certver864e11d5/37bef912f0fc4f46bcd196c8b8513e2e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1563401408,"updated":1563401408,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault864e11d5.vault.azure.net/certificates/certver864e11d5/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1563401405,"updated":1563401408}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Jul 2019 22:10:08 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_lst_versions.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_lst_versions.yaml new file mode 100644 index 000000000000..263e3ee8ca30 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_lst_versions.yaml @@ -0,0 +1,428 @@ +interactions: +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/ef910c91df49425ab0909f847c971ea2","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/ef910c91df49425ab0909f847c971ea2","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/ef910c91df49425ab0909f847c971ea2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110297,"updated":1562110297,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110297}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:38 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/ea9afeaafc0e4257a5cf430725877245","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/ea9afeaafc0e4257a5cf430725877245","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/ea9afeaafc0e4257a5cf430725877245","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110298,"updated":1562110298,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110298}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:38 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/447e151392b641c29cf8b42805d27d8f","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/447e151392b641c29cf8b42805d27d8f","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/447e151392b641c29cf8b42805d27d8f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110299,"updated":1562110299,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110299}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:39 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/06c17c5072114f4db7f93273f5c0c4b6","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/06c17c5072114f4db7f93273f5c0c4b6","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/06c17c5072114f4db7f93273f5c0c4b6","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110299,"updated":1562110299,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110299}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:39 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/cb8748730cbb4c58af71535f52519a7a","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/cb8748730cbb4c58af71535f52519a7a","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/cb8748730cbb4c58af71535f52519a7a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110300}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:39 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/1d26f8d39dc04660bc77246e5ce6950c","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/1d26f8d39dc04660bc77246e5ce6950c","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/1d26f8d39dc04660bc77246e5ce6950c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110300}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:40 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '3339' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/import?api-version=7.0 + response: + body: + string: '{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/69da2ff6abd145a3a9d1ad352fcbdd90","kid":"https://vault74b5116c.vault.azure.net/keys/certver74b5116c/69da2ff6abd145a3a9d1ad352fcbdd90","sid":"https://vault74b5116c.vault.azure.net/secrets/certver74b5116c/69da2ff6abd145a3a9d1ad352fcbdd90","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1562110297,"updated":1562110300}}}' + headers: + cache-control: + - no-cache + content-length: + - '1802' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:40 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.7.2 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b1 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/versions?api-version=7.0 + response: + body: + string: '{"value":[{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/06c17c5072114f4db7f93273f5c0c4b6","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110299,"updated":1562110299},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/1d26f8d39dc04660bc77246e5ce6950c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/447e151392b641c29cf8b42805d27d8f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110299,"updated":1562110299},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/69da2ff6abd145a3a9d1ad352fcbdd90","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/cb8748730cbb4c58af71535f52519a7a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110300,"updated":1562110300},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/ea9afeaafc0e4257a5cf430725877245","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110298,"updated":1562110298},"subject":""},{"id":"https://vault74b5116c.vault.azure.net/certificates/certver74b5116c/ef910c91df49425ab0909f847c971ea2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1562110297,"updated":1562110297},"subject":""}],"nextLink":null}' + headers: + cache-control: + - no-cache + content-length: + - '1875' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 02 Jul 2019 23:31:40 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.26;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_merge_certificate.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_merge_certificate.yaml new file mode 100644 index 000000000000..83584e568d3f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_merge_certificate.yaml @@ -0,0 +1,213 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"x509_props": {"subject": "CN=MyCert", "sans": {}}, "issuer": + {"name": "Unknown", "cert_transparency": false}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['123'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn38bKr0WcxqY8S5Onn/ke8qA4RxOdIame/V+3oziSxcr0LuJB0jWOktyB+elROvmIKYWBtFz91UtXEtBDFc7auUa2yZifbVcNDVtRN13TbqdgEfNkBEMd7KWFWCsoDBjZ1TgHb0AKkM3AjH6L7CKf3yyod/AhdxLXCCFLgkdZskt0+TaAwSPtfcOvj0jujEBo0/8wcGOfJ+DyBnFsNpMXpIxGQo2QGGtkcCnE3qZt0hpLL+pCU41dac0BQhudu5fxmdRQSMtX+OrL6FLLz7TTkssBKSkTlYFOoW9XapvQTk/8aIkDwVEOnQ6ZRCDRSkMP+na/FfQX9dsHAslyrhZxQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAInhmSpCoLoGBrLhsWNclsSJg0ztuo4tOEIcoa454Gh7X+0J50Ce2XhL9MtwPKF2QFSwnVA4IQq2xyonHgqc7bSfAv3Af/eoJ2vtM0NLzFQyKC5ai2jW6gZhBa90bfIaESNCA7eAC3I52gl3LlfGijYKm5DMNgr7dSiaWogIZ1X2ahanaGrag0knVIa5hJWm9CbxT4Lk6cnHTunOGpblMg+3Ljump++RX3i25Qixhij7u17lzlBp1nhq0NUOwr25EDpdkTs6CUYVjWvJa0Lxujm8ySUukJrkS1dOslzPSdLmF8SiK5M+3FLhrhsCpmJ4zT+lMd2fXlvnJYbJd9Rgz54=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"1b3de19bb3fe41fd95f2c9bdfec1b705"}'} + headers: + cache-control: [no-cache] + content-length: ['1230'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + location: ['https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0&request_id=1b3de19bb3fe41fd95f2c9bdfec1b705'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn38bKr0WcxqY8S5Onn/ke8qA4RxOdIame/V+3oziSxcr0LuJB0jWOktyB+elROvmIKYWBtFz91UtXEtBDFc7auUa2yZifbVcNDVtRN13TbqdgEfNkBEMd7KWFWCsoDBjZ1TgHb0AKkM3AjH6L7CKf3yyod/AhdxLXCCFLgkdZskt0+TaAwSPtfcOvj0jujEBo0/8wcGOfJ+DyBnFsNpMXpIxGQo2QGGtkcCnE3qZt0hpLL+pCU41dac0BQhudu5fxmdRQSMtX+OrL6FLLz7TTkssBKSkTlYFOoW9XapvQTk/8aIkDwVEOnQ6ZRCDRSkMP+na/FfQX9dsHAslyrhZxQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAInhmSpCoLoGBrLhsWNclsSJg0ztuo4tOEIcoa454Gh7X+0J50Ce2XhL9MtwPKF2QFSwnVA4IQq2xyonHgqc7bSfAv3Af/eoJ2vtM0NLzFQyKC5ai2jW6gZhBa90bfIaESNCA7eAC3I52gl3LlfGijYKm5DMNgr7dSiaWogIZ1X2ahanaGrag0knVIa5hJWm9CbxT4Lk6cnHTunOGpblMg+3Ljump++RX3i25Qixhij7u17lzlBp1nhq0NUOwr25EDpdkTs6CUYVjWvJa0Lxujm8ySUukJrkS1dOslzPSdLmF8SiK5M+3FLhrhsCpmJ4zT+lMd2fXlvnJYbJd9Rgz54=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"1b3de19bb3fe41fd95f2c9bdfec1b705"}'} + headers: + cache-control: [no-cache] + content-length: ['1230'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:17 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn38bKr0WcxqY8S5Onn/ke8qA4RxOdIame/V+3oziSxcr0LuJB0jWOktyB+elROvmIKYWBtFz91UtXEtBDFc7auUa2yZifbVcNDVtRN13TbqdgEfNkBEMd7KWFWCsoDBjZ1TgHb0AKkM3AjH6L7CKf3yyod/AhdxLXCCFLgkdZskt0+TaAwSPtfcOvj0jujEBo0/8wcGOfJ+DyBnFsNpMXpIxGQo2QGGtkcCnE3qZt0hpLL+pCU41dac0BQhudu5fxmdRQSMtX+OrL6FLLz7TTkssBKSkTlYFOoW9XapvQTk/8aIkDwVEOnQ6ZRCDRSkMP+na/FfQX9dsHAslyrhZxQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAInhmSpCoLoGBrLhsWNclsSJg0ztuo4tOEIcoa454Gh7X+0J50Ce2XhL9MtwPKF2QFSwnVA4IQq2xyonHgqc7bSfAv3Af/eoJ2vtM0NLzFQyKC5ai2jW6gZhBa90bfIaESNCA7eAC3I52gl3LlfGijYKm5DMNgr7dSiaWogIZ1X2ahanaGrag0knVIa5hJWm9CbxT4Lk6cnHTunOGpblMg+3Ljump++RX3i25Qixhij7u17lzlBp1nhq0NUOwr25EDpdkTs6CUYVjWvJa0Lxujm8ySUukJrkS1dOslzPSdLmF8SiK5M+3FLhrhsCpmJ4zT+lMd2fXlvnJYbJd9Rgz54=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"1b3de19bb3fe41fd95f2c9bdfec1b705"}'} + headers: + cache-control: [no-cache] + content-length: ['1230'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:27 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn38bKr0WcxqY8S5Onn/ke8qA4RxOdIame/V+3oziSxcr0LuJB0jWOktyB+elROvmIKYWBtFz91UtXEtBDFc7auUa2yZifbVcNDVtRN13TbqdgEfNkBEMd7KWFWCsoDBjZ1TgHb0AKkM3AjH6L7CKf3yyod/AhdxLXCCFLgkdZskt0+TaAwSPtfcOvj0jujEBo0/8wcGOfJ+DyBnFsNpMXpIxGQo2QGGtkcCnE3qZt0hpLL+pCU41dac0BQhudu5fxmdRQSMtX+OrL6FLLz7TTkssBKSkTlYFOoW9XapvQTk/8aIkDwVEOnQ6ZRCDRSkMP+na/FfQX9dsHAslyrhZxQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAInhmSpCoLoGBrLhsWNclsSJg0ztuo4tOEIcoa454Gh7X+0J50Ce2XhL9MtwPKF2QFSwnVA4IQq2xyonHgqc7bSfAv3Af/eoJ2vtM0NLzFQyKC5ai2jW6gZhBa90bfIaESNCA7eAC3I52gl3LlfGijYKm5DMNgr7dSiaWogIZ1X2ahanaGrag0knVIa5hJWm9CbxT4Lk6cnHTunOGpblMg+3Ljump++RX3i25Qixhij7u17lzlBp1nhq0NUOwr25EDpdkTs6CUYVjWvJa0Lxujm8ySUukJrkS1dOslzPSdLmF8SiK5M+3FLhrhsCpmJ4zT+lMd2fXlvnJYbJd9Rgz54=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"1b3de19bb3fe41fd95f2c9bdfec1b705"}'} + headers: + cache-control: [no-cache] + content-length: ['1230'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn38bKr0WcxqY8S5Onn/ke8qA4RxOdIame/V+3oziSxcr0LuJB0jWOktyB+elROvmIKYWBtFz91UtXEtBDFc7auUa2yZifbVcNDVtRN13TbqdgEfNkBEMd7KWFWCsoDBjZ1TgHb0AKkM3AjH6L7CKf3yyod/AhdxLXCCFLgkdZskt0+TaAwSPtfcOvj0jujEBo0/8wcGOfJ+DyBnFsNpMXpIxGQo2QGGtkcCnE3qZt0hpLL+pCU41dac0BQhudu5fxmdRQSMtX+OrL6FLLz7TTkssBKSkTlYFOoW9XapvQTk/8aIkDwVEOnQ6ZRCDRSkMP+na/FfQX9dsHAslyrhZxQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAInhmSpCoLoGBrLhsWNclsSJg0ztuo4tOEIcoa454Gh7X+0J50Ce2XhL9MtwPKF2QFSwnVA4IQq2xyonHgqc7bSfAv3Af/eoJ2vtM0NLzFQyKC5ai2jW6gZhBa90bfIaESNCA7eAC3I52gl3LlfGijYKm5DMNgr7dSiaWogIZ1X2ahanaGrag0knVIa5hJWm9CbxT4Lk6cnHTunOGpblMg+3Ljump++RX3i25Qixhij7u17lzlBp1nhq0NUOwr25EDpdkTs6CUYVjWvJa0Lxujm8ySUukJrkS1dOslzPSdLmF8SiK5M+3FLhrhsCpmJ4zT+lMd2fXlvnJYbJd9Rgz54=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"1b3de19bb3fe41fd95f2c9bdfec1b705"}'} + headers: + cache-control: [no-cache] + content-length: ['1230'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:48 GMT'] + expires: ['-1'] + pragma: [no-cache] + retry-after: ['10'] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"x5c": ["TUlJQ3lqQ0NBYklDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREFlRncweE9UQTVNRFF5TXpFNU5EaGFGdzB4T1RBNU1EUXlNekl3TkRoYU1CRXhEekFOQmdOVkJBTVRCazE1UTJWeWREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUo5L0d5cTlGbk1hbVBFdVRwNS81SHZLZ09FY1RuU0dwbnYxZnQ2TTRrc1hLOUM3aVFkSTFqcExjZ2ZucFVUcjVpQ21GZ2JSYy9kVkxWeExRUXhYTzJybEd0c21ZbjIxWERRMWJVVGRkMDI2bllCSHpaQVJESGV5bGhWZ3JLQXdZMmRVNEIyOUFDcEROd0l4K2krd2luOThzcUhmd0lYY1Mxd2doUzRKSFdiSkxkUGsyZ01FajdYM0RyNDlJN294QWFOUC9NSEJqbnlmZzhnWnhiRGFURjZTTVJrS05rQmhyWkhBcHhONm1iZElhU3kvcVFsT05YV25OQVVJYm5idVg4Wm5VVUVqTFYvanF5K2hTeTgrMDA1TExBU2twRTVXQlRxRnZWMnFiMEU1UC9HaUpBOEZSRHAwT21VUWcwVXBERC9wMnZ4WDBGL1hiQndMSmNxNFdjVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVpLT0daOC9OQmd0WTFid3RRRXcxZVVVelU4Ri8ra0RCeHAyODl5aTBWczcvZzVkdms2OE00V2xRNjYwUVIxMGdIbU9NUWxvSHZvMGxJbXFRYUl3eCtldnBxdlJhVGZCNjVQRGVpSG5iVG5MSzFtL3c0akJPVTZ1SmFFWEdDeTI5Ym12dWRaQW42c0VqeENUWXJlTDVBWnN6YmVPM1dsMVo1ZkQxc2NRQnZkKytyRWVKZWVLMmxKaWM0bHpOUE5nZHFocVVUY3lZcFdOU3dFNFRyeXlYeXJ0VlhSRDVMTEZkMGszTkxkcWVna2tkU0xtZWNKam45blE2elZSbTBieWZOelhqUGJNYWZQL3k2VzJSejdhdXJnUVlMR21wZGxxZVdxT0JOL0t4aXlzZWNxaEFPYW43MkJ0aXF0cG5mK1BycVQ1YUxFWlJJeFdxdjI5akMxMnVpZz09"]}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['1293'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending/merge?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/f8458998787a4b46860305081b9d73d4","kid":"https://vault1051159997cf0f1333.vault.azure.net/keys/mergeCertificate/f8458998787a4b46860305081b9d73d4","sid":"https://vault1051159997cf0f1333.vault.azure.net/secrets/mergeCertificate/f8458998787a4b46860305081b9d73d4","x5t":"QIQJzdaI6u8ueFwhLOSmsZJBKKU","cer":"MIICyjCCAbICAQEwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MDQyMzE5NDhaFw0xOTA5MDQyMzIwNDhaMBExDzANBgNVBAMTBk15Q2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ9/Gyq9FnMamPEuTp5/5HvKgOEcTnSGpnv1ft6M4ksXK9C7iQdI1jpLcgfnpUTr5iCmFgbRc/dVLVxLQQxXO2rlGtsmYn21XDQ1bUTdd026nYBHzZARDHeylhVgrKAwY2dU4B29ACpDNwIx+i+win98sqHfwIXcS1wghS4JHWbJLdPk2gMEj7X3Dr49I7oxAaNP/MHBjnyfg8gZxbDaTF6SMRkKNkBhrZHApxN6mbdIaSy/qQlONXWnNAUIbnbuX8ZnUUEjLV/jqy+hSy8+005LLASkpE5WBTqFvV2qb0E5P/GiJA8FRDp0OmUQg0UpDD/p2vxX0F/XbBwLJcq4WcUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAZKOGZ8/NBgtY1bwtQEw1eUUzU8F/+kDBxp289yi0Vs7/g5dvk68M4WlQ660QR10gHmOMQloHvo0lImqQaIwx+evpqvRaTfB65PDeiHnbTnLK1m/w4jBOU6uJaEXGCy29bmvudZAn6sEjxCTYreL5AZszbeO3Wl1Z5fD1scQBvd++rEeJeeK2lJic4lzNPNgdqhqUTcyYpWNSwE4TryyXyrtVXRD5LLFd0k3NLdqegkkdSLmecJjn9nQ6zVRm0byfNzXjPbMafP/y6W2Rz7aurgQYLGmpdlqeWqOBN/KxiysecqhAOan72Btiqtpnf+PrqT5aLEZRIxWqv29jC12uig==","attributes":{"enabled":true,"nbf":1567639188,"exp":1567639248,"created":1567639188,"updated":1567639188,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=MyCert","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown","cert_transparency":false},"attributes":{"enabled":true,"created":1567639158,"updated":1567639158}},"pending":{"id":"https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2251'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:49 GMT'] + expires: ['-1'] + location: ['https://vault1051159997cf0f1333.vault.azure.net/certificates/mergeCertificate?api-version=7.0'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 201, message: Created} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_policy.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_policy.yaml new file mode 100644 index 000000000000..d7617cd8c7ba --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_policy.yaml @@ -0,0 +1,150 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/e5f19bc3645d4551b1ce5461b841c40d","kid":"https://vault105115999712a60ed1.vault.azure.net/keys/policyCertificate/e5f19bc3645d4551b1ce5461b841c40d","sid":"https://vault105115999712a60ed1.vault.azure.net/secrets/policyCertificate/e5f19bc3645d4551b1ce5461b841c40d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639157,"updated":1567639157,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}}}'} + headers: + cache-control: [no-cache] + content-length: ['1850'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639157}}'} + headers: + cache-control: [no-cache] + content-length: ['550'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"key_props": {"exportable": true, "kty": "RSA", "key_size": 2048, "reuse_key": + false}, "secret_props": {"contentType": "application/x-pkcs12"}, "issuer": {"name": + "Self"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['172'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639158}}'} + headers: + cache-control: [no-cache] + content-length: ['547'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999712a60ed1.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639157,"updated":1567639158}}'} + headers: + cache-control: [no-cache] + content-length: ['547'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:19:18 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_recover_and_purge.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_recover_and_purge.yaml new file mode 100644 index 000000000000..58347438833f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_recover_and_purge.yaml @@ -0,0 +1,1481 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:22 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639223,"updated":1567639223,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639223,"updated":1567639223}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:23 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:24 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "MIIJOwIBAzCCCPcGCSqGSIb3DQEHAaCCCOgEggjkMIII4DCCBgkGCSqGSIb3DQEHAaCCBfoEggX2MIIF8jCCBe4GCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAj15YH9pOE58AICB9AEggTYLrI+SAru2dBZRQRlJY7XQ3LeLkah2FcRR3dATDshZ2h0IA2oBrkQIdsLyAAWZ32qYR1qkWxLHn9AqXgu27AEbOk35+pITZaiy63YYBkkpR+pDdngZt19Z0PWrGwHEq5z6BHS2GLyyN8SSOCbdzCz7blj3+7IZYoMj4WOPgOm/tQ6U44SFWek46QwN2zeA4i97v7ftNNns27ms52jqfhOvTA9c/wyfZKAY4aKJfYYUmycKjnnRl012ldS2lOkASFt+lu4QCa72IY6ePtRudPCvmzRv2pkLYS6z3cI7omT8nHP3DymNOqLbFqr5O2M1ZYaLC63Q3xt3eVvbcPh3N08D1hHkhz/KDTvkRAQpvrW8ISKmgDdmzN55Pe55xHfSWGB7gPw8sZea57IxFzWHTK2yvTslooWoosmGxanYY2IG/no3EbPOWDKjPZ4ilYJe5JJ2immlxPz+2e2EOCKpDI+7fzQcRz3PTd3BK+budZ8aXX8aW/lOgKS8WmxZoKnOJBNWeTNWQFugmktXfdPHAdxMhjUXqeGQd8wTvZ4EzQNNafovwkI7IV/ZYoa++RGofVR3ZbRSiBNF6TDj/qXFt0wN/CQnsGAmQAGNiN+D4mY7i25dtTu/Jc7OxLdhAUFpHyJpyrYWLfvOiS5WYBeEDHkiPUa/8eZSPA3MXWZR1RiuDvuNqMjct1SSwdXADTtF68l/US1ksU657+XSC+6ly1A/upz+X71+C4Ho6W0751j5ZMT6xKjGh5pee7MVuduxIzXjWIy3YSd0fIT3U0A5NLEvJ9rfkx6JiHjRLx6V1tqsrtT6BsGtmCQR1UCJPLqsKVDvAINx3cPA/CGqr5OX2BGZlAihGmN6n7gv8w4O0k0LPTAe5YefgXN3m9pE867N31GtHVZaJ/UVgDNYS2jused4rw76ZWN41akx2QN0JSeMJqHXqVz6AKfz8ICS/dFnEGyBNpXiMRxrY/QPKi/wONwqsbDxRW7vZRVKs78pBkE0ksaShlZk5GkeayDWC/7Hi/NqUFtIloK9XB3paLxo1DGu5qqaF34jZdktzkXp0uZqpp+FfKZaiovMjt8F7yHCPk+LYpRsU2Cyc9DVoDA6rIgf+uEP4jppgehsxyT0lJHax2t869R2jYdsXwYUXjgwHIV0voj7bJYPGFlFjXOp6ZW86scsHM5xfsGQoK2Fp838VT34SHE1ZXU/puM7rviREHYW72pfpgGZUILQMohuTPnd8tFtAkbrmjLDo+k9xx7HUvgoFTiNNWuq/cRjr70FKNguMMTIrid+HwfmbRoaxENWdLcOTNeascER2a+37UQolKD5ksrPJG6RdNA7O2pzp3micDYRs/+s28cCIxO//J/d4nsgHp6RTuCu4+Jm9k0YTw2Xg75b2cWKrxGnDUgyIlvNPaZTB5QbMid4x44/lE0LLi9kcPQhRgrK07OnnrMgZvVGjt1CLGhKUv7KFc3xV1r1rwKkosxnoG99oCoTQtregcX5rIMjHgkc1IdflGJkZzaWMkYVFOJ4Weynz008i4ddkske5vabZs37Lb8iggUYNBYZyGzalruBgnQyK4fz38Fae4nWYjyildVfgyo/fCePR2ovOfphx9OQJi+M9BoFmPrAg+8ARDZ+R+5yzYuEc9ZoVX7nkp7LTGB3DANBgkrBgEEAYI3EQIxADATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGEAOAAwAGQAZgBmADgANgAtAGUAOQA2AGUALQA0ADIAMgA0AC0AYQBhADEAMQAtAGIAZAAxADkANABkADUAYQA2AGIANwA3MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggLPBgkqhkiG9w0BBwagggLAMIICvAIBADCCArUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECNX+VL2MxzzWAgIH0ICCAojmRBO+CPfVNUO0s+BVuwhOzikAGNBmQHNChmJ/pyzPbMUbx7tO63eIVSc67iERda2WCEmVwPigaVQkPaumsfp8+L6iV/BMf5RKlyRXcwh0vUdu2Qa7qadD+gFQ2kngf4Dk6vYo2/2HxayuIf6jpwe8vql4ca3ZtWXfuRix2fwgltM0bMz1g59d7x/glTfNqxNlsty0A/rWrPJjNbOPRU2XykLuc3AtlTtYsQ32Zsmu67A7UNBw6tVtkEXlFDqhavEhUEO3dvYqMY+QLxzpZhA0q44ZZ9/ex0X6QAFNK5wuWxCbupHWsgxRwKftrxyszMHsAvNoNcTlqcctee+ecNwTJQa1/MDbnhO6/qHA7cfG1qYDq8Th635vGNMW1w3sVS7l0uEvdayAsBHWTcOC2tlMa5bfHrhY8OEIqj5bN5H9RdFy8G/W239tjDu1OYjBDydiBqzBn8HG1DSj1Pjc0kd/82d4ZU0308KFTC3yGcRad0GnEH0Oi3iEJ9HbriUbfVMbXNHOF+MktWiDVqzndGMKmuJSdfTBKvGFvejAWVO5E4mgLvoaMmbchc3BO7sLeraHnJN5hvMBaLcQI38N86mUfTR8AP6AJ9c2k514KaDLclm4z6J8dMz60nUeo5D3YD09G6BavFHxSvJ8MF0Lu5zOFzEePDRFm9mH8W0N/sFlIaYfD/GWU/w44mQucjaBk95YtqOGRIj58tGDWr8iUdHwaYKGqU24zGeRae9DhFXPzZshV1ZGsBQFRaoYkyLAwdJWIXTi+c37YaC8FRSEnnNmS79Dou1Kc3BvK4EYKAD2KxjtUebrV174gD0Q+9YuJ0GXOTspBvCFd5VT2Rw5zDNrA/J3F5fMCk4wOzAfMAcGBSsOAwIaBBSxgh2xyF+88V4vAffBmZXv8Txt4AQU4O/NX4MjxSodbE7ApNAMIvrtREwCAgfQ", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:24 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:24 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:25 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:25 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:26 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b/e87b2f82700843468571834ed3595795","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg0cfef134b/e87b2f82700843468571834ed3595795","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg0cfef134b/e87b2f82700843468571834ed3595795","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:26 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639227,"updated":1567639227}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:27 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639227,"updated":1567639227}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:27 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639228,"updated":1567639228}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:27 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639228,"updated":1567639228}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:28 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639229,"updated":1567639229}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:28 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639229,"updated":1567639229}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:28 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639223,"updated":1567639223,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639223,"updated":1567639223}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:29 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b/e87b2f82700843468571834ed3595795","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg0cfef134b/e87b2f82700843468571834ed3595795","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg0cfef134b/e87b2f82700843468571834ed3595795","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg1cfef134b/01a6e6e9dea34bc9afe36b9fb60275f4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639227,"updated":1567639227}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg2cfef134b/91929d99df0a46d7a330e2ceaba2c17c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639227,"updated":1567639227}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg3cfef134b/8a86147655404b6d8c131fe9d14a07f2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639228,"updated":1567639228}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg4cfef134b/07f8e58772b247b99c564318f03dc623","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639228,"updated":1567639228}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg5cfef134b/d39302e4f1ba4123a1d290a0eecb1677","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639229,"updated":1567639229}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certprg6cfef134b/ad7cdf4d396c4fc4a569feb738cc8825","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639229,"updated":1567639229}}}'} + headers: + cache-control: [no-cache] + content-length: ['2015'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg0cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg1cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg2cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639227,"updated":1567639227,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg3cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg4cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639228,"updated":1567639228,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg5cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b","deletedDate":1567639231,"scheduledPurgeDate":1575415231,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certprg6cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639229,"updated":1567639229,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639223,"updated":1567639223,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b","deletedDate":1567639229,"scheduledPurgeDate":1575415229,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b","deletedDate":1567639230,"scheduledPurgeDate":1575415230,"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"}}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['5991'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639223,"updated":1567639223,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639223,"updated":1567639223}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:02 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:03 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:03 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Wed, 04 Sep 2019 23:21:03 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 204, message: No Content} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['28'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec0cfef134b/c83c94bc1b064ec89c9b29ed19b624f0","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639223,"updated":1567639223,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec0cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639223,"updated":1567639223}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec1cfef134b/45ccdf842d31424eba5f46aaaccb0d3a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec1cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec2cfef134b/1ad2aa1f68254665a23ac6f677037381","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639224,"updated":1567639224,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec2cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec3cfef134b/fc826f21aee34432ad64c75341305f91","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec3cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec4cfef134b/6fb5d40623e048d9bd273f4810ac6418","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639225,"updated":1567639225,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec4cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639225,"updated":1567639225}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec5cfef134b/d7bb2298bf9b40269f47a70b59e2d6ae","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec5cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","kid":"https://vault1051159997cfef134b.vault.azure.net/keys/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","sid":"https://vault1051159997cfef134b.vault.azure.net/secrets/certrec6cfef134b/53f5af916be14bf6a08e868ae39befe4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639226,"updated":1567639226,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997cfef134b.vault.azure.net/certificates/certrec6cfef134b/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639226,"updated":1567639226}}}'} + headers: + cache-control: [no-cache] + content-length: ['1858'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:34 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_async_request_cancellation_and_deletion.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_async_request_cancellation_and_deletion.yaml new file mode 100644 index 000000000000..2df8fbf54347 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_async_request_cancellation_and_deletion.yaml @@ -0,0 +1,232 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:53:35 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: + cache-control: no-cache + content-length: '1357' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:53:37 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '9', '5', a, a, '1', e, d, '5', ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, a, + s, y, n, c, C, a, n, c, e, l, e, d, D, e, l, e, t, e, d, C, e, r, t, /, p, + e, n, d, i, n, g, '?', a, p, i, '-', v, e, r, s, i, o, n, '=', '7', ., '0', + '&', r, e, q, u, e, s, t, _, i, d, '=', '4', f, '8', d, '6', '2', '8', b, + '4', '2', '9', '3', '4', '5', '9', '8', '8', c, b, '9', '8', c, '1', '1', + '9', '7', '7', '2', '3', d, '3', f] + pragma: no-cache + retry-after: '10' + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/create, api-version=7.0, ''] +- request: + body: '{"cancellation_requested": true}' + headers: + Accept: [application/json] + Content-Length: ['32'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1356', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:53:37 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1356', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:53:37 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1356', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:53:48 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"cancelled","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1191', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:53:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"cancelled","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1191', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:54:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9FPUNV/o3Otk5SDzRxVGgpZpug1A73sZgraPgkAj+EdPKxHGsxsLdH15CeK2FvklVoxvIk9vOOp5SIkL4eWbWrQJ6qKrKex41MMGq4anzq8I4wG6RB3zFAkWfVSHXsriVsHJc1U6N0ffYGktNA6C2UEsauYQ8ihOJ034d0FCbsaDGlFwwrY0KAei7a+bzyiXXah/kXGF28FheNWvPWEITnrw+QIYph0pZnJhH5nsI+JCVQa7GEjUueHuRH3P0IAVMXywCe3fv9A//Vkxcb2H19Stz6Knrf+e4rO3jK2UxI1ss6Nc0Ub0h6b7nj3e4x8dntcDezEINJ4rvqHLTNzpwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAD4AltGjOY6hsqMsUmKP3W7NzBIFsDH6UIXY/Nn0krev5GGiPEdo6Ikq76GfIRJKsqrPfhSLb1DQFEBr4KIpLzQEoacJpZtVJs6r4ihyl6q8UTfKKR8vDIIVxzEmZnxaYKSdm+JyOmbMCKIX0zYikvA01XGrzvcxw57ZRdDwWo5p0odnVxQZsfE7dbmqVMh4wi91PVGPxGzGDrGFqp/9zA9X5Av3u5fM239D7gvvH2BPNL7RVPGJj24wqPdOAW1e0z1g5M4tGpoQPqPmVlQvwbrFidpkFescwBz0VPU4J4aiwt3Uyz7GE6/AY3t7olw9r4KLAreB8yPIP+kl2taG/P0=","cancellation_requested":true,"status":"cancelled","request_id":"4f8d628b429345988cb98c1197723d3f"}'} + headers: {cache-control: no-cache, content-length: '1191', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:54:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"error":{"code":"PendingCertificateNotFound","message":"Pending + certificate not found: asyncCanceledDeletedCert"}}'} + headers: {cache-control: no-cache, content-length: '115', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:54:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/ba6914d440934266b3fd9ef55c35908c","attributes":{"enabled":false,"nbf":1567640617,"exp":1630799617,"created":1567641217,"updated":1567641217,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999795aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567641217,"updated":1567641217}}}'} + headers: {cache-control: no-cache, content-length: '942', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:54:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999795aa1ed5.vault.azure.net, + /certificates/asyncCanceledDeletedCert, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_backup_restore.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_backup_restore.yaml new file mode 100644 index 000000000000..1b20ac9e891f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_backup_restore.yaml @@ -0,0 +1,210 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {}, "validity_months": + 24}, "lifetime_actions": [{"trigger": {"lifetime_percentage": 2}, "action": + {"action_type": "EmailContacts"}}], "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['375'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqD1scIVrdmfjlAWncS4iyAjroA8v5+2QXaGW5J7BWK/FJQ1gWb4466HtNE3rhXkVg0LxKrDGN+6VSVTe+qAPv1RT2X0++PcLsTEY5DYH/bs3bav72ftX6h5c6TA+NrBO1I34B57HknTmNLtKX1IR6TAtFnGeOB7hw8X0G8CJyFCV0vXUPcONAkWMtUhP2eI6KpwDTpkffOeBnPuCcGT6EHg9gjvmldFxxkVbqdhwObR01o+Bi2ar42MFN/35BQJQpXPAlLNj+w+Jy/+OPOC3Md/BSMud+bfDp0k3dWW1KegGq4Xh2xrqoWo1L7En4Ypf9EVdIWzKVq/zKNRxQ5KypQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHxWDCITt43yBQ/6D6H9IuR4pfvwYNnTV5ErnKOU7AERpiYfSW3ViFfj4ybgudKcLV4NRd6+ip0IA2i0OqHapNhb+zoM86K/rZxbPZvaHF+IqhbM3rIaoRKkA1Bd5R8UpJX+Wp7rIVFmyv3RVloW43J5/ihHmrwE5QWs50xox9EUVkGfQ9ou8XTuV/gu9iWaxZ04qMo8dCU/00jKW5zok3X500+xr4MgcOqsBKPHw/EfZIXaS8iuY6AML/DqOIm8xEERcdutLwyD1o9LXWcW3OpsRHrvRmhWN9vo/NbcyWGeeVG3TrRwteMVwBr09fbyvwKGdQBDSDZH/Mbtrz6kwuo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"9003453483304d8c9c191b06e2e396e4"}'} + headers: + cache-control: no-cache + content-length: '1303' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:19:59 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', c, f, a, '1', '4', '9', '7', ., v, a, u, l, t, ., + a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, e, + r, t, c, f, a, '1', '4', '9', '7', /, p, e, n, d, i, n, g, '?', a, p, i, '-', + v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, + '=', '9', '0', '0', '3', '4', '5', '3', '4', '8', '3', '3', '0', '4', d, '8', + c, '9', c, '1', '9', '1', b, '0', '6', e, '2', e, '3', '9', '6', e, '4'] + pragma: no-cache + retry-after: '10' + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqD1scIVrdmfjlAWncS4iyAjroA8v5+2QXaGW5J7BWK/FJQ1gWb4466HtNE3rhXkVg0LxKrDGN+6VSVTe+qAPv1RT2X0++PcLsTEY5DYH/bs3bav72ftX6h5c6TA+NrBO1I34B57HknTmNLtKX1IR6TAtFnGeOB7hw8X0G8CJyFCV0vXUPcONAkWMtUhP2eI6KpwDTpkffOeBnPuCcGT6EHg9gjvmldFxxkVbqdhwObR01o+Bi2ar42MFN/35BQJQpXPAlLNj+w+Jy/+OPOC3Md/BSMud+bfDp0k3dWW1KegGq4Xh2xrqoWo1L7En4Ypf9EVdIWzKVq/zKNRxQ5KypQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHxWDCITt43yBQ/6D6H9IuR4pfvwYNnTV5ErnKOU7AERpiYfSW3ViFfj4ybgudKcLV4NRd6+ip0IA2i0OqHapNhb+zoM86K/rZxbPZvaHF+IqhbM3rIaoRKkA1Bd5R8UpJX+Wp7rIVFmyv3RVloW43J5/ihHmrwE5QWs50xox9EUVkGfQ9ou8XTuV/gu9iWaxZ04qMo8dCU/00jKW5zok3X500+xr4MgcOqsBKPHw/EfZIXaS8iuY6AML/DqOIm8xEERcdutLwyD1o9LXWcW3OpsRHrvRmhWN9vo/NbcyWGeeVG3TrRwteMVwBr09fbyvwKGdQBDSDZH/Mbtrz6kwuo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"9003453483304d8c9c191b06e2e396e4"}'} + headers: {cache-control: no-cache, content-length: '1303', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:59 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqD1scIVrdmfjlAWncS4iyAjroA8v5+2QXaGW5J7BWK/FJQ1gWb4466HtNE3rhXkVg0LxKrDGN+6VSVTe+qAPv1RT2X0++PcLsTEY5DYH/bs3bav72ftX6h5c6TA+NrBO1I34B57HknTmNLtKX1IR6TAtFnGeOB7hw8X0G8CJyFCV0vXUPcONAkWMtUhP2eI6KpwDTpkffOeBnPuCcGT6EHg9gjvmldFxxkVbqdhwObR01o+Bi2ar42MFN/35BQJQpXPAlLNj+w+Jy/+OPOC3Md/BSMud+bfDp0k3dWW1KegGq4Xh2xrqoWo1L7En4Ypf9EVdIWzKVq/zKNRxQ5KypQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHxWDCITt43yBQ/6D6H9IuR4pfvwYNnTV5ErnKOU7AERpiYfSW3ViFfj4ybgudKcLV4NRd6+ip0IA2i0OqHapNhb+zoM86K/rZxbPZvaHF+IqhbM3rIaoRKkA1Bd5R8UpJX+Wp7rIVFmyv3RVloW43J5/ihHmrwE5QWs50xox9EUVkGfQ9ou8XTuV/gu9iWaxZ04qMo8dCU/00jKW5zok3X500+xr4MgcOqsBKPHw/EfZIXaS8iuY6AML/DqOIm8xEERcdutLwyD1o9LXWcW3OpsRHrvRmhWN9vo/NbcyWGeeVG3TrRwteMVwBr09fbyvwKGdQBDSDZH/Mbtrz6kwuo=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"9003453483304d8c9c191b06e2e396e4"}'} + headers: {cache-control: no-cache, content-length: '1303', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:09 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqD1scIVrdmfjlAWncS4iyAjroA8v5+2QXaGW5J7BWK/FJQ1gWb4466HtNE3rhXkVg0LxKrDGN+6VSVTe+qAPv1RT2X0++PcLsTEY5DYH/bs3bav72ftX6h5c6TA+NrBO1I34B57HknTmNLtKX1IR6TAtFnGeOB7hw8X0G8CJyFCV0vXUPcONAkWMtUhP2eI6KpwDTpkffOeBnPuCcGT6EHg9gjvmldFxxkVbqdhwObR01o+Bi2ar42MFN/35BQJQpXPAlLNj+w+Jy/+OPOC3Md/BSMud+bfDp0k3dWW1KegGq4Xh2xrqoWo1L7En4Ypf9EVdIWzKVq/zKNRxQ5KypQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHxWDCITt43yBQ/6D6H9IuR4pfvwYNnTV5ErnKOU7AERpiYfSW3ViFfj4ybgudKcLV4NRd6+ip0IA2i0OqHapNhb+zoM86K/rZxbPZvaHF+IqhbM3rIaoRKkA1Bd5R8UpJX+Wp7rIVFmyv3RVloW43J5/ihHmrwE5QWs50xox9EUVkGfQ9ou8XTuV/gu9iWaxZ04qMo8dCU/00jKW5zok3X500+xr4MgcOqsBKPHw/EfZIXaS8iuY6AML/DqOIm8xEERcdutLwyD1o9LXWcW3OpsRHrvRmhWN9vo/NbcyWGeeVG3TrRwteMVwBr09fbyvwKGdQBDSDZH/Mbtrz6kwuo=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497","request_id":"9003453483304d8c9c191b06e2e396e4"}'} + headers: {cache-control: no-cache, content-length: '1221', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:19 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqD1scIVrdmfjlAWncS4iyAjroA8v5+2QXaGW5J7BWK/FJQ1gWb4466HtNE3rhXkVg0LxKrDGN+6VSVTe+qAPv1RT2X0++PcLsTEY5DYH/bs3bav72ftX6h5c6TA+NrBO1I34B57HknTmNLtKX1IR6TAtFnGeOB7hw8X0G8CJyFCV0vXUPcONAkWMtUhP2eI6KpwDTpkffOeBnPuCcGT6EHg9gjvmldFxxkVbqdhwObR01o+Bi2ar42MFN/35BQJQpXPAlLNj+w+Jy/+OPOC3Md/BSMud+bfDp0k3dWW1KegGq4Xh2xrqoWo1L7En4Ypf9EVdIWzKVq/zKNRxQ5KypQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHxWDCITt43yBQ/6D6H9IuR4pfvwYNnTV5ErnKOU7AERpiYfSW3ViFfj4ybgudKcLV4NRd6+ip0IA2i0OqHapNhb+zoM86K/rZxbPZvaHF+IqhbM3rIaoRKkA1Bd5R8UpJX+Wp7rIVFmyv3RVloW43J5/ihHmrwE5QWs50xox9EUVkGfQ9ou8XTuV/gu9iWaxZ04qMo8dCU/00jKW5zok3X500+xr4MgcOqsBKPHw/EfZIXaS8iuY6AML/DqOIm8xEERcdutLwyD1o9LXWcW3OpsRHrvRmhWN9vo/NbcyWGeeVG3TrRwteMVwBr09fbyvwKGdQBDSDZH/Mbtrz6kwuo=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497","request_id":"9003453483304d8c9c191b06e2e396e4"}'} + headers: {cache-control: no-cache, content-length: '1221', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:25 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLmRGWllSLTF6amNOMjVweXNkREtPSGxSOUZzZGFLQ1VXZE11TzkxbGRDejJoa1p4VlBOUjh6aC1ZekpleUZRYnZTRFlTWVJUaF9tRTdmSk10SmFjcUV2ZU50S0g4OTZDUHctX2JVQllmZEtJSERFR1IyaEZmZzZjNFhodHl2aTRsdkJKcDJXckUzV0hCUThHWC04WWdpMEY2NzJJT0JKOG1xdmF4YkYyQ2NqcGU1d1NMc1h1VmJOdmZKZ1lPbUtnanNTMVlJc0oyWEhLYnA1RlFHWXJZa2U5d0tmalYtS3F5dDZETTUzMDFYSzdnVHhGVThtdlF3ckZ3TTZ0dGp3aFNBVXg0WjJRQ0gxcFhkTS1DTXN0MlRkQkFqT24yZS0ySFV2NWNyeHZoSHNSTzhIcVM5eDBJS1RieXBKSm5veXdwMGphNXZlc0FrQVhwUmFkdjlvdW9LZy52NG5xbGxGcjlzNXEtSXRxbDdFSjdRLk55QmZoUWIyNmVHdjV4U3FHbkZ3UXdKVmVVb3BWdTY0OTYwX3cxVHJRckQ2dG9MNXpyMTBRTkR2dUE0ZG1RLVozZHZQcFNZS3FCSlRGTjFyM0plcVByN0MwdHFGYWY2Y3EwRTJzTHh2aWtiY0h3bEh1SWxyWmdPekJUUDhFellZRU1ZbUNjc0l5b05aMkJYRWRzVFRmaEFXNFo0MUhQUVVZX0ROSFk1VWVGNzdkRHVEZjhRMjBoQURONjRfb2JMbWQyUW1SSVpsaDFocDVENUFvVW81OUIyRm5iek0yTmRaQWUteXZFcUxMamtFU2owdzdmd0M1NWNpdHlnakdDaXFvSmVYMW00VTE0dl9WNjlndjdhYkxlX0tyekllX2Q3d2dpZ2duSzVCWlNDWnVucUx4ZGFrazJVbHhPUWdtSGYwblpoNXUtbEpZMzJsZzB3SEtmOE9McXU1ZG1fbFZRZlpCT0k2b2dNVFlrNlAyMFlJaFNZS2xsMnpzMmoxSmxSc193bDZKTEN6S21mTHNON1VPbjRWZXRHM29KYXNhZnlqRFVzMk4ybEtIY0gtdTFyZ083TkFfYXZNOEZIeHlNSVJCX2tWcDNtaDJKOEtlOGc0ZC0zRG43MmhnUmJmVHJ5SmNTWVNqTUxEQ2RfbGJqYXRybkVIMkJ1OTJEODZYT0dhb21zZ0tIcW9IajZYWDBvcGFob0tYY25rN0tJczVfMXBlc2trbjdnRVVialNpRUJHYXhEaWRzNFAzVkRQNTFUZnh5cUJvLXNUcG9UazlqcmNnaDNQcFllV0lPajBEY20yMndCS3dTQTVmQ3dVWTROLV9VV3ptTG5QRGoxalVJZS1hb0cwdG0xQUJ0UG5GZkdDdXJsVEp6dzJFYTgtbzg2ZEswbEtkZTNVWFBYN0YyTXhPTFprZHhLT0o1bzkzMEM5LVVESmRXZHI2eExrazFWcW5DclJHZ3hJQkdTc05rcFp6SEpFQlRZVXdHUmFtcDljakhxMGpyQ3k4ZEtKVXFFZ3k4NGtwZE9yUFdjQWtlbEotTzAteHZ4UTA3VkI0cE9hMTJuWW5vTi1PQl9NY2RxMnh3Z3N6S2p2VmVYLXZQd05nd2g0bHNFa2dtWlZYWXU2Y3Q2UHZMTkt3OUIxU3lvQ3hHWmhmcXp0bDhucE9FOGlIemR5ODdab2JYNGxkaHFnSGFZSWdEZklOM0hrcXBzemxLeUo2RUtESWl1bDd3cVNxRFF3cHVBU19sQzFlRFJKZTN4cnVreFhLLUMtTWZaUmYzejNWbFJubVhYNDQtNHhHY1BrUmpEbldsQ2RPRHUtdTNXWEplcnJBZnV4ZG43cFRkSnVrNXR2b0Jkb3MxdjIwVzkzYXVwbGhUaWJnQkxuNXFwZWVjalBzRUNwM3ExSDZzN0ZuLXU3alBuWUV3X0xETHJWSFZqRXg5UUZaWjl3MWljMzBjcWc1U29xckNnZVFRR0d1a1o5eG1fUjl2cDRyMDV0bi0ydnBaRTdGRmdYcWFNOXJRYnl0ekpqRkxTQ25GSjh2MWs1YkVFakIyLUtxVXNZSW9RTzVkTnAxUXBWcEcycjNVbFJ1WWcxOWIyQ1Rqa19JOXVKQkZVZ1VlczZlaE9WWi1feFp3T1BfdUlQSHRORFFaanBCRERSWmRBUkNzLUJFRGE3V1hzVU1WZ05OT3JtdmV2RlBONlVaOTdSSE5OZU1SRDMzUVlHdlZLVEJRcC1xRTRZTHRnSnFYMm1Qc3o5ZTVpbks5MmJneTRQTkc0Unp1NENJWXp2RXljTVpfejNDM1RtaHlhY210VEMyLUdUVlNiSnkxcUJONXNwWGtfM1VFSlF3MUVIcUx3aDIwS1V1WWlreFNjckZLYkNOOUV6NEU5WDNwZVJPVy1KeXdINE9tODJSSzBaZGNobFJZeEw2ZnFzeWJWd2RBV0ZTUUhJNXhMLTU0Ym50ZkRZWlc5c2xiSnhRdDV5elg5bGNvYy1xV1FfSHBreEVvSkVqOUliUEVzbkdyLTI5VWhWMFBTMWNjV3ZnUkc2R3ZBa0tHVW5wcmExbTVyLXlEbUhlOFFBU1NrRUFhWi05ZnVxWURDeEozWFlHeGl0SDZReEpFYW1oald1Si1KM1R5MnBLU2h6VHlxZ0pIZG9yN1NpWGtQTlgyS0g4bTJTekczQ1M3UWQ5dHIzcnU1WjI2dFAxejVHdzBFZlBIWjNLQ3EzSWhJRkpoMDFNZmozN3FxTEd1aUVUdXRyNnBTbEt5TXNEVFJ1c2w3X1lNc2gxaU9GbFdrTnoxX2t4QnZOM3pMN1F6V04wREdnRlpjUWswSnBuSmtvNFgyemI2Yk9zM3RkRDh6bjdlYkQ2ZS1GY0hlekZSelhMeUZyS0g4RkExQkRoWGVKMG0wMjNydGIxV1pSQjc1eGhTNWRHUk8xanIyN0pFUVhaeUFHeG1jMVpMS0dIZ1V4aWw4ZWRRMUhhTW9aUDJpYlVGQVJFbV8tc3pFV0NteDdWRDJNN2xUaXkyU3UxWS1sTnctb1pPZkY1eWxPZVhNNld1SHMtTzZjczczR1NtMzhwQ212eVdkSXhqRVpwUncyOGxyazA2Sm9QYWtyMndFQWRKbmZFZVhLVngzNWJqM1RteUdOS25abkx5alY4RE1xMzRYbHFHNlBqOG9WNnRLLXB1NXM0SDZKcnRuck9BbV9OVXhGOEdlZFRfZm42ZWpiXy1rT1FSZW1fM2dTbXFZUkdPVW41Y1FGZmJKVlBielVRVGs5dzgtd3oyX1puU0ZJNEtYd1dISHN5NmpubWVMN2JnNGZnQlktcWFYU2htQzlKT1F4SzVLRWFkbEEwaGJNNm1QYy1JSHpoRHc0ZGZtYmxVT1ZYN1JHSXBuaklua2R4TGNqRmEtMW52VTAyZDVXVlZxNE1LVXlQelhVdDE5Q29kUUltWFFqSGlRb2RLcVo2aXAxbnJ6d2pWbXlEcXNibE9ZN1c0SEUwWmJ2RFB2RF9LQmcwdnFvYzJwSy03R2JPMEtJejRJWnN0NTA4UXZJZHUyLWdlM2x5MmVSNXJYVUVJcnZGSVBEdnM5ckg1Y2IyWVE1UjhHS3Zta3pQMWxnbUltRDdlWERyRnE5dlpDcjR4amU0UkowanhvNDZTeV9pM3Z6QzY3andoZ2pZVGxGZ2pWM254eE1oTzlRT0JXOEd1YXlhQkNSMUNNeEdtc3gwQlE3MFlYZkRJTmRueWRXSThhM3lOYW0wejg4a1ZsTEFIRUxKM05fOHhSNnpIT05namI1UjUzX3R5bnVyOWVlS0ZGZFNucVYzWkZuUzUxVXFmR0FLLUh5c0RiT0NQY24xblFDNmhRSzRqWXp3Mlc1OGpNMUY0VUstTUNGN3A0d0ZhUEtzS1dRY3IydFJ0UGRvQXRIeVNhZXdnWU9KdTE0ck8wa2s3ck5DYlhBdllTNG02NEZTaGF1UzBwT0pNSDh0Mi1UMmFYQjZuUHNXWHMwOHQ1QjJWbzNRb1lXWnQ4WGRFNDZMdE5rZGpOaDVEVlRtWnp0ZDdVVjJjOFZ6UDJjN29oYVpMX0E5ZVNmanZVTUFWMTR1TVJxcHRTbFhESGZIQjhNSk1FdjRtY1JVN2FiSFNvZjljYlZmeTZoUFM3OEZxNGhscVJpMV9mdldpVVB6TTljRlRhWTVLMWJTbHpyOGdGRG1OTzJZUGFlZGc3WWZfQ3o3eTM2QkdyVEo3SllnbThKSUhKdVFsclMwdlJieFhITU1DUEJZdWNlTW80RVZERjdLYXVhZU0yMEVFNXhKTHZ2LVJGSXlyNGtidy1CVzlIZUtFSzNHdXJnc2UtWVYzMnRQZFZieHZEY2J5cy1sT0NZQkdqVmhna0Mxck8tOEJYbFBFRjV2bUsxVXM0Rk1odl84Z0VLMUZVTzNsWkcxWGF5bUlicEtqbDdJellhU0dWZmQ2Qm8tX1ZueGozblZQUnpuZ1M2cFdJM2dpWFh4aXhWYXZ0S0tnODl2d3ZHaXg4aktjMDczNjkya3Z3SDQxdUVwelM4X09WUkU0VVpJbjRXTlR3Qmt0d3pMYnVBQWRCQlpsbzc3VkZFclJiUXg2ajJXYXMtaFNGekhFZTlVc0s5TFlaOWd3RWlqdXhKZ0hEQjE1UFZfcHBJcHlUb1g1cFpwSDNlMzBpWnQwSGpMMGZJdVdyQnhmNTU3NnRoRS05bFU5cHNFbEh2UEZWdXJBMzB2UldwWURZOXVmZXNiaWFpWV9OdlV4azAzVjBDclNBZHFoVzFLSFE1LWFaNUk1LXVaWGlFa2RLTjM2RGNfeHZlV2o5WURVcy1aTkU1YXFBbEU4NDZma05yVko5TEJYVERzQTNhZVNaZUZlN3NFelBhYzA1VzdsemdfaFJYa3dQZ0lmTm5qVGhuSzBVQjduSC0yNkVjY2ZSYVpKZVJkYlJBZmRaLWdINFh0NnZoaXNsT0hvcGxpOFpoNWcxY1JwaFU3dlpiUS1udVFjM2ZNamdHczNRek11dHJoem9VXzZBdl9IQmlncEZkdVhlR01icVJkVDNaYWI2ZmtWSE43Mnlhb1NSRnpOMVpzaGx3bXBLX0Z2blk3d2E5azB3VXdfNllQTkZUam1kZWhtODl5cC1lU3Z1Sk9teEE3NmdWVENCTEl0QU4yY29HUkJ3Vk1RWG5odGRfMGFnNXpucWgzdndFM20xd0s5dzhDSERHUmN2ZTZFejhEQzV5c000TUJDV0RTbmhnVHJULWtlYm93TldPQkJkWWhPZExwSXRWVXROZUt0WGtFN25OR0RSVFA0aWp0Q1NPeFF6UG8tVU9rYmt2TGVjWjJlSzNJR1JRcTdXRlU4S2pqZllLcDhJN1Bub2txUENnRVFuNFhDVEJveUJudFd5SHlHQWFSMGwzRTRubGFRN19YQW1COWh1UjNTd1FxcmdMTllscUFrUTRsSWxYbllwNkZwaEhHTUV0UmtRTWdZSWJvNmYwZ0ZGOF9FMkpVX0ltTVAwSjRsemZlbVd0a0hIVXFjQzlHcFZXalFIQl94US1DYi03bV9VWmY0M0dhTnk0YUtLdEhTeFN0enpzNFdrZDBIMnhldThndXh6SUxVeGVETlFZa0NUOEdjQm1DTGF4dXNBOTB5TjdDMEs5Zmhib0RRYkJKUkxZMWtxLXgxVzUzY1BoRUJCMnQ4VkpNRFBnOHFuRnhEQ0pXSmdyLUhnWWpybzdjbTRrVG90Qk5PYmNnZEtqczdWN2V4eF9YczdZc201bjVvR3BsY3ZYLTBVT1BiZmEyMTh3S2hNcndSWGR4eGZDZ0l0Q0VxT0tYNU9lUzBRdGVfQnl5OElfWkhTeGQwNklSdXRjeEk1OWM5Y1FMc2V2NU1VN0x5MTEteUN6TVlmeUFHcVBpVDZKckZ4LWt3bVhnWlNjYTZ2bVRRWkoxTXhHX2hpSjBCZWdqV3NmWlp4UElxcG5Ecmw5WGxISm1FVXZrU3dUcmtCN0h1Zy1SUmFKTkVjQ0V4NW1KWHIwSUttY21IUWRlZ2FZRXVqN2w2eWk5V1BpZUl5bDd0Q2pSelUybFNGR1lSdURwcDhJc0hzOGVucU9fZ1g2T0l5RmUxdm11R1JsVGltV3BfVDE5bE1PdjRCbjhMclgzeGlMNUVzWDBObTZyc2RkVkRoT2RrUjluR3RvRTE4Vk1FOE4tbGVMMVVuOHB1NUhxeV90STdSRU9SU2U1Rmp1RTVvQm5uT0JpV3VtdlQyUTFVeGt3NkQzbWVSaUUtTDQ0aVlHR3dGek5xdGxGZXZEOC1NTzJNRHZ0TTN6UWFyQlJXWTZZX0padGswUkZGOEI2dF9FQTZhOExlQkZ2cjkyeE9LOElDZkVER3BRZ0ZWOXV0aEtEZ3ZmUlZXU2diODhKVzN2cTB4REZXMEt1Z2hxUS1sY2JQY0Vrcmx2SS1xZXRGbGZiN0hod21WY3BtbWVhWnN5Sm5mczk2UTdJcldaaExuci11NTJwT1BZakFCS0hJREk0QkVkNWRnTkFRSGpvRzFQNjhoWjVuZ3k5N3lQWnhtSkc1M09wa2Ezd0VmYWtFeTlVTWRpV1RJMVlnZ0NEblVYcXNmemlrSHBPLXRCZ2tyUmtCejdZMlpmSHMtQlYyX3U1ZE8xcFRYWmVOVHl3VWVXZFRINEVMQWN3ZFRBeWxYMnQ1QXVKYVRhdTFrcjJMQW03bVFpS3d6a3I1Ymd1Q2FTM1ZPTUwtaUprRlFhRHIzNVlzbmY4ckwweFBRZTFLZ3E3SEZTWnNrMmN2cGVWXzgtN1J3M2ZkQUtWdWlBTzBRT2FOTjY4MTZaWm82eFh1a2hWd1F0amhIS0k4NXJwSzdoOXJaTGNST0pCcjdkSlQ4bmRnaWZCQ1hfWTVQNlhqdW81SUtRXy1pUG4xWUhfQkpXMC1MNVlGNHFXSS0tZEhhZWRTVVByRms1dlFvUFFiNS12YjA5RkFwQjMwZnhNQVFpUU50bThmNWYwcUdKRjdScXFJbjJMVlJHeDhWR3BMVTRIVi1FZVJOSHR3aHdsdVRoNkY3S3NrdDg3dEVrVEozbE1qcjk4eThWWjQyUUIwQlpVMWhQbzZ3bS02OWlZS1doUnZmNE1Wdy15TWhaVnNmM1N1NzFLalBNMENZLVptT1A5VmpyaC1QMllSbDE4UTE3UE5jUmdzdnhXY3owVW5CTjJWcEJSZ1JQRlB6NWNjZkNSdEo0Nm5TVlRVQnFvYnpEcDJ1d19HRXVJTHNIOW5QaTI4cnBiV2I2aG9oc1FZRXJQZW80Z0JPUkNPTnJnY01HVVBQYzNLZHBSem9iVHBJVWRUdW4xbHBHQ0NWejNuWVVfY1lUa2psMFRjTmJGWmw4T1llNnYyMjc2blFsUVVXZnljWHd1Nm5sNDdmQUNub20xdDA3Nl9UZnN5SmVLeTlVb2U2SDRLb1k3akFZTS1uNmhPcU9uT3IxNlJaY1N3bUZ6SjBaYmdIWXlvZG14NC12Q1RGMDlWUG03N0VYeUE2elQ2MlpzbWNJZzRtbkdPR2tMcXNCRjRjNXhkSWpiV3JJdEUxMmMxMTJ4RmtFT3RoSDlnYW9reDc3MUkxZktZQmVHZDJKR0NEc3hFY1ZxYWd3OVFWZm9ULUxSSjZzYUozOV80alo2YVJ4SThsSndjcVdCSHVLYnFkRWJyOFU4bWw2em9nSHdwZllYVFJYTFBUTHpSYzhEajZWYlZTOWMtaUM0NlFydlNJR1V2ZGpZOEc3bmN4Mkt1QnljcDFfOXU2aTRrUUNST0NJZDBFVVFONFhVb2s4OGw0S0ozSlc5ZnZyZm9ycVFNeW15T3NWTjJ5Z200SW1JR2x1cDAxbDhtX0hILXJzd3UtWHQ5MGVuUWRyejNMTF81ODljc1M3eE5aTnZ6RjBFWWtIQi00ZnMydjN2REFyaUlhblV2U1dYaE9ybnJNQVEzQ3FZWWpMaTZtXzc3RTh1Sm1fb3I4UmVoSmRTOGpBVXZucWZwYW1NMHJ1LXpZdzdLTi1lQTF5Y3BBTHJxcGl4WTR0Z1kyREs4d2dzNGJmMXY0Ung0ZjIxc2IzZjBiaklEU1F4Rkh4UFlBZFhpYkVxYXpoOWdTOEZuQURnRVpySUtXNDBxeVJ6MkMxT19GQXZxMHA3Uy1mTXhkUDMtZTFXbzF4VXV6NU5PWVBHb0paU2RYME1FcVJteTNqWWpaYktFNkNYbzQ0QzYyVlJXb1NQdVF5WVNYclZxN19jNjRISnN1WGxHNmhJS0xxOTV5bTIzckliTlctUG4tSVpiRFR5OGVUYXF3MTljeEtxckVCOVpqbFI3WVdXNzlSTVNTaDhWWXZnOVF4YUZfSnZIZmZfd2ZZTkN6YmlZVnF3QTgyVXZFNTQ3Mk54Zlp0LW84dFgyZFlwaDV5N2ZoXzk2QjhrVWwzQ0J0cEIxZzhReFBCRllEQ19BY29Ka2liUlU1TnNXYzZlMXFzcERrZmNERUhvTFBTbTlXamdhN183eEpuM05GS1VGaGlWbVR5dGlKSjBveFZYdFJNdzdORUhpNUlGS0d1NDFnWFVKM0VJX2JOc1RCcmJ4Z3BqUXhDclhfcldtZmFkeldDTldzUDRGbjJ5bzFjbzNLaXQtWWx6UFE3ZVRFcGdUV2phWENmcFgtcHNPODFteFB2bU93UVEwTl9CUkhNNmhvSnc5ZEVtV1ZTNDIybElocW9BYVJ4cGtnVkU3cXNyU0RzSkdZTngwYU5ydjNYTkRsZ2lUZ2VJYjRFTTk0VkdtWDFMblJMOVNpSFFLV0VnbF9vWkJtXy1WamREUzJyT2NjRFV4aU9QOTdncVVOV293U2pidUE2a3lJZ01DRDF4WVZheFR0NER1ejk0Z05JdDNBVmJXZGlDR24ycTZEWEFaVHhFYmwxUzVRYjFEYjZXQktsdHpoY2Y0dUtNTHd4Zk51cVFsUU9XOWpXVHRYZzIySTdiclJYYUNIRGN5NUtqTXdXbEUwdjdiNlpQcHBNX24tMkRsV2FJMHEtVDREWUtRSnpUWlR2VDRBbEducHhsU1B6UkVNblJ4WVdSV2I2dFhVMEVVNVkzd25OSWJyd19hUTFVbFc4Mjg3cXFDZjJScEhCUmQ1aUFlQXJFN1FwUXhwWk5CUzdtMVN6Z05ZUmpQV19yZWxNN3JpV2RBUG9pY0JDZXlVdktfVnluUTM0UEo2bW9nMDRyd1lnRjhlVDJabDB5a2I2Z2x4SnZ0QzJxMjRwRzh0bUlFcGRQSXk2ZUI4c0lCWm9mSlFUTmpXZEZHXzBRRHllenRCNkxhcEJjZ0k0dWQ2YzFLWWgzRnppWXhCa1Zoa2pMQlQwV3FrYXpMcmNwczhYbzZRMGU4Wm9OcjBGSUZ4NEtRZ1dOb0V5VnZoUFF0LTk1c1B5QmxZMWJTSUx3T1FlTE1vaS1mTmk4aGlnNTJBZTNCUlNxcURnU0I5OV9odU93WHphXzB1YjZhQktpRF9tWGlLY1VKZWxlbUhjeFgyQnhUdWstLWR3THpwWEl1LUV2bmlwN0djNHhsTjcyYWoxcU15dWdfckZuaXZTNExEVnk4NDE3QklRN3ktbm5nN2pQcUx0S0E4eXVBNnE2TzNUVlVJY1ZWdndPS3hFUXJGOXdKQVZDVjVwNDJIR2pkczYxb0dMYmZuSXZnRkhXYk1sU25aWTkwZW5jandaXzFyZTBWM3JaSkZzMnhnc01fMzFVM1lsbjl4bTJjWFRsNXZzVF81WkIyaFZhZERwRnBpTzZPckNvUFh3eFBYcFZlSGJjZkt0WGpMbG5wVXE3Q1VLWWVleklqMF8zeC1GREV1WDBzWEQ3WldCWDlacmwzTzE0QXhpN1NfY1pPU2JYal9STlMzWGphUGdwcm9mSHFzNDZxZnhodXNxUjYtcXBhZVpBY2Fhc0h4WTdUV0lmR1h1MmhIc3BuTVI3bHBpQXduaFhjYWI2WWlWaXBaX1IzdGxLWHlmUFNnMnhuQVFJTlo4SUl4dkdpb1hLcTRqUUpMcGFYU3FWbkV2aUtJX0ttMmh3UlNUc0NJS1FPZnVrNEEzMExqdnFFOUNua2F6ZjVUS1dvcHBxZll5TF9PNjMxd3hrTW9BbUNjTnhabFdvVUxfZTJqVkc4U21kSGo0bGFwRjVzMTdMdjc4YTFONEtNbW1YY1ZnMXVFTnNJRHo5WkNsREwtaGJ0c1FUWE01cVJJRFN1MzNvUEdMMkhnYU1yRDZyUy02a2c2c1NPaGtXSVJ6WWhSUnItNG5WT2prU0NyMHFNU2RfNFB4ZmVyeG10Z3pXanozbk5oSEwwTnZVdEFwMEdZcFJMYjAtOVdObDd6S1dOZHAxOGh0UFhNUU5FTDJnclBwVVdBLXpEYTNQbTdXaGdPck9xZHRpMTUtWW93a0hqa052VHY1UW9Qbkc2alNaekVVM3VXRmJZOEl0LUlxMW1pc1N3SlR6d2xpdjc4ZXctUXZDT1dPb2F6Uy1lZmVoTm5VemlkZ0ZhWk5DMG4zNHc4cFVHTjlvTTlvREpQODM5OUNtRmlDUkZfdmprd1hNZjNob1dtVUhnWXdiY2w5VkxYT2tiV0FBV0twQW1MbGlOOXR4UndIRUJxN0J4R1RVQmdObFhvUDlaeFl6RWJHcUtFRl8tS1hOWWhwUk5VN00wc2Q3V1NWeG9pOThPemdaNmhjdXJ2ZktTS25QY1RIVC14SE96TnVRbnNiZ0VaWEQtcmF1VGFvdlhzS1ZzSVhlZ0hDWExqblk1QnIxUEtHR2pva3NCQmk4UHlrekxxbmlyTE5VMUF5UDc3Z0NlZDhER1o3UFZWVE1jcUJYT2lRTXZNV29nVmxlY0ZzRVZibzF4a0EtZVAwSzFKb3ZqZmlGWE5OLUd5TmFSXzlMQU1SMkVLMVVPbllRQTJIbW1jQnJWNEE1MFF4eVBfbDF1OFRwLWk5TkRkSmgtanZZREl5TUthNTZ3Q2RESEN1WUV4ZUoyOU9FbFNrSTRaNmtTay1TYlVVSFlQNVFfaUNKWWxtZC03Wlh3YVoxTk5oSC01QkxrWGdlalY1cEZVQmpXb0N6b0UxSGluU0NHRTVrMl82U29ZUFQ3eVJDcXJuWEFiYXVuVXJ6aFpPcmV4WXE3bWNXTjgzRjNEX1FQYlFmVHpIdFN5VUNRY0tBOHpZZWYtZHVwalpSc0RLeXplV2N5ekZycEUzVGJYSWhZdUhzbVlZcG9VZXQ1NVJpVlNsR3ZLRV9DcWVtV0l6ZS1yMWMzTWZ3RF9lbGVlZnFhay1XcnM0eEhTOENCbUs2bF9TQUdQYlRUT0pFTnJDR2ZBcFF2RE9oajZnV0JtUVAzSzl3S3FqNEJGVXRBc2tWVU9na0JmTFo4Q3E5bG5oeUxVdmd3ZmNqQnhzSV9rU2JtTEZSeVhaNDJTWFBGNlJMM0VDSlRvRmtWM1pkWjN3emVkSEtFbmx3aHBoZVl2UHNrTGFOdXBoVUIxei1ubWV6dWdETFdMM2c5YV9hYjlOalk5a1ZQbThoeDVXTFk1WE16bEdtMGFScGdHSnRkUFJSVGVzd3FSdTNHUlg4YUZtdVRPbV9lT2EzSHRxSmNJV0VReW1tUEx1UU83M1g1RnFzNzhFU0lEd3ZrNDQweXVwNHljOVM4VEhRbE4xVERPaVg3allUYXBmZVMyS1J3Q0lCXzN3b1J1ZFZjNXlvSEdrcDQ1bFJsa0tORGxXTEktU0wxalBrNS1XUUpqbk9ORjlycnp1U3hadmg5bTd0SWxvUERoX0Mtd1ZBMlU1NndLVHhBcFZ4Q0MzckJKclYwTDRORExvd3hGVjgyMk1YanhNZWo5UmRhX09PcWZtcklybEd4UzdZcXJOY3E4WWhPSmFQb2p2NTlQX1B6Zi1fdVFJdFVtajhMVVlOLURCTVNBeXdsRkV6ZHNCZ29qVU1VbTFVSkd0RmhZU3BqVjFJQXZfcmxoeUV2ZXQ3UjZ0bDl2WUFzLWRUVWdyOEZTVTRvRU01VmZQODJ1dmhsUUx0Y0c3VHVSSEJCZTdFTjhYSlU1d2I4UWk3ODJWSHhra0dqajFzQ21pMlhySUY4TzlNMHp0Wk1qLTlfYzV4V0ZGYS1acGZHb1B2Mm1ZVl9DYWVQejJGaFVOU1gxZzA0RFVWVThIbmpnLVUwNktBR0RmTUJLQ1lURmhLcnRjTy1OZjdHY2lSUGJ3UFBCU1MyM1NHMWF4UjdMNUpiVWZzOXlrNnVMNkZLbzJWVmtXOGhiX1kwNGxTZWNTbUl5TWhNZDJ5MUJEUXBOSU84MlIxc1BoRlhXMGVZMFF3OXB6Z2ltSUs0cUtieWNkS1VlOElQeF8ySzUya0VsNDJiQWhqWWVialFaNmF3OERDRzlZbnlkQVA5ZFRPMFhQeFBIQjM3c2I3ZHJUQWlXSUlEUlZRU291am1rX2lFN3lJZEtWTGpaY2hpeW9NVmVJcDZWbjJJRE9hclZaRTlNVFd6aGxDSDlsYV9zb0Z4c2x3bG1Rdl9acHZlck9JQ0NjajFISE9uZWFpUlNLY0NMWk5tLTNhdDRXU0xYcmVjQ2R6aDEzbVh6N1VVWlh6aGM0aGZpRjl0RVhNck9OV1kySzZ3OGZyY2RsY2kzd2gxOXR1bDljdXI0SVRuX3owcHJkcksydVNhdjFGVzlBNVQ5MWpIWVVEc3pQRGJnM1RyMnd3MnVac19mdV9mbDVaZUJ5SW91WUdvZFJpUzhRSFJTbWVYYlVHMVY4NHU5SjRwOUJ4ZHlBQlBmU1FXUlRGa1g1bTVrTVVhRWI2QnRmdDVBbkRkWU5DbmhpMmYySmNTTVg0Y3l2dTQ3UFA3ajVDT21CWlBVSmpuLUZMMURFVURPLXFSU3loUlNjd2hNSWtWTFB4VExPRmtXOVNLeWhSd3NqbTFFRUp5bDNBRmZZT0tpNFlnZ0ZEcXE3dU1sbXY5amFuSjhDRzFaRENfSDV4dUUwTDJ5bTFPSUpVZVlrLUNjREZ2MjF2YTdFVnZjdVk3dHI1aGlvSDBIcThGV2N6UU9qZ3Z6cFlRRExIVFh6QVozZDdGZzZQTmVWNy1acUdsZEhPaHVoeWhsajNMaGRoQTBkWWIzanA4VVVGZDNrNDZ0NUxnQ0c2MTJRVWRoOFBGSjVSbjY5WkNYR2ZmZW5pQk9JSVB1S29OSGppUm93TzE1YXVlZnRsanBVaE8tb3VEb3hDVXViSks3RkpUS25maWJvelNuVVQzcVZnVDRGZVRLSzY1M1Jwemw3ejlVQnotX3o4XzRDZVBzV3VFT0hFOUM4Y29uM1dTM0QyRlRSeUd4WjRRREJ0UUFmT2kzcHJMaW5PM2J6NndqY0Q0RlBfeC1uQ2JTYWZ6aGhINC04VW5UekFtYWRuZEpUYjlwTUkyZnZiM3dudHdPaHE2ZWd0cVJjYW9TQmxFOU1KT3UwQlhvdnAzY2hRazZ6bUdVWEhPWE5QY2FscVBPMXNYZHBMSWxVT2xaOE9tcnV1bHZVX3RuSlBlaVFhOERsZUczSWZRY1RtT1p0dTFLMnctSDZlVEt4WGtXc0hQbC1FSkVIcU1Tc2xtMHhZYnk1a0lxQVVGa2dYeGVzSFRqQ05iNG9HU3kyamdNX1A3cklobTlLNnRuWWNxMkpONW40Slh0Skl6b19EdUtCUDVtVHVWTmEtX1VKSVBOS0E0SGRHS2dPYUxyZUZFamJWLUR6VHBzaldWcTBKSHVMdG9mTDZCV3Eyay1UZm1ickRjYk1jNjlyaEg1djRhSnVuZUM2YTh2RVZqQTNvOXpxT3JZUjhNalFVc2gwXy1JdXh0T2F3eGhQTG9kUHhqVVVxcEV0b2xLYVVsci05eEY4cmdOY1R1Rlc0a1QzM3p0STFlMHVCZXc3UFZYVzNvS1NpS1RVZk44M0tjYjl1aURnNkdsQzJSTnBYTTRnMmNmV0kySENZQlhQUEVMQlUyUS04MDhFS2JYU3FBaWtsSmR1T0ZPWDhxUnhPMmNzRm1GNXZYWFZHTUdHVjhYdjlqWVVfV00yTl9BcVhqcTdjZG1UNE5qWkNoM3ozN1YyV2p6Yi1CUkl6c3l0dVF2Vy1UaXFZcWlBZ0RBY0VpSTdwRmU4bl9YZTRHbHBuRDJlNG9nLVAtSnp1NkRIQ3JHelVLMWVnTHlTRlNiaGVldVp6djVEcGJZbGxOUU1vdldFZk1ZYnRmVG5sbjJJRm5La3pEb0N2NEEtbmU3R21iYlhJU1R3X1hmTjNMVy1lMmhpbTU1RFBhMFRJYkZMcG1mNENXQVlPQnVmUHIwSHdGOG1IZU9BZ2dmblBjZ0dfTGlOUW54LW9rb0M4N0tGVTlGV21FVWtzNUdPUmhFZzhCQk5SWE9QR1I2Y19IVkh6Z21Zd2JIUV9mZURjODA1M0VCMkVpYlVMZDZyUTNxX0I4SFk0akh6VnpEdlhWcXI2UUI5VHFwNFYwX2plZ2FiNURxYlA0T1pSdFVJeDJtdVppLV9wRTRrbmQ1TEdkSFdoMGpkZmtGQWo2RUxucmg5MzJiaEVOazB3MnQtbk92Q2ZqM1FCNGJwUlQwYmJuMGhDbFpFZzgwZHZwZFpsY01pQlhhWXB0a041MzlvUWE1MnZac0gyOFVWSFplaGp4WEl5SnYydWlUMnZ6S0VjUmlhSmhwTlNjaC1RSW5ZWjNCbmNITHA0cFJBOWVtNjRTS0lmY0N6ZnNDOUJPZXo3TGNJZXo1U05Zd2NBUVlQQU1jbFA1eDEyYmhJZ1BRcUk2YnRmV19hQkYzcHNZUmhLTjE4OXBjMkFsYWQtdElnSHRxb0EtbUxwR18tN2NOMm9ZVFVKeE1lUVR1dmtzM2hydkpXbmxGbjhla0J3RXYxUjk1RE92bWZ6MEsyM0dIa24wczJzYU1LbE1KZHdxZGxzWU42NThkOVJJNmdBRnY1bjVBcGlzS2VETjJ0SWxydkpwSjRBQTM1d0M4YTFtUUFrZXhNejdjTmI1WldVM1B0TXdyLTdGZ0RqUFdXYUVkTXNGQlF2Um5SbHQ5OHA1LVRSa3FVMzVZMFh3NXUxc3Z5SVpwWXN0SExxb1QwNmZEaHVlQWt1cHMzU2dDWlM5V2JkVUJjMnprX0ZwWWVrNHJZd3lHVVdIbDZmVEU3S1M3Y1J4eUFfa0xEenhMS1dqSFJ1R1FZZjFvYzgxYTR3U3hDRlUxY093LUpjalFOd2hRU0diOHBZY2VHTHpyN3owMkJyZVIzYzdBX0ZqSXFMbG5jcEtkU3NTM2VlRXF1M0MwMGFsUElPREVJc2pHb3IxeDlKdkU5bzRza3NBYVN6cm1tVkNHZVFVa213NHdhNkdDZEFqZU1PQ2lhQWFfY3otRGxZWFpuSDZhZ0ZfdEM5RkY2U2F4M1ZISGhBMGxDSXR2emlwWGgwQjVMNWYwNGpGTjdoOXJROW1nMi1Xc3h3dHpMZUpsR0trRFFCS0U5SkNjZ3lnY1hyTjVrazNiLVdGVlhkMi1GZ0l1T2V6X0dGZnlDdE5kZmt5S1FhSnVBMzJlbmFpVU16aHQxNDlBVld1eWRxSmFGQnYtYTBHWThTY0pYaGtleU9oN3pfZTN3SVdGQWNRUkh0WE5rZWFJUGU4Y2FjanEzT3hKeEdnZ00td0h0NlZNNkc0MnFidDBhb0MwOWktVzRyMll3bFFqMzdLX1pxc0N6T3lNTG5fRHZ5X2NHTDdQbUN5Z2pLUEo2bGJTUUpweG4zQjFVYW1qczhOR1dsZXJ4WllKZndqcExLSWczRm56SjZRZldnZERCVENIM1ZLZUtTSk9HNDktV0VRdktjdnBRVTRkc0hUS1dKYk1wVEhvaHVEMTgwQVJNX2t1WnFyN2FaaDNSQzh6SjdhODRKNEFObzczck95U2pCaUpIaEU1US15OTcwdEdmdFBPc2NYT0tmYkVwMGJrTXJ4ZVR0bjhCYmxjc05FOVJzYzNtVWRueFVBMmZKc2tfeWNxSkl4TzgwNl9BU3JMWEFzTFl3Ukh3cGhfVmc0cS1iWVNBNlA3b2x3QVlWUUdIYkN1djNpeTUxbmR4RGdibmtTRnF0bFJwNzJFdkcwTTZIeUxjLTVmZ3pXQlJnQ1JvY3NlS0NUcHY4UktGNWE2YU1VbUdsdFVRdkVEeEFhUzJCeEt5enN4SC1xM3pDc0JUWnFaM3dWNFg0ZEczTjZyOFBNWmdWZzhIZUlCanJHdnVhZVVVb3JobmF6SWxPcTV1ZFVQTFFTZlExVS1pMFVxYWxxeUs3VTM5Rjdoa0xsZllqM2I5ODNfMFZydXFCWnZOU2FjeUJGeGlvMDBoOVBQVXEwdmxCb2FralVBN0Y2RTBIZ1E4QUY0eUtDdTJWTmJTa1hPNVFBTGtHUGhKcDdRNEl5c1FULVJ6czlrSDdPamV6WWhFc3hBeFMyNF90RWVuUFVoWkRVSWZsbWxXenRWcGRrdFV6VGVrdFctN0ozU2ZVamdKNFlyaUthRmZJeDhJdXZaem1oVnJ4dGpUWnNYV3BCZFlVb3BMb1NNNTZaQTBiM2VQVEM4MS1PZVF4V3duYVhEVFEyNF85UzVsRXVtdjVZQnJqZHZPLUxkbVM3OEhCX3JIVmFTcFdlb2Zybm15RnoyQks4NW9WQkF6a2tONnY4U2NIcDgwck5rTjhVUWZYMXBmcFVCYnk5TlgtMzFLOTM3SFBIQkFqWXhyTmFOemxzNXVQNzlheHI2MHdoWVBlZ1AxTE9SaENvcEdwTG0tUW9FbHZoejZZN3BJUF9ocVI1NzlzaWRHSXJuVm1MaG1LZUVPbGlOV1dfMi1QY2loZEdqSWhSbEtjZ2NwYl9MVVZKSFFUbk91OWZHQmt5cWxGVXBhbmJxeWJIbTUyWldKS3JaNndxT3NmTl9iLTFIUDVGVGtBWXUtUHJ5SEN6VjZCS0xGcGtmMURCOUQ0UzRVWnA3c1l0Ry1iRG9meDNxVVFVRl81NVV3Qk03VmRackZUeDYtZ182a1V1UFNIX2NsbDFNRUIxOFlyVndxeDAxZjBNNWRJb1pIbDY2X3JMdXpVM25GbmZ0U1g4X3JDdmJWdmNJNHl6TVdiVXdfNE5LcE41dTBRdndMRGJiN1l5Tkg1bmxyNWVjRzJDWHUtRXpzQ05VNUtjTGpXQ0R2VmFXU1lkNDAzMWFvaERBdzJQME9JSnRlSnRhX3JjekExNFVEZ051RDJzRGJlcVQ0WU13MmYtMVQ2SlhIeXhfUzFiTkpUZElDemEzeG1lTXZfMEktU0JPSTFsRHRoU1h2ZjBDaWZmQVRsWlNmZUIxVHd5ZWk3ZXVudjdIdHF1NzRMV0RMR1V3MlBHUnJ1cE1sbVBTV1YzOVNDZF9jcjQ4V1FTQnVxNWljeUktcjVZbENPUHFhenZfd2NmU0pHU3hGc0x0WVRhMk5LUzFCM1E3OUo3Y3RoR3poNVV5R3FIdzJLaXh3OVpTQ0xwdS1rWHVmMDdHTjZLQkxNZzM0NFpadUhzblI3OU1pNVQ0TFViQkRFM1daRXQ0T1ZCUW9TVUFPNUl0SkUzemE3RG5vZ28yUjg5d011M0h6MTRSbU55eHR1eXJrNnlJN0hjeHdpVUJhTm5HaDN4THdILXhpYkdOTDRMVGl2MmlHZmFFTWEyczV2bjRqbWthYWpEV3F4Q09TQVBxY2lGQi1MbTRxbFpUWVBxWWJ6cC13VnFLWFVxODUzN0ROZU10OEUxWjhhWXhxX2ZFVkhtRUVPWXQ0dlV0Tnc1S0FRMnc3VWJPc1RYZFRId3JkbERnbktWaVJ2XzhzemU2bFFKVmNhcWtxcU5RNXZab3VOeTlnV1BxN1lja2liRGczaE85azFSc1pHWjN1YkdISzFaODd6enV3czBESWtvT3ZZU0RZd2kzWkFEbzRLUml3U0gtVTNoVi1YWWUzTjNOQjVuTWhZR25RamRURjNnN0tIYV85UmtRcEZ6S3RNTmxDUkJZWm43Z0FXZm10UjYzZ3p0eU5YWE53aG11ZE9DSXRWVENtWl9paGpMZFFBS3B3Zkp1VWhhLTdPa2hCRTAyZjdmMV9zODMya1N5WmhNOXBZZVRWeUM1S2cxOXNXUzRUbEdNZHhDa0s0U2hkYjFVeGxhOHM4UWtqMlk2QUhNSXBvaWZzend2dXFuZnk0WGJyZ3I5eDVEdWF0b3dKZmI1MGZNODZlU0FRVmlWUGdENkRPTjh3b080RjZMa3JfU2FaYTR0OGJvRTlac212eXppcjdSZE54cXZJU1g0WXJGdGtRNmZ4eUdaQnpXWUNaMnVtY0s4WUV0QVVOUVRpai1mTnI3eV94LTQ3UjRwNlVXYS1PemQxYUhETlFLR2JTSnpRUEZ0SzlCU3JLZlJPRTZrV21KTkxtLTVKN0NOWE80N3QzY1JQLUxUSXh4d0puVTA5Q0Qyc0dsRV83dFJXUFhNdVhYQkI5ZWk0WVhBMTBWNjBlbFViNlkteUN5VW13M05ONkE0Z1E3aFl2WDM5OHowcXJpeHY0SjFkLVRNM1RCYV8xdjU1c3g4ZmZMbUszWmNZdXBCT0xVSzZBck8wRzJhc2RSZFBjZFd3ckdBdk10ZllFc2ZWbkpIS1RHN3RnUTRfNnl6anJrZFNONnc5Wm8xdkxMQ1ZSS1FjOVhGZUhDVXBGQmN1ZnVGLVdWYkRxNjJvdm5LYk9wWmx6anh1Ny11UC0wV2dIWEM2NjU4ckVhTlJrTmNsWGVKLS1CQmxENGQ3OXVQV1RVcFZ4OU1kN2I0YTdRMnA2d1N4MlAwRjRvTFM2bjFFNzMwdFZOMGNLTFZFdlFNZEwzRzlpZ0lNN2xMMndqUjRGUXdaME1zYWMySGp6bG9HUnJqc1o0S3BYRk1UNm5HSU1vUzVDU291X3RLWXRJUjBQNThPOUZSVmZjMDdkOXNEZmdBVFNXNTZOVHM3dkwtN0p2SnlzTjh1UXVPX1BSX1c3N0hlV2VITFVtbTJlWWtnbDkxYUhGZWp0bTk0UHFoakpJRVpvbXhvZ0NlaWJGaXpQeW5yVjNFZGhaWm40VE9oMk9qaEU0R290aEU0OHhUT1Z4S1o5NTVEa2VuNFFDLU5HYkk3cjZpQU1YWVo4YVY4S3JUaUp4NFlPa3B3VWxvQ2VnZTZ3MzhUYTY2c3FTYThXMW1Nb2ZIU0ZBZGpTZ2JKVmpjS04yWE11OVk1T1gxSUp0SnBiUWM4ZUxYRHpVV2hnMUdGZ2pSQjRUWXpMR2ljclFpVFJxX3RGTlZ2NTJqQTVJV2xRQ04zd2JGZmtfTGpIZjFzTGJTUGZ0eFN5c01oWG9KaS12dnlrd1pqdmoxeXAzSU91LXpJVk42YWVreWNQbjJ2dE40SDliY3E1bjFWdVMtRHFpMXBsZzZjV3ppemFDWjRFVmRjbXZ2Y3FEQWExVThkS0Jib3VXaVZ1eHpGQmlya1ROdmpQelpxcVpaVi1aSTdkYlJYMlozNXowVEVjZlhWdGdnTV9GWnBwT1pRY2p4Z2psV3JlZG9jNk8wVVdwcDJsVm5wOGhpWlktcE51WmUyZnR0dFBsTDUwNldXY1lxdXNwcGluejhnM3I3eVBkTEx1OHVaREFtV0dtcDJyRkxGTGFKN3I5SlQ3UUZXSnl1MzVVNnlSRlhWTFl4SWRLUzBrU0RIaUo5VlJLSG1PM0ZGQjkzMkdmbmtWdlZMNm5DZlNjcmFsWmJ0ME80bG9zV0FteDlEdnVEenRHWDlKaFkyUFdRMG1WeTg3S0ZEZ0lfaWYtWDRFQVpGb2xwVDBkellKbjRfOW05Mk8xd2VtYnBBWUtRR05Ra1hLMjR5d3FPVTlySWwweU01UW9wUTlISzJLbm9KazNWU3pFOHZ2bGstNFRjTXBrUFJrVDhZNm4zVWhuRXA3T1ZDM1VwSGlrT2x6eFdhOTJTNlZmM3hRdEhHbnZpTDRIVjRIRzBWOUJtX0ZnTmxBYlhUenlFdWVnaWp0Vlp4d1lnSlV1ZzNUR2hmekYzUmZ6RGZGWm9tcW5WYWdwNHpLN0pEMU91dzNxblRSVEFoYm9saGNzU2Vtay1ubFQ1b3JTTHhNTWxCODZpbDlYNUY3dEFxR0laem5SSFYwYVJfNlVaV1dTV1c4b0UxNFBwYnFUc0M1R2JMMGZtaVZIbkEteXd3RlllQjJ5S3FudzNsalp1Sldsa1NSSnl2N01mS1NNSUpsekttZzhBbU5sRENuNV8zT3lWZ2pZRUNDRXFKZExhMUQzRUdRMDdQSlA2S3gtZEcxeG4yUEpaY284aGhPZXlYLXpJWloyMktGRm54WUVScnNlRDJIYVVJVkdBSURybTkySUN5eEJEMjE3d0pTOW9EdDQtSEx6ZUs2QmhRTTNteTRmWnMxN3IySHZpdVNBbjd5aklxTzUtMnEyQUh2NjV1SHlObVVwWTJjR0thVldTeGczNUIzUS15RXpoQ2VjLW5UdWpDcUFyam16ZkZKRzlIN2s4WXVsMUUtVWdGZTRqSDZXcEtkWHNmWDZuZHRvdE50a2Zma1FRNjdGUEFoNW1RNHN5WkI3N3NERlNrWS1aNXd3dUVrazVvUWRBNDdDYTJmcVJRbkxMblNuV2pGbVZQZ2lPd3AxTE81enpaQ3NZOC16Mmh6bjNaTnQ2cUR5RC1Eb1htcmZ5a18zRkFZWDhzNlRBREVlZHFKT2dXVnlaZk5LbzFlRzZOT0hMNFRjQk9DM3IxTmJiVFlMMTNLTS1MN2JES05LdDBUN1JmWF9wdzR2Wi1HVTRRUC1Ic2pPbVUyY0VxN3dOOVZKY09pVmFsOW5pLTNCY1oyV1hJV29tcWg5VmZuVFBZOW5GTTl6TzdzcXNFTHF4YW1DaEIyYlNZMkI0OG1PbTdFQjdES3NtQ0hjNVJLM29iTEItNXg0RUNiZWtOT185bW5UWURjZmFlVnZ2cFFIYzRmQ1dtNUcwNGcxbTd5eXRhMXhPZUhkdHlEb0VTRVJmekVZenNFemFlMHhwSU1VcG52alhiYzFOOU5TNTduZ2Jid2gzaWNzTjhxZEVwekdsWUN4cTh4QkNzcjU2VWZwbWxZOVhMclUxcllTcTlOZlI4Z1lfWHhKY3VGV2JhczQ5OUUzWkdFVFNlMkM0VU9wTU9QNVBmT2RGZjl2bHRsMmVlRW42dmRKek43S0F4N1hab2VGWjN6cmJza0dwVDVCNmxPc3YyVXZMck5oN3JWMU5WWmxBMTd0RGJ6N211MWF1TXA3YnZCREpYZFJvMU1UeDItdXRPYWNXeWFyM29uYjZOSDlpVDlEZU5DdEdaMTJFeFo5UzAtZm9iM1hsQ1ltRDFQQTBQOWVFYy14dkVxYXBxYVFjdzk1RUt2NHkxVnNNQ21wdmo3bHA5aENTZWhiOG1GWVZCb0F2M1RTMllaRGJrYUdpNnNtd3NVMGxZd21vRDN0Vm55bjRPLTNBRW1CM1VWZHJ0RzUxX054a1JSMzJ4eXBOcnFlbFE5MjNiLWJDRzV0UmFGRm9QdU44al91anFtU2JlRnJCaUtLOWNYRDhPaG9CbzZyS05pNzlCZElMUDFha3NpX0FKU21kUzA3WVFNbDZzMWZCS2VNSkhVR0RwY2lFbEVpS2lIODZuMDE5MFZiWjNXV2paV1R3Ull0emxVZ212TXFyemxKeGpZTUtBVGpSY1ZNdDRuTWVyNUNab2s4M1JvRGlwaWhZTWt6dXFDcXFCZWVoVlR1Q19kWTd2Yk1RUWVQSlBHa0NQRV9ta2F5am1SdG9oc3Z0R0VIRzdxa2Z6VFh0cTFocVN6NlctU0pKWU1NQTRvQTlOSnc2bmdjblNNUXA1dUlPT1p2TnhUdmhHVGFQbE43VEpma3BFTzM1aHhXR3RCb2Y1T1VFSHh5X0NWWG15UmRSTWtfWnhPblByMVN1VUlVVnhSUFlTR2d5d2UzVjZ2YXhaTUhtWk1XdGpsZ09lVUprQ1ZoVGpLMlhDS2FkLXVDb1czTXJOZ2VPNWVuZkVLYmxxZnBMN1hlQWs1UlpaX05lVVpyUnlvNkNPdlVKcHZmMzcxX1QtYkZHOW1oQmpQdllxaVc0UGFfdFFhT2ktbGxrSGQydy1yeEZtbXhfZ19XMllCTlBqSGtpN2tXUm5aa1c4NG9YNk81SUFWSGFhZTl2a3h5N1pBb0dvXzE4cVFPM21rS3ZQaFpzRm1Pd0hPbFBISHY3bEw5VmxCby1meGdzNWg4ZzM3amhrUWxTYjNkN2pPdzI5ZmdKWWRPUWNhR3lzdURuMG1JU3RlbmtvOTY3WUtlcm11a0tWVURlOS1sMHZ6YUo4bDBhbU9XeURQZnROMTJ4SjU2TjVVRHoxbWJzNGs1V0ozU0xkVEdxQlI1OW10cUZReTJSQlBWa3NWUjVEQWZsOFBKSThCd0VybGNmNjEzU1R1SkZhRnlFWUNTRTBZMFlsUVlkYUFobVFmNkI0Z2kzZ1VUOFJjR0N0aU1LMjZGZHVZb0tzbVJDVWxPYnRLQkJPbV94aTdOMDZuMUNxdkU1UFZDUjVwMEwyMC1wVkUyT1MwY3pGN1ZuTTNrMHhhUEdKTEZLS0QwbU81VktobG42UzRyUGMzQl9ZQ2Z5eXdIM0FSR2NJLU9BcnpJek9uYmZodTZaS0dsT1NVOVBmd1h3SWRaTnRPeGt2VTJXdDlNbFhQODVESWZXZzBJQm51bVRxUm1vTUUxbXlseUxJMmtzNnR6RjlzUzVyTXYwcWU1eDNPeEhra2IzN0dMVmVEeUlOQlhaWVZBN19yZUFlV05VdXhQdV9BMk42dWpyOW5ZTjlkQUM0OWQwQnRiZkVyc3FrTkxvNG4zaXhFeGVSZlFTY1dmZzIySlQyUzRmQmVNbEoyR0JRNHBRVFliRFZueVBhTkJiZ2NkYlkxblFIMUdKa1hhZHl0ZlBuN1I0UXlMak5LbVAxbTZKX0N5SHAwNzlqcGdPTk1ZZUxsUEFzc1loOFhzcTlXZ1RuRm5iVHA2UnBRQ284SU1zczI4dHM1blgyZmUyM1lEOUJJdS15VmF2TzRxTWVRbFlydHhqYzgyc2p1TERNR2poc3dOZkRxTHh6WGthZ2l3aXU5MUVfZk11V01PUEpzVWcxbnRQNjZhdlJySDN1cERsY2FRQm5WMDFXRG9QVmFHdjZRYkxONDZydUdpU3M3c042eDFBWGc5OXpEUGRmU1FHNDllWnFKamQtX0x0TW83N0Ryb2REYTJxOGpiZUttRWtjQllRX0JfbmMxQVlRZDFMQU5nNjZMUDlyRDFaVzNlTmZCOTZldTVjTERLSFF5bTEwNzlFOW03SDhtQTdCSWRTZXI2aE43dkppdzF2WW5mQXJIZFlVZWR1TEk3UkoxQVFxemxjdW5GUFAwVG5yMlBObHVKM2laT2xCNHNSYnJrTy1RTkY0NmROT1lueFpyeTdUU3BjQXgxam8xXy10SXJiRkNybDZaZ2tudGQxTzZYN0hYelJCcWI1LVRHb2tyRHNMVjZBdE0tTllxVTVPcll5Uk5Ma1NQT1hRUjNmVXhTdFV3czJLSE5zbGtsVk9kb2NLOElueWVUZzRNNl9leTZrOU1pQ1hIZEFuc0hUYXgxVlRGUHh3LXZ3SXFQZTJuZWl1aUk2VjcwN1RaQ0JzWDFsYURkM3VzcXV1VDZmNzZxaHRubURDNGtqbTdFUzRwOE9yQW4wSmR6V0laMlNSMlZKeTIzLV8wWnZJUUpJY1d0NkhycFliaFZ3MW56eTJ0X2RrTjJ1MmY3WWNtd200Q0JsOUtXVjg1VnREb0pqb3dLbnRmY2Ffb2xLc25rZGM4WkhwUDBfaW1mU1FXTk5fMUZPNF91d0x6TU5vQURkSXNuSGYyek9CR2M4VWZ3czdOQ2doSHJXbWlRSlh2SnBjazAxUW5OODFaYURZY2I4N040NXdCbmZIcFJET1RDUXBNdlVySGFCakNtYUJlZlZGMUJMM2lWWGJRd2pyUVVOcXk3RXNMQnVtTDFDMVNfSjU2ZTdma2dPWE5pZExOTV9ibGpNS2kwWV9WaDdNYTZ2SmxXc2tnZkstV0djdmVyQzlmemhKZzBON29WSmFYMnJQRllFVDlDVmZaRFlfUWY4a2xyUGhRcXhEaG5HZjJhUG5wbEVxdUs2WUJVQVAzR0FibU9ORGNOQlRETWZqcHppRG40WlMzRmFQODJnVkdScXB2RmcyTHhSTF93LUFYVnBlNF9VZjkwSHVJTUVvYzREVVh6NXZObS1naks1VHVxT2hZMGcxMS1mTVZBYzlNbjg5Nm0yU1M1dXJSdy1Zb1lUU1FIUFQtel9WS1U4ajJHSEpUMWxzVURtYzNaR0hRSkNUa1NiZlBIQTRJb0hIZkFPQ2RPdzNpZDhfZ2s4Rko4X19nOFNiV2hkY0lsanVwOVA3eGtrR1prMzdObEN6SXB2bGxEVjR0UFVUd19FVEMxbmo3UXhILXdwNWhUTGhiZC1tYnJKQzRraWtDNGJzYlhvblV6aVVLTnFMbFFzQnBuVklkbXE2QVY3eC1SZmt1WWdUVkJ4bnBOUF9kNmlBMmNtQU9hQjg1c24xUG01QUEtTEJ2TjJXWmtTdXdsWDFLY0FCMTdESjdvZGNIaFpyVEszczRjOVEwQTJXdnJLOEttTllGMW1ZVEI3alJyWDdHZTROWk5lZWpUS2d2N1NtX2NCLVdDV1FWcFRZaVQwNEN1enAwU3NvOGh2UnZmTFk3X1AtcjhYd2lMRWdtNEMxVDExZmltdjJGVGpXV0hnTkxfUTlPZm92cDA2cjhKZHdjV3J5Zy1obzJlV2VnYlpWNk5raGJQYVBkMEcwTlFHa2VKeG5WOUdicnhzUE8tRHpyYndsOHQ4bTVoVGNTWWRReUw3Yk8wYzJkbWp1TDRjSTRZT3VtSS1EcVFDT2wyMFVxcDAyVms2Vl9QTzVLdzRBcnJDTmphbjVtTENMVG5fZDgycmVrU1UyRVZNX0RwQW1ZTEo4bmFGTGVJY2M0d2xXemgzWmNoVVVVNVAwaEZILXdiMUFHdk95ZldWakdidUZrelZoQmhjSFpZNkhsX1JrNXBVUnRwRVh5c3dqUlUxVjduSFB3UE8xVVRGa0VlakhRTTcyMjIwS2tUVFA5em83UGtES2xiUnpHTzAzdHRpdjVNRURqM3kxbjdxZ0pTeWlVanpicV91X2F5YXdPM2MtM2VlaTVIb1hQam1pSTM3akkxTnR6eTdDMFFzeERST2NSMEUwNlE3RkpQTnd4Q1Awd2RIQTdXVjF2Wm9GMnZvTUxhS1NoTHJ3OGUxb2xKaFFmNldqSWpYWGRXT0ItY0hBR29OQU05X0RQTXdHVjI1SUh4TmR2NDh4WGd3TWZNcjFMbW5HOTVXM0RtdHg1ZF9RZmF6aW1Dczh6eDUtUVdlWHd1NmxKQmFKOXZKdzJLY0hGcktyN3lQLWM2RVBnZzc4M1BsOF9XcFpMeHhyc1Bpc2pZdzFoa1gtRXFSZUN3X3VvbzEzaXZJWFhPLU95M0RVdnJ2cjJiRkF2UjdyVFpZdF9wU3BWNnhyRUVNbWNkUmxXWEFTMGNha2NTaV9kVXZOdC1SUDRFSm9KR1pJR2FVZ2pwMUJERE1QV2I0OWhrNkdVSjdya0hjYVVIUkRqVGxvdkx1MkpIV2xwU1dJZ0QzOWMyUUVhTDAxTVVURmhiZ0JHdkNfMmRPMjBPQWxvbkZQaHRrZGw4Q3FmcjdOaVpNTE9YbXVpUi0yQWR3dWJPNUNSY0VZUjNmdEF4NVRET0h1VnVua2toNmxPOENveFhGQXdwcnJ5UDB2X29DVkJlX0MtSXJRdU5XVnZOR0ZSYXpfMkVjNWhibTFGNkg0RXAtN2FvYlAzUnZwTExPQ2MwSUs0enFXbjhLY3ZTclVoUWk5RVBzR3U4NkVaN09KVWZ3cUU1RHIwVHU1LWdfREx2bjl3V2U0cTA2UU1DVnN2N3plYU9uSjdTWlcwNUNUOEY4T0JmV1gwM0xrTmlILVhIWjZlaFpTaHBJMUU5bTZVbk93Y3lTMk1tLUsxU1NGTGpBNVViZHdkMld3cmE1THgwdlBRNHdnZ0FZM044bXEyc0FnOHIwUzhuX0E2elFwd3JrYXlETFdHUnNNWkFBbkhSU1h4aUx2cWRFNlpZTWFOMHVlUkk5UmFibTZqNjBGaEp4VTZZenpxN1FEU1pHZmJLeEpoZWVYYXpwYVJhcDVMQ0pVWGJhVUktR0VlSGVxa0RvZFpEVkoxTVJvZWxOaExwa1lUbktOSWxDbXdURUplY09rREpSeF9Ra3FLMFRtV0Z1RmlmQzlqT0w3ZjU4UTBGdzZZazlCdVRDYUQwR0lTYkVRaUZQOVRoVEFYbWdqOUtRZEUyX0R6bFFQZTJrZ1RqLUpucVBVNGRFV2J5dGE2S1pCSWQwUTE1QkJRUFNybXctd2E2UlczMllEdW5jbmUzNWMwdFUzX19PdERSSWZnUVFTbkZwN29IS0I2aXIyX1A5N09ENjdVamd2Z0pUMk1PT2owc3ZsSVdiZHhQeWJOLXhlSzVTcERHM1padjVSdkhMeUQwZ0pqZXlzbEdCbjhsYmMwTVFVSlZFeUFRMkwxakFQdWZ2OC1NMWFsT3o0LUN1bjMtSldfczgtclhLa2dXTzVHVG9oOGdBcTlEZFg5dXdjNVV0Nk1MbTE4d3BqMUhDa1JDSEZqdXd2eW5Vb0c0WVR0bUFtR2lfTHBwQmlpTDh2UURlU3M2SEdGYUVGUGhVallpZEFlTGpLUXFPNUxFb0RLaVNZWFRvZFk4c2xIQjZzaGhQX3NQTVdCMFpnbllqTjVoMkIySnlqamdjQjVMY3laYXJ6YWphYVcxTFVlTzhqRjBob1h5em10R0xKMVc3dkNlbnFIVVNaSmcxNzJNdk9CV0hDdXNkeG1UQ3o0Ykp4ZHQ0RHdBMmpGb21pY0dUTmFoemdFd29PcDhXR0dDWFE3cnd2SDVHTDVZN29TYUp6RFVfMkVfOG1kTzI2cXFOMG9OaWhuVHJ3R19hWGttWUNuM2lwYkdqSXJfYm1zT3pCdFgydEdkbzJ2RWg4VFRHTkJJSkNuNWZuRGFPcWZHSi10MXBwWVhqYk1tS1hGM0NYRmprLTZsWmkzRXVQeFhsM2c1dHFOT2s5VHBJQVpjZTN6MzB0LVpuX0t0QTh3TjJVR1puZjhsNU5FZk9MNFhEbE1QMzNsVXI0MjBZOHV1OUNycXlTdDRNVHgteGxNcUh1UWhiV2RleE5nMExGeWloNTVKN3dhck1ZYlY5dnRXTEVaanBWRldsSnNaRXRudm5FYmRKSzBzdVg4Q1QxY3JpaWt5bUNtY1RSejFQWTlvYTlSNWpsaU1hMWt3SDQ2VW43ekNBTk02R2Myal9rUUhGbHc5MTZPSThNQnh3VFdqUmxuOVdvUnVyVTlsaE5jYjBwYXczQkRubUdYVzdPQWE2MUY5Zmd1b3JXb3UxcEdaQkpRRGZDY20yc2NYLWJvM09oZHVuQ1ljZ2FobUptVlBWQlVyWjFwYTlKS2NIVlFUNUFKdlV1M3ZMaERBTFFGMlZzME1FRzVRZ1BRYjBaRkhZSHB1cVpTXy1kWG1Cb2ZaZ1JQZ0RPLTZmZ1l3MGlueURLcWxjVG9WSjBVeC0ycEo4UXkwYm56bEllOEJCdm84dFdMNlIyRkw3cVRCZ0VhRVFlbFhodVctSThCbkJlaXpMeTl3Q3JqVXlnb0Vndnh4MTFVamlLVEk5QjhUYWQtVTdNYlg4TzZocjBJZ0xOQjREZ1ZsVXV3YzJ3YXRHM0hsNmtzajdXSkJDbWVqSE8ycUFzSEhlNkd4V2NzSmhDN3RUdDVlMG1QS1JkZWtFOWk5VUdaWkVWZjQ0c2pmcWdpT0N6a0N5WXY5YXNmYlM2NnRqVmx1NWpURndxRFNkZC1rQnNHSnpwbTk1RU55d1NHTnFJVnRPVFBQdW9qdkZBOXB3Z0todkliWVlxVzVyZmFNSHFFaG1vdll1NV8wTHBYNGZmTExYa05sSWNqaGRFWUQxRnpTRDdfYXBjODlHZ3R2b0htY2Z4M2xWZTNKSHBpNUl2Z0xXUGx0Z0MzQ1FhNmtWODNBb2VGbXRZQXdOdC01TEZ5dWtobnZrQ1Ria29yMEp1U0hDWmsyOVRLSXRoUVdCbktWYmNPaTNuVzRWcHFLVmgybXp0UFJ6R1JXNHNiUm4zVTg0OVR5N0NIb0YwSkFEdzZtMG9adXVPZWhsTTNDb1huNVoxVDVZX2d3NUtNM1Z6OGFBQjQzU2FPVDBzNU91T0lTbnpEbG1VM1dzVEUwX1BZUmE0MjBySjZTd1QtUWQ3aTNnVzJBS3VyNDliTjlkTDN3Y29abkRpSzQxV3JmTjJQODRPbGxLQ2lwYkdPbjJudVRYMjdiTDIxWmVXMlJLd1dCbmNOemZyWWlQWXJSTVQ0aEZiYWtJWXpOU0V5ek15QVZTRWc3elh6aGhjZ3V4a01jbzBxSjIzNXBzb2pmR0M5bk9hT214dWR3YXlDN2xGYlF4Tl95VUdtQkZPcm81YlRwbndNU2hZZ01tNUdlT2dURGJCejJJS1otemRhUVF3R21aX2xSZmxuMUpjVUhsd0ZmOGxuVHB1cmJlY3NPVVBRbnV0UmRVTnZvdGRYU1F5ZXF1YmxSNjVQS1pYNnlGZ2xWZFdhMkVEdnN4MXdUbFZ6djZOTUhZRE1Ldm5CNnBVQXAyOWRKM1V0OXZRV0JvM0RHcmJlYURwU1FtZzFkb3d3NDVXdlpkdUw5MzBZX1NLWm5IRjAwNmdqcHdLSFRtTS1vRjhuWE92TnVJWDJaMGp5Zk1GSlVjTE94bzYyQWE5cEhMZTY5X2h5OEpqSnV0cGpEWDQ5ejR6S3VJd1M0RmIyT0JGd283amp2T2I0TU41UXUtblJxYzJSTDZHT0pQRzNjSkYtWkg0SzZQc0RSeVpENWczVkVGeDZ0ODdBQ2Z0d3dBcnplVXRYWVM3MFhEbjR2Q0FGVzZGMUtjNmN1blhDdzVOOXM1X1NrSU5TMHJIMXBLZkV6QTVUT2ZrQXBjNUdSMlhMYVBkNTBMMXVBM2JOLS1WWVo2ZVhpRlFQM1h5d2RHd2NpdVdHYUdmejhvYzJnR3pjVVFoSHluZGttS3dhQWh0amVENzlObmQ2TFdlT1k2N1NlaXRNZ3F2RVVPcTg4NXVpYV9idTlycUxOZ0dGUEtNclJSc094NlNJTXFwa203NzhhQ3BvZklJa21kOHgyOGRFS0Y1YUlURjNIbXRqWGs4U29lZ1g2V0RCaGlDSFpjbDRROEstcnhDUGRUR3BWQXU3aG40Vk1uTkM0OFFRNkVrdFg0Y0RPOEpCVmdhTlc1ZDc2WmpHQmtWZXR0X2Fka05hb0l2V2ZwS0FySkNSLTRKLXJ5ZEFyaHBzQlNXdWhjSndrWTVqYm03VWVzZWhYcFpVaHAzNWUyM1hMWF9ERG44SzV2Z0RobmhUbTBOUFdSWWV5dF9hUUJQMVNySlZIckFpWmhjNTQ5RlJ0dmZIV2lJZjA2U05wZE9FdkpXS3ozejhLMnhsLXR4ZElhQUhyY2RqeG1iR1RFN21FLXZSMHlkQzluaDBTTm1tV0JndkxqbEtyaks4d1N6ZV9iamd0US1iQlctNEpWd041NkxiTktweGxWbzdWSTF1MEJwUGJWZG95QUVYNWE1bXhScjF2V24xNTV3ZG56WE5mN3NpY2lIZXZMSXpCNEdfWi1qcTQyYVZsdGFpWC05bW1DM09SaHVfZVF6NkJPaGJjMTBJVGNnUXQyRGtDbDE0UWNKNms5dkFBa3pSV00wR0VGU1RKRTAzYzR0eFJIVndwQVoyWU01UndGYjRMUmNCcVRpcXRKdW15b24zSWFIWS0yZnZWdEItaWdqd0hBanE0RER3X3V1RHp1Vm0xdWQtelFycHhrcE5XYlp1aUNlQTE3REhsSnpTU19MLWVGVk5Za2NWdy1RcjVOeUE0amV4VE1QQ1hCQUI3bDZVSHFVRHJPV0FJRnNpb04xZXFjc3EyZ2VYY2JpWkU2WjJSOXQ5NjgySVc3TWJvZ0ZQVmRFNWQxamFORENBakFaOWFrWndZLW9pMUpOdVFQS2wzem9NeEctM0N0dXNDa2o5QXduWHFYT2htOUhpeVJ5UlVQSjVEaG8tY3RzYjd2LW95TzdmWUJLN2IzeTBieWFRckczTjBGeUVEV2xVaDZKQ2FLNUZDNC1wTWNGd1BNU2IxRE5RNnA1dEs1UEF4RGtyQngwd25ZNWJRczd2eTlpVFUya2hodVVCVzRTMG1QeldIWHNndWI5Y2NqLUQyVFptSlRzT2RhT202QUNhVjVzYjYwZWVtTm42aWZCbEVkSGNJbDUzWGt0X0N0RUNLVjJLWjRmU1ZkSy1xTGNUdG5rcnJ2NUYzbHpiVnQ3WktGWjZ6OGpFa3d5dTlBc01XN1hyQzJXVFZwU3lscTYxZzM4ak16MHZQaGJWdU44VTc3YVlibUpvbERLbEw1Nkx2OUlRWm84d3hjVmlOOUdNWkZURk1vSllFdW5ORkZFRWV5NUNRM2ZycGJPWkhFRXBrVlEzVWJTMThDemFIYlo4bDgzd2tZVS10UHRja2FkVnN2NDVxUENWQXdhdVlCUFFiSE5mUkltWllNOWo2dFJ1LW1IT2lFU3pzcklScHNGT3R4blRLUGhxN0pGU2ZSVHh2OHlKWUNxVmVGNm1GZmNSQ05HSlUzQzM4RVJPSV9zSnNObkxWSVpXbUpZM3hHVWJQU3Y0TkxIclc2QzVVQ1l4YUdfaXpnLVREWXcxdmVrR21RZ2RPeGJmZUV0QTVSWnBnUW5TWFpINnpfR2NZczNlbXRHc2N1cGg1UkYwSnN0TzhRRy00ZkhzUC00eXN5S1MzblFpUUo0N2JZOV9GeEQ3ODVxQWJBSUdBSE13WXotVEVPek51M3NNejF3VzUyUS1nUXhoY0Q2Y29BSEI0dzRfZkdzTWdkLWR3c1A0bWtoZmlCMm9ObDJIMTA3aGdCQWtKeUNjZENYMUUtN1NpQ1liS1NkcXgxNjlxbUJxeGRXMGpmMHBsRzJYYnNqZ1ZFUmQzRHN6VFdzUnowTnVWQUZkN19WWDUyTk10eE0xaUNHbTM1dTdhTnlwYTg5ak84MERqSy14eE9yQzcwWTF3ZElLcER3OFdwdjEtUE9aMy05Vm93Q2dZaXQ0WVNmd2prVENRNGhTaEdEdGVUYWtJQW5uT0xZT1FnNEVUX3E1ZEZ1Y1Y3WURQWUZCZHBJM0ZOaF9yS0hqNVJtZ1IyWnExUURRNW9zcFhZM1VSbUp0ODVES3hkX252MU5relNzZHBEaW1PcE15d0FvUThpdnVqWUpiRkpJUUNRRE9BdlNuSW1DMVpQLV9lSnJLckFSUFBUT0tvZjh0NEV6NXNsR2JqT2VLUTRPM2hVU0pqOFRIWGxkSnFWWDRaZTFDVFEwcGpRV19ZcVFwWmROclZqZThSbmZzNTZ1UV9VbWkzUllfejRqZm5xQ0NRTzl4bllHTzZlRVF1UGpuVVVyZmhicXd5WGVlU1BIWXcxM0VuVXZPMjhBMElfWG9Uc1VnMVFmQmN4d2tjRnoxeko5NEtiOFAxbGxyc21OcVFwOHlIcEhibmM5eDQxd1FjcEVTd0ZzSV9pbjhjVks5by1jcDBkc0ZrUlNzejY5dmg4emdxTHNiOThfdWZqV0hYVzd1LTQ0RzhHczhWS21OblgyWjh4QXdIQmkwSDFHSTBUQk92bVNlTGpULWotek52Rm9DVHpkczlULUNGWU1MTzBaYXJtWHRvLXZyOE1RdHRXdUF6bmZacDJjdExvTlM3cEptZGZPclBmQW5QRUhla3JlLW44XzQtZTdVNnp3Y0dFYjl3M0NTUGVaTVV0ZWhZRzFtYjBxbndPeER5Mk45ME5OaGZhMGM3MndRQmRweTNDRmVybkFtbnRTME4wX2tUTVVwWFJDcTNKby1GbjRod09HMzMzQnV4ZG40c3hrLURudV8tNHZHSE9md3BRTmRaMldmei1yNlYtMzBiTUhweVQ3cXpwM3ltaFhtVUk4MklKUEUydEd5MU5vbTFLMXo1Y29nQlBUelJ2TV9KTUI5UHc3d3NOaUxmRnNnZkxWdk5FNG53azdFS3h0NWxpWF9tN1ZENXloV0pjdm92aUo1QmlaX2l6LXhST3EtUXpQNDVYSUxqM2NkZUZ2X2dzRVgyRV9DU0RkdzZEQ3hZaTZaeUNrRDVqcEZFVnkyRWxSdTF1aTlpM3lfWjg1dGk0eGFKSTN5ckhYSDNBQ3A2U3JCeERhQ0Y4VW9vVGo2cHg5MXA2S05HdHNnY29JWGRlVTRuMGRhRDRzdWx5ZWxjaWhTY191MVJ5Tld0MVFGQVlYVFd4SksxYzk1cnY2ZjBNb2NyTzZjSVpFU0p2a25HV1llZHpBUnBfZ2hlRk9tQmcxWlZtV1Jjdks3Tmo5ZEd6TVBLUjRCQlhEUVpBd3pEaHpSLXpFanRUeEVXUmFEcDBQX2hNdlZMNGdLWjV1c3ZObm1yVzVMWmJRMFFsaEs1dERJZFF5Wnpaam53YUtlX01Kbnl4N2V6dlFXdHNaRTVQRjR2UnE4VXRkQkN4S3AtZmY5eDVzaG5sSGNhczNaQ3lzWHU2QWNKVFh4cGlaUUdpbFZnUHZSemlmaUtkN3dzWUJCQlhEeU5ieC1fWnBBNW8tNkR3c3N6WFNOVkJDUjVnNzY0RF9lNnBvcEZRdXNDaHJVMzF5bTg3MHlMYkxmajNRaURuOVhDUFBQdGtOQ0tDVjJmeTdEdWJXdWF4SFdrWUl4aklHa3BmRW9wWVRFRnNtV0VVTVJ3R1FuUDM0eFlwTUdPVy1vdUhxT2JZMkxyMW90dWVZTGowaE1oTFdib2IzbDBFZ29DNDhoN3FnTkFBUFNBUHRoUUVoOGJyZzdyeUJ0eUlyZC1zYlIwaDFIUndTcmdqUlpwZmxtZkZmMUpDYzFiZE9JSE9fNk9YMGNTVXhzYkJrRVh1UFdBSDJWQTNPR2FWbHdlWWE5eUxhLUpyVUYyMDZ2azVPcEJZTzZvbl8wWFg3WE80aEpxVXRURlc0ZDBPM2RIUVRnRVNkeHAweTJWU2tqYnpva194Y3JGZDVzeU9OY1dUSEdDazBUdzlZZXRXZENaNU9wUy1xNTMxdHpNd1l3UHEwUEFVazY2ZXdSOGx5NTZpTDVOemVuOVgwd3NjMWE2Nkc3alhhRllPQ3dBY3paRFNSLU1Qc1pLaDRaZ09iS1F5cVJKRmh1VTlmZkp4Q1BwX0NWV2RWUTVzcjNTQUNFa0I5NDFGLW92bnh6a3dwSTh3UDNXdjZaX2RJWnk4Ri1Lcms5ekRnVEhjWUZDRk5INWFjcWx2bl9DMWNIc1MtMHNIclIwYkM4b0VKOGxaZDEtSnE2NE9oS212bG5BV0ZaR2EtOFhiQnpMNG1TTnozeVlnaVNFRy1UaDlKU2xjS204LWNLaVNMa2QtMEdvdkZlejMzWEtubDVBVVM1ZkNDYjE4M0ZNalUwb2NyMTFzWnlJd2U4M1JLWG5veEJFQzVrdmlVTGNwU1lYR25QZkk2dDFMVi1wZ014Nzk5NGJITEh2cVpaTU9GUXpWQjZkSXNZTUlaWGJwLWE5QUhJTEVaMHBDcHRmVEtOeDRIcUt5QWY2bklHY1oxQzExSU5TbFhsUDVjakVXS3JOV3VaV19uRDM2OHdIUXpfeG5IMWl5YzZDN0h4OTlLSnc3MXR1QnBOVE54a0VsZUR4bURLZHNMeU1Lbm03bVNjZlh3Q0FQbW9BNndzQnZqYUNqYmxTaTlQaERZM1VNYUJtajQzZWo3R1JNUGlfc2tnZDQxQjAxVFBlOXAzSEN3ejZMTVZHX05XcjRmczdpamZWMVNBM002elNSWHBySzcyNmM4cDBTcktXZk80cVVwZzlXcVRPc2RLd2tFSWpOZlhYQUFpLXVUZVBOR1pTMUwzcWM3WUcxY3dCWXEwNF9GSWYxSjZ5X25GR29LZDdiLTZYR1NVM1dZY3docWl0a1Y0V1lBbjVYVm1oMkhVMmhMOEZFYXVPWktBUER4N2hSczZ3eVFsc3V5N0E5Wm9FdzdwQm03R2JZLVV1U19OWk5PU2pJdlh1Um53ZmQyYWJuRXdsb3pITDlFSWVPc0FMQUcwRjA2X0lXQkhPNGc2REd5UGRYR2cxU1o1WkJuYTFDMkxPb2Qtc09VM3g3ZXB0YzFlNGU4NzFGLUllblZvMDRFNnRwLUFUYVctZzNfbk04THhJZTd4cGdkanFJUzJ1WnJSaWpjb3ExOFpvMlpOM3d3TTF3TG5BSU9jam5NZDNDSlRPSWEtdFZDNF9TT0hKbzM1X2dEbWlMSjVfczNBcDVyLVJwVFRQMkhWdVRSanlPeldRR0tZYUo4bmplUEVFaFdwc09QbkdubVFaUW5sMHUwMndVWE9oSEFESV81YW5kUF9TbkdaeGNqSWo1RXdJUFJNNWlwZGs3bG1TYndSNmlKMUM1S0FxLVBNZF9EUFhHanZHQlQ4Q3FwRkZ1eEtVeF9odjhnSVZhMlR3WWluY2JHM0g4cVNCTVNTTG9iVUpMczRGUlhBOS0zbTRmd2Z4Ti1uQS1va3FobkFoSjBTR3Y0WWxlbkxVREVRTzhDWVZLUzkyc2dRanp2VlY4R1dVOEFCVnNSdjZrRmREeDR1dUJiRnR0YlJSay1fSkdudXhZSWVJTGNNZ09Zc3NpTFpZTGVGU3FYVHBPcGoxVjZaM2tEOEstMDF1eDFZVnQwaWhnY01Ya0l4b2NwNW1QUjcyem5xQ3NqcXdzV19lZjRsSG1RU0pRbE1vS2xvazZVOVZzVWl5S2hnWk1feVMzVTFCYVVhR2sySzF1S1NKUEhpSS1KbUFIVXc4TUxmNzl1ZHFIMHVHcjdwSFdidC1NZGRuMHc3ZmRCLWZ6cUJPRWNDZ29tU0tLN1M5UEVVaC1OQWhBWDBqM01qZU5RT3RZY19Sc3lKNHBoY2w0bmlNNFJSZm5nN0I4Uko5MlR5MFdhaHdTaEQyTjd4eTR5dmM3blZkeHV1eFJsZnlmSDcyb1piTVlDRHdFbEZKYXVacDVDM2J1VzBPdENOTUUxSEt2d0FyemF0bkZRSW5qc3lmWDNHbFJ3U20xUUh0V0JpelBNUy1Od0p0VEhrSjZISGhTbUcxNVZBMXhVaEVaS1JjVXhNcENBa1hQc3ZtMzRGLTZxNG5wdUFnN29ZMUtmUjg2RENoSnhKa3plaXlCdk10NVJJdFVXanFhXzRFdld1dGhFWVNUV2JITWVjNmRFbi1MX3RiZHF4ZnM0ZDNhcnJUZGRNbkk5MVl1MkJoQTg4QS11YmFjWEdxTHlTR0V1aVk1MTNnb2FKY3NaLTZuMTNJUjVpSm8xUWdMYUhUU3NWTUhnd2RoejNYUHFwU3NoMmlHVnB1eWZETWlQMFpoSlY5VEwxZDZtb0Y5a1g0eEhsWnZiazl4M21kNHNyOUVBeGxmdjlqd05BVG40Sl9XRTlqcVZWTGJsNmJ5OTdGbVNZbF9xVjJnNjczY0NNdy0yaDFXZno5NG1CU0NraWtKTko3TEY1b1BuNG1zM0dPLUM4NnlaQzB3RXdvakstUWpsS0xZTzY3ZWt6bjczc3lKU3hfQnRCaHFSYVFKdUxyZnhHOG5oTWo5RVQ0dWNqZmhldXFZdkdleUEwZTV4b3RQQ05ULTRpZzlBZWU1bHBTY2RWVV81c0VpdUw3aFpwbFlsYWNsRU1FZmlPMDFhc21OVlVHYVVJNVZXYWR2bEFGLVg1Ym5kaWdST01ldElHMDVkMjE3d0otZDBJd2RfWTE2anhsTjdQLTRhYlFSaEFXT01VVnBLSjI3UVhzbUp5c3NmaThvQ25rSkIwcjJVR1ZYcm16T0JXNWRnQklJay1iWEJFclJWWW9tSHFJYndnVHdPYVNJSjh2cWIxOHVBWklsaTY1cDd3bkUybV9kVVB2NWZRYUliMjZSTnNDbXMyVTFkWEtwM1Nwd2dvaDRMUk9fQ0QwUTRVNlo3bXBRZEphT0pQTkp5VERNdTBaUnZRbjBYNkdvaDRkMjhJR3FLQ3lzUjB1RXVsTFJsWTR3WXBnc0RQX256T1d1ZDRVd2FtMHhUWjhEeVg2RmNHNHRqMTNYZTIxQkdvQUNrQ3dlSkpZcTlKblJkcnFHRUxWLWZuWHNCVVZnYTloVlRVekFKNGMwRXd2aHdseTZIX0V0T0NNRWNWOUg0Y29LdVdmT3otM1FJTXliMVQwZ3lEZkZJWXZHeUdfRGwxVzVFZ0doTnpYZnBQRmZSX21FTldOcjVrdmllWV96WTZTRDFWNDNFaU5CRmNuQnhqa2VMQmswRzEzSHJxQ3NBNDhrQlBtV1RwdFRLUi14eG5XanB1ck1DLXRkVHNlRE9IaFRteGpYc1M5X2N6YzkyU2M4TnU1b3dYUXdRNmktb3k3VmhISnFEeWRkd2VoWjh1eW4zdUVmaTNBMXVHX0cwY0pmRGdXUER0VkpNQXd6c1h1UVk0QjdNNm55NzRPWlhHeGhCSGlkYkt5ODJTa3JCS204a1MtT0JQbG96YVpWZV9sTTlEa2ZWRWxFYkJfU0FCaGE1Qml0SS1sZXBCWUdNRGtvV29xbTlNWGRsaENWaXd5MTd5cl9JUjBiUFc3TnliWDFHakVKVGdWX0pla0pnRGxtb0o0TmZjbUVqOFg4QjVycWFhZUQ4Y0t5enJpSGk1SFVOVGl5LXdWQlpoclo1ZWlPQUNlSXRyRU82bzg1VktKSXRxbk9XX1p5ejgyVGx5bGtSZzc1cS1ENVd6MGxTb01NWS1INHVoN3R6NnhiRC00WjRwM3ZLak1yanBTZWctT1k2NzlqVnlzTkk4U2dHSGRfMFY0NVVCcVo4d3E1YnJOWVg5dTk3S2NmelZjemxaaU9yLVRPd1IxanpXZXJBMlFDRy1rVEZXdnhpRDFpaVVWX2dLdE92bGpUX2JTWWY3cjd1YXZvZVpkaG5sbEpPWGZhQ2tYUG9SX0pNeEstd2hrUUZ5TFVKajJrMjFZZVJubm91YkVOR2RYM3FXR3E4VDBXWjB0OWxOU3p3NWF5UFM2cGN3Y0NPR3A2azVsVmRDWDkxX0ZweXFmY094UDlEc0N2VFpvSlp1NzRlVDFSYnJaNS1QanJMWi1oUFpUd2hsV3NJdERGTGdTNW54MUVXb0RVeFYxdjN6bzB0TmplOTVwN1NhNDdldE9FMmFROFBOZ2hxMEFIT2c3dlc4bnc2VG1MRDVVQ2U1X1BBaUhaOHlyZ3g4UE5hMy1fRmlYUEZBYUlRNTl0dlo3SnFoeUVELWplUWNNd1FmTjBMdk5tTXlXRlJPTzVzMnIxblhxN0NrQXpyWUlwc0xqZDRsNDZfR1NVVUZudFZka3RiQ3RsTllRVlZ4S1RqOEk5c0xwajBfcG9EdEpXNGd5SjhuQ0Y0MXMwUXVzVExpMEhHNjEzdHRudFRtdVJibk00ZXNzMnFyNUF4bHZXTGhsQ1RIUV9ITzBhMExnOFYzX3RlOF93ZkE2VkNVU1hhbE1zdXVnTTZha3U5VmRXc1pTLVVTaGdyQVc2eThhcUc1aGZSemxmV2ZKUjlGdUFZMDc0amJTckVRRlppOW5PX2FXbllPQ3VFOVVPOFpDeUNBR3c1dkxFQ0lFbU1BUFBnd2tGVXN3SlNDZDEzOGVkN1hqbG1UMmNWMVhyRGVvODFscUpOWDZXdERsR0s1ZEhyYkxFNnhlSjc1Y29GRUFXWjBpUklCSk5XNEl0NHJuMFBSQmhmY1FyWE14anJpY2xnU0ljRkVNNHVXcmFTYTd0WGpWUklfdElvb0ZlZGlpQUtNbVlYX1JYSTJQclBTbDRvQ0RnQVQzRTM5SDJ5ZmNmT3ZzdFkxd0FOUHZZSldlbV9zYzRIT1U5OTJfUlZGRGpKU0lLUjdQVEF2UVpaYjdKd2xmb0wzSjY4N2JZZnFzQlRxaHBZU2pxYnpCaDVwWTMxelN2aVdzRHJEVEV4ZzFPU2FFX3kzcHlhWXpFSjcyREFnb3dRLVdVTmJNQVZUUXdiWnpYTm9UWFppVEQ2Q2JiVXRZeUxHLVdOYll4UENoS1kxeFAyd0RBTl9nLUlHTndDY3BnQWhvemZVRS1JN1o1U2t1T3BqZ0dnZmk3ZnFzdDY3THBRUWgzM3NWNE9ybkQ0b3lGeE9KR0Z4RVE0dnBEeExRU05IcnNGNkF3eDZkMXZvTU5FZmkzRWt1elNXbUVBbUV6Vk95OGlIdXRHWXotZXRRV3NqVERlbVhjVlFrZjJrOTV0Q05oQV9SenBxVzNfa2pWeVRCeWdSS2FSdkZvOWsyNXBPa09iemdyT01yaEFGMVlyRmJWREVSLVlzSTdxLWh3dElibmxVVWlqYmZTa0VVZWc0ZTBzWHl6bWdDNXBORllubFg3eUhJQ0pMcExacERtTl9obXZvMlF1VkNGdWRXcjRmeVlKNXFjdlZlanotcGVUNWFaNTZ5Ny03QVRQYVF4aWx4T1dibHdhMms5bWFFdktrV3dPLW1tQnBqTUhDQldibWYzSUJpektnRUFkUzktV3J3Ym91MGtDODdQMjFNYldaZ2RSd3M0M01SYWtEc2ZXQklrbnJ4d1NWRlMzVERrMGEtbHNCT2w2aE5JM1dMOGVqcjM1dnRqMUZxR1RrbWUta2F4MENLNkhhSG1SVE9XZGFfUjViNktBR2pPLXVHZHhSVnlJa080eERQZDJPNnBDOFoyVzRldEtHNFdPekdqM0ZXWGdfR21oeHZIZTBiekdpQUZYZTRkWU45TF9kSTEwQmpsaDBpaW5rMnRxNnZnLTdlVzRzczR4S0cxVHpXTDFNaWtBb01LeVIybmNVcUlBWExjMTdQaUdzUUdlUUZYYk1jdGUtUEJCaHBsYlB1SmViblY0anJ2ZG02SlkyeW94Ylh0Z3E2MWQycGlGNkVzSXo2UlRGZlJIX1poWXpfbXdMZHhmTXNkbnBCOEtUU0RLZWdRai1DOXRWVDdENGJuUjBrOTl5UUVkQUUyOE5IelZwZm0xYzhiVmpYQ0Rvcnc3ZmZhZTNCVmdlUThhRDhHSDFhWTlTSUZIYjYtQ3V1SzdXVFVFaFNaazQ0bUNha2h0S2xKYkx6QVJsZlZGM05CTmNrV2M0ZHNuNXZCelFQMlhlQkhLSTg2Y2twX1JMc2JMR1pDNnZZdG1QN2cwdGdDcEdpYVNjZGFyMEtKelFiUVpGbnlhb0ZkbkFtajFnRXNJaVVmZ2pSYU5OTFZ0M2VLWmFHR2dGQ1ZDOGlFN3BoUDBCTjBFUDl5MDVieUczc21NdjYteVZPb1hNeDdnY3VWeXc0MUFVMUp4NnVha0RrY3lRT3VtQm5UdVQxVkI1a2N0OUdUcFNldnFqYnBSUDN4X3l0a2taNkZ0d0RJSVdRb2ZBS2N6YnVKQnB6MF95NkxsRGRBdmhoOHZOTHhVbHRZY3hYMV96eVRWdVRGd01kOXdhRm85OFhYa3lWS2dnTXdYNjJHTzNxc1VLVlhpdnhqbzRSX0d4SHg4QmN5Rkg5TkNFSG03ZHliUEN5cEMwRWYzekRxS2FObkhURzFoNkRGemd3OEU0dFpSV2pXS1FkSkZ3QWVKaW1MSzVfTTgwN0FiZFI0N05zeWNwUWdGS2RiUTBkdlhMdWZ3TmQ3bVZneXkwTXNRMVJUdTZEZTJDenV1azhPZ1FlQUoyTnE4TUQyWkprT2h1QXM0LWVvMTc2WnI4QlZIM3dYTzFNdU9ibV9sRVR3b2ZDOWFKbU9xMlVXSXdmU1NrQ2NFWXBTNG04ZkJLdjBtczUzM0d4TXhRLVdoZks5b0RIMkNqdUVPZUFkTk1iYWRDeE5hajRCZno0elRYUzh6cTJGTUo2NXJvcWRmeGhHLUlNWHE3TTBzRlJsSlJzM3JBWVQ4c0toRzVLcnhQSVVRVWFuclZabU1xUFRyOEt5WXZuVzd4ZFMyNFNndXQwNXpPQjZGTkg5c0xELU1GUENCQjFoWjgtN0NMLW43aUp1TWctUVMtdkR1Nnh3cUhfZUZmYk5xcDhRdmowbjdPcXhDRWRoZVlTcjZTcE15N1NvRDVLMzc2QnNnYjF3dFZ6VDkxLWlMWVdGekhSNy05S1lZWmg1OE5wOE5vWXRPQVJNUlNiWnRaNlYtWWtqOTdjNS1ubXhaSnhZQmpDbmpTSDBOcmp3WHA5UnlPMmNndC1ySHJtaDdzQm1MUjU5Qk54Y1hCekdwUWZpWW9DNnUxV2g4bkZRdU1lRjdfZldrUldiRnJCMlRfc3l5V2JJYzBiM2ZyX1dtNVRSVjRNMUtGdlktc3FKN0pmV0V2TE92SmNWd2VNSE9NUV9XODk5QkhQOVNEYzBRbzZDemhxUE5kQ0FSaG91MkVMZ3VIbHFhcmluZnZHdTNyMkJ6SGJzVDZ4ZC1wT0VPR0VTNmRMYVRUUUthcGxYZVpPVkYtRGc3WTVzbE5sbVg1Y1A0Z3JVX003RmE2aWU0eEpKd1dpWlpJSi1UTHFpR0RxdXJMZWxHd1ZaV0Yzd0lJTE1KOWVpZVZmR3FwdUlVdGZzWTN4bHRxUEdRb05VOTZzZDhRbXVRVXdLeGxKSExzMW9iSEtMRDRiVHpSeGFPcE55NlI2b3dzeGdkd0FqV2hxemVrTVlqWUxmVXQzVFlLM0VFTTlxNUNNT3dmbDR1eHcyQVhuTjRBblRmLV9zTjdqWVZFVXZGeUhwRmV1RFBVenBTa2RlOHlwdVBBNmR6Nk1NMXl6VFFVNkthMjBteUpMZFlhQzE1ZkhrWi1xeGJ0Q1ZvVTdHN0V5aVFabVhRd0Z0NDdTbHJZODhpY1pfQjBzc2tObHVRVF9RMVZWZF9FUXFHWVBEbEFReFQ4S1NhZXIwZXd1ekdQODdhZERERmw3NEJCRVNmdjJmUmw4UEU4NHRlN1hVTVgzQi1yTmExOTFqZnJES0RzRVFac3VVUFNPYjBuZlRYa1VDX0F2cUdwS2ttbG9ET2VtcG1HQUYtTHBWbExWN1lnTE5lQlVuU3NSMzhrNENPSWlIbjltaUdBRko0SVlNTGIxcWk3cG5haG95c2pCaWluX1FDV1VETWZja2ZkVkppclpScFpWZUdOV0NzbGJ1Ry1aMGNCRmFxby1QOXdNWVRyQnFMYlQwa2pLY0VSc29aUTZDZVVrWWZfcVQxNXYxTEZuYllraVE0U3pmOS1wam52R0RKVjdyZU9ZcVFVZjUyTDdmMmV6bjVyZmlNOFlXU1FLQ2FYbjVlbWpaTWExUUNHeWxxWkZuMUxiSnRZRVM3TG9IY1JlUFpYUkhadVcwd0hOUHN0LXBEUS1aVDFTNjRCeUhLWFRCdS1rZTR4d2FjZE5STk5DQjNsM2xyWGZ6eVNGUlVNM3BJNXdPVWdmdEVuelpWb1drZzdiOEZHc3l5ZjVtRlZQcEhkUU42ZGhXU0Ztd2pSYXh3UXZhZEFrVWtGWGdoWDV2a01raEE0b2tkVWpLYnpXU1pYcFZXeGNPNVJyR3Rjc3dfbEF0MGRWcFJRclc1aXVFSmJmVWVHaE9yd1FiamFQRWpwT2RVbXVzLWJrTC1SRDVGVmdDa0pBelk5aUlVVW11b0J1UkpwcncxdTBVZkwyaTExNHlHQjhLNTJGTHJRQlNXUkRVbGp4bHFZYzZvSjIxMmQ3YVd1dWhNTWNwWm1WUVE1clNGa2dBMDNTM296QS1Lc1Jwbm5obFV1SEhteGpXZ2JSbTliOFZGQm9pbEpfSmMwSE05aTRTaVFjRnZLbTlIMU51cm5uMlZJNTdveVpoc1o5b0NoVDVGNXNKaklpdkFaMVR3UURZWThHQUhHSFhwYUxOUGV0V2ZrTHQwbjZnWlhNeW9UbzV6eUNnZ2NfQzh5b2hXR1ZFaVNOM2RfNTdxR1JkNjdBSWlGRHBoaHlyRGtER3JDSUFrQ2dfQzczem5QY1JRMnVFMnd6THhyWWctX2RrUkFQZ05zdUpMWVNKbWl4NFBDWllQQnFoaW1oNktFZHlqRVFXOExUU2hCNFd4b29zY1JDRFBNWWE1VFhvOHhnN1c2aTA5R3FJb0QyOVhQTHc5Nlk1bzVTREM0SFRsSGMxWG5tNkNJTHhQUXdESnRFbS1DUTJQLWZReEdLcENmUExlREF2Rkx6RzlVQkN3LXFaM2hJYi1DQWFpa1NtaHZHZFhrYWx5anY2VEdiYW80OElEaVpRVWZXVU14RDdiQUhUZHhMcVlQd0JXZS0xS19OWVljNWtsT2YwaGlCTl9wSm4tVF9Mc2VfY1lEWnRKMkdkUFp2UnBTc003XzF3UENUaEZ4clgxVWVXQ191MXFSYlFUWGJuOGI4UGFWNC1mLVcyRkVSSzdEaU9BX0VuMUVtTTZMa0lscGFuR1JlUE5KbmxmbThkZ0NkZG5RSVktZjkxT0dwRnB3S0MydllNd0d5WmFDYW9yQ3lBUHpHSmdrazZQYmVtQWJoQmF4QS5YTDJFQWx6Z3Bzak9MRmN0R3Z4TWNn"}'} + headers: {cache-control: no-cache, content-length: '42664', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:25 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497/backup, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","kid":"https://vault1051159997cfa1497.vault.azure.net/keys/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","sid":"https://vault1051159997cfa1497.vault.azure.net/secrets/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","x5t":"EGCdbDY5NxW2aWAyaffevJ0T5WI","cer":"MIIDOjCCAiKgAwIBAgIQLMT9FrFxSXCIGo9LpD0VzDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMDE0WhcNMjEwOTA0MjMyMDE0WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCoPWxwhWt2Z+OUBadxLiLICOugDy/n7ZBdoZbknsFYr8UlDWBZvjjroe00TeuFeRWDQvEqsMY37pVJVN76oA+/VFPZfT749wuxMRjkNgf9uzdtq/vZ+1fqHlzpMD42sE7UjfgHnseSdOY0u0pfUhHpMC0WcZ44HuHDxfQbwInIUJXS9dQ9w40CRYy1SE/Z4joqnANOmR9854Gc+4JwZPoQeD2CO+aV0XHGRVup2HA5tHTWj4GLZqvjYwU3/fkFAlClc8CUs2P7D4nL/4484Lcx38FIy535t8OnSTd1ZbUp6AarheHbGuqhajUvsSfhil/0RV0hbMpWr/Mo1HFDkrKlAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQlfgxfPPlqTxG+aZxCq6ndMe8SrzAdBgNVHQ4EFgQUJX4MXzz5ak8RvmmcQqup3THvEq8wDQYJKoZIhvcNAQELBQADggEBAChWFn8tJXpHADvvjrUEPLKFrhLe5HRn+4xOKeXvXR0FGNhRnaZ+kWc/kEpRUiUA8wTHsdJAi6zkAcg3iyrqA105PQ0nHxEMqQo6Kw3RUO3HBSrV5JKOmWCwJCGnAmBUlL3HdKabYfr1bWoTaeShyYR4+3bJ8RudScBMFFnFOMnO0JQNiNRleekGEG+TbH3L0y9ki8io1FelftHHgiuJPrB7hFNsluyss/mZkEcQY8knKXDel7QSV3/Awi4q5YRY3Zht0GXWFTHtvL8JqWKEGggIcq+iLRq2beESaIOsIoM+kNWN710ZlfUvbc1UQjBeF7BSgYwK7RPKG8aCe5fTY+I=","attributes":{"enabled":true,"nbf":1567638614,"exp":1630797614,"created":1567639214,"updated":1567639214,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":2},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639199,"updated":1567639199}},"pending":{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/pending"}}'} + headers: {cache-control: no-cache, content-length: '2348', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:26 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/certcfa1497, api-version=7.0, ''] +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLmRGWllSLTF6amNOMjVweXNkREtPSGxSOUZzZGFLQ1VXZE11TzkxbGRDejJoa1p4VlBOUjh6aC1ZekpleUZRYnZTRFlTWVJUaF9tRTdmSk10SmFjcUV2ZU50S0g4OTZDUHctX2JVQllmZEtJSERFR1IyaEZmZzZjNFhodHl2aTRsdkJKcDJXckUzV0hCUThHWC04WWdpMEY2NzJJT0JKOG1xdmF4YkYyQ2NqcGU1d1NMc1h1VmJOdmZKZ1lPbUtnanNTMVlJc0oyWEhLYnA1RlFHWXJZa2U5d0tmalYtS3F5dDZETTUzMDFYSzdnVHhGVThtdlF3ckZ3TTZ0dGp3aFNBVXg0WjJRQ0gxcFhkTS1DTXN0MlRkQkFqT24yZS0ySFV2NWNyeHZoSHNSTzhIcVM5eDBJS1RieXBKSm5veXdwMGphNXZlc0FrQVhwUmFkdjlvdW9LZy52NG5xbGxGcjlzNXEtSXRxbDdFSjdRLk55QmZoUWIyNmVHdjV4U3FHbkZ3UXdKVmVVb3BWdTY0OTYwX3cxVHJRckQ2dG9MNXpyMTBRTkR2dUE0ZG1RLVozZHZQcFNZS3FCSlRGTjFyM0plcVByN0MwdHFGYWY2Y3EwRTJzTHh2aWtiY0h3bEh1SWxyWmdPekJUUDhFellZRU1ZbUNjc0l5b05aMkJYRWRzVFRmaEFXNFo0MUhQUVVZX0ROSFk1VWVGNzdkRHVEZjhRMjBoQURONjRfb2JMbWQyUW1SSVpsaDFocDVENUFvVW81OUIyRm5iek0yTmRaQWUteXZFcUxMamtFU2owdzdmd0M1NWNpdHlnakdDaXFvSmVYMW00VTE0dl9WNjlndjdhYkxlX0tyekllX2Q3d2dpZ2duSzVCWlNDWnVucUx4ZGFrazJVbHhPUWdtSGYwblpoNXUtbEpZMzJsZzB3SEtmOE9McXU1ZG1fbFZRZlpCT0k2b2dNVFlrNlAyMFlJaFNZS2xsMnpzMmoxSmxSc193bDZKTEN6S21mTHNON1VPbjRWZXRHM29KYXNhZnlqRFVzMk4ybEtIY0gtdTFyZ083TkFfYXZNOEZIeHlNSVJCX2tWcDNtaDJKOEtlOGc0ZC0zRG43MmhnUmJmVHJ5SmNTWVNqTUxEQ2RfbGJqYXRybkVIMkJ1OTJEODZYT0dhb21zZ0tIcW9IajZYWDBvcGFob0tYY25rN0tJczVfMXBlc2trbjdnRVVialNpRUJHYXhEaWRzNFAzVkRQNTFUZnh5cUJvLXNUcG9UazlqcmNnaDNQcFllV0lPajBEY20yMndCS3dTQTVmQ3dVWTROLV9VV3ptTG5QRGoxalVJZS1hb0cwdG0xQUJ0UG5GZkdDdXJsVEp6dzJFYTgtbzg2ZEswbEtkZTNVWFBYN0YyTXhPTFprZHhLT0o1bzkzMEM5LVVESmRXZHI2eExrazFWcW5DclJHZ3hJQkdTc05rcFp6SEpFQlRZVXdHUmFtcDljakhxMGpyQ3k4ZEtKVXFFZ3k4NGtwZE9yUFdjQWtlbEotTzAteHZ4UTA3VkI0cE9hMTJuWW5vTi1PQl9NY2RxMnh3Z3N6S2p2VmVYLXZQd05nd2g0bHNFa2dtWlZYWXU2Y3Q2UHZMTkt3OUIxU3lvQ3hHWmhmcXp0bDhucE9FOGlIemR5ODdab2JYNGxkaHFnSGFZSWdEZklOM0hrcXBzemxLeUo2RUtESWl1bDd3cVNxRFF3cHVBU19sQzFlRFJKZTN4cnVreFhLLUMtTWZaUmYzejNWbFJubVhYNDQtNHhHY1BrUmpEbldsQ2RPRHUtdTNXWEplcnJBZnV4ZG43cFRkSnVrNXR2b0Jkb3MxdjIwVzkzYXVwbGhUaWJnQkxuNXFwZWVjalBzRUNwM3ExSDZzN0ZuLXU3alBuWUV3X0xETHJWSFZqRXg5UUZaWjl3MWljMzBjcWc1U29xckNnZVFRR0d1a1o5eG1fUjl2cDRyMDV0bi0ydnBaRTdGRmdYcWFNOXJRYnl0ekpqRkxTQ25GSjh2MWs1YkVFakIyLUtxVXNZSW9RTzVkTnAxUXBWcEcycjNVbFJ1WWcxOWIyQ1Rqa19JOXVKQkZVZ1VlczZlaE9WWi1feFp3T1BfdUlQSHRORFFaanBCRERSWmRBUkNzLUJFRGE3V1hzVU1WZ05OT3JtdmV2RlBONlVaOTdSSE5OZU1SRDMzUVlHdlZLVEJRcC1xRTRZTHRnSnFYMm1Qc3o5ZTVpbks5MmJneTRQTkc0Unp1NENJWXp2RXljTVpfejNDM1RtaHlhY210VEMyLUdUVlNiSnkxcUJONXNwWGtfM1VFSlF3MUVIcUx3aDIwS1V1WWlreFNjckZLYkNOOUV6NEU5WDNwZVJPVy1KeXdINE9tODJSSzBaZGNobFJZeEw2ZnFzeWJWd2RBV0ZTUUhJNXhMLTU0Ym50ZkRZWlc5c2xiSnhRdDV5elg5bGNvYy1xV1FfSHBreEVvSkVqOUliUEVzbkdyLTI5VWhWMFBTMWNjV3ZnUkc2R3ZBa0tHVW5wcmExbTVyLXlEbUhlOFFBU1NrRUFhWi05ZnVxWURDeEozWFlHeGl0SDZReEpFYW1oald1Si1KM1R5MnBLU2h6VHlxZ0pIZG9yN1NpWGtQTlgyS0g4bTJTekczQ1M3UWQ5dHIzcnU1WjI2dFAxejVHdzBFZlBIWjNLQ3EzSWhJRkpoMDFNZmozN3FxTEd1aUVUdXRyNnBTbEt5TXNEVFJ1c2w3X1lNc2gxaU9GbFdrTnoxX2t4QnZOM3pMN1F6V04wREdnRlpjUWswSnBuSmtvNFgyemI2Yk9zM3RkRDh6bjdlYkQ2ZS1GY0hlekZSelhMeUZyS0g4RkExQkRoWGVKMG0wMjNydGIxV1pSQjc1eGhTNWRHUk8xanIyN0pFUVhaeUFHeG1jMVpMS0dIZ1V4aWw4ZWRRMUhhTW9aUDJpYlVGQVJFbV8tc3pFV0NteDdWRDJNN2xUaXkyU3UxWS1sTnctb1pPZkY1eWxPZVhNNld1SHMtTzZjczczR1NtMzhwQ212eVdkSXhqRVpwUncyOGxyazA2Sm9QYWtyMndFQWRKbmZFZVhLVngzNWJqM1RteUdOS25abkx5alY4RE1xMzRYbHFHNlBqOG9WNnRLLXB1NXM0SDZKcnRuck9BbV9OVXhGOEdlZFRfZm42ZWpiXy1rT1FSZW1fM2dTbXFZUkdPVW41Y1FGZmJKVlBielVRVGs5dzgtd3oyX1puU0ZJNEtYd1dISHN5NmpubWVMN2JnNGZnQlktcWFYU2htQzlKT1F4SzVLRWFkbEEwaGJNNm1QYy1JSHpoRHc0ZGZtYmxVT1ZYN1JHSXBuaklua2R4TGNqRmEtMW52VTAyZDVXVlZxNE1LVXlQelhVdDE5Q29kUUltWFFqSGlRb2RLcVo2aXAxbnJ6d2pWbXlEcXNibE9ZN1c0SEUwWmJ2RFB2RF9LQmcwdnFvYzJwSy03R2JPMEtJejRJWnN0NTA4UXZJZHUyLWdlM2x5MmVSNXJYVUVJcnZGSVBEdnM5ckg1Y2IyWVE1UjhHS3Zta3pQMWxnbUltRDdlWERyRnE5dlpDcjR4amU0UkowanhvNDZTeV9pM3Z6QzY3andoZ2pZVGxGZ2pWM254eE1oTzlRT0JXOEd1YXlhQkNSMUNNeEdtc3gwQlE3MFlYZkRJTmRueWRXSThhM3lOYW0wejg4a1ZsTEFIRUxKM05fOHhSNnpIT05namI1UjUzX3R5bnVyOWVlS0ZGZFNucVYzWkZuUzUxVXFmR0FLLUh5c0RiT0NQY24xblFDNmhRSzRqWXp3Mlc1OGpNMUY0VUstTUNGN3A0d0ZhUEtzS1dRY3IydFJ0UGRvQXRIeVNhZXdnWU9KdTE0ck8wa2s3ck5DYlhBdllTNG02NEZTaGF1UzBwT0pNSDh0Mi1UMmFYQjZuUHNXWHMwOHQ1QjJWbzNRb1lXWnQ4WGRFNDZMdE5rZGpOaDVEVlRtWnp0ZDdVVjJjOFZ6UDJjN29oYVpMX0E5ZVNmanZVTUFWMTR1TVJxcHRTbFhESGZIQjhNSk1FdjRtY1JVN2FiSFNvZjljYlZmeTZoUFM3OEZxNGhscVJpMV9mdldpVVB6TTljRlRhWTVLMWJTbHpyOGdGRG1OTzJZUGFlZGc3WWZfQ3o3eTM2QkdyVEo3SllnbThKSUhKdVFsclMwdlJieFhITU1DUEJZdWNlTW80RVZERjdLYXVhZU0yMEVFNXhKTHZ2LVJGSXlyNGtidy1CVzlIZUtFSzNHdXJnc2UtWVYzMnRQZFZieHZEY2J5cy1sT0NZQkdqVmhna0Mxck8tOEJYbFBFRjV2bUsxVXM0Rk1odl84Z0VLMUZVTzNsWkcxWGF5bUlicEtqbDdJellhU0dWZmQ2Qm8tX1ZueGozblZQUnpuZ1M2cFdJM2dpWFh4aXhWYXZ0S0tnODl2d3ZHaXg4aktjMDczNjkya3Z3SDQxdUVwelM4X09WUkU0VVpJbjRXTlR3Qmt0d3pMYnVBQWRCQlpsbzc3VkZFclJiUXg2ajJXYXMtaFNGekhFZTlVc0s5TFlaOWd3RWlqdXhKZ0hEQjE1UFZfcHBJcHlUb1g1cFpwSDNlMzBpWnQwSGpMMGZJdVdyQnhmNTU3NnRoRS05bFU5cHNFbEh2UEZWdXJBMzB2UldwWURZOXVmZXNiaWFpWV9OdlV4azAzVjBDclNBZHFoVzFLSFE1LWFaNUk1LXVaWGlFa2RLTjM2RGNfeHZlV2o5WURVcy1aTkU1YXFBbEU4NDZma05yVko5TEJYVERzQTNhZVNaZUZlN3NFelBhYzA1VzdsemdfaFJYa3dQZ0lmTm5qVGhuSzBVQjduSC0yNkVjY2ZSYVpKZVJkYlJBZmRaLWdINFh0NnZoaXNsT0hvcGxpOFpoNWcxY1JwaFU3dlpiUS1udVFjM2ZNamdHczNRek11dHJoem9VXzZBdl9IQmlncEZkdVhlR01icVJkVDNaYWI2ZmtWSE43Mnlhb1NSRnpOMVpzaGx3bXBLX0Z2blk3d2E5azB3VXdfNllQTkZUam1kZWhtODl5cC1lU3Z1Sk9teEE3NmdWVENCTEl0QU4yY29HUkJ3Vk1RWG5odGRfMGFnNXpucWgzdndFM20xd0s5dzhDSERHUmN2ZTZFejhEQzV5c000TUJDV0RTbmhnVHJULWtlYm93TldPQkJkWWhPZExwSXRWVXROZUt0WGtFN25OR0RSVFA0aWp0Q1NPeFF6UG8tVU9rYmt2TGVjWjJlSzNJR1JRcTdXRlU4S2pqZllLcDhJN1Bub2txUENnRVFuNFhDVEJveUJudFd5SHlHQWFSMGwzRTRubGFRN19YQW1COWh1UjNTd1FxcmdMTllscUFrUTRsSWxYbllwNkZwaEhHTUV0UmtRTWdZSWJvNmYwZ0ZGOF9FMkpVX0ltTVAwSjRsemZlbVd0a0hIVXFjQzlHcFZXalFIQl94US1DYi03bV9VWmY0M0dhTnk0YUtLdEhTeFN0enpzNFdrZDBIMnhldThndXh6SUxVeGVETlFZa0NUOEdjQm1DTGF4dXNBOTB5TjdDMEs5Zmhib0RRYkJKUkxZMWtxLXgxVzUzY1BoRUJCMnQ4VkpNRFBnOHFuRnhEQ0pXSmdyLUhnWWpybzdjbTRrVG90Qk5PYmNnZEtqczdWN2V4eF9YczdZc201bjVvR3BsY3ZYLTBVT1BiZmEyMTh3S2hNcndSWGR4eGZDZ0l0Q0VxT0tYNU9lUzBRdGVfQnl5OElfWkhTeGQwNklSdXRjeEk1OWM5Y1FMc2V2NU1VN0x5MTEteUN6TVlmeUFHcVBpVDZKckZ4LWt3bVhnWlNjYTZ2bVRRWkoxTXhHX2hpSjBCZWdqV3NmWlp4UElxcG5Ecmw5WGxISm1FVXZrU3dUcmtCN0h1Zy1SUmFKTkVjQ0V4NW1KWHIwSUttY21IUWRlZ2FZRXVqN2w2eWk5V1BpZUl5bDd0Q2pSelUybFNGR1lSdURwcDhJc0hzOGVucU9fZ1g2T0l5RmUxdm11R1JsVGltV3BfVDE5bE1PdjRCbjhMclgzeGlMNUVzWDBObTZyc2RkVkRoT2RrUjluR3RvRTE4Vk1FOE4tbGVMMVVuOHB1NUhxeV90STdSRU9SU2U1Rmp1RTVvQm5uT0JpV3VtdlQyUTFVeGt3NkQzbWVSaUUtTDQ0aVlHR3dGek5xdGxGZXZEOC1NTzJNRHZ0TTN6UWFyQlJXWTZZX0padGswUkZGOEI2dF9FQTZhOExlQkZ2cjkyeE9LOElDZkVER3BRZ0ZWOXV0aEtEZ3ZmUlZXU2diODhKVzN2cTB4REZXMEt1Z2hxUS1sY2JQY0Vrcmx2SS1xZXRGbGZiN0hod21WY3BtbWVhWnN5Sm5mczk2UTdJcldaaExuci11NTJwT1BZakFCS0hJREk0QkVkNWRnTkFRSGpvRzFQNjhoWjVuZ3k5N3lQWnhtSkc1M09wa2Ezd0VmYWtFeTlVTWRpV1RJMVlnZ0NEblVYcXNmemlrSHBPLXRCZ2tyUmtCejdZMlpmSHMtQlYyX3U1ZE8xcFRYWmVOVHl3VWVXZFRINEVMQWN3ZFRBeWxYMnQ1QXVKYVRhdTFrcjJMQW03bVFpS3d6a3I1Ymd1Q2FTM1ZPTUwtaUprRlFhRHIzNVlzbmY4ckwweFBRZTFLZ3E3SEZTWnNrMmN2cGVWXzgtN1J3M2ZkQUtWdWlBTzBRT2FOTjY4MTZaWm82eFh1a2hWd1F0amhIS0k4NXJwSzdoOXJaTGNST0pCcjdkSlQ4bmRnaWZCQ1hfWTVQNlhqdW81SUtRXy1pUG4xWUhfQkpXMC1MNVlGNHFXSS0tZEhhZWRTVVByRms1dlFvUFFiNS12YjA5RkFwQjMwZnhNQVFpUU50bThmNWYwcUdKRjdScXFJbjJMVlJHeDhWR3BMVTRIVi1FZVJOSHR3aHdsdVRoNkY3S3NrdDg3dEVrVEozbE1qcjk4eThWWjQyUUIwQlpVMWhQbzZ3bS02OWlZS1doUnZmNE1Wdy15TWhaVnNmM1N1NzFLalBNMENZLVptT1A5VmpyaC1QMllSbDE4UTE3UE5jUmdzdnhXY3owVW5CTjJWcEJSZ1JQRlB6NWNjZkNSdEo0Nm5TVlRVQnFvYnpEcDJ1d19HRXVJTHNIOW5QaTI4cnBiV2I2aG9oc1FZRXJQZW80Z0JPUkNPTnJnY01HVVBQYzNLZHBSem9iVHBJVWRUdW4xbHBHQ0NWejNuWVVfY1lUa2psMFRjTmJGWmw4T1llNnYyMjc2blFsUVVXZnljWHd1Nm5sNDdmQUNub20xdDA3Nl9UZnN5SmVLeTlVb2U2SDRLb1k3akFZTS1uNmhPcU9uT3IxNlJaY1N3bUZ6SjBaYmdIWXlvZG14NC12Q1RGMDlWUG03N0VYeUE2elQ2MlpzbWNJZzRtbkdPR2tMcXNCRjRjNXhkSWpiV3JJdEUxMmMxMTJ4RmtFT3RoSDlnYW9reDc3MUkxZktZQmVHZDJKR0NEc3hFY1ZxYWd3OVFWZm9ULUxSSjZzYUozOV80alo2YVJ4SThsSndjcVdCSHVLYnFkRWJyOFU4bWw2em9nSHdwZllYVFJYTFBUTHpSYzhEajZWYlZTOWMtaUM0NlFydlNJR1V2ZGpZOEc3bmN4Mkt1QnljcDFfOXU2aTRrUUNST0NJZDBFVVFONFhVb2s4OGw0S0ozSlc5ZnZyZm9ycVFNeW15T3NWTjJ5Z200SW1JR2x1cDAxbDhtX0hILXJzd3UtWHQ5MGVuUWRyejNMTF81ODljc1M3eE5aTnZ6RjBFWWtIQi00ZnMydjN2REFyaUlhblV2U1dYaE9ybnJNQVEzQ3FZWWpMaTZtXzc3RTh1Sm1fb3I4UmVoSmRTOGpBVXZucWZwYW1NMHJ1LXpZdzdLTi1lQTF5Y3BBTHJxcGl4WTR0Z1kyREs4d2dzNGJmMXY0Ung0ZjIxc2IzZjBiaklEU1F4Rkh4UFlBZFhpYkVxYXpoOWdTOEZuQURnRVpySUtXNDBxeVJ6MkMxT19GQXZxMHA3Uy1mTXhkUDMtZTFXbzF4VXV6NU5PWVBHb0paU2RYME1FcVJteTNqWWpaYktFNkNYbzQ0QzYyVlJXb1NQdVF5WVNYclZxN19jNjRISnN1WGxHNmhJS0xxOTV5bTIzckliTlctUG4tSVpiRFR5OGVUYXF3MTljeEtxckVCOVpqbFI3WVdXNzlSTVNTaDhWWXZnOVF4YUZfSnZIZmZfd2ZZTkN6YmlZVnF3QTgyVXZFNTQ3Mk54Zlp0LW84dFgyZFlwaDV5N2ZoXzk2QjhrVWwzQ0J0cEIxZzhReFBCRllEQ19BY29Ka2liUlU1TnNXYzZlMXFzcERrZmNERUhvTFBTbTlXamdhN183eEpuM05GS1VGaGlWbVR5dGlKSjBveFZYdFJNdzdORUhpNUlGS0d1NDFnWFVKM0VJX2JOc1RCcmJ4Z3BqUXhDclhfcldtZmFkeldDTldzUDRGbjJ5bzFjbzNLaXQtWWx6UFE3ZVRFcGdUV2phWENmcFgtcHNPODFteFB2bU93UVEwTl9CUkhNNmhvSnc5ZEVtV1ZTNDIybElocW9BYVJ4cGtnVkU3cXNyU0RzSkdZTngwYU5ydjNYTkRsZ2lUZ2VJYjRFTTk0VkdtWDFMblJMOVNpSFFLV0VnbF9vWkJtXy1WamREUzJyT2NjRFV4aU9QOTdncVVOV293U2pidUE2a3lJZ01DRDF4WVZheFR0NER1ejk0Z05JdDNBVmJXZGlDR24ycTZEWEFaVHhFYmwxUzVRYjFEYjZXQktsdHpoY2Y0dUtNTHd4Zk51cVFsUU9XOWpXVHRYZzIySTdiclJYYUNIRGN5NUtqTXdXbEUwdjdiNlpQcHBNX24tMkRsV2FJMHEtVDREWUtRSnpUWlR2VDRBbEducHhsU1B6UkVNblJ4WVdSV2I2dFhVMEVVNVkzd25OSWJyd19hUTFVbFc4Mjg3cXFDZjJScEhCUmQ1aUFlQXJFN1FwUXhwWk5CUzdtMVN6Z05ZUmpQV19yZWxNN3JpV2RBUG9pY0JDZXlVdktfVnluUTM0UEo2bW9nMDRyd1lnRjhlVDJabDB5a2I2Z2x4SnZ0QzJxMjRwRzh0bUlFcGRQSXk2ZUI4c0lCWm9mSlFUTmpXZEZHXzBRRHllenRCNkxhcEJjZ0k0dWQ2YzFLWWgzRnppWXhCa1Zoa2pMQlQwV3FrYXpMcmNwczhYbzZRMGU4Wm9OcjBGSUZ4NEtRZ1dOb0V5VnZoUFF0LTk1c1B5QmxZMWJTSUx3T1FlTE1vaS1mTmk4aGlnNTJBZTNCUlNxcURnU0I5OV9odU93WHphXzB1YjZhQktpRF9tWGlLY1VKZWxlbUhjeFgyQnhUdWstLWR3THpwWEl1LUV2bmlwN0djNHhsTjcyYWoxcU15dWdfckZuaXZTNExEVnk4NDE3QklRN3ktbm5nN2pQcUx0S0E4eXVBNnE2TzNUVlVJY1ZWdndPS3hFUXJGOXdKQVZDVjVwNDJIR2pkczYxb0dMYmZuSXZnRkhXYk1sU25aWTkwZW5jandaXzFyZTBWM3JaSkZzMnhnc01fMzFVM1lsbjl4bTJjWFRsNXZzVF81WkIyaFZhZERwRnBpTzZPckNvUFh3eFBYcFZlSGJjZkt0WGpMbG5wVXE3Q1VLWWVleklqMF8zeC1GREV1WDBzWEQ3WldCWDlacmwzTzE0QXhpN1NfY1pPU2JYal9STlMzWGphUGdwcm9mSHFzNDZxZnhodXNxUjYtcXBhZVpBY2Fhc0h4WTdUV0lmR1h1MmhIc3BuTVI3bHBpQXduaFhjYWI2WWlWaXBaX1IzdGxLWHlmUFNnMnhuQVFJTlo4SUl4dkdpb1hLcTRqUUpMcGFYU3FWbkV2aUtJX0ttMmh3UlNUc0NJS1FPZnVrNEEzMExqdnFFOUNua2F6ZjVUS1dvcHBxZll5TF9PNjMxd3hrTW9BbUNjTnhabFdvVUxfZTJqVkc4U21kSGo0bGFwRjVzMTdMdjc4YTFONEtNbW1YY1ZnMXVFTnNJRHo5WkNsREwtaGJ0c1FUWE01cVJJRFN1MzNvUEdMMkhnYU1yRDZyUy02a2c2c1NPaGtXSVJ6WWhSUnItNG5WT2prU0NyMHFNU2RfNFB4ZmVyeG10Z3pXanozbk5oSEwwTnZVdEFwMEdZcFJMYjAtOVdObDd6S1dOZHAxOGh0UFhNUU5FTDJnclBwVVdBLXpEYTNQbTdXaGdPck9xZHRpMTUtWW93a0hqa052VHY1UW9Qbkc2alNaekVVM3VXRmJZOEl0LUlxMW1pc1N3SlR6d2xpdjc4ZXctUXZDT1dPb2F6Uy1lZmVoTm5VemlkZ0ZhWk5DMG4zNHc4cFVHTjlvTTlvREpQODM5OUNtRmlDUkZfdmprd1hNZjNob1dtVUhnWXdiY2w5VkxYT2tiV0FBV0twQW1MbGlOOXR4UndIRUJxN0J4R1RVQmdObFhvUDlaeFl6RWJHcUtFRl8tS1hOWWhwUk5VN00wc2Q3V1NWeG9pOThPemdaNmhjdXJ2ZktTS25QY1RIVC14SE96TnVRbnNiZ0VaWEQtcmF1VGFvdlhzS1ZzSVhlZ0hDWExqblk1QnIxUEtHR2pva3NCQmk4UHlrekxxbmlyTE5VMUF5UDc3Z0NlZDhER1o3UFZWVE1jcUJYT2lRTXZNV29nVmxlY0ZzRVZibzF4a0EtZVAwSzFKb3ZqZmlGWE5OLUd5TmFSXzlMQU1SMkVLMVVPbllRQTJIbW1jQnJWNEE1MFF4eVBfbDF1OFRwLWk5TkRkSmgtanZZREl5TUthNTZ3Q2RESEN1WUV4ZUoyOU9FbFNrSTRaNmtTay1TYlVVSFlQNVFfaUNKWWxtZC03Wlh3YVoxTk5oSC01QkxrWGdlalY1cEZVQmpXb0N6b0UxSGluU0NHRTVrMl82U29ZUFQ3eVJDcXJuWEFiYXVuVXJ6aFpPcmV4WXE3bWNXTjgzRjNEX1FQYlFmVHpIdFN5VUNRY0tBOHpZZWYtZHVwalpSc0RLeXplV2N5ekZycEUzVGJYSWhZdUhzbVlZcG9VZXQ1NVJpVlNsR3ZLRV9DcWVtV0l6ZS1yMWMzTWZ3RF9lbGVlZnFhay1XcnM0eEhTOENCbUs2bF9TQUdQYlRUT0pFTnJDR2ZBcFF2RE9oajZnV0JtUVAzSzl3S3FqNEJGVXRBc2tWVU9na0JmTFo4Q3E5bG5oeUxVdmd3ZmNqQnhzSV9rU2JtTEZSeVhaNDJTWFBGNlJMM0VDSlRvRmtWM1pkWjN3emVkSEtFbmx3aHBoZVl2UHNrTGFOdXBoVUIxei1ubWV6dWdETFdMM2c5YV9hYjlOalk5a1ZQbThoeDVXTFk1WE16bEdtMGFScGdHSnRkUFJSVGVzd3FSdTNHUlg4YUZtdVRPbV9lT2EzSHRxSmNJV0VReW1tUEx1UU83M1g1RnFzNzhFU0lEd3ZrNDQweXVwNHljOVM4VEhRbE4xVERPaVg3allUYXBmZVMyS1J3Q0lCXzN3b1J1ZFZjNXlvSEdrcDQ1bFJsa0tORGxXTEktU0wxalBrNS1XUUpqbk9ORjlycnp1U3hadmg5bTd0SWxvUERoX0Mtd1ZBMlU1NndLVHhBcFZ4Q0MzckJKclYwTDRORExvd3hGVjgyMk1YanhNZWo5UmRhX09PcWZtcklybEd4UzdZcXJOY3E4WWhPSmFQb2p2NTlQX1B6Zi1fdVFJdFVtajhMVVlOLURCTVNBeXdsRkV6ZHNCZ29qVU1VbTFVSkd0RmhZU3BqVjFJQXZfcmxoeUV2ZXQ3UjZ0bDl2WUFzLWRUVWdyOEZTVTRvRU01VmZQODJ1dmhsUUx0Y0c3VHVSSEJCZTdFTjhYSlU1d2I4UWk3ODJWSHhra0dqajFzQ21pMlhySUY4TzlNMHp0Wk1qLTlfYzV4V0ZGYS1acGZHb1B2Mm1ZVl9DYWVQejJGaFVOU1gxZzA0RFVWVThIbmpnLVUwNktBR0RmTUJLQ1lURmhLcnRjTy1OZjdHY2lSUGJ3UFBCU1MyM1NHMWF4UjdMNUpiVWZzOXlrNnVMNkZLbzJWVmtXOGhiX1kwNGxTZWNTbUl5TWhNZDJ5MUJEUXBOSU84MlIxc1BoRlhXMGVZMFF3OXB6Z2ltSUs0cUtieWNkS1VlOElQeF8ySzUya0VsNDJiQWhqWWVialFaNmF3OERDRzlZbnlkQVA5ZFRPMFhQeFBIQjM3c2I3ZHJUQWlXSUlEUlZRU291am1rX2lFN3lJZEtWTGpaY2hpeW9NVmVJcDZWbjJJRE9hclZaRTlNVFd6aGxDSDlsYV9zb0Z4c2x3bG1Rdl9acHZlck9JQ0NjajFISE9uZWFpUlNLY0NMWk5tLTNhdDRXU0xYcmVjQ2R6aDEzbVh6N1VVWlh6aGM0aGZpRjl0RVhNck9OV1kySzZ3OGZyY2RsY2kzd2gxOXR1bDljdXI0SVRuX3owcHJkcksydVNhdjFGVzlBNVQ5MWpIWVVEc3pQRGJnM1RyMnd3MnVac19mdV9mbDVaZUJ5SW91WUdvZFJpUzhRSFJTbWVYYlVHMVY4NHU5SjRwOUJ4ZHlBQlBmU1FXUlRGa1g1bTVrTVVhRWI2QnRmdDVBbkRkWU5DbmhpMmYySmNTTVg0Y3l2dTQ3UFA3ajVDT21CWlBVSmpuLUZMMURFVURPLXFSU3loUlNjd2hNSWtWTFB4VExPRmtXOVNLeWhSd3NqbTFFRUp5bDNBRmZZT0tpNFlnZ0ZEcXE3dU1sbXY5amFuSjhDRzFaRENfSDV4dUUwTDJ5bTFPSUpVZVlrLUNjREZ2MjF2YTdFVnZjdVk3dHI1aGlvSDBIcThGV2N6UU9qZ3Z6cFlRRExIVFh6QVozZDdGZzZQTmVWNy1acUdsZEhPaHVoeWhsajNMaGRoQTBkWWIzanA4VVVGZDNrNDZ0NUxnQ0c2MTJRVWRoOFBGSjVSbjY5WkNYR2ZmZW5pQk9JSVB1S29OSGppUm93TzE1YXVlZnRsanBVaE8tb3VEb3hDVXViSks3RkpUS25maWJvelNuVVQzcVZnVDRGZVRLSzY1M1Jwemw3ejlVQnotX3o4XzRDZVBzV3VFT0hFOUM4Y29uM1dTM0QyRlRSeUd4WjRRREJ0UUFmT2kzcHJMaW5PM2J6NndqY0Q0RlBfeC1uQ2JTYWZ6aGhINC04VW5UekFtYWRuZEpUYjlwTUkyZnZiM3dudHdPaHE2ZWd0cVJjYW9TQmxFOU1KT3UwQlhvdnAzY2hRazZ6bUdVWEhPWE5QY2FscVBPMXNYZHBMSWxVT2xaOE9tcnV1bHZVX3RuSlBlaVFhOERsZUczSWZRY1RtT1p0dTFLMnctSDZlVEt4WGtXc0hQbC1FSkVIcU1Tc2xtMHhZYnk1a0lxQVVGa2dYeGVzSFRqQ05iNG9HU3kyamdNX1A3cklobTlLNnRuWWNxMkpONW40Slh0Skl6b19EdUtCUDVtVHVWTmEtX1VKSVBOS0E0SGRHS2dPYUxyZUZFamJWLUR6VHBzaldWcTBKSHVMdG9mTDZCV3Eyay1UZm1ickRjYk1jNjlyaEg1djRhSnVuZUM2YTh2RVZqQTNvOXpxT3JZUjhNalFVc2gwXy1JdXh0T2F3eGhQTG9kUHhqVVVxcEV0b2xLYVVsci05eEY4cmdOY1R1Rlc0a1QzM3p0STFlMHVCZXc3UFZYVzNvS1NpS1RVZk44M0tjYjl1aURnNkdsQzJSTnBYTTRnMmNmV0kySENZQlhQUEVMQlUyUS04MDhFS2JYU3FBaWtsSmR1T0ZPWDhxUnhPMmNzRm1GNXZYWFZHTUdHVjhYdjlqWVVfV00yTl9BcVhqcTdjZG1UNE5qWkNoM3ozN1YyV2p6Yi1CUkl6c3l0dVF2Vy1UaXFZcWlBZ0RBY0VpSTdwRmU4bl9YZTRHbHBuRDJlNG9nLVAtSnp1NkRIQ3JHelVLMWVnTHlTRlNiaGVldVp6djVEcGJZbGxOUU1vdldFZk1ZYnRmVG5sbjJJRm5La3pEb0N2NEEtbmU3R21iYlhJU1R3X1hmTjNMVy1lMmhpbTU1RFBhMFRJYkZMcG1mNENXQVlPQnVmUHIwSHdGOG1IZU9BZ2dmblBjZ0dfTGlOUW54LW9rb0M4N0tGVTlGV21FVWtzNUdPUmhFZzhCQk5SWE9QR1I2Y19IVkh6Z21Zd2JIUV9mZURjODA1M0VCMkVpYlVMZDZyUTNxX0I4SFk0akh6VnpEdlhWcXI2UUI5VHFwNFYwX2plZ2FiNURxYlA0T1pSdFVJeDJtdVppLV9wRTRrbmQ1TEdkSFdoMGpkZmtGQWo2RUxucmg5MzJiaEVOazB3MnQtbk92Q2ZqM1FCNGJwUlQwYmJuMGhDbFpFZzgwZHZwZFpsY01pQlhhWXB0a041MzlvUWE1MnZac0gyOFVWSFplaGp4WEl5SnYydWlUMnZ6S0VjUmlhSmhwTlNjaC1RSW5ZWjNCbmNITHA0cFJBOWVtNjRTS0lmY0N6ZnNDOUJPZXo3TGNJZXo1U05Zd2NBUVlQQU1jbFA1eDEyYmhJZ1BRcUk2YnRmV19hQkYzcHNZUmhLTjE4OXBjMkFsYWQtdElnSHRxb0EtbUxwR18tN2NOMm9ZVFVKeE1lUVR1dmtzM2hydkpXbmxGbjhla0J3RXYxUjk1RE92bWZ6MEsyM0dIa24wczJzYU1LbE1KZHdxZGxzWU42NThkOVJJNmdBRnY1bjVBcGlzS2VETjJ0SWxydkpwSjRBQTM1d0M4YTFtUUFrZXhNejdjTmI1WldVM1B0TXdyLTdGZ0RqUFdXYUVkTXNGQlF2Um5SbHQ5OHA1LVRSa3FVMzVZMFh3NXUxc3Z5SVpwWXN0SExxb1QwNmZEaHVlQWt1cHMzU2dDWlM5V2JkVUJjMnprX0ZwWWVrNHJZd3lHVVdIbDZmVEU3S1M3Y1J4eUFfa0xEenhMS1dqSFJ1R1FZZjFvYzgxYTR3U3hDRlUxY093LUpjalFOd2hRU0diOHBZY2VHTHpyN3owMkJyZVIzYzdBX0ZqSXFMbG5jcEtkU3NTM2VlRXF1M0MwMGFsUElPREVJc2pHb3IxeDlKdkU5bzRza3NBYVN6cm1tVkNHZVFVa213NHdhNkdDZEFqZU1PQ2lhQWFfY3otRGxZWFpuSDZhZ0ZfdEM5RkY2U2F4M1ZISGhBMGxDSXR2emlwWGgwQjVMNWYwNGpGTjdoOXJROW1nMi1Xc3h3dHpMZUpsR0trRFFCS0U5SkNjZ3lnY1hyTjVrazNiLVdGVlhkMi1GZ0l1T2V6X0dGZnlDdE5kZmt5S1FhSnVBMzJlbmFpVU16aHQxNDlBVld1eWRxSmFGQnYtYTBHWThTY0pYaGtleU9oN3pfZTN3SVdGQWNRUkh0WE5rZWFJUGU4Y2FjanEzT3hKeEdnZ00td0h0NlZNNkc0MnFidDBhb0MwOWktVzRyMll3bFFqMzdLX1pxc0N6T3lNTG5fRHZ5X2NHTDdQbUN5Z2pLUEo2bGJTUUpweG4zQjFVYW1qczhOR1dsZXJ4WllKZndqcExLSWczRm56SjZRZldnZERCVENIM1ZLZUtTSk9HNDktV0VRdktjdnBRVTRkc0hUS1dKYk1wVEhvaHVEMTgwQVJNX2t1WnFyN2FaaDNSQzh6SjdhODRKNEFObzczck95U2pCaUpIaEU1US15OTcwdEdmdFBPc2NYT0tmYkVwMGJrTXJ4ZVR0bjhCYmxjc05FOVJzYzNtVWRueFVBMmZKc2tfeWNxSkl4TzgwNl9BU3JMWEFzTFl3Ukh3cGhfVmc0cS1iWVNBNlA3b2x3QVlWUUdIYkN1djNpeTUxbmR4RGdibmtTRnF0bFJwNzJFdkcwTTZIeUxjLTVmZ3pXQlJnQ1JvY3NlS0NUcHY4UktGNWE2YU1VbUdsdFVRdkVEeEFhUzJCeEt5enN4SC1xM3pDc0JUWnFaM3dWNFg0ZEczTjZyOFBNWmdWZzhIZUlCanJHdnVhZVVVb3JobmF6SWxPcTV1ZFVQTFFTZlExVS1pMFVxYWxxeUs3VTM5Rjdoa0xsZllqM2I5ODNfMFZydXFCWnZOU2FjeUJGeGlvMDBoOVBQVXEwdmxCb2FralVBN0Y2RTBIZ1E4QUY0eUtDdTJWTmJTa1hPNVFBTGtHUGhKcDdRNEl5c1FULVJ6czlrSDdPamV6WWhFc3hBeFMyNF90RWVuUFVoWkRVSWZsbWxXenRWcGRrdFV6VGVrdFctN0ozU2ZVamdKNFlyaUthRmZJeDhJdXZaem1oVnJ4dGpUWnNYV3BCZFlVb3BMb1NNNTZaQTBiM2VQVEM4MS1PZVF4V3duYVhEVFEyNF85UzVsRXVtdjVZQnJqZHZPLUxkbVM3OEhCX3JIVmFTcFdlb2Zybm15RnoyQks4NW9WQkF6a2tONnY4U2NIcDgwck5rTjhVUWZYMXBmcFVCYnk5TlgtMzFLOTM3SFBIQkFqWXhyTmFOemxzNXVQNzlheHI2MHdoWVBlZ1AxTE9SaENvcEdwTG0tUW9FbHZoejZZN3BJUF9ocVI1NzlzaWRHSXJuVm1MaG1LZUVPbGlOV1dfMi1QY2loZEdqSWhSbEtjZ2NwYl9MVVZKSFFUbk91OWZHQmt5cWxGVXBhbmJxeWJIbTUyWldKS3JaNndxT3NmTl9iLTFIUDVGVGtBWXUtUHJ5SEN6VjZCS0xGcGtmMURCOUQ0UzRVWnA3c1l0Ry1iRG9meDNxVVFVRl81NVV3Qk03VmRackZUeDYtZ182a1V1UFNIX2NsbDFNRUIxOFlyVndxeDAxZjBNNWRJb1pIbDY2X3JMdXpVM25GbmZ0U1g4X3JDdmJWdmNJNHl6TVdiVXdfNE5LcE41dTBRdndMRGJiN1l5Tkg1bmxyNWVjRzJDWHUtRXpzQ05VNUtjTGpXQ0R2VmFXU1lkNDAzMWFvaERBdzJQME9JSnRlSnRhX3JjekExNFVEZ051RDJzRGJlcVQ0WU13MmYtMVQ2SlhIeXhfUzFiTkpUZElDemEzeG1lTXZfMEktU0JPSTFsRHRoU1h2ZjBDaWZmQVRsWlNmZUIxVHd5ZWk3ZXVudjdIdHF1NzRMV0RMR1V3MlBHUnJ1cE1sbVBTV1YzOVNDZF9jcjQ4V1FTQnVxNWljeUktcjVZbENPUHFhenZfd2NmU0pHU3hGc0x0WVRhMk5LUzFCM1E3OUo3Y3RoR3poNVV5R3FIdzJLaXh3OVpTQ0xwdS1rWHVmMDdHTjZLQkxNZzM0NFpadUhzblI3OU1pNVQ0TFViQkRFM1daRXQ0T1ZCUW9TVUFPNUl0SkUzemE3RG5vZ28yUjg5d011M0h6MTRSbU55eHR1eXJrNnlJN0hjeHdpVUJhTm5HaDN4THdILXhpYkdOTDRMVGl2MmlHZmFFTWEyczV2bjRqbWthYWpEV3F4Q09TQVBxY2lGQi1MbTRxbFpUWVBxWWJ6cC13VnFLWFVxODUzN0ROZU10OEUxWjhhWXhxX2ZFVkhtRUVPWXQ0dlV0Tnc1S0FRMnc3VWJPc1RYZFRId3JkbERnbktWaVJ2XzhzemU2bFFKVmNhcWtxcU5RNXZab3VOeTlnV1BxN1lja2liRGczaE85azFSc1pHWjN1YkdISzFaODd6enV3czBESWtvT3ZZU0RZd2kzWkFEbzRLUml3U0gtVTNoVi1YWWUzTjNOQjVuTWhZR25RamRURjNnN0tIYV85UmtRcEZ6S3RNTmxDUkJZWm43Z0FXZm10UjYzZ3p0eU5YWE53aG11ZE9DSXRWVENtWl9paGpMZFFBS3B3Zkp1VWhhLTdPa2hCRTAyZjdmMV9zODMya1N5WmhNOXBZZVRWeUM1S2cxOXNXUzRUbEdNZHhDa0s0U2hkYjFVeGxhOHM4UWtqMlk2QUhNSXBvaWZzend2dXFuZnk0WGJyZ3I5eDVEdWF0b3dKZmI1MGZNODZlU0FRVmlWUGdENkRPTjh3b080RjZMa3JfU2FaYTR0OGJvRTlac212eXppcjdSZE54cXZJU1g0WXJGdGtRNmZ4eUdaQnpXWUNaMnVtY0s4WUV0QVVOUVRpai1mTnI3eV94LTQ3UjRwNlVXYS1PemQxYUhETlFLR2JTSnpRUEZ0SzlCU3JLZlJPRTZrV21KTkxtLTVKN0NOWE80N3QzY1JQLUxUSXh4d0puVTA5Q0Qyc0dsRV83dFJXUFhNdVhYQkI5ZWk0WVhBMTBWNjBlbFViNlkteUN5VW13M05ONkE0Z1E3aFl2WDM5OHowcXJpeHY0SjFkLVRNM1RCYV8xdjU1c3g4ZmZMbUszWmNZdXBCT0xVSzZBck8wRzJhc2RSZFBjZFd3ckdBdk10ZllFc2ZWbkpIS1RHN3RnUTRfNnl6anJrZFNONnc5Wm8xdkxMQ1ZSS1FjOVhGZUhDVXBGQmN1ZnVGLVdWYkRxNjJvdm5LYk9wWmx6anh1Ny11UC0wV2dIWEM2NjU4ckVhTlJrTmNsWGVKLS1CQmxENGQ3OXVQV1RVcFZ4OU1kN2I0YTdRMnA2d1N4MlAwRjRvTFM2bjFFNzMwdFZOMGNLTFZFdlFNZEwzRzlpZ0lNN2xMMndqUjRGUXdaME1zYWMySGp6bG9HUnJqc1o0S3BYRk1UNm5HSU1vUzVDU291X3RLWXRJUjBQNThPOUZSVmZjMDdkOXNEZmdBVFNXNTZOVHM3dkwtN0p2SnlzTjh1UXVPX1BSX1c3N0hlV2VITFVtbTJlWWtnbDkxYUhGZWp0bTk0UHFoakpJRVpvbXhvZ0NlaWJGaXpQeW5yVjNFZGhaWm40VE9oMk9qaEU0R290aEU0OHhUT1Z4S1o5NTVEa2VuNFFDLU5HYkk3cjZpQU1YWVo4YVY4S3JUaUp4NFlPa3B3VWxvQ2VnZTZ3MzhUYTY2c3FTYThXMW1Nb2ZIU0ZBZGpTZ2JKVmpjS04yWE11OVk1T1gxSUp0SnBiUWM4ZUxYRHpVV2hnMUdGZ2pSQjRUWXpMR2ljclFpVFJxX3RGTlZ2NTJqQTVJV2xRQ04zd2JGZmtfTGpIZjFzTGJTUGZ0eFN5c01oWG9KaS12dnlrd1pqdmoxeXAzSU91LXpJVk42YWVreWNQbjJ2dE40SDliY3E1bjFWdVMtRHFpMXBsZzZjV3ppemFDWjRFVmRjbXZ2Y3FEQWExVThkS0Jib3VXaVZ1eHpGQmlya1ROdmpQelpxcVpaVi1aSTdkYlJYMlozNXowVEVjZlhWdGdnTV9GWnBwT1pRY2p4Z2psV3JlZG9jNk8wVVdwcDJsVm5wOGhpWlktcE51WmUyZnR0dFBsTDUwNldXY1lxdXNwcGluejhnM3I3eVBkTEx1OHVaREFtV0dtcDJyRkxGTGFKN3I5SlQ3UUZXSnl1MzVVNnlSRlhWTFl4SWRLUzBrU0RIaUo5VlJLSG1PM0ZGQjkzMkdmbmtWdlZMNm5DZlNjcmFsWmJ0ME80bG9zV0FteDlEdnVEenRHWDlKaFkyUFdRMG1WeTg3S0ZEZ0lfaWYtWDRFQVpGb2xwVDBkellKbjRfOW05Mk8xd2VtYnBBWUtRR05Ra1hLMjR5d3FPVTlySWwweU01UW9wUTlISzJLbm9KazNWU3pFOHZ2bGstNFRjTXBrUFJrVDhZNm4zVWhuRXA3T1ZDM1VwSGlrT2x6eFdhOTJTNlZmM3hRdEhHbnZpTDRIVjRIRzBWOUJtX0ZnTmxBYlhUenlFdWVnaWp0Vlp4d1lnSlV1ZzNUR2hmekYzUmZ6RGZGWm9tcW5WYWdwNHpLN0pEMU91dzNxblRSVEFoYm9saGNzU2Vtay1ubFQ1b3JTTHhNTWxCODZpbDlYNUY3dEFxR0laem5SSFYwYVJfNlVaV1dTV1c4b0UxNFBwYnFUc0M1R2JMMGZtaVZIbkEteXd3RlllQjJ5S3FudzNsalp1Sldsa1NSSnl2N01mS1NNSUpsekttZzhBbU5sRENuNV8zT3lWZ2pZRUNDRXFKZExhMUQzRUdRMDdQSlA2S3gtZEcxeG4yUEpaY284aGhPZXlYLXpJWloyMktGRm54WUVScnNlRDJIYVVJVkdBSURybTkySUN5eEJEMjE3d0pTOW9EdDQtSEx6ZUs2QmhRTTNteTRmWnMxN3IySHZpdVNBbjd5aklxTzUtMnEyQUh2NjV1SHlObVVwWTJjR0thVldTeGczNUIzUS15RXpoQ2VjLW5UdWpDcUFyam16ZkZKRzlIN2s4WXVsMUUtVWdGZTRqSDZXcEtkWHNmWDZuZHRvdE50a2Zma1FRNjdGUEFoNW1RNHN5WkI3N3NERlNrWS1aNXd3dUVrazVvUWRBNDdDYTJmcVJRbkxMblNuV2pGbVZQZ2lPd3AxTE81enpaQ3NZOC16Mmh6bjNaTnQ2cUR5RC1Eb1htcmZ5a18zRkFZWDhzNlRBREVlZHFKT2dXVnlaZk5LbzFlRzZOT0hMNFRjQk9DM3IxTmJiVFlMMTNLTS1MN2JES05LdDBUN1JmWF9wdzR2Wi1HVTRRUC1Ic2pPbVUyY0VxN3dOOVZKY09pVmFsOW5pLTNCY1oyV1hJV29tcWg5VmZuVFBZOW5GTTl6TzdzcXNFTHF4YW1DaEIyYlNZMkI0OG1PbTdFQjdES3NtQ0hjNVJLM29iTEItNXg0RUNiZWtOT185bW5UWURjZmFlVnZ2cFFIYzRmQ1dtNUcwNGcxbTd5eXRhMXhPZUhkdHlEb0VTRVJmekVZenNFemFlMHhwSU1VcG52alhiYzFOOU5TNTduZ2Jid2gzaWNzTjhxZEVwekdsWUN4cTh4QkNzcjU2VWZwbWxZOVhMclUxcllTcTlOZlI4Z1lfWHhKY3VGV2JhczQ5OUUzWkdFVFNlMkM0VU9wTU9QNVBmT2RGZjl2bHRsMmVlRW42dmRKek43S0F4N1hab2VGWjN6cmJza0dwVDVCNmxPc3YyVXZMck5oN3JWMU5WWmxBMTd0RGJ6N211MWF1TXA3YnZCREpYZFJvMU1UeDItdXRPYWNXeWFyM29uYjZOSDlpVDlEZU5DdEdaMTJFeFo5UzAtZm9iM1hsQ1ltRDFQQTBQOWVFYy14dkVxYXBxYVFjdzk1RUt2NHkxVnNNQ21wdmo3bHA5aENTZWhiOG1GWVZCb0F2M1RTMllaRGJrYUdpNnNtd3NVMGxZd21vRDN0Vm55bjRPLTNBRW1CM1VWZHJ0RzUxX054a1JSMzJ4eXBOcnFlbFE5MjNiLWJDRzV0UmFGRm9QdU44al91anFtU2JlRnJCaUtLOWNYRDhPaG9CbzZyS05pNzlCZElMUDFha3NpX0FKU21kUzA3WVFNbDZzMWZCS2VNSkhVR0RwY2lFbEVpS2lIODZuMDE5MFZiWjNXV2paV1R3Ull0emxVZ212TXFyemxKeGpZTUtBVGpSY1ZNdDRuTWVyNUNab2s4M1JvRGlwaWhZTWt6dXFDcXFCZWVoVlR1Q19kWTd2Yk1RUWVQSlBHa0NQRV9ta2F5am1SdG9oc3Z0R0VIRzdxa2Z6VFh0cTFocVN6NlctU0pKWU1NQTRvQTlOSnc2bmdjblNNUXA1dUlPT1p2TnhUdmhHVGFQbE43VEpma3BFTzM1aHhXR3RCb2Y1T1VFSHh5X0NWWG15UmRSTWtfWnhPblByMVN1VUlVVnhSUFlTR2d5d2UzVjZ2YXhaTUhtWk1XdGpsZ09lVUprQ1ZoVGpLMlhDS2FkLXVDb1czTXJOZ2VPNWVuZkVLYmxxZnBMN1hlQWs1UlpaX05lVVpyUnlvNkNPdlVKcHZmMzcxX1QtYkZHOW1oQmpQdllxaVc0UGFfdFFhT2ktbGxrSGQydy1yeEZtbXhfZ19XMllCTlBqSGtpN2tXUm5aa1c4NG9YNk81SUFWSGFhZTl2a3h5N1pBb0dvXzE4cVFPM21rS3ZQaFpzRm1Pd0hPbFBISHY3bEw5VmxCby1meGdzNWg4ZzM3amhrUWxTYjNkN2pPdzI5ZmdKWWRPUWNhR3lzdURuMG1JU3RlbmtvOTY3WUtlcm11a0tWVURlOS1sMHZ6YUo4bDBhbU9XeURQZnROMTJ4SjU2TjVVRHoxbWJzNGs1V0ozU0xkVEdxQlI1OW10cUZReTJSQlBWa3NWUjVEQWZsOFBKSThCd0VybGNmNjEzU1R1SkZhRnlFWUNTRTBZMFlsUVlkYUFobVFmNkI0Z2kzZ1VUOFJjR0N0aU1LMjZGZHVZb0tzbVJDVWxPYnRLQkJPbV94aTdOMDZuMUNxdkU1UFZDUjVwMEwyMC1wVkUyT1MwY3pGN1ZuTTNrMHhhUEdKTEZLS0QwbU81VktobG42UzRyUGMzQl9ZQ2Z5eXdIM0FSR2NJLU9BcnpJek9uYmZodTZaS0dsT1NVOVBmd1h3SWRaTnRPeGt2VTJXdDlNbFhQODVESWZXZzBJQm51bVRxUm1vTUUxbXlseUxJMmtzNnR6RjlzUzVyTXYwcWU1eDNPeEhra2IzN0dMVmVEeUlOQlhaWVZBN19yZUFlV05VdXhQdV9BMk42dWpyOW5ZTjlkQUM0OWQwQnRiZkVyc3FrTkxvNG4zaXhFeGVSZlFTY1dmZzIySlQyUzRmQmVNbEoyR0JRNHBRVFliRFZueVBhTkJiZ2NkYlkxblFIMUdKa1hhZHl0ZlBuN1I0UXlMak5LbVAxbTZKX0N5SHAwNzlqcGdPTk1ZZUxsUEFzc1loOFhzcTlXZ1RuRm5iVHA2UnBRQ284SU1zczI4dHM1blgyZmUyM1lEOUJJdS15VmF2TzRxTWVRbFlydHhqYzgyc2p1TERNR2poc3dOZkRxTHh6WGthZ2l3aXU5MUVfZk11V01PUEpzVWcxbnRQNjZhdlJySDN1cERsY2FRQm5WMDFXRG9QVmFHdjZRYkxONDZydUdpU3M3c042eDFBWGc5OXpEUGRmU1FHNDllWnFKamQtX0x0TW83N0Ryb2REYTJxOGpiZUttRWtjQllRX0JfbmMxQVlRZDFMQU5nNjZMUDlyRDFaVzNlTmZCOTZldTVjTERLSFF5bTEwNzlFOW03SDhtQTdCSWRTZXI2aE43dkppdzF2WW5mQXJIZFlVZWR1TEk3UkoxQVFxemxjdW5GUFAwVG5yMlBObHVKM2laT2xCNHNSYnJrTy1RTkY0NmROT1lueFpyeTdUU3BjQXgxam8xXy10SXJiRkNybDZaZ2tudGQxTzZYN0hYelJCcWI1LVRHb2tyRHNMVjZBdE0tTllxVTVPcll5Uk5Ma1NQT1hRUjNmVXhTdFV3czJLSE5zbGtsVk9kb2NLOElueWVUZzRNNl9leTZrOU1pQ1hIZEFuc0hUYXgxVlRGUHh3LXZ3SXFQZTJuZWl1aUk2VjcwN1RaQ0JzWDFsYURkM3VzcXV1VDZmNzZxaHRubURDNGtqbTdFUzRwOE9yQW4wSmR6V0laMlNSMlZKeTIzLV8wWnZJUUpJY1d0NkhycFliaFZ3MW56eTJ0X2RrTjJ1MmY3WWNtd200Q0JsOUtXVjg1VnREb0pqb3dLbnRmY2Ffb2xLc25rZGM4WkhwUDBfaW1mU1FXTk5fMUZPNF91d0x6TU5vQURkSXNuSGYyek9CR2M4VWZ3czdOQ2doSHJXbWlRSlh2SnBjazAxUW5OODFaYURZY2I4N040NXdCbmZIcFJET1RDUXBNdlVySGFCakNtYUJlZlZGMUJMM2lWWGJRd2pyUVVOcXk3RXNMQnVtTDFDMVNfSjU2ZTdma2dPWE5pZExOTV9ibGpNS2kwWV9WaDdNYTZ2SmxXc2tnZkstV0djdmVyQzlmemhKZzBON29WSmFYMnJQRllFVDlDVmZaRFlfUWY4a2xyUGhRcXhEaG5HZjJhUG5wbEVxdUs2WUJVQVAzR0FibU9ORGNOQlRETWZqcHppRG40WlMzRmFQODJnVkdScXB2RmcyTHhSTF93LUFYVnBlNF9VZjkwSHVJTUVvYzREVVh6NXZObS1naks1VHVxT2hZMGcxMS1mTVZBYzlNbjg5Nm0yU1M1dXJSdy1Zb1lUU1FIUFQtel9WS1U4ajJHSEpUMWxzVURtYzNaR0hRSkNUa1NiZlBIQTRJb0hIZkFPQ2RPdzNpZDhfZ2s4Rko4X19nOFNiV2hkY0lsanVwOVA3eGtrR1prMzdObEN6SXB2bGxEVjR0UFVUd19FVEMxbmo3UXhILXdwNWhUTGhiZC1tYnJKQzRraWtDNGJzYlhvblV6aVVLTnFMbFFzQnBuVklkbXE2QVY3eC1SZmt1WWdUVkJ4bnBOUF9kNmlBMmNtQU9hQjg1c24xUG01QUEtTEJ2TjJXWmtTdXdsWDFLY0FCMTdESjdvZGNIaFpyVEszczRjOVEwQTJXdnJLOEttTllGMW1ZVEI3alJyWDdHZTROWk5lZWpUS2d2N1NtX2NCLVdDV1FWcFRZaVQwNEN1enAwU3NvOGh2UnZmTFk3X1AtcjhYd2lMRWdtNEMxVDExZmltdjJGVGpXV0hnTkxfUTlPZm92cDA2cjhKZHdjV3J5Zy1obzJlV2VnYlpWNk5raGJQYVBkMEcwTlFHa2VKeG5WOUdicnhzUE8tRHpyYndsOHQ4bTVoVGNTWWRReUw3Yk8wYzJkbWp1TDRjSTRZT3VtSS1EcVFDT2wyMFVxcDAyVms2Vl9QTzVLdzRBcnJDTmphbjVtTENMVG5fZDgycmVrU1UyRVZNX0RwQW1ZTEo4bmFGTGVJY2M0d2xXemgzWmNoVVVVNVAwaEZILXdiMUFHdk95ZldWakdidUZrelZoQmhjSFpZNkhsX1JrNXBVUnRwRVh5c3dqUlUxVjduSFB3UE8xVVRGa0VlakhRTTcyMjIwS2tUVFA5em83UGtES2xiUnpHTzAzdHRpdjVNRURqM3kxbjdxZ0pTeWlVanpicV91X2F5YXdPM2MtM2VlaTVIb1hQam1pSTM3akkxTnR6eTdDMFFzeERST2NSMEUwNlE3RkpQTnd4Q1Awd2RIQTdXVjF2Wm9GMnZvTUxhS1NoTHJ3OGUxb2xKaFFmNldqSWpYWGRXT0ItY0hBR29OQU05X0RQTXdHVjI1SUh4TmR2NDh4WGd3TWZNcjFMbW5HOTVXM0RtdHg1ZF9RZmF6aW1Dczh6eDUtUVdlWHd1NmxKQmFKOXZKdzJLY0hGcktyN3lQLWM2RVBnZzc4M1BsOF9XcFpMeHhyc1Bpc2pZdzFoa1gtRXFSZUN3X3VvbzEzaXZJWFhPLU95M0RVdnJ2cjJiRkF2UjdyVFpZdF9wU3BWNnhyRUVNbWNkUmxXWEFTMGNha2NTaV9kVXZOdC1SUDRFSm9KR1pJR2FVZ2pwMUJERE1QV2I0OWhrNkdVSjdya0hjYVVIUkRqVGxvdkx1MkpIV2xwU1dJZ0QzOWMyUUVhTDAxTVVURmhiZ0JHdkNfMmRPMjBPQWxvbkZQaHRrZGw4Q3FmcjdOaVpNTE9YbXVpUi0yQWR3dWJPNUNSY0VZUjNmdEF4NVRET0h1VnVua2toNmxPOENveFhGQXdwcnJ5UDB2X29DVkJlX0MtSXJRdU5XVnZOR0ZSYXpfMkVjNWhibTFGNkg0RXAtN2FvYlAzUnZwTExPQ2MwSUs0enFXbjhLY3ZTclVoUWk5RVBzR3U4NkVaN09KVWZ3cUU1RHIwVHU1LWdfREx2bjl3V2U0cTA2UU1DVnN2N3plYU9uSjdTWlcwNUNUOEY4T0JmV1gwM0xrTmlILVhIWjZlaFpTaHBJMUU5bTZVbk93Y3lTMk1tLUsxU1NGTGpBNVViZHdkMld3cmE1THgwdlBRNHdnZ0FZM044bXEyc0FnOHIwUzhuX0E2elFwd3JrYXlETFdHUnNNWkFBbkhSU1h4aUx2cWRFNlpZTWFOMHVlUkk5UmFibTZqNjBGaEp4VTZZenpxN1FEU1pHZmJLeEpoZWVYYXpwYVJhcDVMQ0pVWGJhVUktR0VlSGVxa0RvZFpEVkoxTVJvZWxOaExwa1lUbktOSWxDbXdURUplY09rREpSeF9Ra3FLMFRtV0Z1RmlmQzlqT0w3ZjU4UTBGdzZZazlCdVRDYUQwR0lTYkVRaUZQOVRoVEFYbWdqOUtRZEUyX0R6bFFQZTJrZ1RqLUpucVBVNGRFV2J5dGE2S1pCSWQwUTE1QkJRUFNybXctd2E2UlczMllEdW5jbmUzNWMwdFUzX19PdERSSWZnUVFTbkZwN29IS0I2aXIyX1A5N09ENjdVamd2Z0pUMk1PT2owc3ZsSVdiZHhQeWJOLXhlSzVTcERHM1padjVSdkhMeUQwZ0pqZXlzbEdCbjhsYmMwTVFVSlZFeUFRMkwxakFQdWZ2OC1NMWFsT3o0LUN1bjMtSldfczgtclhLa2dXTzVHVG9oOGdBcTlEZFg5dXdjNVV0Nk1MbTE4d3BqMUhDa1JDSEZqdXd2eW5Vb0c0WVR0bUFtR2lfTHBwQmlpTDh2UURlU3M2SEdGYUVGUGhVallpZEFlTGpLUXFPNUxFb0RLaVNZWFRvZFk4c2xIQjZzaGhQX3NQTVdCMFpnbllqTjVoMkIySnlqamdjQjVMY3laYXJ6YWphYVcxTFVlTzhqRjBob1h5em10R0xKMVc3dkNlbnFIVVNaSmcxNzJNdk9CV0hDdXNkeG1UQ3o0Ykp4ZHQ0RHdBMmpGb21pY0dUTmFoemdFd29PcDhXR0dDWFE3cnd2SDVHTDVZN29TYUp6RFVfMkVfOG1kTzI2cXFOMG9OaWhuVHJ3R19hWGttWUNuM2lwYkdqSXJfYm1zT3pCdFgydEdkbzJ2RWg4VFRHTkJJSkNuNWZuRGFPcWZHSi10MXBwWVhqYk1tS1hGM0NYRmprLTZsWmkzRXVQeFhsM2c1dHFOT2s5VHBJQVpjZTN6MzB0LVpuX0t0QTh3TjJVR1puZjhsNU5FZk9MNFhEbE1QMzNsVXI0MjBZOHV1OUNycXlTdDRNVHgteGxNcUh1UWhiV2RleE5nMExGeWloNTVKN3dhck1ZYlY5dnRXTEVaanBWRldsSnNaRXRudm5FYmRKSzBzdVg4Q1QxY3JpaWt5bUNtY1RSejFQWTlvYTlSNWpsaU1hMWt3SDQ2VW43ekNBTk02R2Myal9rUUhGbHc5MTZPSThNQnh3VFdqUmxuOVdvUnVyVTlsaE5jYjBwYXczQkRubUdYVzdPQWE2MUY5Zmd1b3JXb3UxcEdaQkpRRGZDY20yc2NYLWJvM09oZHVuQ1ljZ2FobUptVlBWQlVyWjFwYTlKS2NIVlFUNUFKdlV1M3ZMaERBTFFGMlZzME1FRzVRZ1BRYjBaRkhZSHB1cVpTXy1kWG1Cb2ZaZ1JQZ0RPLTZmZ1l3MGlueURLcWxjVG9WSjBVeC0ycEo4UXkwYm56bEllOEJCdm84dFdMNlIyRkw3cVRCZ0VhRVFlbFhodVctSThCbkJlaXpMeTl3Q3JqVXlnb0Vndnh4MTFVamlLVEk5QjhUYWQtVTdNYlg4TzZocjBJZ0xOQjREZ1ZsVXV3YzJ3YXRHM0hsNmtzajdXSkJDbWVqSE8ycUFzSEhlNkd4V2NzSmhDN3RUdDVlMG1QS1JkZWtFOWk5VUdaWkVWZjQ0c2pmcWdpT0N6a0N5WXY5YXNmYlM2NnRqVmx1NWpURndxRFNkZC1rQnNHSnpwbTk1RU55d1NHTnFJVnRPVFBQdW9qdkZBOXB3Z0todkliWVlxVzVyZmFNSHFFaG1vdll1NV8wTHBYNGZmTExYa05sSWNqaGRFWUQxRnpTRDdfYXBjODlHZ3R2b0htY2Z4M2xWZTNKSHBpNUl2Z0xXUGx0Z0MzQ1FhNmtWODNBb2VGbXRZQXdOdC01TEZ5dWtobnZrQ1Ria29yMEp1U0hDWmsyOVRLSXRoUVdCbktWYmNPaTNuVzRWcHFLVmgybXp0UFJ6R1JXNHNiUm4zVTg0OVR5N0NIb0YwSkFEdzZtMG9adXVPZWhsTTNDb1huNVoxVDVZX2d3NUtNM1Z6OGFBQjQzU2FPVDBzNU91T0lTbnpEbG1VM1dzVEUwX1BZUmE0MjBySjZTd1QtUWQ3aTNnVzJBS3VyNDliTjlkTDN3Y29abkRpSzQxV3JmTjJQODRPbGxLQ2lwYkdPbjJudVRYMjdiTDIxWmVXMlJLd1dCbmNOemZyWWlQWXJSTVQ0aEZiYWtJWXpOU0V5ek15QVZTRWc3elh6aGhjZ3V4a01jbzBxSjIzNXBzb2pmR0M5bk9hT214dWR3YXlDN2xGYlF4Tl95VUdtQkZPcm81YlRwbndNU2hZZ01tNUdlT2dURGJCejJJS1otemRhUVF3R21aX2xSZmxuMUpjVUhsd0ZmOGxuVHB1cmJlY3NPVVBRbnV0UmRVTnZvdGRYU1F5ZXF1YmxSNjVQS1pYNnlGZ2xWZFdhMkVEdnN4MXdUbFZ6djZOTUhZRE1Ldm5CNnBVQXAyOWRKM1V0OXZRV0JvM0RHcmJlYURwU1FtZzFkb3d3NDVXdlpkdUw5MzBZX1NLWm5IRjAwNmdqcHdLSFRtTS1vRjhuWE92TnVJWDJaMGp5Zk1GSlVjTE94bzYyQWE5cEhMZTY5X2h5OEpqSnV0cGpEWDQ5ejR6S3VJd1M0RmIyT0JGd283amp2T2I0TU41UXUtblJxYzJSTDZHT0pQRzNjSkYtWkg0SzZQc0RSeVpENWczVkVGeDZ0ODdBQ2Z0d3dBcnplVXRYWVM3MFhEbjR2Q0FGVzZGMUtjNmN1blhDdzVOOXM1X1NrSU5TMHJIMXBLZkV6QTVUT2ZrQXBjNUdSMlhMYVBkNTBMMXVBM2JOLS1WWVo2ZVhpRlFQM1h5d2RHd2NpdVdHYUdmejhvYzJnR3pjVVFoSHluZGttS3dhQWh0amVENzlObmQ2TFdlT1k2N1NlaXRNZ3F2RVVPcTg4NXVpYV9idTlycUxOZ0dGUEtNclJSc094NlNJTXFwa203NzhhQ3BvZklJa21kOHgyOGRFS0Y1YUlURjNIbXRqWGs4U29lZ1g2V0RCaGlDSFpjbDRROEstcnhDUGRUR3BWQXU3aG40Vk1uTkM0OFFRNkVrdFg0Y0RPOEpCVmdhTlc1ZDc2WmpHQmtWZXR0X2Fka05hb0l2V2ZwS0FySkNSLTRKLXJ5ZEFyaHBzQlNXdWhjSndrWTVqYm03VWVzZWhYcFpVaHAzNWUyM1hMWF9ERG44SzV2Z0RobmhUbTBOUFdSWWV5dF9hUUJQMVNySlZIckFpWmhjNTQ5RlJ0dmZIV2lJZjA2U05wZE9FdkpXS3ozejhLMnhsLXR4ZElhQUhyY2RqeG1iR1RFN21FLXZSMHlkQzluaDBTTm1tV0JndkxqbEtyaks4d1N6ZV9iamd0US1iQlctNEpWd041NkxiTktweGxWbzdWSTF1MEJwUGJWZG95QUVYNWE1bXhScjF2V24xNTV3ZG56WE5mN3NpY2lIZXZMSXpCNEdfWi1qcTQyYVZsdGFpWC05bW1DM09SaHVfZVF6NkJPaGJjMTBJVGNnUXQyRGtDbDE0UWNKNms5dkFBa3pSV00wR0VGU1RKRTAzYzR0eFJIVndwQVoyWU01UndGYjRMUmNCcVRpcXRKdW15b24zSWFIWS0yZnZWdEItaWdqd0hBanE0RER3X3V1RHp1Vm0xdWQtelFycHhrcE5XYlp1aUNlQTE3REhsSnpTU19MLWVGVk5Za2NWdy1RcjVOeUE0amV4VE1QQ1hCQUI3bDZVSHFVRHJPV0FJRnNpb04xZXFjc3EyZ2VYY2JpWkU2WjJSOXQ5NjgySVc3TWJvZ0ZQVmRFNWQxamFORENBakFaOWFrWndZLW9pMUpOdVFQS2wzem9NeEctM0N0dXNDa2o5QXduWHFYT2htOUhpeVJ5UlVQSjVEaG8tY3RzYjd2LW95TzdmWUJLN2IzeTBieWFRckczTjBGeUVEV2xVaDZKQ2FLNUZDNC1wTWNGd1BNU2IxRE5RNnA1dEs1UEF4RGtyQngwd25ZNWJRczd2eTlpVFUya2hodVVCVzRTMG1QeldIWHNndWI5Y2NqLUQyVFptSlRzT2RhT202QUNhVjVzYjYwZWVtTm42aWZCbEVkSGNJbDUzWGt0X0N0RUNLVjJLWjRmU1ZkSy1xTGNUdG5rcnJ2NUYzbHpiVnQ3WktGWjZ6OGpFa3d5dTlBc01XN1hyQzJXVFZwU3lscTYxZzM4ak16MHZQaGJWdU44VTc3YVlibUpvbERLbEw1Nkx2OUlRWm84d3hjVmlOOUdNWkZURk1vSllFdW5ORkZFRWV5NUNRM2ZycGJPWkhFRXBrVlEzVWJTMThDemFIYlo4bDgzd2tZVS10UHRja2FkVnN2NDVxUENWQXdhdVlCUFFiSE5mUkltWllNOWo2dFJ1LW1IT2lFU3pzcklScHNGT3R4blRLUGhxN0pGU2ZSVHh2OHlKWUNxVmVGNm1GZmNSQ05HSlUzQzM4RVJPSV9zSnNObkxWSVpXbUpZM3hHVWJQU3Y0TkxIclc2QzVVQ1l4YUdfaXpnLVREWXcxdmVrR21RZ2RPeGJmZUV0QTVSWnBnUW5TWFpINnpfR2NZczNlbXRHc2N1cGg1UkYwSnN0TzhRRy00ZkhzUC00eXN5S1MzblFpUUo0N2JZOV9GeEQ3ODVxQWJBSUdBSE13WXotVEVPek51M3NNejF3VzUyUS1nUXhoY0Q2Y29BSEI0dzRfZkdzTWdkLWR3c1A0bWtoZmlCMm9ObDJIMTA3aGdCQWtKeUNjZENYMUUtN1NpQ1liS1NkcXgxNjlxbUJxeGRXMGpmMHBsRzJYYnNqZ1ZFUmQzRHN6VFdzUnowTnVWQUZkN19WWDUyTk10eE0xaUNHbTM1dTdhTnlwYTg5ak84MERqSy14eE9yQzcwWTF3ZElLcER3OFdwdjEtUE9aMy05Vm93Q2dZaXQ0WVNmd2prVENRNGhTaEdEdGVUYWtJQW5uT0xZT1FnNEVUX3E1ZEZ1Y1Y3WURQWUZCZHBJM0ZOaF9yS0hqNVJtZ1IyWnExUURRNW9zcFhZM1VSbUp0ODVES3hkX252MU5relNzZHBEaW1PcE15d0FvUThpdnVqWUpiRkpJUUNRRE9BdlNuSW1DMVpQLV9lSnJLckFSUFBUT0tvZjh0NEV6NXNsR2JqT2VLUTRPM2hVU0pqOFRIWGxkSnFWWDRaZTFDVFEwcGpRV19ZcVFwWmROclZqZThSbmZzNTZ1UV9VbWkzUllfejRqZm5xQ0NRTzl4bllHTzZlRVF1UGpuVVVyZmhicXd5WGVlU1BIWXcxM0VuVXZPMjhBMElfWG9Uc1VnMVFmQmN4d2tjRnoxeko5NEtiOFAxbGxyc21OcVFwOHlIcEhibmM5eDQxd1FjcEVTd0ZzSV9pbjhjVks5by1jcDBkc0ZrUlNzejY5dmg4emdxTHNiOThfdWZqV0hYVzd1LTQ0RzhHczhWS21OblgyWjh4QXdIQmkwSDFHSTBUQk92bVNlTGpULWotek52Rm9DVHpkczlULUNGWU1MTzBaYXJtWHRvLXZyOE1RdHRXdUF6bmZacDJjdExvTlM3cEptZGZPclBmQW5QRUhla3JlLW44XzQtZTdVNnp3Y0dFYjl3M0NTUGVaTVV0ZWhZRzFtYjBxbndPeER5Mk45ME5OaGZhMGM3MndRQmRweTNDRmVybkFtbnRTME4wX2tUTVVwWFJDcTNKby1GbjRod09HMzMzQnV4ZG40c3hrLURudV8tNHZHSE9md3BRTmRaMldmei1yNlYtMzBiTUhweVQ3cXpwM3ltaFhtVUk4MklKUEUydEd5MU5vbTFLMXo1Y29nQlBUelJ2TV9KTUI5UHc3d3NOaUxmRnNnZkxWdk5FNG53azdFS3h0NWxpWF9tN1ZENXloV0pjdm92aUo1QmlaX2l6LXhST3EtUXpQNDVYSUxqM2NkZUZ2X2dzRVgyRV9DU0RkdzZEQ3hZaTZaeUNrRDVqcEZFVnkyRWxSdTF1aTlpM3lfWjg1dGk0eGFKSTN5ckhYSDNBQ3A2U3JCeERhQ0Y4VW9vVGo2cHg5MXA2S05HdHNnY29JWGRlVTRuMGRhRDRzdWx5ZWxjaWhTY191MVJ5Tld0MVFGQVlYVFd4SksxYzk1cnY2ZjBNb2NyTzZjSVpFU0p2a25HV1llZHpBUnBfZ2hlRk9tQmcxWlZtV1Jjdks3Tmo5ZEd6TVBLUjRCQlhEUVpBd3pEaHpSLXpFanRUeEVXUmFEcDBQX2hNdlZMNGdLWjV1c3ZObm1yVzVMWmJRMFFsaEs1dERJZFF5Wnpaam53YUtlX01Kbnl4N2V6dlFXdHNaRTVQRjR2UnE4VXRkQkN4S3AtZmY5eDVzaG5sSGNhczNaQ3lzWHU2QWNKVFh4cGlaUUdpbFZnUHZSemlmaUtkN3dzWUJCQlhEeU5ieC1fWnBBNW8tNkR3c3N6WFNOVkJDUjVnNzY0RF9lNnBvcEZRdXNDaHJVMzF5bTg3MHlMYkxmajNRaURuOVhDUFBQdGtOQ0tDVjJmeTdEdWJXdWF4SFdrWUl4aklHa3BmRW9wWVRFRnNtV0VVTVJ3R1FuUDM0eFlwTUdPVy1vdUhxT2JZMkxyMW90dWVZTGowaE1oTFdib2IzbDBFZ29DNDhoN3FnTkFBUFNBUHRoUUVoOGJyZzdyeUJ0eUlyZC1zYlIwaDFIUndTcmdqUlpwZmxtZkZmMUpDYzFiZE9JSE9fNk9YMGNTVXhzYkJrRVh1UFdBSDJWQTNPR2FWbHdlWWE5eUxhLUpyVUYyMDZ2azVPcEJZTzZvbl8wWFg3WE80aEpxVXRURlc0ZDBPM2RIUVRnRVNkeHAweTJWU2tqYnpva194Y3JGZDVzeU9OY1dUSEdDazBUdzlZZXRXZENaNU9wUy1xNTMxdHpNd1l3UHEwUEFVazY2ZXdSOGx5NTZpTDVOemVuOVgwd3NjMWE2Nkc3alhhRllPQ3dBY3paRFNSLU1Qc1pLaDRaZ09iS1F5cVJKRmh1VTlmZkp4Q1BwX0NWV2RWUTVzcjNTQUNFa0I5NDFGLW92bnh6a3dwSTh3UDNXdjZaX2RJWnk4Ri1Lcms5ekRnVEhjWUZDRk5INWFjcWx2bl9DMWNIc1MtMHNIclIwYkM4b0VKOGxaZDEtSnE2NE9oS212bG5BV0ZaR2EtOFhiQnpMNG1TTnozeVlnaVNFRy1UaDlKU2xjS204LWNLaVNMa2QtMEdvdkZlejMzWEtubDVBVVM1ZkNDYjE4M0ZNalUwb2NyMTFzWnlJd2U4M1JLWG5veEJFQzVrdmlVTGNwU1lYR25QZkk2dDFMVi1wZ014Nzk5NGJITEh2cVpaTU9GUXpWQjZkSXNZTUlaWGJwLWE5QUhJTEVaMHBDcHRmVEtOeDRIcUt5QWY2bklHY1oxQzExSU5TbFhsUDVjakVXS3JOV3VaV19uRDM2OHdIUXpfeG5IMWl5YzZDN0h4OTlLSnc3MXR1QnBOVE54a0VsZUR4bURLZHNMeU1Lbm03bVNjZlh3Q0FQbW9BNndzQnZqYUNqYmxTaTlQaERZM1VNYUJtajQzZWo3R1JNUGlfc2tnZDQxQjAxVFBlOXAzSEN3ejZMTVZHX05XcjRmczdpamZWMVNBM002elNSWHBySzcyNmM4cDBTcktXZk80cVVwZzlXcVRPc2RLd2tFSWpOZlhYQUFpLXVUZVBOR1pTMUwzcWM3WUcxY3dCWXEwNF9GSWYxSjZ5X25GR29LZDdiLTZYR1NVM1dZY3docWl0a1Y0V1lBbjVYVm1oMkhVMmhMOEZFYXVPWktBUER4N2hSczZ3eVFsc3V5N0E5Wm9FdzdwQm03R2JZLVV1U19OWk5PU2pJdlh1Um53ZmQyYWJuRXdsb3pITDlFSWVPc0FMQUcwRjA2X0lXQkhPNGc2REd5UGRYR2cxU1o1WkJuYTFDMkxPb2Qtc09VM3g3ZXB0YzFlNGU4NzFGLUllblZvMDRFNnRwLUFUYVctZzNfbk04THhJZTd4cGdkanFJUzJ1WnJSaWpjb3ExOFpvMlpOM3d3TTF3TG5BSU9jam5NZDNDSlRPSWEtdFZDNF9TT0hKbzM1X2dEbWlMSjVfczNBcDVyLVJwVFRQMkhWdVRSanlPeldRR0tZYUo4bmplUEVFaFdwc09QbkdubVFaUW5sMHUwMndVWE9oSEFESV81YW5kUF9TbkdaeGNqSWo1RXdJUFJNNWlwZGs3bG1TYndSNmlKMUM1S0FxLVBNZF9EUFhHanZHQlQ4Q3FwRkZ1eEtVeF9odjhnSVZhMlR3WWluY2JHM0g4cVNCTVNTTG9iVUpMczRGUlhBOS0zbTRmd2Z4Ti1uQS1va3FobkFoSjBTR3Y0WWxlbkxVREVRTzhDWVZLUzkyc2dRanp2VlY4R1dVOEFCVnNSdjZrRmREeDR1dUJiRnR0YlJSay1fSkdudXhZSWVJTGNNZ09Zc3NpTFpZTGVGU3FYVHBPcGoxVjZaM2tEOEstMDF1eDFZVnQwaWhnY01Ya0l4b2NwNW1QUjcyem5xQ3NqcXdzV19lZjRsSG1RU0pRbE1vS2xvazZVOVZzVWl5S2hnWk1feVMzVTFCYVVhR2sySzF1S1NKUEhpSS1KbUFIVXc4TUxmNzl1ZHFIMHVHcjdwSFdidC1NZGRuMHc3ZmRCLWZ6cUJPRWNDZ29tU0tLN1M5UEVVaC1OQWhBWDBqM01qZU5RT3RZY19Sc3lKNHBoY2w0bmlNNFJSZm5nN0I4Uko5MlR5MFdhaHdTaEQyTjd4eTR5dmM3blZkeHV1eFJsZnlmSDcyb1piTVlDRHdFbEZKYXVacDVDM2J1VzBPdENOTUUxSEt2d0FyemF0bkZRSW5qc3lmWDNHbFJ3U20xUUh0V0JpelBNUy1Od0p0VEhrSjZISGhTbUcxNVZBMXhVaEVaS1JjVXhNcENBa1hQc3ZtMzRGLTZxNG5wdUFnN29ZMUtmUjg2RENoSnhKa3plaXlCdk10NVJJdFVXanFhXzRFdld1dGhFWVNUV2JITWVjNmRFbi1MX3RiZHF4ZnM0ZDNhcnJUZGRNbkk5MVl1MkJoQTg4QS11YmFjWEdxTHlTR0V1aVk1MTNnb2FKY3NaLTZuMTNJUjVpSm8xUWdMYUhUU3NWTUhnd2RoejNYUHFwU3NoMmlHVnB1eWZETWlQMFpoSlY5VEwxZDZtb0Y5a1g0eEhsWnZiazl4M21kNHNyOUVBeGxmdjlqd05BVG40Sl9XRTlqcVZWTGJsNmJ5OTdGbVNZbF9xVjJnNjczY0NNdy0yaDFXZno5NG1CU0NraWtKTko3TEY1b1BuNG1zM0dPLUM4NnlaQzB3RXdvakstUWpsS0xZTzY3ZWt6bjczc3lKU3hfQnRCaHFSYVFKdUxyZnhHOG5oTWo5RVQ0dWNqZmhldXFZdkdleUEwZTV4b3RQQ05ULTRpZzlBZWU1bHBTY2RWVV81c0VpdUw3aFpwbFlsYWNsRU1FZmlPMDFhc21OVlVHYVVJNVZXYWR2bEFGLVg1Ym5kaWdST01ldElHMDVkMjE3d0otZDBJd2RfWTE2anhsTjdQLTRhYlFSaEFXT01VVnBLSjI3UVhzbUp5c3NmaThvQ25rSkIwcjJVR1ZYcm16T0JXNWRnQklJay1iWEJFclJWWW9tSHFJYndnVHdPYVNJSjh2cWIxOHVBWklsaTY1cDd3bkUybV9kVVB2NWZRYUliMjZSTnNDbXMyVTFkWEtwM1Nwd2dvaDRMUk9fQ0QwUTRVNlo3bXBRZEphT0pQTkp5VERNdTBaUnZRbjBYNkdvaDRkMjhJR3FLQ3lzUjB1RXVsTFJsWTR3WXBnc0RQX256T1d1ZDRVd2FtMHhUWjhEeVg2RmNHNHRqMTNYZTIxQkdvQUNrQ3dlSkpZcTlKblJkcnFHRUxWLWZuWHNCVVZnYTloVlRVekFKNGMwRXd2aHdseTZIX0V0T0NNRWNWOUg0Y29LdVdmT3otM1FJTXliMVQwZ3lEZkZJWXZHeUdfRGwxVzVFZ0doTnpYZnBQRmZSX21FTldOcjVrdmllWV96WTZTRDFWNDNFaU5CRmNuQnhqa2VMQmswRzEzSHJxQ3NBNDhrQlBtV1RwdFRLUi14eG5XanB1ck1DLXRkVHNlRE9IaFRteGpYc1M5X2N6YzkyU2M4TnU1b3dYUXdRNmktb3k3VmhISnFEeWRkd2VoWjh1eW4zdUVmaTNBMXVHX0cwY0pmRGdXUER0VkpNQXd6c1h1UVk0QjdNNm55NzRPWlhHeGhCSGlkYkt5ODJTa3JCS204a1MtT0JQbG96YVpWZV9sTTlEa2ZWRWxFYkJfU0FCaGE1Qml0SS1sZXBCWUdNRGtvV29xbTlNWGRsaENWaXd5MTd5cl9JUjBiUFc3TnliWDFHakVKVGdWX0pla0pnRGxtb0o0TmZjbUVqOFg4QjVycWFhZUQ4Y0t5enJpSGk1SFVOVGl5LXdWQlpoclo1ZWlPQUNlSXRyRU82bzg1VktKSXRxbk9XX1p5ejgyVGx5bGtSZzc1cS1ENVd6MGxTb01NWS1INHVoN3R6NnhiRC00WjRwM3ZLak1yanBTZWctT1k2NzlqVnlzTkk4U2dHSGRfMFY0NVVCcVo4d3E1YnJOWVg5dTk3S2NmelZjemxaaU9yLVRPd1IxanpXZXJBMlFDRy1rVEZXdnhpRDFpaVVWX2dLdE92bGpUX2JTWWY3cjd1YXZvZVpkaG5sbEpPWGZhQ2tYUG9SX0pNeEstd2hrUUZ5TFVKajJrMjFZZVJubm91YkVOR2RYM3FXR3E4VDBXWjB0OWxOU3p3NWF5UFM2cGN3Y0NPR3A2azVsVmRDWDkxX0ZweXFmY094UDlEc0N2VFpvSlp1NzRlVDFSYnJaNS1QanJMWi1oUFpUd2hsV3NJdERGTGdTNW54MUVXb0RVeFYxdjN6bzB0TmplOTVwN1NhNDdldE9FMmFROFBOZ2hxMEFIT2c3dlc4bnc2VG1MRDVVQ2U1X1BBaUhaOHlyZ3g4UE5hMy1fRmlYUEZBYUlRNTl0dlo3SnFoeUVELWplUWNNd1FmTjBMdk5tTXlXRlJPTzVzMnIxblhxN0NrQXpyWUlwc0xqZDRsNDZfR1NVVUZudFZka3RiQ3RsTllRVlZ4S1RqOEk5c0xwajBfcG9EdEpXNGd5SjhuQ0Y0MXMwUXVzVExpMEhHNjEzdHRudFRtdVJibk00ZXNzMnFyNUF4bHZXTGhsQ1RIUV9ITzBhMExnOFYzX3RlOF93ZkE2VkNVU1hhbE1zdXVnTTZha3U5VmRXc1pTLVVTaGdyQVc2eThhcUc1aGZSemxmV2ZKUjlGdUFZMDc0amJTckVRRlppOW5PX2FXbllPQ3VFOVVPOFpDeUNBR3c1dkxFQ0lFbU1BUFBnd2tGVXN3SlNDZDEzOGVkN1hqbG1UMmNWMVhyRGVvODFscUpOWDZXdERsR0s1ZEhyYkxFNnhlSjc1Y29GRUFXWjBpUklCSk5XNEl0NHJuMFBSQmhmY1FyWE14anJpY2xnU0ljRkVNNHVXcmFTYTd0WGpWUklfdElvb0ZlZGlpQUtNbVlYX1JYSTJQclBTbDRvQ0RnQVQzRTM5SDJ5ZmNmT3ZzdFkxd0FOUHZZSldlbV9zYzRIT1U5OTJfUlZGRGpKU0lLUjdQVEF2UVpaYjdKd2xmb0wzSjY4N2JZZnFzQlRxaHBZU2pxYnpCaDVwWTMxelN2aVdzRHJEVEV4ZzFPU2FFX3kzcHlhWXpFSjcyREFnb3dRLVdVTmJNQVZUUXdiWnpYTm9UWFppVEQ2Q2JiVXRZeUxHLVdOYll4UENoS1kxeFAyd0RBTl9nLUlHTndDY3BnQWhvemZVRS1JN1o1U2t1T3BqZ0dnZmk3ZnFzdDY3THBRUWgzM3NWNE9ybkQ0b3lGeE9KR0Z4RVE0dnBEeExRU05IcnNGNkF3eDZkMXZvTU5FZmkzRWt1elNXbUVBbUV6Vk95OGlIdXRHWXotZXRRV3NqVERlbVhjVlFrZjJrOTV0Q05oQV9SenBxVzNfa2pWeVRCeWdSS2FSdkZvOWsyNXBPa09iemdyT01yaEFGMVlyRmJWREVSLVlzSTdxLWh3dElibmxVVWlqYmZTa0VVZWc0ZTBzWHl6bWdDNXBORllubFg3eUhJQ0pMcExacERtTl9obXZvMlF1VkNGdWRXcjRmeVlKNXFjdlZlanotcGVUNWFaNTZ5Ny03QVRQYVF4aWx4T1dibHdhMms5bWFFdktrV3dPLW1tQnBqTUhDQldibWYzSUJpektnRUFkUzktV3J3Ym91MGtDODdQMjFNYldaZ2RSd3M0M01SYWtEc2ZXQklrbnJ4d1NWRlMzVERrMGEtbHNCT2w2aE5JM1dMOGVqcjM1dnRqMUZxR1RrbWUta2F4MENLNkhhSG1SVE9XZGFfUjViNktBR2pPLXVHZHhSVnlJa080eERQZDJPNnBDOFoyVzRldEtHNFdPekdqM0ZXWGdfR21oeHZIZTBiekdpQUZYZTRkWU45TF9kSTEwQmpsaDBpaW5rMnRxNnZnLTdlVzRzczR4S0cxVHpXTDFNaWtBb01LeVIybmNVcUlBWExjMTdQaUdzUUdlUUZYYk1jdGUtUEJCaHBsYlB1SmViblY0anJ2ZG02SlkyeW94Ylh0Z3E2MWQycGlGNkVzSXo2UlRGZlJIX1poWXpfbXdMZHhmTXNkbnBCOEtUU0RLZWdRai1DOXRWVDdENGJuUjBrOTl5UUVkQUUyOE5IelZwZm0xYzhiVmpYQ0Rvcnc3ZmZhZTNCVmdlUThhRDhHSDFhWTlTSUZIYjYtQ3V1SzdXVFVFaFNaazQ0bUNha2h0S2xKYkx6QVJsZlZGM05CTmNrV2M0ZHNuNXZCelFQMlhlQkhLSTg2Y2twX1JMc2JMR1pDNnZZdG1QN2cwdGdDcEdpYVNjZGFyMEtKelFiUVpGbnlhb0ZkbkFtajFnRXNJaVVmZ2pSYU5OTFZ0M2VLWmFHR2dGQ1ZDOGlFN3BoUDBCTjBFUDl5MDVieUczc21NdjYteVZPb1hNeDdnY3VWeXc0MUFVMUp4NnVha0RrY3lRT3VtQm5UdVQxVkI1a2N0OUdUcFNldnFqYnBSUDN4X3l0a2taNkZ0d0RJSVdRb2ZBS2N6YnVKQnB6MF95NkxsRGRBdmhoOHZOTHhVbHRZY3hYMV96eVRWdVRGd01kOXdhRm85OFhYa3lWS2dnTXdYNjJHTzNxc1VLVlhpdnhqbzRSX0d4SHg4QmN5Rkg5TkNFSG03ZHliUEN5cEMwRWYzekRxS2FObkhURzFoNkRGemd3OEU0dFpSV2pXS1FkSkZ3QWVKaW1MSzVfTTgwN0FiZFI0N05zeWNwUWdGS2RiUTBkdlhMdWZ3TmQ3bVZneXkwTXNRMVJUdTZEZTJDenV1azhPZ1FlQUoyTnE4TUQyWkprT2h1QXM0LWVvMTc2WnI4QlZIM3dYTzFNdU9ibV9sRVR3b2ZDOWFKbU9xMlVXSXdmU1NrQ2NFWXBTNG04ZkJLdjBtczUzM0d4TXhRLVdoZks5b0RIMkNqdUVPZUFkTk1iYWRDeE5hajRCZno0elRYUzh6cTJGTUo2NXJvcWRmeGhHLUlNWHE3TTBzRlJsSlJzM3JBWVQ4c0toRzVLcnhQSVVRVWFuclZabU1xUFRyOEt5WXZuVzd4ZFMyNFNndXQwNXpPQjZGTkg5c0xELU1GUENCQjFoWjgtN0NMLW43aUp1TWctUVMtdkR1Nnh3cUhfZUZmYk5xcDhRdmowbjdPcXhDRWRoZVlTcjZTcE15N1NvRDVLMzc2QnNnYjF3dFZ6VDkxLWlMWVdGekhSNy05S1lZWmg1OE5wOE5vWXRPQVJNUlNiWnRaNlYtWWtqOTdjNS1ubXhaSnhZQmpDbmpTSDBOcmp3WHA5UnlPMmNndC1ySHJtaDdzQm1MUjU5Qk54Y1hCekdwUWZpWW9DNnUxV2g4bkZRdU1lRjdfZldrUldiRnJCMlRfc3l5V2JJYzBiM2ZyX1dtNVRSVjRNMUtGdlktc3FKN0pmV0V2TE92SmNWd2VNSE9NUV9XODk5QkhQOVNEYzBRbzZDemhxUE5kQ0FSaG91MkVMZ3VIbHFhcmluZnZHdTNyMkJ6SGJzVDZ4ZC1wT0VPR0VTNmRMYVRUUUthcGxYZVpPVkYtRGc3WTVzbE5sbVg1Y1A0Z3JVX003RmE2aWU0eEpKd1dpWlpJSi1UTHFpR0RxdXJMZWxHd1ZaV0Yzd0lJTE1KOWVpZVZmR3FwdUlVdGZzWTN4bHRxUEdRb05VOTZzZDhRbXVRVXdLeGxKSExzMW9iSEtMRDRiVHpSeGFPcE55NlI2b3dzeGdkd0FqV2hxemVrTVlqWUxmVXQzVFlLM0VFTTlxNUNNT3dmbDR1eHcyQVhuTjRBblRmLV9zTjdqWVZFVXZGeUhwRmV1RFBVenBTa2RlOHlwdVBBNmR6Nk1NMXl6VFFVNkthMjBteUpMZFlhQzE1ZkhrWi1xeGJ0Q1ZvVTdHN0V5aVFabVhRd0Z0NDdTbHJZODhpY1pfQjBzc2tObHVRVF9RMVZWZF9FUXFHWVBEbEFReFQ4S1NhZXIwZXd1ekdQODdhZERERmw3NEJCRVNmdjJmUmw4UEU4NHRlN1hVTVgzQi1yTmExOTFqZnJES0RzRVFac3VVUFNPYjBuZlRYa1VDX0F2cUdwS2ttbG9ET2VtcG1HQUYtTHBWbExWN1lnTE5lQlVuU3NSMzhrNENPSWlIbjltaUdBRko0SVlNTGIxcWk3cG5haG95c2pCaWluX1FDV1VETWZja2ZkVkppclpScFpWZUdOV0NzbGJ1Ry1aMGNCRmFxby1QOXdNWVRyQnFMYlQwa2pLY0VSc29aUTZDZVVrWWZfcVQxNXYxTEZuYllraVE0U3pmOS1wam52R0RKVjdyZU9ZcVFVZjUyTDdmMmV6bjVyZmlNOFlXU1FLQ2FYbjVlbWpaTWExUUNHeWxxWkZuMUxiSnRZRVM3TG9IY1JlUFpYUkhadVcwd0hOUHN0LXBEUS1aVDFTNjRCeUhLWFRCdS1rZTR4d2FjZE5STk5DQjNsM2xyWGZ6eVNGUlVNM3BJNXdPVWdmdEVuelpWb1drZzdiOEZHc3l5ZjVtRlZQcEhkUU42ZGhXU0Ztd2pSYXh3UXZhZEFrVWtGWGdoWDV2a01raEE0b2tkVWpLYnpXU1pYcFZXeGNPNVJyR3Rjc3dfbEF0MGRWcFJRclc1aXVFSmJmVWVHaE9yd1FiamFQRWpwT2RVbXVzLWJrTC1SRDVGVmdDa0pBelk5aUlVVW11b0J1UkpwcncxdTBVZkwyaTExNHlHQjhLNTJGTHJRQlNXUkRVbGp4bHFZYzZvSjIxMmQ3YVd1dWhNTWNwWm1WUVE1clNGa2dBMDNTM296QS1Lc1Jwbm5obFV1SEhteGpXZ2JSbTliOFZGQm9pbEpfSmMwSE05aTRTaVFjRnZLbTlIMU51cm5uMlZJNTdveVpoc1o5b0NoVDVGNXNKaklpdkFaMVR3UURZWThHQUhHSFhwYUxOUGV0V2ZrTHQwbjZnWlhNeW9UbzV6eUNnZ2NfQzh5b2hXR1ZFaVNOM2RfNTdxR1JkNjdBSWlGRHBoaHlyRGtER3JDSUFrQ2dfQzczem5QY1JRMnVFMnd6THhyWWctX2RrUkFQZ05zdUpMWVNKbWl4NFBDWllQQnFoaW1oNktFZHlqRVFXOExUU2hCNFd4b29zY1JDRFBNWWE1VFhvOHhnN1c2aTA5R3FJb0QyOVhQTHc5Nlk1bzVTREM0SFRsSGMxWG5tNkNJTHhQUXdESnRFbS1DUTJQLWZReEdLcENmUExlREF2Rkx6RzlVQkN3LXFaM2hJYi1DQWFpa1NtaHZHZFhrYWx5anY2VEdiYW80OElEaVpRVWZXVU14RDdiQUhUZHhMcVlQd0JXZS0xS19OWVljNWtsT2YwaGlCTl9wSm4tVF9Mc2VfY1lEWnRKMkdkUFp2UnBTc003XzF3UENUaEZ4clgxVWVXQ191MXFSYlFUWGJuOGI4UGFWNC1mLVcyRkVSSzdEaU9BX0VuMUVtTTZMa0lscGFuR1JlUE5KbmxmbThkZ0NkZG5RSVktZjkxT0dwRnB3S0MydllNd0d5WmFDYW9yQ3lBUHpHSmdrazZQYmVtQWJoQmF4QS5YTDJFQWx6Z3Bzak9MRmN0R3Z4TWNn"}' + headers: + Accept: [application/json] + Content-Length: ['42665'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997cfa1497.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","kid":"https://vault1051159997cfa1497.vault.azure.net/keys/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","sid":"https://vault1051159997cfa1497.vault.azure.net/secrets/certcfa1497/ed4a81ce38bd4aff9a320a54999365bb","x5t":"EGCdbDY5NxW2aWAyaffevJ0T5WI","cer":"MIIDOjCCAiKgAwIBAgIQLMT9FrFxSXCIGo9LpD0VzDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMDE0WhcNMjEwOTA0MjMyMDE0WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCoPWxwhWt2Z+OUBadxLiLICOugDy/n7ZBdoZbknsFYr8UlDWBZvjjroe00TeuFeRWDQvEqsMY37pVJVN76oA+/VFPZfT749wuxMRjkNgf9uzdtq/vZ+1fqHlzpMD42sE7UjfgHnseSdOY0u0pfUhHpMC0WcZ44HuHDxfQbwInIUJXS9dQ9w40CRYy1SE/Z4joqnANOmR9854Gc+4JwZPoQeD2CO+aV0XHGRVup2HA5tHTWj4GLZqvjYwU3/fkFAlClc8CUs2P7D4nL/4484Lcx38FIy535t8OnSTd1ZbUp6AarheHbGuqhajUvsSfhil/0RV0hbMpWr/Mo1HFDkrKlAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQlfgxfPPlqTxG+aZxCq6ndMe8SrzAdBgNVHQ4EFgQUJX4MXzz5ak8RvmmcQqup3THvEq8wDQYJKoZIhvcNAQELBQADggEBAChWFn8tJXpHADvvjrUEPLKFrhLe5HRn+4xOKeXvXR0FGNhRnaZ+kWc/kEpRUiUA8wTHsdJAi6zkAcg3iyrqA105PQ0nHxEMqQo6Kw3RUO3HBSrV5JKOmWCwJCGnAmBUlL3HdKabYfr1bWoTaeShyYR4+3bJ8RudScBMFFnFOMnO0JQNiNRleekGEG+TbH3L0y9ki8io1FelftHHgiuJPrB7hFNsluyss/mZkEcQY8knKXDel7QSV3/Awi4q5YRY3Zht0GXWFTHtvL8JqWKEGggIcq+iLRq2beESaIOsIoM+kNWN710ZlfUvbc1UQjBeF7BSgYwK7RPKG8aCe5fTY+I=","attributes":{"enabled":true,"nbf":1567638614,"exp":1630797614,"created":1567639214,"updated":1567639214,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997cfa1497.vault.azure.net/certificates/certcfa1497/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":2},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639199,"updated":1567639199}}}'} + headers: {cache-control: no-cache, content-length: '2239', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:26 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997cfa1497.vault.azure.net, + /certificates/restore, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_contacts.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_contacts.yaml new file mode 100644 index 000000000000..97fb342eebc8 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_contacts.yaml @@ -0,0 +1,109 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997f8b2142a.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +- request: + body: '{"contacts": [{"email": "admin@contoso.com", "name": "John Doe", "phone": + "1111111111"}, {"email": "admin2@contoso.com", "name": "John Doe2", "phone": + "2222222222"}]}' + headers: + Accept: [application/json] + Content-Length: ['166'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: {cache-control: no-cache, content-length: '231', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997f8b2142a.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: {cache-control: no-cache, content-length: '231', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997f8b2142a.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts","contacts":[{"email":"admin@contoso.com","name":"John + Doe","phone":"1111111111"},{"email":"admin2@contoso.com","name":"John Doe2","phone":"2222222222"}]}'} + headers: {cache-control: no-cache, content-length: '231', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997f8b2142a.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997f8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"error":{"code":"ContactsNotFound","message":"Contacts not found"}}'} + headers: {cache-control: no-cache, content-length: '68', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997f8b2142a.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_issuer.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_issuer.yaml new file mode 100644 index 000000000000..9946c6f321e6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_issuer.yaml @@ -0,0 +1,171 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:01 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser"}, "org_details": + {"admin_details": [{"first_name": "John", "last_name": "Doe", "email": "admin@microsoft.com", + "phone": "4255555555"}]}, "attributes": {"enabled": true}}' + headers: + Accept: [application/json] + Content-Length: ['235'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639802,"updated":1567639802}}'} + headers: {cache-control: no-cache, content-length: '351', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:01 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639802,"updated":1567639802}}'} + headers: {cache-control: no-cache, content-length: '351', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:01 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser2"}, "org_details": + {"admin_details": [{"first_name": "John", "last_name": "Doe", "email": "admin@microsoft.com", + "phone": "4255555555"}]}, "attributes": {"enabled": true}}' + headers: + Accept: [application/json] + Content-Length: ['236'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PUT + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer2","provider":"Test","credentials":{"account_id":"keyvaultuser2"},"org_details":{"zip":0,"admin_details":[{"first_name":"John","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639802,"updated":1567639802}}'} + headers: {cache-control: no-cache, content-length: '353', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:01 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer2, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test"},{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '234', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:02 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers, api-version=7.0, ''] +- request: + body: '{"org_details": {"admin_details": [{"first_name": "Jane", "last_name": + "Doe", "email": "admin@microsoft.com", "phone": "4255555555"}]}}' + headers: + Accept: [application/json] + Content-Length: ['135'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"Jane","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639802,"updated":1567639802}}'} + headers: {cache-control: no-cache, content-length: '351', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:02 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test","credentials":{"account_id":"keyvaultuser"},"org_details":{"zip":0,"admin_details":[{"first_name":"Jane","last_name":"Doe","email":"admin@microsoft.com","phone":"4255555555"}]},"attributes":{"enabled":true,"created":1567639802,"updated":1567639802}}'} + headers: {cache-control: no-cache, content-length: '351', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:02 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateIssuerNotFound","message":"Issuer + not found"}}'} + headers: {cache-control: no-cache, content-length: '75', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:30:02 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997d1371366.vault.azure.net, + /certificates/issuers/issuer, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_operations.yaml new file mode 100644 index 000000000000..2d46202f6de7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_operations.yaml @@ -0,0 +1,212 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:24 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": true}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=DefaultPolicy", "sans": {}, "key_usage": ["cRLSign", + "dataEncipherment", "digitalSignature", "keyAgreement", "keyCertSign", "keyEncipherment"], + "validity_months": 12}, "lifetime_actions": [{"trigger": {"days_before_expiry": + 90}, "action": {"action_type": "AutoRenew"}}], "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['484'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB0kw2YitAxd4GuWtaknnE2jXNxVvh6+For8f4mOFxhJyA6hdSA/1+8k+1RfGXo3cxJDux9317+hWp0xeRn0AQ55dJMnTAEQGhCcFhte4BhbvdGErCnXSHVjsT0/5Fm9kIsCvVft50B9LH3wwoDNUEO8ch9MpVKOuM75LdaRA1t2xN/gOvATszjQdAj+aYGmkpqvVcRSLsXaGZ5ATnw3Jr1DsK4Ubr9h52ggZE6NR6uL0Nwktpjrtrct1J3JvxgyzUxQcqxIijIO3e+7u49sfZvBN6AFeHmZ62o2Eci5SX1tmJ2MzReORklUnMYiJNECfFD37DR+lDoj26W1eKLEP2U","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"68f6010e6fe44437a8cbb97e8f055798"}'} + headers: + cache-control: no-cache + content-length: '1301' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:20:25 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '2', '2', a, c, '1', '5', '0', f, ., v, a, u, l, + t, ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, + c, e, r, t, '2', '2', a, c, '1', '5', '0', f, /, p, e, n, d, i, n, g, '?', + a, p, i, '-', v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, + t, _, i, d, '=', '6', '8', f, '6', '0', '1', '0', e, '6', f, e, '4', '4', + '4', '3', '7', a, '8', c, b, b, '9', '7', e, '8', f, '0', '5', '5', '7', '9', + '8'] + pragma: no-cache + retry-after: '10' + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB0kw2YitAxd4GuWtaknnE2jXNxVvh6+For8f4mOFxhJyA6hdSA/1+8k+1RfGXo3cxJDux9317+hWp0xeRn0AQ55dJMnTAEQGhCcFhte4BhbvdGErCnXSHVjsT0/5Fm9kIsCvVft50B9LH3wwoDNUEO8ch9MpVKOuM75LdaRA1t2xN/gOvATszjQdAj+aYGmkpqvVcRSLsXaGZ5ATnw3Jr1DsK4Ubr9h52ggZE6NR6uL0Nwktpjrtrct1J3JvxgyzUxQcqxIijIO3e+7u49sfZvBN6AFeHmZ62o2Eci5SX1tmJ2MzReORklUnMYiJNECfFD37DR+lDoj26W1eKLEP2U","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"68f6010e6fe44437a8cbb97e8f055798"}'} + headers: {cache-control: no-cache, content-length: '1301', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:25 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB0kw2YitAxd4GuWtaknnE2jXNxVvh6+For8f4mOFxhJyA6hdSA/1+8k+1RfGXo3cxJDux9317+hWp0xeRn0AQ55dJMnTAEQGhCcFhte4BhbvdGErCnXSHVjsT0/5Fm9kIsCvVft50B9LH3wwoDNUEO8ch9MpVKOuM75LdaRA1t2xN/gOvATszjQdAj+aYGmkpqvVcRSLsXaGZ5ATnw3Jr1DsK4Ubr9h52ggZE6NR6uL0Nwktpjrtrct1J3JvxgyzUxQcqxIijIO3e+7u49sfZvBN6AFeHmZ62o2Eci5SX1tmJ2MzReORklUnMYiJNECfFD37DR+lDoj26W1eKLEP2U","cancellation_requested":false,"status":"completed","target":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f","request_id":"68f6010e6fe44437a8cbb97e8f055798"}'} + headers: {cache-control: no-cache, content-length: '1221', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:34 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB0kw2YitAxd4GuWtaknnE2jXNxVvh6+For8f4mOFxhJyA6hdSA/1+8k+1RfGXo3cxJDux9317+hWp0xeRn0AQ55dJMnTAEQGhCcFhte4BhbvdGErCnXSHVjsT0/5Fm9kIsCvVft50B9LH3wwoDNUEO8ch9MpVKOuM75LdaRA1t2xN/gOvATszjQdAj+aYGmkpqvVcRSLsXaGZ5ATnw3Jr1DsK4Ubr9h52ggZE6NR6uL0Nwktpjrtrct1J3JvxgyzUxQcqxIijIO3e+7u49sfZvBN6AFeHmZ62o2Eci5SX1tmJ2MzReORklUnMYiJNECfFD37DR+lDoj26W1eKLEP2U","cancellation_requested":false,"status":"completed","target":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f","request_id":"68f6010e6fe44437a8cbb97e8f055798"}'} + headers: {cache-control: no-cache, content-length: '1221', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","kid":"https://vault105115999722ac150f.vault.azure.net/keys/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","sid":"https://vault105115999722ac150f.vault.azure.net/secrets/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","x5t":"AEMlW2rPp6a3Cbi5PvQZxSz4cWQ","cer":"MIIDNjCCAh6gAwIBAgIQCZ/c9LQtS/+FT5pmYqwe7jANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMTAzMVoXDTIwMDkwNDIzMjAzMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFHfnmY7vavF0p1rjcTHp/SRfUdtEMB0GA1UdDgQWBBR355mO72rxdKda43Ex6f0kX1HbRDANBgkqhkiG9w0BAQsFAAOCAQEAH5DA8HhFMdv9zHw1ZIb5EeK/y+bb5CtT/BjotXFiyYLaqRb2PvWtv3w/svF+hDNo+x5zcqVNs/wqw1TRGiNNPWkoCEqbz+CfjU//O6WR8iqlM9ByBIKmHhXTyckN1EXy8AbnmEDZgpotiJEjHfKZQ+AkGqz77keJlzBITT2bAW2qmp5S5QHAGph7Ej7KoVE6IFZf7rGoiQQqWISjGaWWy5t0Fi+/Xid/dQv04WpSHp0BCZklmhXsldj3wcUYBbODBJI+66QNZl06ePRSH2qWx69vlHWXoVtTgI4rklpmye1Q37qYtdstZ8ECJvB6eBQuDd1jo8zWEho7VeqRYKkFwg==","attributes":{"enabled":true,"nbf":1567638631,"exp":1599261631,"created":1567639231,"updated":1567639231,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}},"pending":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2405', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/, api-version=7.0, ''] +- request: + body: '{"tags": {"tag1": "updated_value1"}}' + headers: + Accept: [application/json] + Content-Length: ['36'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","kid":"https://vault105115999722ac150f.vault.azure.net/keys/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","sid":"https://vault105115999722ac150f.vault.azure.net/secrets/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","x5t":"AEMlW2rPp6a3Cbi5PvQZxSz4cWQ","cer":"MIIDNjCCAh6gAwIBAgIQCZ/c9LQtS/+FT5pmYqwe7jANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMTAzMVoXDTIwMDkwNDIzMjAzMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFHfnmY7vavF0p1rjcTHp/SRfUdtEMB0GA1UdDgQWBBR355mO72rxdKda43Ex6f0kX1HbRDANBgkqhkiG9w0BAQsFAAOCAQEAH5DA8HhFMdv9zHw1ZIb5EeK/y+bb5CtT/BjotXFiyYLaqRb2PvWtv3w/svF+hDNo+x5zcqVNs/wqw1TRGiNNPWkoCEqbz+CfjU//O6WR8iqlM9ByBIKmHhXTyckN1EXy8AbnmEDZgpotiJEjHfKZQ+AkGqz77keJlzBITT2bAW2qmp5S5QHAGph7Ej7KoVE6IFZf7rGoiQQqWISjGaWWy5t0Fi+/Xid/dQv04WpSHp0BCZklmhXsldj3wcUYBbODBJI+66QNZl06ePRSH2qWx69vlHWXoVtTgI4rklpmye1Q37qYtdstZ8ECJvB6eBQuDd1jo8zWEho7VeqRYKkFwg==","attributes":{"enabled":true,"nbf":1567638631,"exp":1599261631,"created":1567639231,"updated":1567639240,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}},"pending":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2438', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","kid":"https://vault105115999722ac150f.vault.azure.net/keys/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","sid":"https://vault105115999722ac150f.vault.azure.net/secrets/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773","x5t":"AEMlW2rPp6a3Cbi5PvQZxSz4cWQ","cer":"MIIDNjCCAh6gAwIBAgIQCZ/c9LQtS/+FT5pmYqwe7jANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNDIzMTAzMVoXDTIwMDkwNDIzMjAzMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALYvpdIiCJIXPzWMEUtop05p7105BGbcxoLKRHbTW8/RUf1uque4vM1KJve6HsKCHeabFigRyJ9xewd0WjbX+PiFamUI3gKqbT9AuAMb9RQWLR4Yyq3d87HJNIkKE09Qp2rEtlSmuRbKvjxmFelwpT4/d3nb1WCYWCE/2SksWQetp0veas0KjIA1f+s2pFdJh5qQ1OfdmaG7yymLMv3Mtp7Z3WUjXSnmXCoUfr/r7SYiYxIP4ilAFUDbc4MsP2jHMgir6CCvCgsfW5nbxczUVSHhSARq5VAh8Rx3dP8VErsXLeb1JlY+98v9oLzIs+k2aeSb1ZAzNruUn/AvE7yLCj8CAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFHfnmY7vavF0p1rjcTHp/SRfUdtEMB0GA1UdDgQWBBR355mO72rxdKda43Ex6f0kX1HbRDANBgkqhkiG9w0BAQsFAAOCAQEAH5DA8HhFMdv9zHw1ZIb5EeK/y+bb5CtT/BjotXFiyYLaqRb2PvWtv3w/svF+hDNo+x5zcqVNs/wqw1TRGiNNPWkoCEqbz+CfjU//O6WR8iqlM9ByBIKmHhXTyckN1EXy8AbnmEDZgpotiJEjHfKZQ+AkGqz77keJlzBITT2bAW2qmp5S5QHAGph7Ej7KoVE6IFZf7rGoiQQqWISjGaWWy5t0Fi+/Xid/dQv04WpSHp0BCZklmhXsldj3wcUYBbODBJI+66QNZl06ePRSH2qWx69vlHWXoVtTgI4rklpmye1Q37qYtdstZ8ECJvB6eBQuDd1jo8zWEho7VeqRYKkFwg==","attributes":{"enabled":true,"nbf":1567638631,"exp":1599261631,"created":1567639231,"updated":1567639240,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":true},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["cRLSign","dataEncipherment","digitalSignature","keyAgreement","keyCertSign","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"days_before_expiry":90},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639224,"updated":1567639224}},"pending":{"id":"https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2438', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999722ac150f.vault.azure.net/certificates/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Certificate + not found: cert22ac150f/versions/fb40469e0a6243eb8ce6cbc27828d773"}}'} + headers: {cache-control: no-cache, content-length: '130', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999722ac150f.vault.azure.net, + /certificates/cert22ac150f/fb40469e0a6243eb8ce6cbc27828d773, api-version=7.0, + ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_get_pending_certificate_signing_request.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_get_pending_certificate_signing_request.yaml new file mode 100644 index 000000000000..dee1a94521cd --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_get_pending_certificate_signing_request.yaml @@ -0,0 +1,168 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:01 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbU51ptGzzdu3Xr7kYqfrEjMJICwFAOptntIdzN9m921agYMClCwK5Kf7TtI52idPM7NLWIiqxzy0kbxggzvjUOa905hYVNb2uuszhU37UVtv+N56nqCGjkLJbEZsXb5xbiZ2wHXAI07arU0fFxjP6ZKQXQcfJsQdTNN+2LWUyTAsOBeWEcRP9S/8wMG23mU6/kHQ6/e5dpiO7P4xmjDcgvGFZCPBE0I20xLnmmmMbKxIyKO0+9ZNCTRhE74jZqFr/QeQaST+IV9k79xcsUgH7v7g6zu71fvIDmnUzggmbEVC20vJoTPI1tGIN1Q1JNJzhpaXj90G852bRtgiiMSMQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJ7gRT3ZOv3LBEOXWbJ1TTfJfEHnxbCerl8CoOUiffyOphdMyH9vcmJnaGrFIzDw9zwdNVI0OSWfxRI1LNymzcR0h1Ixgr1BmRD1FM5WeWb1aIve8cOgHUatfhSmht43JNW/f1bRf+ZnyH4OYLwr1L8pWMxAgFn1s/6ZMnMwlbHpGHRo3UPoEYGK96bAPj/GYNtzXwSSozWjKKajvig0haL1oe1yqsJy1JiYDkcmOX57iMMXVM75VgSkyvUY93Po0nOa+aGzaU7XdUCTH9IIcP0hkvoy4trNX52bv04rrGD0lzZLGfLN8y63eeFczm4IMfFOxTYH9gEgm9RgP1VVab8=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"a318767ca464424b8be2884bdf6330a1"}'} + headers: + cache-control: no-cache + content-length: '1350' + content-type: application/json; charset=utf-8 + date: Thu, 05 Sep 2019 16:22:03 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '9', '1', f, '9', '1', e, d, a, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, u, + n, k, n, o, w, n, I, s, s, u, e, r, C, e, r, t, /, p, e, n, d, i, n, g, '?', + a, p, i, '-', v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, + t, _, i, d, '=', a, '3', '1', '8', '7', '6', '7', c, a, '4', '6', '4', '4', + '2', '4', b, '8', b, e, '2', '8', '8', '4', b, d, f, '6', '3', '3', '0', a, + '1'] + pragma: no-cache + retry-after: '10' + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbU51ptGzzdu3Xr7kYqfrEjMJICwFAOptntIdzN9m921agYMClCwK5Kf7TtI52idPM7NLWIiqxzy0kbxggzvjUOa905hYVNb2uuszhU37UVtv+N56nqCGjkLJbEZsXb5xbiZ2wHXAI07arU0fFxjP6ZKQXQcfJsQdTNN+2LWUyTAsOBeWEcRP9S/8wMG23mU6/kHQ6/e5dpiO7P4xmjDcgvGFZCPBE0I20xLnmmmMbKxIyKO0+9ZNCTRhE74jZqFr/QeQaST+IV9k79xcsUgH7v7g6zu71fvIDmnUzggmbEVC20vJoTPI1tGIN1Q1JNJzhpaXj90G852bRtgiiMSMQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJ7gRT3ZOv3LBEOXWbJ1TTfJfEHnxbCerl8CoOUiffyOphdMyH9vcmJnaGrFIzDw9zwdNVI0OSWfxRI1LNymzcR0h1Ixgr1BmRD1FM5WeWb1aIve8cOgHUatfhSmht43JNW/f1bRf+ZnyH4OYLwr1L8pWMxAgFn1s/6ZMnMwlbHpGHRo3UPoEYGK96bAPj/GYNtzXwSSozWjKKajvig0haL1oe1yqsJy1JiYDkcmOX57iMMXVM75VgSkyvUY93Po0nOa+aGzaU7XdUCTH9IIcP0hkvoy4trNX52bv04rrGD0lzZLGfLN8y63eeFczm4IMfFOxTYH9gEgm9RgP1VVab8=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"a318767ca464424b8be2884bdf6330a1"}'} + headers: {cache-control: no-cache, content-length: '1350', content-type: application/json; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:03 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbU51ptGzzdu3Xr7kYqfrEjMJICwFAOptntIdzN9m921agYMClCwK5Kf7TtI52idPM7NLWIiqxzy0kbxggzvjUOa905hYVNb2uuszhU37UVtv+N56nqCGjkLJbEZsXb5xbiZ2wHXAI07arU0fFxjP6ZKQXQcfJsQdTNN+2LWUyTAsOBeWEcRP9S/8wMG23mU6/kHQ6/e5dpiO7P4xmjDcgvGFZCPBE0I20xLnmmmMbKxIyKO0+9ZNCTRhE74jZqFr/QeQaST+IV9k79xcsUgH7v7g6zu71fvIDmnUzggmbEVC20vJoTPI1tGIN1Q1JNJzhpaXj90G852bRtgiiMSMQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJ7gRT3ZOv3LBEOXWbJ1TTfJfEHnxbCerl8CoOUiffyOphdMyH9vcmJnaGrFIzDw9zwdNVI0OSWfxRI1LNymzcR0h1Ixgr1BmRD1FM5WeWb1aIve8cOgHUatfhSmht43JNW/f1bRf+ZnyH4OYLwr1L8pWMxAgFn1s/6ZMnMwlbHpGHRo3UPoEYGK96bAPj/GYNtzXwSSozWjKKajvig0haL1oe1yqsJy1JiYDkcmOX57iMMXVM75VgSkyvUY93Po0nOa+aGzaU7XdUCTH9IIcP0hkvoy4trNX52bv04rrGD0lzZLGfLN8y63eeFczm4IMfFOxTYH9gEgm9RgP1VVab8=","cancellation_requested":false,"status":"completed","target":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert","request_id":"a318767ca464424b8be2884bdf6330a1"}'} + headers: {cache-control: no-cache, content-length: '1275', content-type: application/json; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:12 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/pkcs10] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbU51ptGzzdu3Xr7kYqfrEjMJICwFAOptntIdzN9m921agYMClCwK5Kf7TtI52idPM7NLWIiqxzy0kbxggzvjUOa905hYVNb2uuszhU37UVtv+N56nqCGjkLJbEZsXb5xbiZ2wHXAI07arU0fFxjP6ZKQXQcfJsQdTNN+2LWUyTAsOBeWEcRP9S/8wMG23mU6/kHQ6/e5dpiO7P4xmjDcgvGFZCPBE0I20xLnmmmMbKxIyKO0+9ZNCTRhE74jZqFr/QeQaST+IV9k79xcsUgH7v7g6zu71fvIDmnUzggmbEVC20vJoTPI1tGIN1Q1JNJzhpaXj90G852bRtgiiMSMQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJ7gRT3ZOv3LBEOXWbJ1TTfJfEHnxbCerl8CoOUiffyOphdMyH9vcmJnaGrFIzDw9zwdNVI0OSWfxRI1LNymzcR0h1Ixgr1BmRD1FM5WeWb1aIve8cOgHUatfhSmht43JNW/f1bRf+ZnyH4OYLwr1L8pWMxAgFn1s/6ZMnMwlbHpGHRo3UPoEYGK96bAPj/GYNtzXwSSozWjKKajvig0haL1oe1yqsJy1JiYDkcmOX57iMMXVM75VgSkyvUY93Po0nOa+aGzaU7XdUCTH9IIcP0hkvoy4trNX52bv04rrGD0lzZLGfLN8y63eeFczm4IMfFOxTYH9gEgm9RgP1VVab8=} + headers: {cache-control: no-cache, content-length: '956', content-type: application/pkcs10; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:18 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbU51ptGzzdu3Xr7kYqfrEjMJICwFAOptntIdzN9m921agYMClCwK5Kf7TtI52idPM7NLWIiqxzy0kbxggzvjUOa905hYVNb2uuszhU37UVtv+N56nqCGjkLJbEZsXb5xbiZ2wHXAI07arU0fFxjP6ZKQXQcfJsQdTNN+2LWUyTAsOBeWEcRP9S/8wMG23mU6/kHQ6/e5dpiO7P4xmjDcgvGFZCPBE0I20xLnmmmMbKxIyKO0+9ZNCTRhE74jZqFr/QeQaST+IV9k79xcsUgH7v7g6zu71fvIDmnUzggmbEVC20vJoTPI1tGIN1Q1JNJzhpaXj90G852bRtgiiMSMQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJ7gRT3ZOv3LBEOXWbJ1TTfJfEHnxbCerl8CoOUiffyOphdMyH9vcmJnaGrFIzDw9zwdNVI0OSWfxRI1LNymzcR0h1Ixgr1BmRD1FM5WeWb1aIve8cOgHUatfhSmht43JNW/f1bRf+ZnyH4OYLwr1L8pWMxAgFn1s/6ZMnMwlbHpGHRo3UPoEYGK96bAPj/GYNtzXwSSozWjKKajvig0haL1oe1yqsJy1JiYDkcmOX57iMMXVM75VgSkyvUY93Po0nOa+aGzaU7XdUCTH9IIcP0hkvoy4trNX52bv04rrGD0lzZLGfLN8y63eeFczm4IMfFOxTYH9gEgm9RgP1VVab8=","cancellation_requested":false,"status":"completed","target":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert","request_id":"a318767ca464424b8be2884bdf6330a1"}'} + headers: {cache-control: no-cache, content-length: '1275', content-type: application/json; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:18 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/009522c64d6844459ec8276a902634ff","kid":"https://vault105115999791f91eda.vault.azure.net/keys/unknownIssuerCert/009522c64d6844459ec8276a902634ff","sid":"https://vault105115999791f91eda.vault.azure.net/secrets/unknownIssuerCert/009522c64d6844459ec8276a902634ff","x5t":"OuQ4J9F8bZQlUUo3IG42RP6SV44","cer":"MIIDWjCCAkKgAwIBAgIQMjMPLDisSzm/zb254vhh+jANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA1MTYxMjA3WhcNMjEwOTA1MTYyMjA3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFtTnWm0bPN27devuRip+sSMwkgLAUA6m2e0h3M32b3bVqBgwKULArkp/tO0jnaJ08zs0tYiKrHPLSRvGCDO+NQ5r3TmFhU1va66zOFTftRW2/43nqeoIaOQslsRmxdvnFuJnbAdcAjTtqtTR8XGM/pkpBdBx8mxB1M037YtZTJMCw4F5YRxE/1L/zAwbbeZTr+QdDr97l2mI7s/jGaMNyC8YVkI8ETQjbTEueaaYxsrEjIo7T71k0JNGETviNmoWv9B5BpJP4hX2Tv3FyxSAfu/uDrO7vV+8gOadTOCCZsRULbS8mhM8jW0Yg3VDUk0nOGlpeP3QbznZtG2CKIxIxAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFK1LfYQEs1A7IppOFF47BVR618W7MB0GA1UdDgQWBBStS32EBLNQOyKaThReOwVUetfFuzANBgkqhkiG9w0BAQsFAAOCAQEAnUJRGl379DUI4MVtJdpJ9vktON27usENMejHa+MIFVlPlF/Zd3AZ4/mv9G34ql4U156bYuwjyp96FnhrmFCCEGShS6CTt38zUriTUOOE/e1K69X3dyLhzgUEw7zzRWM/8eUqb87jYXBXGHFAEBARQ6rRZIfVfYWvcGp/YmFFjQD6qrhfG+0j5Kvxd5NWniR693caXXuUM8r32RXDGjwZFRq/02ykE7WZt5ZJNGYd3GOtH5yI66ZagbzS5ylBwG/mBxxwlqnUshCPoOlVCjXHc4tHVbN63p6Yz+LYn7dHClZapiIxemjXsOZ8ZkQkvtrJuJyeL90K7A1LvmjVHbB1Xg==","attributes":{"enabled":true,"nbf":1567699927,"exp":1630858927,"created":1567700527,"updated":1567700527,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567700523,"updated":1567700523}},"pending":{"id":"https://vault105115999791f91eda.vault.azure.net/certificates/unknownIssuerCert/pending"}}'} + headers: {cache-control: no-cache, content-length: '2457', content-type: application/json; + charset=utf-8, date: 'Thu, 05 Sep 2019 16:22:19 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999791f91eda.vault.azure.net, + /certificates/unknownIssuerCert, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list.yaml new file mode 100644 index 000000000000..20d60f4e56d1 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list.yaml @@ -0,0 +1,206 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert052a3107a/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:02 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert052a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert052a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert052a3107a/b3a18e55c0a943d98dc09ff68223e1d9","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert052a3107a/b3a18e55c0a943d98dc09ff68223e1d9","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert052a3107a/b3a18e55c0a943d98dc09ff68223e1d9","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639203,"updated":1567639203,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert052a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639203,"updated":1567639203}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert052a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert152a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert152a3107a/81d0cd13c1524863b262f32608a7b05e","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert152a3107a/81d0cd13c1524863b262f32608a7b05e","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert152a3107a/81d0cd13c1524863b262f32608a7b05e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639203,"updated":1567639203,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert152a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639203,"updated":1567639203}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert152a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert252a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert252a3107a/26ee16cb9adb4bb0bab9b126559614fa","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert252a3107a/26ee16cb9adb4bb0bab9b126559614fa","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert252a3107a/26ee16cb9adb4bb0bab9b126559614fa","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert252a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639204,"updated":1567639204}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:03 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert252a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert352a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert352a3107a/f72774f5726348599c1f185667ac1480","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert352a3107a/f72774f5726348599c1f185667ac1480","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert352a3107a/f72774f5726348599c1f185667ac1480","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert352a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639204,"updated":1567639204}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:04 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert352a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert452a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert452a3107a/a2ce32439fab4e62b3ae1e4789d5a41a","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert452a3107a/a2ce32439fab4e62b3ae1e4789d5a41a","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert452a3107a/a2ce32439fab4e62b3ae1e4789d5a41a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert452a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639204,"updated":1567639204}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:04 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert452a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert552a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert552a3107a/a3459b7ba72b46d1aa723fef42bc939b","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert552a3107a/a3459b7ba72b46d1aa723fef42bc939b","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert552a3107a/a3459b7ba72b46d1aa723fef42bc939b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639205,"updated":1567639205,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert552a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639205,"updated":1567639205}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:04 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert552a3107a/import, api-version=7.0, ''] +- request: + body: '{"value": "MIIJOwIBAzCCCPcGCSqGSIb3DQEHAaCCCOgEggjkMIII4DCCBgkGCSqGSIb3DQEHAaCCBfoEggX2MIIF8jCCBe4GCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAj15YH9pOE58AICB9AEggTYLrI+SAru2dBZRQRlJY7XQ3LeLkah2FcRR3dATDshZ2h0IA2oBrkQIdsLyAAWZ32qYR1qkWxLHn9AqXgu27AEbOk35+pITZaiy63YYBkkpR+pDdngZt19Z0PWrGwHEq5z6BHS2GLyyN8SSOCbdzCz7blj3+7IZYoMj4WOPgOm/tQ6U44SFWek46QwN2zeA4i97v7ftNNns27ms52jqfhOvTA9c/wyfZKAY4aKJfYYUmycKjnnRl012ldS2lOkASFt+lu4QCa72IY6ePtRudPCvmzRv2pkLYS6z3cI7omT8nHP3DymNOqLbFqr5O2M1ZYaLC63Q3xt3eVvbcPh3N08D1hHkhz/KDTvkRAQpvrW8ISKmgDdmzN55Pe55xHfSWGB7gPw8sZea57IxFzWHTK2yvTslooWoosmGxanYY2IG/no3EbPOWDKjPZ4ilYJe5JJ2immlxPz+2e2EOCKpDI+7fzQcRz3PTd3BK+budZ8aXX8aW/lOgKS8WmxZoKnOJBNWeTNWQFugmktXfdPHAdxMhjUXqeGQd8wTvZ4EzQNNafovwkI7IV/ZYoa++RGofVR3ZbRSiBNF6TDj/qXFt0wN/CQnsGAmQAGNiN+D4mY7i25dtTu/Jc7OxLdhAUFpHyJpyrYWLfvOiS5WYBeEDHkiPUa/8eZSPA3MXWZR1RiuDvuNqMjct1SSwdXADTtF68l/US1ksU657+XSC+6ly1A/upz+X71+C4Ho6W0751j5ZMT6xKjGh5pee7MVuduxIzXjWIy3YSd0fIT3U0A5NLEvJ9rfkx6JiHjRLx6V1tqsrtT6BsGtmCQR1UCJPLqsKVDvAINx3cPA/CGqr5OX2BGZlAihGmN6n7gv8w4O0k0LPTAe5YefgXN3m9pE867N31GtHVZaJ/UVgDNYS2jused4rw76ZWN41akx2QN0JSeMJqHXqVz6AKfz8ICS/dFnEGyBNpXiMRxrY/QPKi/wONwqsbDxRW7vZRVKs78pBkE0ksaShlZk5GkeayDWC/7Hi/NqUFtIloK9XB3paLxo1DGu5qqaF34jZdktzkXp0uZqpp+FfKZaiovMjt8F7yHCPk+LYpRsU2Cyc9DVoDA6rIgf+uEP4jppgehsxyT0lJHax2t869R2jYdsXwYUXjgwHIV0voj7bJYPGFlFjXOp6ZW86scsHM5xfsGQoK2Fp838VT34SHE1ZXU/puM7rviREHYW72pfpgGZUILQMohuTPnd8tFtAkbrmjLDo+k9xx7HUvgoFTiNNWuq/cRjr70FKNguMMTIrid+HwfmbRoaxENWdLcOTNeascER2a+37UQolKD5ksrPJG6RdNA7O2pzp3micDYRs/+s28cCIxO//J/d4nsgHp6RTuCu4+Jm9k0YTw2Xg75b2cWKrxGnDUgyIlvNPaZTB5QbMid4x44/lE0LLi9kcPQhRgrK07OnnrMgZvVGjt1CLGhKUv7KFc3xV1r1rwKkosxnoG99oCoTQtregcX5rIMjHgkc1IdflGJkZzaWMkYVFOJ4Weynz008i4ddkske5vabZs37Lb8iggUYNBYZyGzalruBgnQyK4fz38Fae4nWYjyildVfgyo/fCePR2ovOfphx9OQJi+M9BoFmPrAg+8ARDZ+R+5yzYuEc9ZoVX7nkp7LTGB3DANBgkrBgEEAYI3EQIxADATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGEAOAAwAGQAZgBmADgANgAtAGUAOQA2AGUALQA0ADIAMgA0AC0AYQBhADEAMQAtAGIAZAAxADkANABkADUAYQA2AGIANwA3MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggLPBgkqhkiG9w0BBwagggLAMIICvAIBADCCArUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECNX+VL2MxzzWAgIH0ICCAojmRBO+CPfVNUO0s+BVuwhOzikAGNBmQHNChmJ/pyzPbMUbx7tO63eIVSc67iERda2WCEmVwPigaVQkPaumsfp8+L6iV/BMf5RKlyRXcwh0vUdu2Qa7qadD+gFQ2kngf4Dk6vYo2/2HxayuIf6jpwe8vql4ca3ZtWXfuRix2fwgltM0bMz1g59d7x/glTfNqxNlsty0A/rWrPJjNbOPRU2XykLuc3AtlTtYsQ32Zsmu67A7UNBw6tVtkEXlFDqhavEhUEO3dvYqMY+QLxzpZhA0q44ZZ9/ex0X6QAFNK5wuWxCbupHWsgxRwKftrxyszMHsAvNoNcTlqcctee+ecNwTJQa1/MDbnhO6/qHA7cfG1qYDq8Th635vGNMW1w3sVS7l0uEvdayAsBHWTcOC2tlMa5bfHrhY8OEIqj5bN5H9RdFy8G/W239tjDu1OYjBDydiBqzBn8HG1DSj1Pjc0kd/82d4ZU0308KFTC3yGcRad0GnEH0Oi3iEJ9HbriUbfVMbXNHOF+MktWiDVqzndGMKmuJSdfTBKvGFvejAWVO5E4mgLvoaMmbchc3BO7sLeraHnJN5hvMBaLcQI38N86mUfTR8AP6AJ9c2k514KaDLclm4z6J8dMz60nUeo5D3YD09G6BavFHxSvJ8MF0Lu5zOFzEePDRFm9mH8W0N/sFlIaYfD/GWU/w44mQucjaBk95YtqOGRIj58tGDWr8iUdHwaYKGqU24zGeRae9DhFXPzZshV1ZGsBQFRaoYkyLAwdJWIXTi+c37YaC8FRSEnnNmS79Dou1Kc3BvK4EYKAD2KxjtUebrV174gD0Q+9YuJ0GXOTspBvCFd5VT2Rw5zDNrA/J3F5fMCk4wOzAfMAcGBSsOAwIaBBSxgh2xyF+88V4vAffBmZXv8Txt4AQU4O/NX4MjxSodbE7ApNAMIvrtREwCAgfQ", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999752a3107a.vault.azure.net/certificates/cert652a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert652a3107a/5dba53eee9dd4ab991b29c455171c72d","kid":"https://vault105115999752a3107a.vault.azure.net/keys/cert652a3107a/5dba53eee9dd4ab991b29c455171c72d","sid":"https://vault105115999752a3107a.vault.azure.net/secrets/cert652a3107a/5dba53eee9dd4ab991b29c455171c72d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639205,"updated":1567639205,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert652a3107a/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639205,"updated":1567639205}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:05 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates/cert652a3107a/import, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999752a3107a.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert052a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639203,"updated":1567639203},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert152a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639203,"updated":1567639203},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert252a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert352a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert452a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639204,"updated":1567639204},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert552a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639205,"updated":1567639205},"subject":""},{"id":"https://vault105115999752a3107a.vault.azure.net/certificates/cert652a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639205,"updated":1567639205},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '1700', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999752a3107a.vault.azure.net, + /certificates, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list_certificate_versions.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list_certificate_versions.yaml new file mode 100644 index 000000000000..3f4d0b4438bb --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_list_certificate_versions.yaml @@ -0,0 +1,206 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:29 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/4d8ffa107ccd45b287d6e0ee2b3a99f3","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/4d8ffa107ccd45b287d6e0ee2b3a99f3","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/4d8ffa107ccd45b287d6e0ee2b3a99f3","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639230,"updated":1567639230,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639230}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:30 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/6fa2920c894e48edaedc40770b4d009c","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/6fa2920c894e48edaedc40770b4d009c","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/6fa2920c894e48edaedc40770b4d009c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639230,"updated":1567639230,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639230}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:31 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/bbc7f4e436864777a46d0b778be456b2","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/bbc7f4e436864777a46d0b778be456b2","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/bbc7f4e436864777a46d0b778be456b2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639231,"updated":1567639231,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639231}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:31 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/9b3f82690366445f9135bce43ea2b0e7","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/9b3f82690366445f9135bce43ea2b0e7","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/9b3f82690366445f9135bce43ea2b0e7","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639231,"updated":1567639231,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639231}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:31 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/fe3422b9a2884b0ab28b8743ee46494c","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/fe3422b9a2884b0ab28b8743ee46494c","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/fe3422b9a2884b0ab28b8743ee46494c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639232}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/1eaf5deaa261444abaddf2d3cddbf282","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/1eaf5deaa261444abaddf2d3cddbf282","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/1eaf5deaa261444abaddf2d3cddbf282","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639232}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/20d520370ea64167899498a78f3b9699","kid":"https://vault1051159997b3f1934.vault.azure.net/keys/certverb3f1934/20d520370ea64167899498a78f3b9699","sid":"https://vault1051159997b3f1934.vault.azure.net/secrets/certverb3f1934/20d520370ea64167899498a78f3b9699","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639230,"updated":1567639232}}}'} + headers: {cache-control: no-cache, content-length: '1834', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/import, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/versions?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/1eaf5deaa261444abaddf2d3cddbf282","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/20d520370ea64167899498a78f3b9699","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/4d8ffa107ccd45b287d6e0ee2b3a99f3","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639230,"updated":1567639230},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/6fa2920c894e48edaedc40770b4d009c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639230,"updated":1567639230},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/9b3f82690366445f9135bce43ea2b0e7","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639231,"updated":1567639231},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/bbc7f4e436864777a46d0b778be456b2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639231,"updated":1567639231},"subject":""},{"id":"https://vault1051159997b3f1934.vault.azure.net/certificates/certverb3f1934/fe3422b9a2884b0ab28b8743ee46494c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639232,"updated":1567639232},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '1931', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault1051159997b3f1934.vault.azure.net, + /certificates/certverb3f1934/versions, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_merge_certificate.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_merge_certificate.yaml new file mode 100644 index 000000000000..cd953c23936a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_merge_certificate.yaml @@ -0,0 +1,183 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:19:58 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/create, api-version=7.0, ''] +- request: + body: '{"policy": {"x509_props": {"subject": "CN=MyCert", "sans": {}}, "issuer": + {"name": "Unknown", "cert_transparency": false}}}' + headers: + Accept: [application/json] + Content-Length: ['123'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGxLfDM8uEO6PClPjXlNCk+wwT533ScmOgFPOpFNST+WikkEIFanReG/tD/Y/1Gl7af3ytlH/NL3bcFh2f41KjasjdbWmZUPoghVYwgug1mvP9zACfa1Uu4FOyMbj+g/sCzcmHF4atoa+VTVPbRU+qJxTmzk7WPAiQxZC6dDtsBfV5qROxrl1TcdOO2g0xh2JdUMBlo0fNN+mzoaCfnzc/GxBQEUNawzBwOzNVyQhClFn60J/oARdpmMB/dzMEmyvcHZazklf5tL6I4C+0xq7WWLpil309lu4XTWVsaDHVHYhXA2eMVhr39HDKKInfVxPiq+oGLibzg4cwZmgdCiFQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADG3VStfoMZpoYnp5a2eRk18mkbUBOCm7bQL18h6Pj+Qr7y+ZlBuUqGwMfzWF4ZodvShG7gNJ12zfCZYX+8AYAPIjzQ0uszwAexcvxL4mI03kaeB0ArDCAT1ieK/8QHaJWTba7OyaR5YNIXO44E5qH0gQ2ldXHZca6Q525j2+ux817SJV7WFDtiSwHXepUyd/mN/8yikFRoKI8KDzImqp0I9kL7eURvvNEMdfcC1b+GTdB1ZSSxEjAp0pJtlYcDDIIBZLwc4231JSNSW+/hJ2dNSrUKuvVVTHnlH2XJM/RFMAMKiJuA5FurFJG4zXkZz0tiEAepU4+FEjJpoAllM24o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"0f7101bc540444a68d2c23dc21fef5cc"}'} + headers: + cache-control: no-cache + content-length: '1230' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:19:59 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '4', c, a, '6', '1', '5', b, '0', ., v, a, u, l, + t, ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, + m, e, r, g, e, C, e, r, t, i, f, i, c, a, t, e, /, p, e, n, d, i, n, g, '?', + a, p, i, '-', v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, + t, _, i, d, '=', '0', f, '7', '1', '0', '1', b, c, '5', '4', '0', '4', '4', + '4', a, '6', '8', d, '2', c, '2', '3', d, c, '2', '1', f, e, f, '5', c, c] + pragma: no-cache + retry-after: '10' + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGxLfDM8uEO6PClPjXlNCk+wwT533ScmOgFPOpFNST+WikkEIFanReG/tD/Y/1Gl7af3ytlH/NL3bcFh2f41KjasjdbWmZUPoghVYwgug1mvP9zACfa1Uu4FOyMbj+g/sCzcmHF4atoa+VTVPbRU+qJxTmzk7WPAiQxZC6dDtsBfV5qROxrl1TcdOO2g0xh2JdUMBlo0fNN+mzoaCfnzc/GxBQEUNawzBwOzNVyQhClFn60J/oARdpmMB/dzMEmyvcHZazklf5tL6I4C+0xq7WWLpil309lu4XTWVsaDHVHYhXA2eMVhr39HDKKInfVxPiq+oGLibzg4cwZmgdCiFQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADG3VStfoMZpoYnp5a2eRk18mkbUBOCm7bQL18h6Pj+Qr7y+ZlBuUqGwMfzWF4ZodvShG7gNJ12zfCZYX+8AYAPIjzQ0uszwAexcvxL4mI03kaeB0ArDCAT1ieK/8QHaJWTba7OyaR5YNIXO44E5qH0gQ2ldXHZca6Q525j2+ux817SJV7WFDtiSwHXepUyd/mN/8yikFRoKI8KDzImqp0I9kL7eURvvNEMdfcC1b+GTdB1ZSSxEjAp0pJtlYcDDIIBZLwc4231JSNSW+/hJ2dNSrUKuvVVTHnlH2XJM/RFMAMKiJuA5FurFJG4zXkZz0tiEAepU4+FEjJpoAllM24o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"0f7101bc540444a68d2c23dc21fef5cc"}'} + headers: {cache-control: no-cache, content-length: '1230', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:00 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGxLfDM8uEO6PClPjXlNCk+wwT533ScmOgFPOpFNST+WikkEIFanReG/tD/Y/1Gl7af3ytlH/NL3bcFh2f41KjasjdbWmZUPoghVYwgug1mvP9zACfa1Uu4FOyMbj+g/sCzcmHF4atoa+VTVPbRU+qJxTmzk7WPAiQxZC6dDtsBfV5qROxrl1TcdOO2g0xh2JdUMBlo0fNN+mzoaCfnzc/GxBQEUNawzBwOzNVyQhClFn60J/oARdpmMB/dzMEmyvcHZazklf5tL6I4C+0xq7WWLpil309lu4XTWVsaDHVHYhXA2eMVhr39HDKKInfVxPiq+oGLibzg4cwZmgdCiFQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADG3VStfoMZpoYnp5a2eRk18mkbUBOCm7bQL18h6Pj+Qr7y+ZlBuUqGwMfzWF4ZodvShG7gNJ12zfCZYX+8AYAPIjzQ0uszwAexcvxL4mI03kaeB0ArDCAT1ieK/8QHaJWTba7OyaR5YNIXO44E5qH0gQ2ldXHZca6Q525j2+ux817SJV7WFDtiSwHXepUyd/mN/8yikFRoKI8KDzImqp0I9kL7eURvvNEMdfcC1b+GTdB1ZSSxEjAp0pJtlYcDDIIBZLwc4231JSNSW+/hJ2dNSrUKuvVVTHnlH2XJM/RFMAMKiJuA5FurFJG4zXkZz0tiEAepU4+FEjJpoAllM24o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"0f7101bc540444a68d2c23dc21fef5cc"}'} + headers: {cache-control: no-cache, content-length: '1230', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:10 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGxLfDM8uEO6PClPjXlNCk+wwT533ScmOgFPOpFNST+WikkEIFanReG/tD/Y/1Gl7af3ytlH/NL3bcFh2f41KjasjdbWmZUPoghVYwgug1mvP9zACfa1Uu4FOyMbj+g/sCzcmHF4atoa+VTVPbRU+qJxTmzk7WPAiQxZC6dDtsBfV5qROxrl1TcdOO2g0xh2JdUMBlo0fNN+mzoaCfnzc/GxBQEUNawzBwOzNVyQhClFn60J/oARdpmMB/dzMEmyvcHZazklf5tL6I4C+0xq7WWLpil309lu4XTWVsaDHVHYhXA2eMVhr39HDKKInfVxPiq+oGLibzg4cwZmgdCiFQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADG3VStfoMZpoYnp5a2eRk18mkbUBOCm7bQL18h6Pj+Qr7y+ZlBuUqGwMfzWF4ZodvShG7gNJ12zfCZYX+8AYAPIjzQ0uszwAexcvxL4mI03kaeB0ArDCAT1ieK/8QHaJWTba7OyaR5YNIXO44E5qH0gQ2ldXHZca6Q525j2+ux817SJV7WFDtiSwHXepUyd/mN/8yikFRoKI8KDzImqp0I9kL7eURvvNEMdfcC1b+GTdB1ZSSxEjAp0pJtlYcDDIIBZLwc4231JSNSW+/hJ2dNSrUKuvVVTHnlH2XJM/RFMAMKiJuA5FurFJG4zXkZz0tiEAepU4+FEjJpoAllM24o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"0f7101bc540444a68d2c23dc21fef5cc"}'} + headers: {cache-control: no-cache, content-length: '1230', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:20 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGxLfDM8uEO6PClPjXlNCk+wwT533ScmOgFPOpFNST+WikkEIFanReG/tD/Y/1Gl7af3ytlH/NL3bcFh2f41KjasjdbWmZUPoghVYwgug1mvP9zACfa1Uu4FOyMbj+g/sCzcmHF4atoa+VTVPbRU+qJxTmzk7WPAiQxZC6dDtsBfV5qROxrl1TcdOO2g0xh2JdUMBlo0fNN+mzoaCfnzc/GxBQEUNawzBwOzNVyQhClFn60J/oARdpmMB/dzMEmyvcHZazklf5tL6I4C+0xq7WWLpil309lu4XTWVsaDHVHYhXA2eMVhr39HDKKInfVxPiq+oGLibzg4cwZmgdCiFQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADG3VStfoMZpoYnp5a2eRk18mkbUBOCm7bQL18h6Pj+Qr7y+ZlBuUqGwMfzWF4ZodvShG7gNJ12zfCZYX+8AYAPIjzQ0uszwAexcvxL4mI03kaeB0ArDCAT1ieK/8QHaJWTba7OyaR5YNIXO44E5qH0gQ2ldXHZca6Q525j2+ux817SJV7WFDtiSwHXepUyd/mN/8yikFRoKI8KDzImqp0I9kL7eURvvNEMdfcC1b+GTdB1ZSSxEjAp0pJtlYcDDIIBZLwc4231JSNSW+/hJ2dNSrUKuvVVTHnlH2XJM/RFMAMKiJuA5FurFJG4zXkZz0tiEAepU4+FEjJpoAllM24o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"0f7101bc540444a68d2c23dc21fef5cc"}'} + headers: {cache-control: no-cache, content-length: '1230', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:31 GMT', expires: '-1', pragma: no-cache, + retry-after: '10', server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending, api-version=7.0, ''] +- request: + body: '{"x5c": ["TUlJQ3lqQ0NBYklDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREFlRncweE9UQTVNRFF5TXpJd016RmFGdzB4T1RBNU1EUXlNekl4TXpGYU1CRXhEekFOQmdOVkJBTVRCazE1UTJWeWREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpoc1Mzd3pQTGhEdWp3cFQ0MTVUUXBQc01FK2Q5MG5Kam9CVHpxUlRVay9sb3BKQkNCV3AwWGh2N1EvMlA5UnBlMm45OHJaUi96UzkyM0JZZG4rTlNvMnJJM1cxcG1WRDZJSVZXTUlMb05acnovY3dBbjJ0Vkx1QlRzakc0L29QN0FzM0poeGVHcmFHdmxVMVQyMFZQcWljVTVzNU8xandJa01XUXVuUTdiQVgxZWFrVHNhNWRVM0hUanRvTk1ZZGlYVkRBWmFOSHpUZnBzNkdnbjU4M1B4c1FVQkZEV3NNd2NEc3pWY2tJUXBSWit0Q2Y2QUVYYVpqQWYzY3pCSnNyM0IyV3M1SlgrYlMraU9BdnRNYXUxbGk2WXBkOVBaYnVGMDFsYkdneDFSMklWd05uakZZYTkvUnd5aWlKMzFjVDRxdnFCaTRtODRPSE1HWm9IUW9oVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVhrSTc2TXByNzF0cnB2L0hPdWVla1hHN0RuaklXQ0lMYXFEakhmWG5NRi8waGJOR0duMFVHLzhqVW82Skp4dGFob3dDUFJnUnlSQjlBU054dzkwUW9vcGNkRXB2VGRoVjJNT1ZJUzcvc0JkL1AvRTBQczFXL1RuM01YWEI0dmVFVTZIT3ZZVWxicUF1VkVINzgzR3ZML3J2NUkwOXJhVXRkODlOWTdCUU1ucU5GMXdxdUhncDkzRGQ5eW53WjU4RjV1cW1ScCtaaE1iWEVOR3JSdVczK1pTcE11UnIydktJUFhGSVd1cDU3anQyazZIRktYTE9qNGIwUzY3K2g3UnAwVTcxNHNFbTZGbE9hWHVaek9jNk9EQUN6Yy9VNVJ5bHhJeUZaRi95c3dGMXorLzdHb092WE1XUDRabWZGVEMyNk1zbHVVQUVDMS9mSHVMUlNTREtyUT09"]}' + headers: + Accept: [application/json] + Content-Length: ['1293'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending/merge?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/f569bd2e9204432e83be21b5d0482cc8","kid":"https://vault10511599974ca615b0.vault.azure.net/keys/mergeCertificate/f569bd2e9204432e83be21b5d0482cc8","sid":"https://vault10511599974ca615b0.vault.azure.net/secrets/mergeCertificate/f569bd2e9204432e83be21b5d0482cc8","x5t":"2Jp1hsImwkL1g5HLthACVt9kiAk","cer":"MIICyjCCAbICAQEwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MDQyMzIwMzFaFw0xOTA5MDQyMzIxMzFaMBExDzANBgNVBAMTBk15Q2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJhsS3wzPLhDujwpT415TQpPsME+d90nJjoBTzqRTUk/lopJBCBWp0Xhv7Q/2P9Rpe2n98rZR/zS923BYdn+NSo2rI3W1pmVD6IIVWMILoNZrz/cwAn2tVLuBTsjG4/oP7As3JhxeGraGvlU1T20VPqicU5s5O1jwIkMWQunQ7bAX1eakTsa5dU3HTjtoNMYdiXVDAZaNHzTfps6Ggn583PxsQUBFDWsMwcDszVckIQpRZ+tCf6AEXaZjAf3czBJsr3B2Ws5JX+bS+iOAvtMau1li6Ypd9PZbuF01lbGgx1R2IVwNnjFYa9/RwyiiJ31cT4qvqBi4m84OHMGZoHQohUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAXkI76Mpr71trpv/HOueekXG7DnjIWCILaqDjHfXnMF/0hbNGGn0UG/8jUo6JJxtahowCPRgRyRB9ASNxw90QoopcdEpvTdhV2MOVIS7/sBd/P/E0Ps1W/Tn3MXXB4veEU6HOvYUlbqAuVEH783GvL/rv5I09raUtd89NY7BQMnqNF1wquHgp93Dd9ynwZ58F5uqmRp+ZhMbXENGrRuW3+ZSpMuRr2vKIPXFIWup57jt2k6HFKXLOj4b0S67+h7Rp0U714sEm6FlOaXuZzOc6ODACzc/U5RylxIyFZF/yswF1z+/7GoOvXMWP4ZmfFTC26MsluUAEC1/fHuLRSSDKrQ==","attributes":{"enabled":true,"nbf":1567639231,"exp":1567639291,"created":1567639231,"updated":1567639231,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=MyCert","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown","cert_transparency":false},"attributes":{"enabled":true,"created":1567639200,"updated":1567639200}},"pending":{"id":"https://vault10511599974ca615b0.vault.azure.net/certificates/mergeCertificate/pending"}}'} + headers: + cache-control: no-cache + content-length: '2251' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:20:31 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '4', c, a, '6', '1', '5', b, '0', ., v, a, u, l, + t, ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, + m, e, r, g, e, C, e, r, t, i, f, i, c, a, t, e, '?', a, p, i, '-', v, e, r, + s, i, o, n, '=', '7', ., '0'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 201, message: Created} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending/merge, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_policy.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_policy.yaml new file mode 100644 index 000000000000..9ef9186d7739 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_policy.yaml @@ -0,0 +1,110 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:05 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999774cf114e.vault.azure.net, + /certificates/policyCertificate/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/c3178ec2a3eb40f79a23f9105b2a6d05","kid":"https://vault105115999774cf114e.vault.azure.net/keys/policyCertificate/c3178ec2a3eb40f79a23f9105b2a6d05","sid":"https://vault105115999774cf114e.vault.azure.net/secrets/policyCertificate/c3178ec2a3eb40f79a23f9105b2a6d05","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639266,"updated":1567639266,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}}}'} + headers: {cache-control: no-cache, content-length: '1850', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999774cf114e.vault.azure.net, + /certificates/policyCertificate/import, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}}'} + headers: {cache-control: no-cache, content-length: '550', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999774cf114e.vault.azure.net, + /certificates/policyCertificate/policy, api-version=7.0, ''] +- request: + body: '{"key_props": {"exportable": true, "kty": "RSA", "key_size": 2048, "reuse_key": + false}, "secret_props": {"contentType": "application/x-pkcs12"}, "issuer": {"name": + "Self"}}' + headers: + Accept: [application/json] + Content-Length: ['172'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}}'} + headers: {cache-control: no-cache, content-length: '547', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999774cf114e.vault.azure.net, + /certificates/policyCertificate/policy, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999774cf114e.vault.azure.net/certificates/policyCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}}'} + headers: {cache-control: no-cache, content-length: '547', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999774cf114e.vault.azure.net, + /certificates/policyCertificate/policy, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_recover_and_purge.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_recover_and_purge.yaml new file mode 100644 index 000000000000..8d0408cb4800 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_recover_and_purge.yaml @@ -0,0 +1,1037 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/import?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:37 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec04d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:37 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec04d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:38 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec14d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec24d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec34d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec44d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec54d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/3447274e3da841109e34e81801b27c86","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec64d8615c8/3447274e3da841109e34e81801b27c86","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec64d8615c8/3447274e3da841109e34e81801b27c86","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec64d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:40 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg04d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:41 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg14d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:41 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg24d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639242,"updated":1567639242}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:42 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg34d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "MIIJOwIBAzCCCPcGCSqGSIb3DQEHAaCCCOgEggjkMIII4DCCBgkGCSqGSIb3DQEHAaCCBfoEggX2MIIF8jCCBe4GCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAj15YH9pOE58AICB9AEggTYLrI+SAru2dBZRQRlJY7XQ3LeLkah2FcRR3dATDshZ2h0IA2oBrkQIdsLyAAWZ32qYR1qkWxLHn9AqXgu27AEbOk35+pITZaiy63YYBkkpR+pDdngZt19Z0PWrGwHEq5z6BHS2GLyyN8SSOCbdzCz7blj3+7IZYoMj4WOPgOm/tQ6U44SFWek46QwN2zeA4i97v7ftNNns27ms52jqfhOvTA9c/wyfZKAY4aKJfYYUmycKjnnRl012ldS2lOkASFt+lu4QCa72IY6ePtRudPCvmzRv2pkLYS6z3cI7omT8nHP3DymNOqLbFqr5O2M1ZYaLC63Q3xt3eVvbcPh3N08D1hHkhz/KDTvkRAQpvrW8ISKmgDdmzN55Pe55xHfSWGB7gPw8sZea57IxFzWHTK2yvTslooWoosmGxanYY2IG/no3EbPOWDKjPZ4ilYJe5JJ2immlxPz+2e2EOCKpDI+7fzQcRz3PTd3BK+budZ8aXX8aW/lOgKS8WmxZoKnOJBNWeTNWQFugmktXfdPHAdxMhjUXqeGQd8wTvZ4EzQNNafovwkI7IV/ZYoa++RGofVR3ZbRSiBNF6TDj/qXFt0wN/CQnsGAmQAGNiN+D4mY7i25dtTu/Jc7OxLdhAUFpHyJpyrYWLfvOiS5WYBeEDHkiPUa/8eZSPA3MXWZR1RiuDvuNqMjct1SSwdXADTtF68l/US1ksU657+XSC+6ly1A/upz+X71+C4Ho6W0751j5ZMT6xKjGh5pee7MVuduxIzXjWIy3YSd0fIT3U0A5NLEvJ9rfkx6JiHjRLx6V1tqsrtT6BsGtmCQR1UCJPLqsKVDvAINx3cPA/CGqr5OX2BGZlAihGmN6n7gv8w4O0k0LPTAe5YefgXN3m9pE867N31GtHVZaJ/UVgDNYS2jused4rw76ZWN41akx2QN0JSeMJqHXqVz6AKfz8ICS/dFnEGyBNpXiMRxrY/QPKi/wONwqsbDxRW7vZRVKs78pBkE0ksaShlZk5GkeayDWC/7Hi/NqUFtIloK9XB3paLxo1DGu5qqaF34jZdktzkXp0uZqpp+FfKZaiovMjt8F7yHCPk+LYpRsU2Cyc9DVoDA6rIgf+uEP4jppgehsxyT0lJHax2t869R2jYdsXwYUXjgwHIV0voj7bJYPGFlFjXOp6ZW86scsHM5xfsGQoK2Fp838VT34SHE1ZXU/puM7rviREHYW72pfpgGZUILQMohuTPnd8tFtAkbrmjLDo+k9xx7HUvgoFTiNNWuq/cRjr70FKNguMMTIrid+HwfmbRoaxENWdLcOTNeascER2a+37UQolKD5ksrPJG6RdNA7O2pzp3micDYRs/+s28cCIxO//J/d4nsgHp6RTuCu4+Jm9k0YTw2Xg75b2cWKrxGnDUgyIlvNPaZTB5QbMid4x44/lE0LLi9kcPQhRgrK07OnnrMgZvVGjt1CLGhKUv7KFc3xV1r1rwKkosxnoG99oCoTQtregcX5rIMjHgkc1IdflGJkZzaWMkYVFOJ4Weynz008i4ddkske5vabZs37Lb8iggUYNBYZyGzalruBgnQyK4fz38Fae4nWYjyildVfgyo/fCePR2ovOfphx9OQJi+M9BoFmPrAg+8ARDZ+R+5yzYuEc9ZoVX7nkp7LTGB3DANBgkrBgEEAYI3EQIxADATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGEAOAAwAGQAZgBmADgANgAtAGUAOQA2AGUALQA0ADIAMgA0AC0AYQBhADEAMQAtAGIAZAAxADkANABkADUAYQA2AGIANwA3MF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBvAHMAbwBmAHQAIABTAHQAcgBvAG4AZwAgAEMAcgB5AHAAdABvAGcAcgBhAHAAaABpAGMAIABQAHIAbwB2AGkAZABlAHIwggLPBgkqhkiG9w0BBwagggLAMIICvAIBADCCArUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECNX+VL2MxzzWAgIH0ICCAojmRBO+CPfVNUO0s+BVuwhOzikAGNBmQHNChmJ/pyzPbMUbx7tO63eIVSc67iERda2WCEmVwPigaVQkPaumsfp8+L6iV/BMf5RKlyRXcwh0vUdu2Qa7qadD+gFQ2kngf4Dk6vYo2/2HxayuIf6jpwe8vql4ca3ZtWXfuRix2fwgltM0bMz1g59d7x/glTfNqxNlsty0A/rWrPJjNbOPRU2XykLuc3AtlTtYsQ32Zsmu67A7UNBw6tVtkEXlFDqhavEhUEO3dvYqMY+QLxzpZhA0q44ZZ9/ex0X6QAFNK5wuWxCbupHWsgxRwKftrxyszMHsAvNoNcTlqcctee+ecNwTJQa1/MDbnhO6/qHA7cfG1qYDq8Th635vGNMW1w3sVS7l0uEvdayAsBHWTcOC2tlMa5bfHrhY8OEIqj5bN5H9RdFy8G/W239tjDu1OYjBDydiBqzBn8HG1DSj1Pjc0kd/82d4ZU0308KFTC3yGcRad0GnEH0Oi3iEJ9HbriUbfVMbXNHOF+MktWiDVqzndGMKmuJSdfTBKvGFvejAWVO5E4mgLvoaMmbchc3BO7sLeraHnJN5hvMBaLcQI38N86mUfTR8AP6AJ9c2k514KaDLclm4z6J8dMz60nUeo5D3YD09G6BavFHxSvJ8MF0Lu5zOFzEePDRFm9mH8W0N/sFlIaYfD/GWU/w44mQucjaBk95YtqOGRIj58tGDWr8iUdHwaYKGqU24zGeRae9DhFXPzZshV1ZGsBQFRaoYkyLAwdJWIXTi+c37YaC8FRSEnnNmS79Dou1Kc3BvK4EYKAD2KxjtUebrV174gD0Q+9YuJ0GXOTspBvCFd5VT2Rw5zDNrA/J3F5fMCk4wOzAfMAcGBSsOAwIaBBSxgh2xyF+88V4vAffBmZXv8Txt4AQU4O/NX4MjxSodbE7ApNAMIvrtREwCAgfQ", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639242,"updated":1567639242}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:42 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg44d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639243,"updated":1567639243}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:42 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg54d8615c8/import, api-version=7.0, ''] +- request: + body: '{"value": "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", + "pwd": "123", "policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}}}' + headers: + Accept: [application/json] + Content-Length: ['3339'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639243,"updated":1567639243}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:42 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg64d8615c8/import, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8","deletedDate":1567639243,"scheduledPurgeDate":1575415243,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec04d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec14d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec24d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec34d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec44d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec54d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/3447274e3da841109e34e81801b27c86","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec64d8615c8/3447274e3da841109e34e81801b27c86","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec64d8615c8/3447274e3da841109e34e81801b27c86","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec64d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg04d8615c8/134e6d0a13044377a980a28a1a6b2659","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg04d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg14d8615c8/2625cf0a208d48fd8657a07f78e4c7c9","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg14d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg24d8615c8/3feef9d4d99445ecb45ef3505f54f961","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639241,"updated":1567639241}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg24d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg34d8615c8/96c60fef0e52499c807bab76037c0ac2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639242,"updated":1567639242}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg34d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg44d8615c8/43d5e1bdbed2465d97795b1e0422455f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639242,"updated":1567639242}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg44d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg54d8615c8/c65292a3f2094713b65c35410d16dd7d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639243,"updated":1567639243}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg54d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certprg64d8615c8/a6de48fe152c4bc68c1f936f6ad32e0d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639243,"updated":1567639243}}}'} + headers: {cache-control: no-cache, content-length: '2015', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:20:44 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certprg64d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg04d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg14d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg24d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639241,"updated":1567639241,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg34d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg44d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639242,"updated":1567639242,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg54d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8","deletedDate":1567639245,"scheduledPurgeDate":1575415245,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certprg64d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639243,"updated":1567639243,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8","deletedDate":1567639243,"scheduledPurgeDate":1575415243,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8","deletedDate":1567639244,"scheduledPurgeDate":1575415244,"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"}}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '5991', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:15 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:15 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec04d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:15 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec14d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec24d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec34d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec44d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec54d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/3447274e3da841109e34e81801b27c86","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec64d8615c8/3447274e3da841109e34e81801b27c86","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec64d8615c8/3447274e3da841109e34e81801b27c86","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certrec64d8615c8/recover, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg04d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg14d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg24d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg34d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:17 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg44d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:17 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg54d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Wed, 04 Sep 2019 23:21:17 GMT', expires: '-1', + pragma: no-cache, server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 204, message: No Content} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates/certprg64d8615c8, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '28', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /deletedcertificates, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec04d8615c8/90e794e86b394ff9b8dcfe2955314317","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec04d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec04d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec14d8615c8/6406a2924d354b0088de43eedf767d1d","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639238,"updated":1567639238,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec14d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639238,"updated":1567639238}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec14d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec24d8615c8/b415123f99b44b0bb0b4dde2ab133ae2","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec24d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec24d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec34d8615c8/20b26f83091b4ed884c6b798aef695b1","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639239,"updated":1567639239,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec34d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639239,"updated":1567639239}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec34d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec44d8615c8/d05be1a5d67e447095d593f546fbdd9e","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec44d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec44d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec54d8615c8/709d0ae3905c4e8fae941cfb92003f9b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec54d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec54d8615c8/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/3447274e3da841109e34e81801b27c86","kid":"https://vault10511599974d8615c8.vault.azure.net/keys/certrec64d8615c8/3447274e3da841109e34e81801b27c86","sid":"https://vault10511599974d8615c8.vault.azure.net/secrets/certrec64d8615c8/3447274e3da841109e34e81801b27c86","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","cer":"MIICODCCAeagAwIBAgIQqHmpBAv+CY9IJFoUhlbziTAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTE1MDQyOTIxNTM0MVoXDTM5MTIzMTIzNTk1OVowFzEVMBMGA1UEAxMMS2V5VmF1bHRUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5bVAT73zr4+N4WVv2+SvTunAw08ksS4BrJW/nNliz3S9XuzMBMXvmYzU5HJ8TtEgluBiZZYd5qsMJD+OXHSNbsLdmMhni0jYX09h3XlC2VJw2sGKeYF+xEaavXm337aZZaZyjrFBrrUl51UePaN+kVFXNlBb3N3TYpqa7KokXenJQuR+i9Gv9a77c0UsSsDSryxppYhKK7HvTZCpKrhVtulF5iPMswWe9np3uggfMamyIsK/0L7X9w9B2qN7993RR0A00nOk4H6CnkuwO77dSsD0KJsk6FyAoZBzRXDZh9+d9R76zCL506NcQy/jl0lCiQYwsUX73PG5pxOh02OwKwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBAGqIjo2geVagzuzaZOe1ClGKhZeiCKfWAxklaGN+qlGUbVS4IN4V1lot3VKnzabasmkEHeNxPwLn1qvSD0cX9CE=","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567639240,"updated":1567639240,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599974d8615c8.vault.azure.net/certificates/certrec64d8615c8/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=KeyVaultTest","ekus":[],"key_usage":[],"validity_months":297,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"EmailContacts"}}],"issuer":{"name":"Unknown"},"attributes":{"enabled":true,"created":1567639240,"updated":1567639240}}}'} + headers: {cache-control: no-cache, content-length: '1858', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:48 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599974d8615c8.vault.azure.net, + /certificates/certrec64d8615c8/, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_samples.test_hello_word_sample.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_samples.test_hello_word_sample.yaml new file mode 100644 index 000000000000..d38e8e967fc0 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_samples.test_hello_word_sample.yaml @@ -0,0 +1,462 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/create?api-version=7.0 + response: + body: + string: '' + headers: + cache-control: + - no-cache + content-length: + - '0' + date: + - Tue, 23 Jul 2019 20:52:35 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + www-authenticate: + - Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net" + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 401 + message: Unauthorized +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["onedrive.microsoft.com", + "xbox.microsoft.com"]}, "validity_months": 24}, "issuer": {"name": "Self"}}, + "attributes": {"exp": 1595451156}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '364' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: POST + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/create?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtJC3dQ6ygr/l2TbV9sKoqGSZx095zk4nc32MBZ9JIu9qo8SGIsui24zPoKlM72rGU8bZ/ywWhZ2Dspq0T+C7dEWrIgQZRazqs//Mb61aT1aNXxlHxk4X4mNYh2TIzh4xJmDP9k8UE4q0ItX1c+Q7K4oiYc8csMQOpq7Bj0VTe8k1x+T3VrmowQEo/tY4IeZLlR86vhWHYmOApyVhauMUbCBVQZ5uDyyvnam6x+jEXEhK6zC3lF3b4JULYMdmqWZxKxX3dOPRUTY5l1fs3rsQ+T7BauGdF3AutFLmGQnsPrkayUKuoWlzrDqlmkkr1wjg+3vV7b7OzYGpueRtwfmLwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAG/U3RHK2agnvzsN4T2UhPpLWf5oaVdThoZN4gK3tAoRpqpqnpOKeFOmi+puZNWvay6toUUsBNbRkhebkhSGIfCxmEVW+C2RdKw9qUib4fhD3l51lR0qmo2HUSpbkVj6zKiha1YsTxZhM2OalhU1ZRiNYv5Okz8UkGanpS1fN3mbOXFuxZ9vjQ9Q9GJm9wtho0A+9YnUK1l2XDHsw9PlrtjTbCBwSszQO2y7ypSI5nUp98Fahs44uJddFmADWPkQYNRPaQHAzM49QPwTcpJB8FInXrVrKwYs7Mkimst5gR+AnTTz9dS8hDdRzc3uPWF7SimWh0ekkcHTVbLzvmDN+m4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d6a1fad225ae41279c24da255feb25ed"}' + headers: + cache-control: + - no-cache + content-length: + - '1380' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:37 GMT + expires: + - '-1' + location: + - https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending?api-version=7.0&request_id=d6a1fad225ae41279c24da255feb25ed + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtJC3dQ6ygr/l2TbV9sKoqGSZx095zk4nc32MBZ9JIu9qo8SGIsui24zPoKlM72rGU8bZ/ywWhZ2Dspq0T+C7dEWrIgQZRazqs//Mb61aT1aNXxlHxk4X4mNYh2TIzh4xJmDP9k8UE4q0ItX1c+Q7K4oiYc8csMQOpq7Bj0VTe8k1x+T3VrmowQEo/tY4IeZLlR86vhWHYmOApyVhauMUbCBVQZ5uDyyvnam6x+jEXEhK6zC3lF3b4JULYMdmqWZxKxX3dOPRUTY5l1fs3rsQ+T7BauGdF3AutFLmGQnsPrkayUKuoWlzrDqlmkkr1wjg+3vV7b7OzYGpueRtwfmLwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAG/U3RHK2agnvzsN4T2UhPpLWf5oaVdThoZN4gK3tAoRpqpqnpOKeFOmi+puZNWvay6toUUsBNbRkhebkhSGIfCxmEVW+C2RdKw9qUib4fhD3l51lR0qmo2HUSpbkVj6zKiha1YsTxZhM2OalhU1ZRiNYv5Okz8UkGanpS1fN3mbOXFuxZ9vjQ9Q9GJm9wtho0A+9YnUK1l2XDHsw9PlrtjTbCBwSszQO2y7ypSI5nUp98Fahs44uJddFmADWPkQYNRPaQHAzM49QPwTcpJB8FInXrVrKwYs7Mkimst5gR+AnTTz9dS8hDdRzc3uPWF7SimWh0ekkcHTVbLzvmDN+m4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d6a1fad225ae41279c24da255feb25ed"}' + headers: + cache-control: + - no-cache + content-length: + - '1380' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:37 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtJC3dQ6ygr/l2TbV9sKoqGSZx095zk4nc32MBZ9JIu9qo8SGIsui24zPoKlM72rGU8bZ/ywWhZ2Dspq0T+C7dEWrIgQZRazqs//Mb61aT1aNXxlHxk4X4mNYh2TIzh4xJmDP9k8UE4q0ItX1c+Q7K4oiYc8csMQOpq7Bj0VTe8k1x+T3VrmowQEo/tY4IeZLlR86vhWHYmOApyVhauMUbCBVQZ5uDyyvnam6x+jEXEhK6zC3lF3b4JULYMdmqWZxKxX3dOPRUTY5l1fs3rsQ+T7BauGdF3AutFLmGQnsPrkayUKuoWlzrDqlmkkr1wjg+3vV7b7OzYGpueRtwfmLwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAG/U3RHK2agnvzsN4T2UhPpLWf5oaVdThoZN4gK3tAoRpqpqnpOKeFOmi+puZNWvay6toUUsBNbRkhebkhSGIfCxmEVW+C2RdKw9qUib4fhD3l51lR0qmo2HUSpbkVj6zKiha1YsTxZhM2OalhU1ZRiNYv5Okz8UkGanpS1fN3mbOXFuxZ9vjQ9Q9GJm9wtho0A+9YnUK1l2XDHsw9PlrtjTbCBwSszQO2y7ypSI5nUp98Fahs44uJddFmADWPkQYNRPaQHAzM49QPwTcpJB8FInXrVrKwYs7Mkimst5gR+AnTTz9dS8hDdRzc3uPWF7SimWh0ekkcHTVbLzvmDN+m4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d6a1fad225ae41279c24da255feb25ed"}' + headers: + cache-control: + - no-cache + content-length: + - '1380' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:47 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtJC3dQ6ygr/l2TbV9sKoqGSZx095zk4nc32MBZ9JIu9qo8SGIsui24zPoKlM72rGU8bZ/ywWhZ2Dspq0T+C7dEWrIgQZRazqs//Mb61aT1aNXxlHxk4X4mNYh2TIzh4xJmDP9k8UE4q0ItX1c+Q7K4oiYc8csMQOpq7Bj0VTe8k1x+T3VrmowQEo/tY4IeZLlR86vhWHYmOApyVhauMUbCBVQZ5uDyyvnam6x+jEXEhK6zC3lF3b4JULYMdmqWZxKxX3dOPRUTY5l1fs3rsQ+T7BauGdF3AutFLmGQnsPrkayUKuoWlzrDqlmkkr1wjg+3vV7b7OzYGpueRtwfmLwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAG/U3RHK2agnvzsN4T2UhPpLWf5oaVdThoZN4gK3tAoRpqpqnpOKeFOmi+puZNWvay6toUUsBNbRkhebkhSGIfCxmEVW+C2RdKw9qUib4fhD3l51lR0qmo2HUSpbkVj6zKiha1YsTxZhM2OalhU1ZRiNYv5Okz8UkGanpS1fN3mbOXFuxZ9vjQ9Q9GJm9wtho0A+9YnUK1l2XDHsw9PlrtjTbCBwSszQO2y7ypSI5nUp98Fahs44uJddFmADWPkQYNRPaQHAzM49QPwTcpJB8FInXrVrKwYs7Mkimst5gR+AnTTz9dS8hDdRzc3uPWF7SimWh0ekkcHTVbLzvmDN+m4=","cancellation_requested":false,"status":"completed","target":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate","request_id":"d6a1fad225ae41279c24da255feb25ed"}' + headers: + cache-control: + - no-cache + content-length: + - '1299' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:57 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","kid":"https://vaulte55813c7.vault.azure.net/keys/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","sid":"https://vaulte55813c7.vault.azure.net/secrets/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","x5t":"-2ZhyDVO_SoGnaYPzivwNHyud_o","cer":"MIIDczCCAlugAwIBAgIQD8O5tQ7hQgu9DL5idDTynzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwNzIzMjA0MjU2WhcNMjEwNzIzMjA1MjU2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+0kLd1DrKCv+XZNtX2wqioZJnHT3nOTidzfYwFn0ki72qjxIYiy6LbjM+gqUzvasZTxtn/LBaFnYOymrRP4Lt0RasiBBlFrOqz/8xvrVpPVo1fGUfGThfiY1iHZMjOHjEmYM/2TxQTirQi1fVz5DsriiJhzxywxA6mrsGPRVN7yTXH5PdWuajBASj+1jgh5kuVHzq+FYdiY4CnJWFq4xRsIFVBnm4PLK+dqbrH6MRcSErrMLeUXdvglQtgx2apZnErFfd049FRNjmXV+zeuxD5PsFq4Z0XcC60UuYZCew+uRrJQq6haXOsOqWaSSvXCOD7e9Xtvs7Ngam55G3B+YvAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBSLux1NVjquqt+V95FKTOQzczUxiDAdBgNVHQ4EFgQUi7sdTVY6rqrflfeRSkzkM3M1MYgwDQYJKoZIhvcNAQELBQADggEBAE8UP6BFgsWbuBfzLDm2E6MVRvT49tWVc5lNqUQniNjixN4Z2ECLD7Gy5lENolPBSJ1GU+OoMOseOtJRcdfL4miW9Eti8pBzj6cSRzc5IJcyZQEsXPNmQW6jkbfqnX0qrXwYpFvV39LcxH0HNGSzljA2xudyas4mwhM3K9z24+deDbc++yaCFsvCzsZo3KdXymklYvW7kfWlTiNTpy8sliZ0WCGrOAQ4adx7HqFxFkvsfjoYII0hvh2+bDXgqBZ0ggwGhYWN/9/x7T2qsnrHvfLJ/blWZCRu1li02p8HKPXuFByuI/oBUMsm6364LcWNPSnuypOEJxrod2LqCtHKWig=","attributes":{"enabled":true,"nbf":1563914576,"exp":1627073576,"created":1563915176,"updated":1563915176,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1563915157,"updated":1563915157}},"pending":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending"}}' + headers: + cache-control: + - no-cache + content-length: + - '2497' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:57 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: '{"attributes": {"exp": 1658609576}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '35' + Content-Type: + - application/json; charset=utf-8 + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: PATCH + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/?api-version=7.0 + response: + body: + string: '{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","kid":"https://vaulte55813c7.vault.azure.net/keys/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","sid":"https://vaulte55813c7.vault.azure.net/secrets/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","x5t":"-2ZhyDVO_SoGnaYPzivwNHyud_o","cer":"MIIDczCCAlugAwIBAgIQD8O5tQ7hQgu9DL5idDTynzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwNzIzMjA0MjU2WhcNMjEwNzIzMjA1MjU2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+0kLd1DrKCv+XZNtX2wqioZJnHT3nOTidzfYwFn0ki72qjxIYiy6LbjM+gqUzvasZTxtn/LBaFnYOymrRP4Lt0RasiBBlFrOqz/8xvrVpPVo1fGUfGThfiY1iHZMjOHjEmYM/2TxQTirQi1fVz5DsriiJhzxywxA6mrsGPRVN7yTXH5PdWuajBASj+1jgh5kuVHzq+FYdiY4CnJWFq4xRsIFVBnm4PLK+dqbrH6MRcSErrMLeUXdvglQtgx2apZnErFfd049FRNjmXV+zeuxD5PsFq4Z0XcC60UuYZCew+uRrJQq6haXOsOqWaSSvXCOD7e9Xtvs7Ngam55G3B+YvAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBSLux1NVjquqt+V95FKTOQzczUxiDAdBgNVHQ4EFgQUi7sdTVY6rqrflfeRSkzkM3M1MYgwDQYJKoZIhvcNAQELBQADggEBAE8UP6BFgsWbuBfzLDm2E6MVRvT49tWVc5lNqUQniNjixN4Z2ECLD7Gy5lENolPBSJ1GU+OoMOseOtJRcdfL4miW9Eti8pBzj6cSRzc5IJcyZQEsXPNmQW6jkbfqnX0qrXwYpFvV39LcxH0HNGSzljA2xudyas4mwhM3K9z24+deDbc++yaCFsvCzsZo3KdXymklYvW7kfWlTiNTpy8sliZ0WCGrOAQ4adx7HqFxFkvsfjoYII0hvh2+bDXgqBZ0ggwGhYWN/9/x7T2qsnrHvfLJ/blWZCRu1li02p8HKPXuFByuI/oBUMsm6364LcWNPSnuypOEJxrod2LqCtHKWig=","attributes":{"enabled":true,"nbf":1563914576,"exp":1627073576,"created":1563915176,"updated":1563915177,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1563915157,"updated":1563915157}},"pending":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending"}}' + headers: + cache-control: + - no-cache + content-length: + - '2497' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:57 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: DELETE + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate?api-version=7.0 + response: + body: + string: '{"recoveryId":"https://vaulte55813c7.vault.azure.net/deletedcertificates/HelloWorldCertificate","deletedDate":1563915178,"scheduledPurgeDate":1571691178,"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","kid":"https://vaulte55813c7.vault.azure.net/keys/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","sid":"https://vaulte55813c7.vault.azure.net/secrets/HelloWorldCertificate/b7722258cbc34e54a5f84eff09e8d7d8","x5t":"-2ZhyDVO_SoGnaYPzivwNHyud_o","cer":"MIIDczCCAlugAwIBAgIQD8O5tQ7hQgu9DL5idDTynzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwNzIzMjA0MjU2WhcNMjEwNzIzMjA1MjU2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+0kLd1DrKCv+XZNtX2wqioZJnHT3nOTidzfYwFn0ki72qjxIYiy6LbjM+gqUzvasZTxtn/LBaFnYOymrRP4Lt0RasiBBlFrOqz/8xvrVpPVo1fGUfGThfiY1iHZMjOHjEmYM/2TxQTirQi1fVz5DsriiJhzxywxA6mrsGPRVN7yTXH5PdWuajBASj+1jgh5kuVHzq+FYdiY4CnJWFq4xRsIFVBnm4PLK+dqbrH6MRcSErrMLeUXdvglQtgx2apZnErFfd049FRNjmXV+zeuxD5PsFq4Z0XcC60UuYZCew+uRrJQq6haXOsOqWaSSvXCOD7e9Xtvs7Ngam55G3B+YvAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBSLux1NVjquqt+V95FKTOQzczUxiDAdBgNVHQ4EFgQUi7sdTVY6rqrflfeRSkzkM3M1MYgwDQYJKoZIhvcNAQELBQADggEBAE8UP6BFgsWbuBfzLDm2E6MVRvT49tWVc5lNqUQniNjixN4Z2ECLD7Gy5lENolPBSJ1GU+OoMOseOtJRcdfL4miW9Eti8pBzj6cSRzc5IJcyZQEsXPNmQW6jkbfqnX0qrXwYpFvV39LcxH0HNGSzljA2xudyas4mwhM3K9z24+deDbc++yaCFsvCzsZo3KdXymklYvW7kfWlTiNTpy8sliZ0WCGrOAQ4adx7HqFxFkvsfjoYII0hvh2+bDXgqBZ0ggwGhYWN/9/x7T2qsnrHvfLJ/blWZCRu1li02p8HKPXuFByuI/oBUMsm6364LcWNPSnuypOEJxrod2LqCtHKWig=","attributes":{"enabled":true,"nbf":1563914576,"exp":1627073576,"created":1563915176,"updated":1563915177,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1563915157,"updated":1563915157}},"pending":{"id":"https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/pending"}}' + headers: + cache-control: + - no-cache + content-length: + - '2649' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:57 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.6 (Windows-10-10.0.18362-SP0) azure-core/1.0.0b2 azsdk-python-azure-keyvault/7.0 + method: GET + uri: https://vaulte55813c7.vault.azure.net/certificates/HelloWorldCertificate/?api-version=7.0 + response: + body: + string: '{"error":{"code":"CertificateNotFound","message":"Certificate not found: + HelloWorldCertificate"}}' + headers: + cache-control: + - no-cache + content-length: + - '97' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 23 Jul 2019 20:52:57 GMT + expires: + - '-1' + pragma: + - no-cache + server: + - Microsoft-IIS/10.0 + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - addr=131.107.160.200;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.0.872 + x-powered-by: + - ASP.NET + status: + code: 404 + message: Not Found +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_backup_restore.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_backup_restore.yaml new file mode 100644 index 000000000000..b4c0cd12fc6b --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_backup_restore.yaml @@ -0,0 +1,239 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:11 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["onedrive.microsoft.com", + "xbox.microsoft.com"]}, "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['329'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0elpYWWfbSYp+wgAfp49HyFl6p/kTN9a8Spunp8T/BEqJHWWTq1zk/VaRBTsQiWOAuzEqWaktMlSHkxqLogGjNnUBGcLPg8v9z58gj3F5+75p198/5gGLYGDBEWjldjuGVfquTo4e+26l/+DuMuyZbWrPWk2JDavWsyyErU14LhNZVeQx5iAFN8EbSjdNm0Sql175JeuEIaap8UPBQCDrboXmZkIFcX7SauzE9E7LvGuowHOjtxyk+SBWGodccFzrPXeIFGKzLm5Fc/5Oa82qUZpHojqzCQ3LwKQWMZqGY9t5m3H9wFQfiRH65vet/AP7x76pEzi6K7o3qHX98ROeQIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIALS8dQ4TW4R7nOnpLY0VKB3fzhXTwU/lky0LMS0v5j5bACueMwwHGeS/1V4Pghymi076jlFiGCK/d2kpN4gI8sY+xVvNgVimNpWbcR/xv8/pTytsSeY0EHKBQGqGBf8FHLZoXFYRfspup/mU03YxJihrlZOAWIxnmDi0yIpnCP4wpCCISVKAsRHtq2Gne6n1FuQwzo6EyGd2JbnU3pXEKdx99UqYYseJEve8mWomBJeWt5PcuTutZldFWO+V5gqBrGXwkkz8t9dIl4nb76yWw9yEfI3nsUIp458lcI++HKfvD1yGoIjHYRSee/jxuHWwodvaCEN5Ll1kcbhnrJIkM=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"af25b76a7e7449e68a1cf8bce8aad55a"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:13 GMT'] + expires: ['-1'] + location: ['https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=af25b76a7e7449e68a1cf8bce8aad55a'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0elpYWWfbSYp+wgAfp49HyFl6p/kTN9a8Spunp8T/BEqJHWWTq1zk/VaRBTsQiWOAuzEqWaktMlSHkxqLogGjNnUBGcLPg8v9z58gj3F5+75p198/5gGLYGDBEWjldjuGVfquTo4e+26l/+DuMuyZbWrPWk2JDavWsyyErU14LhNZVeQx5iAFN8EbSjdNm0Sql175JeuEIaap8UPBQCDrboXmZkIFcX7SauzE9E7LvGuowHOjtxyk+SBWGodccFzrPXeIFGKzLm5Fc/5Oa82qUZpHojqzCQ3LwKQWMZqGY9t5m3H9wFQfiRH65vet/AP7x76pEzi6K7o3qHX98ROeQIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIALS8dQ4TW4R7nOnpLY0VKB3fzhXTwU/lky0LMS0v5j5bACueMwwHGeS/1V4Pghymi076jlFiGCK/d2kpN4gI8sY+xVvNgVimNpWbcR/xv8/pTytsSeY0EHKBQGqGBf8FHLZoXFYRfspup/mU03YxJihrlZOAWIxnmDi0yIpnCP4wpCCISVKAsRHtq2Gne6n1FuQwzo6EyGd2JbnU3pXEKdx99UqYYseJEve8mWomBJeWt5PcuTutZldFWO+V5gqBrGXwkkz8t9dIl4nb76yWw9yEfI3nsUIp458lcI++HKfvD1yGoIjHYRSee/jxuHWwodvaCEN5Ll1kcbhnrJIkM=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"af25b76a7e7449e68a1cf8bce8aad55a"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:13 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0elpYWWfbSYp+wgAfp49HyFl6p/kTN9a8Spunp8T/BEqJHWWTq1zk/VaRBTsQiWOAuzEqWaktMlSHkxqLogGjNnUBGcLPg8v9z58gj3F5+75p198/5gGLYGDBEWjldjuGVfquTo4e+26l/+DuMuyZbWrPWk2JDavWsyyErU14LhNZVeQx5iAFN8EbSjdNm0Sql175JeuEIaap8UPBQCDrboXmZkIFcX7SauzE9E7LvGuowHOjtxyk+SBWGodccFzrPXeIFGKzLm5Fc/5Oa82qUZpHojqzCQ3LwKQWMZqGY9t5m3H9wFQfiRH65vet/AP7x76pEzi6K7o3qHX98ROeQIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIALS8dQ4TW4R7nOnpLY0VKB3fzhXTwU/lky0LMS0v5j5bACueMwwHGeS/1V4Pghymi076jlFiGCK/d2kpN4gI8sY+xVvNgVimNpWbcR/xv8/pTytsSeY0EHKBQGqGBf8FHLZoXFYRfspup/mU03YxJihrlZOAWIxnmDi0yIpnCP4wpCCISVKAsRHtq2Gne6n1FuQwzo6EyGd2JbnU3pXEKdx99UqYYseJEve8mWomBJeWt5PcuTutZldFWO+V5gqBrGXwkkz8t9dIl4nb76yWw9yEfI3nsUIp458lcI++HKfvD1yGoIjHYRSee/jxuHWwodvaCEN5Ll1kcbhnrJIkM=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"af25b76a7e7449e68a1cf8bce8aad55a"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:23 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0elpYWWfbSYp+wgAfp49HyFl6p/kTN9a8Spunp8T/BEqJHWWTq1zk/VaRBTsQiWOAuzEqWaktMlSHkxqLogGjNnUBGcLPg8v9z58gj3F5+75p198/5gGLYGDBEWjldjuGVfquTo4e+26l/+DuMuyZbWrPWk2JDavWsyyErU14LhNZVeQx5iAFN8EbSjdNm0Sql175JeuEIaap8UPBQCDrboXmZkIFcX7SauzE9E7LvGuowHOjtxyk+SBWGodccFzrPXeIFGKzLm5Fc/5Oa82qUZpHojqzCQ3LwKQWMZqGY9t5m3H9wFQfiRH65vet/AP7x76pEzi6K7o3qHX98ROeQIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIALS8dQ4TW4R7nOnpLY0VKB3fzhXTwU/lky0LMS0v5j5bACueMwwHGeS/1V4Pghymi076jlFiGCK/d2kpN4gI8sY+xVvNgVimNpWbcR/xv8/pTytsSeY0EHKBQGqGBf8FHLZoXFYRfspup/mU03YxJihrlZOAWIxnmDi0yIpnCP4wpCCISVKAsRHtq2Gne6n1FuQwzo6EyGd2JbnU3pXEKdx99UqYYseJEve8mWomBJeWt5PcuTutZldFWO+V5gqBrGXwkkz8t9dIl4nb76yWw9yEfI3nsUIp458lcI++HKfvD1yGoIjHYRSee/jxuHWwodvaCEN5Ll1kcbhnrJIkM=","cancellation_requested":false,"status":"completed","target":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name","request_id":"af25b76a7e7449e68a1cf8bce8aad55a"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:33 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnJWaFNhSERkY1FSNnRkNWN3RlU5XzEyRjZ0RDNxeG5SU2gta1ZIbmROWGl3WFFjazM2ZDNUdmExNkdlajVBQVIyeE9lSk9BeG5NUFBPaWsyN1JIRU5lRnJSMzBrdEx5YnlXblo4Tk5XRXlMTFlIN2M0dlpPTHJjeUgxYlVNZ1hvb1FlcTdndThIc0NxWndzWVgwNlZVVGE1LXJTZ3pYc0JLMWg4dDBFRm9CcUlFZzNaLU8yM3FRYkg0Mks0cC1yenBJY0I4bC1FYkQwSVZRQXNQTjJPNU5GRTZDM2hudGlQM0R5RGJtSDF2dEpPNlhYN0JwSmU0Z2ZHV3pDdThLOF80R1htZzBxcFRfUVFvd1dqSnl1MmJsOTBlZllERGszemJRODFlRHUxTEdWS0dVekpJY3lDaV94bHlrSWVFOXo5Y3otVVdKamx0a3VhVTdqanVSVUN0QS5ZcGdhRzJHeWR0c0lUQjlSRFB6Q29nLk5IeTl6X3pTSi05a053NkM4anhaYUdCMGxzQ0swcVdKazJEN2RoNUVCTXJMdEhMSk5kTE5NU0Y4M1VNcFNwN3lKWlFzUUlwSXpSbTNaNlVqYzd4THRkbndkUENMQllfeTJrOXhVMk5MQkVYZmoyUGs5bWhGbDNyM1V2alVFYzEwaUcyNzhxd3hoM0xCU0oySEZvelAxVUNaSHN3WjVmc0RyMDlOVE1BZTdmT1gtUUFERkt2Q1ltVERDMHVVSFF5elg4N2g0dzRWVlY2QnFhcGdOZ3FkeWZ0SnFHaFJpbXFnV0xRVE1OYldBVXNsdF9JemdzazRKYldKU3ZHMWt0NUgybUczb21COE12T190QllqSTVRdEdfeVdIVW1xV2NJbWtWMXl4Zml2bUhUQkRuQjlTZ2Zhelp4NVVkeDdDS2xMdmVZTHhkN1Q0VDN6anlvSjAtMlFoVzZuak1XMTBVbEtxRWNLNnIwUUhtRFEtcUJrbklTdnBDNURabDBWdFRTeUtJNGg5R05nZVQ4SlFaWkpOZFdKb0ZrcGpoemZvOU8zY2RkeU8tdWw2NjY1OG9SZUpnUDY2SThNcXdCMi1aYk0wR1ktVUVRMno4aTBVMUpQWTF4RE9hT1JOcW9hTmVOVTg5cUFKaUFJNWV6MXVKMGliS2lNb3M2TTczaEhsMUc2aEhtaEtudkJYbU9FSXdhZU9VRFk2amkxdS03RlI1RV9VUHlLNDA5ZUdIT1c3ZGJlX1c5My1DUVFWRGpHRE1KdkhBN2w2ZC1jYloyUmlnYmdDblRoSE93ZFV3aDdzcHZSb3hIbW42d2dTd2FUQTFoeFFtT28wYlIwTmc4WTlicWc3eUR1b0Y3OWR0UTlvUFZzLURPR0dDbXlzMlpELU9EUk96eS16eFVCblVBZ0o5UDB2WHFaNEc4SElac2xaWnBpV3V0THdPT0U3dlhzUGlBdFl0ZGJiOUt1cHZHOGkzd2NZSjdycDBMWGZteUN2clZ3QVRUcWlXQ0tCMTBMTHZNVmZSYVZqRWRZSU9RRXFKVDljMWc0VUY0NWhLS3hpMzhlamlSRVc2OHVmQ2t3cnNsaGRzUUZ4ZGdGd1VkVS1CVXdEQmRwajZ2MTlURmY4Xy1hcE10MUtvSERQRjc1TDR3aTBEX2hwcl9VUGJFOTdxSDNGZ3EwaGx6R3JuampRZXg2NXNJZWh1V3M0UXVDRjFaZDNSTmF1Sy14QzUzWko4RVA0MlBQUWQ0ZFVrZWJfM1hYWEdvYW5uRHgwSTFPTnJQUWZiU0tNbmNaYjZ0dTVoMTFQZHA4Wi1tRjJWdnU4cEgtd2hZMk9yNXI1SFhrQnA0X3pQbjZLMnlRNEkzMnZvY2dNNmQ0WXU4RDJUbFBPb2lWclZmeHdLOU5IWlFxalF2MTMtMWpaY0tydWJMZWlwY2pqeldZcFQtLWJwZmRtSG5yNWFZT2lHNS1JR0RHUzJDZzNnZGw0NlZzUFdwQUh6MWJGOHNYakVGSlVXZ0J1MVdzOUlZby1tRWJfM0tiSHVUTFdfSkstWkZVbUliWnAtR1pTNFpWMThiM2JsR1k5NWMwQldSV1R1OFZDNmpoaG1TbkcwM090XzV6RkNCaFR0WDlNWHV0Q191YnJwcUJuOHpfN2ZkUTVhT3k4QXZqSEJ1S19pMUtZTkdQVE1RaVp1VXBiU2VNRVhFVUFzYzloY1lSZ0pFc0ZzeERNRzIzcUFSeDBCMGJINDF4emZmbm54LXJUWXpTRks3V2gxRThMOV93VXVTZng3dDBoSjJ0SEFuMTJ0Zm4zNmpteHZyQzZrV0RxTmJKNzdUOHczLUM5QWlHMlpJMnpEem0tMTBDZEVKSF9FWXJidXFpbXdMcW44cl82TWdNV25TTTJrU0x1ZUEyOGFhRE1SN2hPUXUyZ3V0d2x0eXJacHhnM0JCWHdQTEUySGxIZnBjX2llSnJhdlByeWNHYlJQVE83X0s1SGZxYUxsYVh6QXA0RmtIMXpiRmFfMGx2Vk9sSWRreGM3NWdGeURCSXVva3lldnVqUlExMHctd1NrNWlnRG8xWGtDT0o3M3JFeU9hcU9XRWhVSldhcUdaMXVicWNuUkpndGlIZ0ZrVmpFN1phcUlWbUpwLVJmcTFhZ3FYYkhoQmJ3QU5OM0dNZWl6dWFST2QzU3JsVldjZkRWWS03b0Z0bVlqWXE5OWxlbHl0ZGsyME02QVlXeGwtM0ZfdnV4eEVXc0F3ZGdxMVEwS2RrYXBhZ3J3d3czb19IQWQ0T2NJZ1AxMGtpelFhOUozMnM0SFdNbVJLYlJETGtlX2dCZDd1Wl9ZWC1nbTVBbTdHc0d3VnJqY1NmV08yOGFvdmFtNVFRdkozcWVzNXhlQ3JkNlhlUlZJVjVsRGpWUlQybDhzVFA4TlRNS3g5SWhRTC1tVlB0ZloxNnl4RV9GWU95NGN3V3hnamNTNmlxZExxclJYdTZhX3J3MGhpRDNneGRQaGJTVm1ndUd6UFhrS0xqU09XTEYySloyUUlsQ3M4c3dTQUxLQ051TnZUejZtcXF3bk9lN3cza3pobW9DNTJtVVlIUGFmaUwtbDNxSE5PZzZFWENsM3g2aXB6alVPZnhfVzdsaVNmdWYyczVVWGxHSG5pdzI1NVRXeVU1QjhTOVUwOGVyd2tad09HLWJhVndDNXliQWNZZHZtQUxSZWtac0RlZXZIREtSWm5WNUh6Y3lOcXVYbVkzZ3M4V2dGY1ZQc2ZKRVpHQ29rWWZRTTdtRmItT1hycldFRF9RTHlQeTdUUGFLVjc2YmowZVdqYXliWkcwNmtBZFgtTndLWEtPaF9CVkdIYXl2UVVDRHRyQ0NtUGVUa0p3X2dZbjJJemtMamI2Z2dDMkRNbzZNUmxLRDNGWW1pVlcxVngzNlhja2tXTHMtZHpuaUQ0WmRPd1lCUVRYckIwQkN5S2l3U3BqNGx3QkpnYjBhMEFHSjVIQTBKQS1iNDI1TGZCQ1pFODd4ZHpURG02clJ3VlRjT21uaVdCQlJyZmxmLS1RWWtIalpyVWhwSnU0VktpWng0V3hocExhOERZYnpTN3QtbURMeW9fRnJ4eWl5S1hiVE1FN2xPOVViWE5zcURXUFRBV1pscDFQNE9IWkg3Vnk1T2tZY2dwYlY0dHZYbl9HcDNPaVg5VE94bXRkWmZHcW42UzVKUjFocDYtSEMwcEgyVFRyNlM1T0daOHI1elBsUEVmbFFJenF4cjZ0Tlh0MjFHVk9fSWN5cmhsZ2NiWXpuYmcxWk5YOEJWYy15dDVTajdZZG9KbUQ2WkJwMjVmY2tRNlVfRlVkb0VCOU9ETmdLWUlnMUwyVE10WXNQUlIweUxoUUtHcUlwREUwNG9yXzFSR2dLN1lhQm9RekV4d1o1M3lUNU9wNWdMdFI2ckg0Xzh0cTJHTmJYTldlc0p6dnBtdjFVbnZjQTFqNXlNdmNaWC1DN1pNVkQzWlF1VnktTUNRWFNDWUE2aWpDbGcwU08xajh3cXFodGczV0dCREtXZmRSQ0ZJWlhjNUx2aHZzTGs0RTJQcmtTWi1YNVRpZ01ueDBOeGJhODFQZmFwZnVYdWw3S3M5YUpIOXl3QlFSaHdyeER1SHVueTBMWGt4UWJLbEx1c1ZoekNLeGx2QzhCVXhNWlVLZDFUS1hWb09KbmdqUTRCZ1Vob1ZJMGNhQ0RCbHlrbTZheHZkWjBiVV85U3RpZkpRTHNseHBic0xrcW1ZRHl3NUxHSVVFWE5mMy1UQTZBWVZpdTM3R3J6RHZfMUJkNW1DX2lsaEFaSDhXYTV2R0IxYTVTTDRWdHZsdDZmako4bTU0MDlPTFVMYVlRbGs4ZnQ5T1EwT3RYVkFuQVdMclltUDVmVEM0LThyYVYxajhvS1pucDJNMklqSVk3c245SkdyaFE5NTlpSlhrcWFEU3h6bFZBTkZob0d3bEJqRTU1RV9QWkx2ODlUaUZteXJVdTgzbmtOQXVXd1NuSTZqV0RFdEdrcWdCdng3RlZ6dU9DWm94a2xkRzFNTndXSGEzNXBoQ0hpa0ZPUmNjVjEzdFNHVUtWRllTQVowdUZYWlJ1V08zUW1iV21mMm11SVhYdzBwZGhVc2FCeUs0d0hnZzRRLXREcFNSRFVrWlpBM25nY2U1QjAxMWhBUEVjV0M1bk1sVHhSRkQtSkx0Z1daTVAwMTNyNXBvbC1kZjVpblh5Qy14RENZWFJ1MHN5cmVtcEw0a0dlVVFYaVBGSloyaEZPbkxNbEZSaFlMTVdfZFlRcWg2MjVqdDRxS1BQY3o1WHVmel9UckR5dmRpaHMzWXJEdFY2ZU1MSHNTY3FSYzVRenlCVzdISEs4UnlDWlVqZnUxTXllMGZreml4eDExREYyVmtVT2JFU3A2RS1JY28zRU13ZnN2VTJBOFY2NnlMcGwyT1lEQVlLSWhHcWhhd3ZqUjNxZGRMWThhb2xiTlpFUmRYUWRMa3d0aFlBcHFNb0hZeURibWpBQlhZU0FZeVBsN1BaWE4wUTFBQzhhU1JCb3hZUTJmWFl4OHB3bExsVVFEVVdYaDk1eGJWM3dTbjhTcVpKdjV0Mm9uMEZiUHFSQWlpUDNoeVF4eDhhTnc1QmJjSng4bWVpTkJtMkZLUkJpbzUyT28wOHFkVERWbWlIVjd3WHdmWEJrNkNpYUswNVduUTdfUFI1Y1RtZ3FIQnE1Z3oxLU5fWnctZVZSUFBCNEZ0V2FhcXFDMTZySjI1MjBTZlFETWxvRG8wcXBPcGU4VXJTUFJndXJiYXZ3UWJtTUtpTmdJc1djcUFTaW8xLUJIVjNlcFllaHNHdllXVjBteVlpblN5R0hRVzBTR0tNeXljMmZvN2dpVjM4RG5DdlNSak16cXdLNlBBNUlva0x6N3hjTGpQT2E0VDJ5cHAtNHY5YmVTbUVTSkI3U0huNThmY1M0OXc4ZWY0Q3ZGVXRWckJoSHlZS2k3VnNwVkJSOEQtNms5czExQlROaGtRNW1leDFWQmFJUndTMXB6UU1JbDZ1QkIyenJYVEdmRnVoZVNvZGkwMGJ1NXFmamdvdE8yX3J3MUlGVlBPdFc0c29NVU9jeW1PRVROOE84dnd0WEZfbDFsVkJBLUlfSDl0RC0xT25mYzVyRVpKMzctSE1wMXVtS083RXBtQ2lIbDhhdHZ1b1FsRERmY2NfbjJfRHFqQWItSTQ4SFIxZ2YyZ1BhRlI2a25oQnNvcTlERGR5S2EwWFViekRaQ3daMFdSYUFOc00ycFdoU0U5RURHZkxQVThMMVQxTGxucnpUYnVYUm11UHlRb0k2dFQzUjJFN184cVlQWjlKMGw1cHhuNFRoa2pMalFqckNLRjZ4VllPejRGMDU4OXhaUjVCSUp2TmNYMTgxSkZWakY4NFktU29OREZsUklsX0Z4ZmJHYXVlYmV6X1RWMVB0MWFWM3A3UVRCRlRUb2RTemt1RVJzTFdJUjRZN1M4dnBUV2FNWGlVUS1ncy1saXlfWE5sc2lfTkExRkwtZUlVUzU2QVVOSWk4QV9iUkx2V0kyTHpZcVhXSUNOMngtd3QxTW84Qm11MGZqX1pkVVkzR00xUVhkSFNjMXJ2d2VWblN2c2pkUmZUUGc0V2xRUTBxT1pxMVJNSjhpWTdkSlRXTXJmeVo3eFVRVTdBVWRLeTk4ajhIc0FPVHZtVlNkWDl0aVVLSWZUNUZKekdDRnR6RVJ1WUp2SHl2clczYjhPVWpGc1FQSWJVUi00dEprelFjX3BsaEJVd2lvUlM3UXNuVklhX3lPcmludklzRkxWSE9qY2F1SS1JaEtPcGZjb1RNSmV2dHI4bHlBNHZseW9PS19hN3BDR29uOHV4dUtlT1JLTnVuVkRhVEhLYndpVllsaEFkYm5MYlB5emZSc3JKdE9DdTM1Yy15QWVKdW9naWQtemJPc3VuRXUyRTFOYTByY2hMMUVtb0dpcFk3N1kxMTZIZDRZYVBzRXp2TEp1U3ZWX25QWnROT05IRkdidDFjMUh1d21FTXFxZmJvbTJCU3lqbW91UlM5WVFEQ3pLZ2xTV3JSWU5KRlhLS0pjdDlnZWFZR0l1dlNGdG52cUttNnBTaTJHNl9hOGpoUDJJSkxCdkVXV0FMbHBRRFFTMUZTN3Ria3FtMzAyTTZHYVUzNTFQRURBRTRFaVQ5LXhITkRFT2xvMUx3Q1JXOUdncjNDUnhoTjBvZ1pyQTZWclhoM05aeENjYnR3WkFQSS1oaWZtTnhfR0ZqNno4bVhOcEk5WGhRNkJxY3E0Vk80eXFRdHpnNkVZTHkxM2ZKaFViREc2aGpwWkY3dTFaaWpxdzFjMEhfLV93dlNJYWdONVJXdjRlMHdSVzhXWXZjaWl3WWs1dFJXWUdIeV9hdVdfNUVrUUlEa0lEcEpSdkoyaENFcjhGeUdoN1NjdjJQUHU0dGxhS040d3JoRzhKR1VVbWRfRzRaUURuYk56MHQ3Qi04UE00cExrUkZzWW45eVAzS2RoX3FDU2JpaXNTa1RScVNHeXZZXzBaZVBTa0JPRmh5X21KSzRtdGU4eHBQYVVkTUNITVhxV3VrcWRiTmFQaVZjR2U2bUJia1hZME5YY1BBWWE2ZEJXU0tLVDdSTV9mYlg3RVd6WEZ4OGxZVVAtODEzVGJnYWVjeExidC1hc05MWmZ0dTUtNzJDRVlEd3NOUUVoZFdTOVk0aktlRlVuSU9Ba2RlMFVYN0NpNk9wV1NCTW1TQm1SOHNWdnp2UUdaVlUyNFlZdmtEaVM3SzVsU2hERDNRTmY4MVdfVnJtc0F5Rlk4QzNyUEZTMzM5TXFBMEZyVnZMS2NtX2kyOVVPWEZBaUtlYTJuY21BUm5xUW4xZUwzYThJYUx1RXRtOHRsdnk4Vk1vVjdfLTY0ZmtpM1NDSmVWZVpad2MzRWdFZ3FIN1RQa0tlUks3NTBRT1ZTdzlGYVZnYUVUeGQ4cmM2NHZXeDBDUkcyVXo0dGtmM0pTZHF5bVhFTUFlZzMxcExITHJfSXRuaWxhTE9PcVVfSEc0RjkxeTdfNUpVcHR3Q1R0Y0U2MlVQS0o5bVB6bXk4MVlnS0djZFBUOEJCdTlua0pnWmljSjVyMnhRWGlzNUZIUG5TV3lDMEVMRm43bnpWOWhNcF94N09fM2s0UzMxQUFyR2lmR1c1MFBqV0hTdFZVSzFiUW5CYmlwc29vUkhIVHJFcTl4NlZBNS1wNk5KWU9CeW5tVUhrNXFyTGh2ZENLQ1dPT2hlM2E4OW5fSnZWVlBhcG9KVGdIeXpPUDJ1UFJLaWZGLXBzMUxrQlYzbGFHeFdQR2dESjk2MUxtN2tjQlB0bGpBZWZpU3pRaUVEcXhjbHhBRGpxOTNUeDVtOERuZ2xfV2p6MlNiR0VfUUpXVmpIVnhJNXJEaFhwWGFCYnkwUDlyRzJQMHVYSG1SNzR1Nkd4NURFcW95ajNjWEppYmpwV09UYjhVQTM4a05xVkt3YjhqTnhBeUJ6UXV6YjBGcFBNOFk5MDZRajhDSmxmT0x4b0xRbXdTellya2w3QnMwM3hTajQ0c3RtQ1dLY0JkSUxkb0N3bWNfb3RzRUY5ZWFJdHZsdGRhZlJCMlEwRTBseTl3ZnU1NW5PeFN6ZEdKQVI0TUI1VVBZdGZGMng0Yy1TSHAtMHdTczE5SVdpU3N4WXAtYUtQTXVjZ3VBR3AzUGZMRW9jMnpHYXFPUmFLZUxqMnhEdW5zS2VSZDY2dUJPZzgyWl9ITVdTRXVqU29fdDVqeDBCSUZPcTd2czdOcW1NNUItUjVHLUUyZTMwTThCU2JPQkd2UDNVRTU2OFloQ3VIMUdidjdubnBjd2h4YjV6NG8yRDNobWhKQU5mWGU4eXdVMkxQc3VCcU44SkwtZDI1czBkUHZIT0theWt1TDZXWkdEUFpPQVoxWnNzLXJXOEYycTRvYnZrc19IWVg1eWtRZlNPdFBKZDdmZmo3Z3ZaTG9hMFFHbGs3cnRhN05kQTRrYnNJMXZHZ0xONkxNQlVtUFBaMW5rTm94OTE5NWNuUHpfOGtxYUNzaVQtQXVuZW82cW9sUERvcWhTTDdjS2RGbF9DMVRnZThGMHI3TENfTC1ROUdxUno1THc2LXlGYjZDWmhOQkQ5SVN0R3FZS0l4X1dMV094dVVTQlJoWUhYSU1KYjJEVUVNZlh0VkRyMjNmMTRUczV2cjIwTG9oQ0s1MWdkeng4SUtWMTRDa1prM0hXQi00QkluaTl4clFmWC1zcFNOX3g0OTdzRkFobF9WUGN0Rmc4RGY5T3lrcnZSdm1XOTZQRjBaSlNOV0NtWkRuR3ZtN3kxc2FTV0hTXzVxQW14SmZWdTFoOHgyNWZDRjZsSjItQWVmVTVTUFo4NTZOakk3YUwzb2ZfM3ljZWV3VWRfbWpnclFmV0c4RHUwNUlhUU1UdVhwUS1OSWFUNEZ3dmdWdEFrbGJWdkNnOFRMbTF1WkQxVkpPZ3dPWTFhSlFaZmxKOVRrT05Rb2RUNldzallLWnFTaXVTWlNsTU5NcHVYQlU2Um5PU2FaX1NpdWkyWlF4ZTBENHpBak50VUtUam1MdE1abWhFRWdVVUhhcUdvVHg3YXJDTy1Ec0xfZW9uMFlYWGpMN1RadXp6blNSYXI1TV9zSk5LblE0aG5OQUZGcUgtSDZqRVdRbUVaUGtkX0lEeHVQNHB0SDJYSm5fOFZaekUzelpDLXFVQ0FEaFl6dnlDUkVKdkp3WURNUHgtOENWUU8yRW00VXVsWWlPR01BM19rRUFIZk1hcGhYMGd4UGdfZHdLR3BGclotZkF6Uk9rbXZyZnlnakppb1ZRakVUVWJ2bTBjRzloZ3QyWmdSWlFsUjQ4bi1LUDFPZ2hYQkxVbTlqR1Z2NFJ1akhzUGRVaHlqdzl5MFJFQVJXQ3JrLWtDLWVVNWFHSHNQRUxONThmbHE0eENDU3VwemVqWXhObkpCbXBJQ2dYcC11d2xxWFpualJ1NHJ1dzdvSkw4NHpvUk1fN0tpZW5lU3JNYk5Eb2hvVzUxdGVVcUVxQ0dNZi1fdmVEM2JiMWdNSndnT0JYNlFUdFh2azNsSGtpQjFfYS1NbFB6TThoNS0xcURRVC1WRnIxRnRLcGhRTG1mRU9KSWYwWG9xMFpFYmlRczlZeVA5TDRfYmR2dFF3Zy1hOUpJS1d4aFY3Zjg2UC1RTTRCMGUxV3ZhUGFRSFh6Y2N2aWtxXy1nNmtvSU52czZPY1FQMEtRT1FHMmhIMjI0eU1nTWlFdzJiQlhDS1ZrWk9VTVB6cUN3RHlrMEk1M0xKclp0MUVQYnlWMGpNSElJdkd0dnlNbkxqWVQ1N09ER016WjVoN1VZQURPcHpJd25qbWdQeFZKeVVsR2NYYjBISmxjTUFxakUyRFNGOEZ5Y2FBRktkSXg0MWdKOUg1TzBtTXN0aE5iU2pPOUpjWXlBRFFHR1h4aDU3RHZhNDVrS1Zza3ZNbTRkMEdsVXdvU0M1VGJJeEViRUVtZmtSbVFHeFVDVlBKRnc3czNSZzRZLVhYWHY2azBONG5DV3Z4QVdrbXJnUTZHaFpFSVdfYWNDUHNyMEhhZWtEeGdHTWIydXVwSHV0eFdxMTdEUENMRXpnWllhaTNPbW9HRURYSW1oZmhTRUNJcmZCc1RlcUw5QTRxR1F2aGtMbm82bGlfZkJ5MkdlV0NzaXE1aE11dXhFYnRINnVyTkVsTDZIRDkxX0lrNEFnbGtsWlYzdHNVc2FmWDNqdS1TVDk0dkhSZWpHQ2JuVjNKY0MxV3dfcnNRTGtybjFkOXpuTnFBRV9vYmktVkJaLWFDVF9ReV9TdFNBbzRkQU5ONDBkU0V6U0oteEVDYXZxckhRdFVScHVhV2VjcEFFZTN1VDZ3b1hiYlJzSTMzQV84ZV9DbzhZTXA5U2NBeDZCbjdsZ0RYNlNWMDY4U0RpZWl6R18wb2NucG1XeDhHQXJJWWlJRllmMmMwZjNOd2tHWnM1SF95RXRoajI3bGg2ZVRZYlVOT1lBbnlhTzdvdEhNY1J6UFhYOGRCSDZiYmtkUEpPQzlwUWlRcXgxandYWWNRa2tYZnVObHhUU1FyUVN2aHU1VFYwY1J5QW5sbGRTMk9GZVNOOFN5SFJMRFJ4NDhCS0ZTLXpRNk5MV0lRVFpVTlpUNlFWdFJSY2lmUV9ENkxKZ0dleVBXSFN6VWlTWThxV3lZQ21wTW81Z1VZNHlHWmdwOW9WUWNwWENTMFVobE9MSEthZklPUUZORlZCOVlVaEd0dnZBR3hnUUZDT0l1S0w3QV9KUk1SU0lqSlVJWmlIZHYyc0NxX3psQkl4ODd5Q2lkMmJva3FtMDJhNks2RWhodUhvcnlkRWpvdFJMSzJwdzFQLWRsNV9ORTQwbTdsN1IyOF9WUUZyaVRlcFUwYXdJYkU5Q0ptVEUwTnVDNS1XLWZaMWdTb2wtVXF5RjFWOVk0dklWeHU3UEdxOERPak94ejFMd2ROb0JjUnp0Y1JaZWpnaXBYd0dUU2xOQmtoVHdLVG5jLXpEcUJTcDBqVkRkenN2SmRYdEh2VTVRc05iR1Rhb0s0WmJ0ZnpnZUFESFVCYi1qWDF1MV9OcEZCM29ENC1HV3dWclZIYlBOVjhDRVFCN3BaRnEtRWhhSkk3c3NQQWFzRzRId1BMX3hzQmpaay1DVmp5aHdrZkViUEI4WFZENW01WFkwOFhLMGpiQVBMYXpqNlpreElJanJRcnZJSWIxTnE4QVhlcFZHal82Q2sxRlU1eUZfTEZNTnpZT1U4UUxfQlFRMmFrOGhPWEJwRjZlLXJKUUotdFRXVGxaZEJhc2lCRGYyYjVMU1F4UnhnbWRjWE01UVRIVEI4NVRHa1l4eGZRN1NRUWhuWXZiUWhVeUJrWG5XQjdCaUxvZFJ4WEYxYk1obFF0NFdhcEhpek5VNS1jWjl6YWJlYUNyVFdLMERtWE5adHN5Q0h1aWxjWm93cWNZbTRqZXRWNXk4ajI0UHJJeS1jRlozTllOSEllTVlGTU5MeUFJMWZtMXJmU2JCOHdvWWZwRDJrRFJMOG81MGtVUHhJcjNtaHFLbmNlT0JIV2lTYmtDbllYR0hRYXJGZE41Q1BBQVlnS0RoaHRkemVxbkJKUnl5VFZYalZLMWE2R1ZWU0lONmlVR2NXVFVfdHNjSy1mSl9NTE93ZlA3TmFKSS1PWFY0VUkwVGdxVVo4anJEX2hrVl9wRU13dUNNWDRSYWZsWjFrUEFILXd6RnUxcFY1M3RqTDVodmUwVHQ4N1U5ajJaOUdSOUxNM19FQ3NvaC1rODhzWFNFaXFsNG9RazV1UVl1anNGanloUkp6OXJicDc4OXZQUG9ubG9Bc0FNc0VDLXBvbDNLTl9POWxRZ211V0JscmhhZDFueFRDWnl5emR6NzlxeV9fekpHTWpKLXhfN1JZVk8zbFpseV9pTmxuZHl2UUR1UlVzc1NxQVdQRURQYTExOXFjLVlxVzBQaFk2a3luQ0lHc0ZoVUhSNGFCamZrenNyVi1wTGt1d2hDaVVtMkNBc1Z3ODUtNjNDcU1JcWNucmlLUlhxeVNwUUhNZHRqU05yZld4N05YTGJhYWV4WHBKZmJfanVWMlltV2UwME1CWkxfeVRmTVh4VXFZTnhwYjRmWHFMelpGSWI4U05fZGxucnlKVW9DRlcwZ1JiMnNMM0ZVNjM0bDlnQTFTSmtBSjB3QmJuVXVTWEUwdV9xbG5fZXBkTk9yQ0lla21HajcwY190aTMxT2phcUxpM29RZXMwQVo0U3BnUGNwV1BIOFlNMDl2aDkzMjVGX0JwVXd3TmhlN094XzZVbVk1eUUwZHBGeG1kTEQzZTdrancwQkdpeHpfQ25UU25kand1b1NfemljcGYwTEh0Z1ljalZ4OXhGYW1yU2kzUm5obWZZU0ZDa2ZJMS1xMUNvU2FuU1lnVWpMMk11VnVMT2NSVjdZdTVEak1nbFRLWGpCUkdjdDZ4YVUxc3Rad0U3dnpRUjlMQmZjbkQ0SEE1TGFIcEpqa3BkRGZkM25QWlQ3WlRHSThEOU9FWExwNHB3OEllM0FzZVJvSHBPbVV2TEc3TGNBRHozNkREVzJqcUdIT0ItbVNkODJuS3BfaWw4czc0VlVjSHk0SVd1bnVjZjQ5ZE5maWhBUGsxSUNJVVpiX3JpOWlFVjZpa0RRQjhIOUZvMjY4Qmw1S0tySjJfRnpBcTQwNTB4MkViSlp2eGlqTUVSOFNBaWZEQlQ0dG1naFFxRHN4Q1lObWQyVzBFTDNUZElCeEJlM0t0UzJiQ0N1bC1xeEFJUlVtcHdCZEg5anE3ZFRRR2VRU1VlNi0xLUhBTDVZdnpKZ05wbDZoNE9ZdjM1TTRpa05nSENVUzV0Q0g4dDU4OTVuVl9FZkhzWkRFLTJ2akVJRjdKRldFRlI4NlBOekFraEV6REhIMW56SDJzRnRLTHpQcEs1MGprR1BXWGg5R1B6Q2JJd1g0MXgwQk9MZHNmNjlzSGF5dWVoVDI0Q2xsOGYwbV9hVXB3MWNMSjM1TmJaUXVuY1c2UWtLb2FnOVlfMm1kSUx0TFh5c2NkQU1XbFc4QzZOOFdsTHlhRF93bEY0dHA4UmNGci03RmVSYWZYRnVMbzBpRnRSWThQV2lmbkcxS1ExZ3VUQlJma25LTEFhWEtpWWIzdVNwXzVOZXN6TXdveDNmVmdLTXlSYmhnQ1JGYk82MzRFV2M1Z25HT2Z5SGlMSWg1dGRpb0NwVC1EaE5fZkowRVZZbkNoMDJkMjJNam1kYXpNc2ZwTnBGTVJSMXRUUHdLRWlYNE9aUWZRY19DRVpwOS1NZ2Q4T1VtY0UzYnkwWVBBalBLazhLRTIyVlBiNWdyTl85NzhUNFFzcDdJby1rOGVoWUZ2WVNoRXNsVlZLWjZOWExpSnBET1J4bU5Nb1FsVHA4X2drcUZiWklmeHZrM0NSMUpNS0NLT3FlYWRsQ0hEVXo5YjBmUl81amhmRVJtNy1VY0s2VURROFJSWm9BWGJsSFZ6a2J4QlJTb2Y3REN1UTAyVDl5ZU1HZk80UlE4RUE3ZllVNWNUSWV6WDdWTlhfbFQ0RXNTSF9lR2xrXzRQcEI2N1phRUVPODU5SnVtQ0twUUgtUUJKVVpBelNKYWxMT3NxallCaFJZSXY2NmNERWJUdHdtTUo2alpVU2g1TzVHWGVtZ0xZOC01UG52Rl9ZVjlrcXhrV0RwVVJ1Wjg5V3dQenctX2g4Y3J1NU03RFBTOU4ycnlEeHFWTWUzemFaN09sNFFCbGlEY1NzRjdXbTVsek56WFJsUDRTaXhEWHpsNVdkTlpGb0lhVzdqQjAyQzlWVmJsSUtOUG9ZUmZWOWN3SjE1S25ta3dOOGFSbTYxci1rZ192OElvRWwtMkl1TjBWU2p5WF9WTkJrSnN1ZENybWo4YTlSMWs3QTYySFdhY21NbWc0OUlrRFdNNmVsQWxxTE1EcDRvb1dDSzFoZ3hlTERYaWE5aUlGOE5yOHJaZGdvbmNIYlVlSjhxMlNlOUNtdjRMcVdWMVZxYUpxbzZpc1AzVURhenpHaW03RFZBQVU3YzFyRjVpcGhycXo0akRyUzhBOW5zMXhFR3FPUGNDUVVnN2NDMjczUTFvM2IzRmhzcm9rU1RPVDJvcjJoNFljZW5QT1hOdVFtQktnUEVqTkxrUFV6ZkwwS09wdVgySXVoendDQ0dLLTVFZ1J2SGhmMGE4c1RfbHhLTjItWl92bTREenpTbDVHQk5QUHVlRkNFbXQ1XzBIN1ZZeWxaNVl0T1EwN3l4MUlWd3pUY1Q1ZjRJeEtEYU1GZ0sxZTlvQlIxblVZZjNibDJOd1BjSDRrT1RfenBzSWZyTGwwRmtVV01yTTFXUWJzbGI3N2x0RjFCcUgtVGpSd05hbm5RRzZNbjZBNm1ablV3dzlEYjF3cmgtQnp2NHRMSzYwQ1dFQl9nYzBNZF9NZ3l4RjZlUFp5ckhEQnRqVm55ck9TY0FQTUVGN2JFQ3hDVTVvSUhFMDctaUJiLXM3QkZaOXhzM3hUSERzNnhQR2UtNjA0bTFvNFhzdmFLUEtrbG55QXlDTlM0M2dyMHR6VUtGb2FESHZuNERyZG5JYXY1QmRwQi0yLUFaMDdMNzU3M2NwM2tDbVRfUG9TNWR4TTJacDlWNjBUUVdnSFBvU1ctcDBOOGpvaGVVWlJ6N0FMTUU3Um5pYmp1ZndHNVpTYTNIa2hGNTgtY01rOFdjZnZlU1ZUZUdpRm1nU3Q3UjNQanl4ZnRGY0dweXprYm9SNldzVG9FQjlXOUk0Y2VOT213dTVJaGtDcF9yaHd1OHJqa09sVzJvelNiTWRETlhRMUV5QUtvT0x3NjlQYmJYbXpHZDJYQS1XS1hiMVNJbFZzTnl5Tlp4Mm5HcU9nLWtvdlFReldtSEg0NGlieHVIc0NiTVJBZk9fV3c1ay0xdzhQN2NjNjBTNnd4NGU4RURWM2R3UkMwQjNRbC0xUnpqSDQ5YVR1bTFySTczeC10QjR2Y1ZWbnZIZU1Tek41MWQyODVTeEdnY0R2YW1BWGs4M0l5OVhFaGsxS0QtdjlwVUpiVmtiUEVjNEtKZ3ZrRnl1SDR6S0N0M0Q3S1QwbGpIb1Jhb3hVY2pLeUlyOVFWWXBLWkRvVkFPUDdnU2JadUpGOXRLN3l4dl9sczRvQWVxbnl2TzRmbHhTY0xNMU9ydnRSNXFvUURWUldxeXNxb3c4RnFCdHpzRFM1NWdjVmdQWXNVNVlXSFMxT1hfYmtFTk0waTdUdFMzeWtBOHpfZVhHUWEyWHFiWE40RnotTGROc3B4bHBMek9DWlY1a0hTR2E4TlU0bUhORFFpQkN2aFdEeEl2S0ZDZEwwNGFTZ2FhMjh1ZXNHTXdhZlRUMTRHaXhKNUpXSmlGMTFDcHB5RXdpbWJkMldXRlE5dTJ0cnNNRDFvZm5FMXJ1bWRLVEVjZWh5MTJ5TTdvMFhxUkx4dEN5bGNrZ3NXRlNleGtaSmVleHhGelRyLXNjaG9ueVRfYkJDR05IMnpHNm5Qa0RabVJUNEhPTFJyeUxoMjNaWXFWdDNHQWdib2M5X1FpNDl5WG9vWlNIQXd0S2xiMU13MzNiTTR4bldBdUUydTZJOU9jUDc3OEl3MEVJbzVVU1A4MHY5MlhrTEFwVWFnWjNkemhWLU43WG0tclphdXR0WE1pSF9GS2p3SkozRkdtV0t1My0xTWtKRWUzdkI0LWhMeGo3MC1kWW5WRmVOWThmcy1ObUlBc19uek1UendEN3JVU25pSTVuQWkxLXUzMGdiLU5VNG1vU1dOcG4tQVNudDZOM1ZueDBoSFJqbkdCZWhwdmJJWlprZ191X1FCYUdPejhWMlN3ZzV6VUVCclBLZlNCT0tGSV8wX2xSWUg2Q2RqMzhvRmlHV3BCQ1o2amRSV1laMjJiczRzWnF2R192dk40MWx4XzcxZDdzSGlrT2hfYmpDWGM5M0FHak42SXhCdXJSREZGT2o2R0JrZnhJUkQxTzdwTDZuVjFkNlRNb000Z1VxNlM0RWlnalBpTnJrSlNkaE5YMUZPNGV3N0VDQW1FRTNzc0tYc2RiYzdmTy1tV2Y4UjZOYkVybW9YR3hKMVM5eEdPaGw2U05FMHVRVU82V0xxaUs4VFMyVTFjSkR3YVNOS3h2cjZWUjJlaHZ6bXBCOHA5UXV1YnYtRjdERDlUUjhkdDJiRWx3V1JPV1VwZlZtWWJKaW9tS2JwRENLVGhPSGphd01fcnVCNFVWM1d0cUV6bjhJRkpEeURnNXZhM1BjZkpQNmFibGN0WlBYSmhZUFM4c2pNTnF3WXFnMW4wQUpuYVFiY01YQmhzTkpGTkota05zMmF2T0tTYXVySkdVRUhNVUVVc1FvamlaX3J6SFpnOE40MUlyY2xVT2RvSVBPWDBTaEFHVXNta1p0a3Y1dlVBenZlVU9rNjNsZXFlVjlrRU82S3FrTDhJNUZOa2JuQjQzZ3I1ZGZ2cDNNdk85TGdXeHJpNzlYYTk4LUNJQ0szTHpIQ0V4elFxd0dBamJWN0phRnZkMkFXNTRqMEVEVVNBSXd5aHNQM0NuM2ZfeGdENkk0a1FBcHg4Wkt4UkE0ZWJwRFNVWEFEMmdzMnpoY2pPT3A4dzJsUm5hNkZTeV9Idm42Z1FTV21rOXFQOWVsQ0FROVczMlNsYl8wOHhXT01wRFozbVNhaEJBV0xQRjhrbnFaRlBfTUpOc2Z3R05tS2NOSGRhS3BqV3hSY0Q5OXhNc3E0WmJrd1prcXkzTlF4akZvQTR4MGpCN1Rra2gxM0x5UFVqdWZLNlg1dDdXMlBkbUFmYkp2UHpOTTZkSnRaV3hJSkkzbUtMWVFoRmVITDBxMDN0MnoybDE4bmhaenlXX0NJSVROWHRhVEFVNFU3OXBnc0Fha2RlVmNVMzVfSjFzbE0xOVlyMTA3VTRRZnlldTItOWNrcllCQWh4NmF4TWRTZDdIVlVZYk1pTDZGMklwZGY3WDRGeEgxTXZjUWE4RWJETkU2VGNxSXRwRk9UZ2R5M0RGYU1vSV8xRC1wQnplZEZXOTZYRmFOTEVteFdFQ1psRnZmYzNWU0N5SkQ0Ml82SWQ4ZE5RWC1lOC1iZ1JJcFJ0RjEtT2doUEE3dWYxbm9idUpfdjM2S2k4Yi11anFUQmtuMmZSNzJMaTRJYmVLTFEwTVktVk9RN1NudlRTWmp2RjlyQkNaSnhTNjJNQ3hLakExNWxBeENjc0c5cmpZelJKV1VmcUxvVHBUeTVQbEVGaDIzVGtnRU0taTNmMWRnSlRlc09zZnBSamlOUFRpckZIaXJFNzRmcHJmX1NlMkt6U0dyVE94akY4dGNkU19VQXdaZXFFRE9GOUs0YW1VcC0tRU9Ta0UwWjZscnNXVGo1a3prXy1ILXNmSkU0b0RoN1Jwc1JabkM4dm9lQ1JhVVRYd1hJMWgzZFQ5VXNYckgwR29PUW1PdV8tdXdKQlZtNWt1WU44Nmp2am8tTDZWeXNJNEt2aExlZFhINmI3WFlidWdFMnV4b2VfNWFIN3ZDOG9hUUh4dkFpYkktckdRYXd1OTRXdk1LdlNOdUtIUGRrcnhWX0VEdjdkenNWVjBTUzFDOC1vZExwLUtmblBQaWQtN2NYS2xwaWdJcC1BX0x0TzBfSkg3eGV0aE8tZ0dFNVdBTzFpN0Q5Ry0xWk9rN1p4eDhwdkZrQlZrRm5tWk1feVNSR01NaG9STjJxQnJXTFZ3dGJoY21va3JQZkhFRDNNRnJ2MU94b2FQYkRxdDhLeUdabllTZ05VYzN6RmpJSEYzTVU3WGowRXcyYnF2ZWVEX1ZpcEtScmhDZVdyOGxlZzM3eUFzLXZFSlBwMzV2X2pPY1REdVlwNmNwU3ZPd2x5SnJEaTJlbkxadkktVW1KLUY1dXlEYWpxa29VenRaR3diODRVNDNsOW54V1RiMmpzMUJPM2x0bWxtU0VGWVhIUDk5amJoUXJ1aVpqRHBZbGd0OHgxM3FIQTc2aXZtNTNnanh5YnlTZHNHS3lKcDdIQU9hcVFyMEZfUjR0bTZDbm1sclhLbGlBeVRuOFN0N3JWMXdjWnNBcFRQbGF2bTBaNzRvSUp2TDVWMVQ5aHBYNExPei00ZjFWOTNmYktmQUVhRlRVM0JDQU0wWm1MblJTVGNER3pGakRjNUx2c2ZXY0xmWlhueW5nMzRkdUlSeUQwbzlHaXc5NjlnSVZVai10bVQtR1M0cHYwaHpsY0pRZUV3MlVRU2J3d20tdUktdzN6NzUxcXFYS3BVV0ZRdVc4M19jS3hYT3F1alA4VHJOWjNMb1VaakNHV3lhTVlySTdaQWNobVVvSlc0bE1LNXBfemNaWE9ER2N0ZWdIY2ZqcVVkNTd4SG43LU1aV1lmS2hDdGswaG1YNGlDSGc2MnN3ZUVZU2hBNnFvb1BMUmhnS2EwM2lNQnlCZlZ2aDJGWUNYZDV2NUlLVWswYjFMeGdqVkRDWXJzaWtCMDRlRnVDMGNWMVBZVkFxRk4zQUxpZzZvX3lrTkJXRHgxekxjMU43NDdlbjR2aXVmOExhVWVCeXpOR0NLVUFBUlpISHp2QkQtUno0R3dzNG1BdmtBZ2pPcUFwc2FCak85VzE0OHJEMFEtMUs4b3Rid1ZJbzI2MzRSSW1wRXNLNG1NeV9VRGF0YzRaUFhSWWlFR2FVYVJWc21KekxkNGlGd1ZnN0pYX1o5UlQtWXV6dDNVZW9HUEdta0VGck5ZYUN2eEMzc0dTNUdpaXJ2TkNOQ3Z0c3owbUxFUXNtT1hQUlU2UkNxM29TelRnY2c5bkVKa29nd3hWNlVMRm1lQVNiUVBJczE4TXFudU5nVWo4SFZvTENDYnoyQWNyRnFzMkR1LTJSTDZrTmRJOFJleTFDN3dDNGVzN3pzN1diZzVoS3VkQ3JoUFliZ2hmenI2Y0Q5aUtaUlJqYXQ5aXFPR0FOd3BDTkF6VlpCbzJlcS1xVXE1V2xJTXhIN1dkLXA4a1RXMVZxbjNmNTk2TGtGU2p0SzFlZ2JVMEYzX2RBdlh6NkItRDcyTmEyZW84TmlKZDc2dmFmNGd2OGtDWm1ncDNla0xQYmVvaDJZNjJXb1dsS1dTZWptRTRqeU1pMWlYQ0V5T0pfNmVpMUZKSFJUdktLalZKNTRLeHNhVVJhczlTTExxRUlQQ0xGMXNhYlp5bXlqclVGckdxVGx5elRSWXdYa2JtV3B1cDdZQ1NCdjB0UDJoT2ZtNHNTdm5yb184YVNZTmJCREI5c3dpT1hpNkF5d0NCQ3FNTl9WS2Y0QjUtMjJ5a1owTDVLbThrSzF2ZHFNaFNCVjRLd1Rad0tOWUMxTXZlVVlUY2JraUppeEVKbW52T2RGQnI1RUtldVpkVFduRDJ1bnhDWktrNHNPMzBrYUthMXN3a1czQWlwZmVJdDExUl9RNHJSeDB3VTBubnJTLUdPQk10Y3MwNXlJZEVQT0RGUnQ5MDhJdURpSG12QV81OVVZUExINWI2eDRDSnN5d2U4RjE4cnZTTkhGd3ExYXV6MktsTWZ2Q1o5N1A3N0h6NHowQmh5Q3JENURudWJHdFYyQ3U5WFJqb1hjQmZHdzlRZHdIU2s5LUM5YXluNGNaU2JZUUU4aUVqbnQ2d2RRODhWdDhjampKQ0g2SGd5YlRrYW5ReWNPeXAwMUhOQ18wTUZGZ2U3YVo0M2tFNzBPd0FIZm9hZGpqVWh5d0FsQXFzZ2tPakd3VjJBMzVsQ0VDUWdKMzRvTFJmT1hxMVVoOVIyR2l1OGFZVGE4QWJTZlpVZTJOQzE5Mm1LTU1paGxOdy1QZThsclVVT3UyaWk5WWtySE1Ub1g0bDM2a2ZfQzBFYjFkZmtLTTJDYUUwblprY0o0cE1ockpTZXNfcmxJdnVDM0NZR1RmeWtjV0dYY3RvWGJpVVREMUVCNHpCZ0hRQkJhNnBNdFByYWFiQzVRN1ZaY3VFY2FxQ3VPYlJ2ZjBlRElVNkM3amRHdEkzWDZUNjljY2J0LWJtc2tmdHhlLUREakRjb0RzaGV2bE4yYlU2RUZmdjViN0xmZk1jaUJDVnl2R2swcEFraVBsaG9GX1QzbmtYV0xpY2lmWURKTFVBOGMxbENlY0o4anBsRFZRazlYOFo0bWFGWVl1Zl9hZDZBRlJZWWR3WkxvU3pCS09Pa18xZXE3ai12b3FVZDNmRm9ueEppQzlSQkZKQk16aWJZQVp1QXlQdEp4WWVtOWdOOF9iWE5uMXBoeFBJMGg4a3F2WUM2cGZVVVhYb0FnQTZfazh4SE5JOUpVS2VMX1FnVGpseDVzU29jdEFUT043STh5MTl4aUpSRXJtUTZibkF2OU5IQVVMbXVaMlphZVljaXpWdWpsN0dnMU9FVmtZMHo0ekpLSkZqYUZHZFdkQm5rRUptampIaWdIT2Rzc2dCcVRvTmZOWGNDVmlkYm9yWnU4SEU5SjhZV1JTNGhMRTRfUnNxZ2kzVzc3dWNZYjkwaU00MnVtWVlIUlhyLWxJbDlFMWFRYm1zZVNTN1dLNEJPdDZqSkRRbVl1cUNwTjJGd2tKd2h0S3lIdFpJcDdnVzZiUlpIaWNtU0hiNlZHWnBGQjBfWHdTSFlVcVJUVUd3S1oxRmpjeUpyWi13RlIyY25YcWR2aWcxUGVSdlpQOWZiNXg5TjFFNmdMcFhLQzBnU3FYalZfV2ZfZHF5Vmt5TlROdDRLLWd6QlZSWDk3TUw1Vmw5bE90eG5YSmVkamhGa1FEUjhxUmZ5QjNSb2tMVC10bGhfS3NpSXFLdkRtdjYyaWlaWENPYmlxejRHTFE1RjR4dG9QWGlSQ1FEc2k4aF9hdWhRU1FQbk1SNnpXVnBsSm4wdDk0bDdaNzFoMWNYeERBLXQ1Vy1BX0FSclZmTVNjVjllUGZwLXJFNGdocjJYbjhVNnA4X3JYT1U3emwwbWxjaWdKLWRqa25Hb29OeGZpN3VLWDg2N0UxLWpvRkZHYlZKOFhSY2RVTzJFbGZFTWpaVnhhdjJiU0tXNk9wVmM5aFJPZ3BEaHBfeU9OWE5KVEF4Q05rZ3hremNDRFRINFBLMmZnd0tMLTdTSzFXUUViVXk3NW1fWnM0Q0JxNEpRc3pib05adWJIQmhhckNwXzEtN2lFZll1WXVHX19JSmRhSFVOY2JUQTBsRUZkV1VWSnBvTjBQdjdrRGZ1OG5uRDJtQi1vNTdGXzJodmdOVWtycjNpdmVYZ2lKWEFpSkRuSXhoMWpZLWxJS3dJOFF1XzZtR3VJcmF2WjV1SXkzN3Bmcmd0SlpTc0NZZnN1V3NzWFpSem40Y2F4R0dkcl9ja2kwYVpHWndkQWp4cjVVb09CMS1zeXM5Ty00MEhKTG1tMjk5S1doOFoxN2d0d0l0NXNWT3RnTU5HVlpRTmtHTmIweUwyQ0FmRURHejNOQTFpNEVaaVRadWNPQVRVTUZOeXVlenV4Q3hnS3NQWkZEUV9FTlg3dE9wN1ZwbC1saWU3VGN6ZnRieXpLT1hzekpTbGlCMS1TUzJvTHdFUTRVNV9jcVpfcGNwSWJTRTlUMEEzZkJsdmxudUMwS09VUU9acHROOE1QWDVnTmxXZE9uV0pSS0U0LXQxd0lmaUNtU2JIY0FpWEJoNmx3TDU3OVpMc0ZoNThIbHVxbDRGenY5V1g1YVRkX01tQXRlU2JlMGtHejFOaWZVSzdKNDY3ZkhLSnROV3FVcHZ3eWFjcFVwa01FMTZnelF4SFVpMXMyNEpOT3NBWVc2c0Y3QkRCT2c4YndvVS13OFNudHVtOTY4aF8wSWxKUlhoNzFSNVV1c3FUZVNsQkVjN0wzU1VORmxwQ21fRV9fR2NKWW14Ymg1czNNck5aeHYzOHBGTzB0ZDNtMnhhZXhNVEFMZm9uRi1SYm9UQTVzYkczSTd2OXpKTlRKTS1uYTVIZ1AxTWlrcElGN0NZZUtMSVFPdlVTQUZneTRlRTNvTHFfaWRMMTktWmVmekRIOS1tVDExVVk3MEJtUUFJV2dxWjNNYlBSZzFGZTZpU2xLZnNGZjNxRldrVmd6NWJXX0ZSMHE5ZElkekoyNENEdTVjNFZYbmY0d194VzBsZjZfbFE2c1NXS1V0d2N2Zjg4cjVBOWZzdVZwamo5SDE3bmdueUx5Wmc5ZmtXdjVjWUYxUGxOVExRS1JhMzJHSExyaGtmcUhWb01SU2JHamhaZ0w5blNWX1poTmsxSC1od3VrX2pWRHcwc0diaDYtX3lyNUQ1eVE0eU9DODRsRFltWUpVaEJydl9KRG9zMGdRVWw1X01qZks5cFBZQ0JCS2JRYl9VVEJKVjJpcWpTeVpjcjVKSUxfQ1NNU3JtdXZDUXI4a05QbVNmaUUtYV8yNS1zdnoxYkU5MFJoSEZYdkdVT3FWSjB2VEVva2U1Zy1pQ0lHM2EwQUhSUEZISExxVkxQbW5rQ3dQMWlXT01tdGF2SXdqVl9uYjBDaHZ5cm1kNWlEYm5vVGJ3UnZPN3JFNkFxNXJmR1c2aXVCRWEtVExtRTk2NWFpaEZna0NSRm5sUWl0ZkhTZDV4ekRXVmlXRDBab1cyRTRoYkV5QTFPLTNidThCMFhRdUhFNDlxendSSkctakpub1hRY0FDRkJxcDh2ZVlUWTlLQ1JwRVFJNnFvaTFWZG8wVXZVT3B6bFhpWURNd2JIMzYxdkk1ck5aLWRpWHBGMkJfQVhqVGNKMktyZHVfRjV5d1hocWpLdEh6LU9yeUx6WUtZb3NlVGRaaW5qYVZqMHB3ZjlwelVldmpEWHI0bUpoNU1fcWhuX2hVeXg2YmlmX2FEQUVDYXBUMHNpdjhDb0FKU2F0LWp1S19hRnhMLXZrSUxwb2swZHVzUEk2Y2hnd3k2dUljZG9iODZNQUdjRUN5Mm15VTd1aEo1b2NqZ2dmRmZNZENfZVhnQmZHdTE4SjdMYXhQMDVuZ0d1ZUdJTWlkeXBVbGtpakFBcHhLM0hsLUVxdFJ6ZXhTd056XzVxdUttWjdlZUZ3RWNSUDVTcVY5QTBDWVNTV21iRno2LVZ4TUxEV0FDb3VlSVF3Q3IwUl8tRi0zSFMyWXEtRnFxbXhxdkU4MFJ0TlhqVng3RUhnSWMzTjFGc0o4c2hPRmpRN0hxWjAyYmFmN2NnLUNNbGdRSjJoamJRanRYUGZwTlNuRkQ0QnNtM2Y2Z2FiZjhWZ0NBaTFrVnVLNkpqeERWdWo2dGloNVR6T2JpWHJPR2FsVEh3OWVCSDY1SmhPSkFlWXpPUElNTEV1RHh5a3JYa3pKTU9xdGxjYm1SUXpkb2R0RUhrdlhOZGpiWGZHeEFYdkl2OG5JMkZmcWU2NHZBbjNiOU0yWkVONlR1M21hdFQ1RFIwc3BfNHc1T0hxeUZiQmpHWF9oSkZ6OS1FMmVKTmdibmRveW81TGJHRU9xN20tNDRDNUFDSVdvSS1fMGFXajFQUDZhWlJQX015cm1vSTl5eVJSeTJqdWtpZWpaNGFiVlVJc2xDem90THhtTmM3Yk1mWnAxWHJRTmZ4bklFWW9DdU9iVEdWaDQwMGtrUDFheXB3V1FQc3ZGajlLWUhiMVhHUmVQUEllSVpSX0thUDh3YjJyenNYeEdGVkpYdnUxZVduZ0pBa0Fjd0lHc1RNOWRRbnNJQjVNSW1VaDFDSkZFM3A2U2NsTDhDTE1uMlZkTE9rOW5iaXFvR0Y2UktoLXVsLVRFSGdHRkp0RGs2MG9BMno3czdDQWtMMElTeHcwSEtwekxBb1ZscU9BRmNjTm84OFJmcEVRWnFLRlNKY3hUeXpTbjJsZ0p2Mlc0VU5BYkhGNHhQaTY2UXFpWWdVQ21WSmNCU3QyTGZSU0tGVlVGSlVTR2lSb0Uwc3FqaDQ5OG0zbXlvWWZrZkpDYzI3YmdhdnVZbm5QeFdJX0l3WnlCNndlNzkzamxOblYyY0RKcW92UWl5ZVVEajRMaE1GSHZ6VUV2cnNwUWhzVHk4akJQR3ZEV1E4NGNXSFhuZWdOYnViUjZOcHNmNGhTdmU1NWF4bDhtLXBFdkJ3RDR2YnI2aHh3RGZhSkV4ZUlnbm5EUVVYTE9DdjB1U0hpaGV5dDJmeVZTTmJ3RVdmRUY2NFh5WElwTTE3UGdLZ21RWFJLNXRJaEc4QnBjNEhyUWszcHh3TEtDZzRJVlN1X2ZTRnUyTER1SjByalZ1WnFQdVB1bUZXOTBPZ0FZaW5ZdnBMcTVPNG1XWkl0dktLUkprcEJyTFNOYks0MnBDOUtscU9rZUNCTU5nSlRpSVZfTG1XYlVvNnoxS1ZBTUd5QVBjemNSRXRWdnBna2taSXRtZk1ISldnbjV0SUVGVDk5VGhReXJlbVVVUUg4bWZpUm9lZVBHY2NzY1lOLTFxaWpTeUsyaUQzMnlKdUtweFB6M1l6UF9aaVRPSFBxTUtSRWdXTGI4Rm1xQ0cwcnNSbGZGUUsyOURIdU1fVGpnZ29FSjl3SWlqbmUtWndJU3VoQnRQQ0tEbU53eFNIeVpMZk1POHVNblc4cHd0cVZqUGhOMllGWDczRUk4ZU52UlNxbzdsWm5EczRZT2ZncUdLRUdSYW1lc0VYSkY0TjBSV21ralloekpoeGhtZmJYYTdrWFl1V2otQUpRS01PV3A3UmRuQWUzdkNRQXdmckZLMVloNEtpcFNLeTJBdTNyTmx5NXl0ZXEyel9Eb0ttQml5bGU0NXRRRHhydnpQMlVpa3NLalpHUVBXOTFrUExXVW5KTG1NOEZmQXpuNy1ZY1RFaWxBZV91LVZlQ3ZRdlZEYWRGSE9kaTVaUDlUWldPdlhKZV8xZm9HVnBNTXdFeTF1Z3dYY2JFcEJnb0xsU3loakdma0ZJWFVQMlFXek5QX21uUE13ZTlyR0x6U0dsd09kVGE2eEoyYnlheHVocm9SUkZ4Z3MyMEUtNENtS1lISUxPQTJRYVhXNFVFZGZBem5FeVpDYXN1cmVvRHFibnFTNmEyS2JaZ0VhekIyVTlobjJMeldQcWR0aWNOLWUxU2NRSnN5alZJQ3hCWjJiLVNDcmJNd0Fic2lXNkFrUjZNX29BQWFxcUpUVzk5SkxiUkIzYmc2Q2ZpU0tXZ24zck1iU1hYS3dvUkV2amlXSDlMaTlSRTVlUXBFTjRlYnJVUm9odldFbEU4Mk9MVlhicU1LR2xqaW9zeEhnTGhyeXpTdWZuc1EwQm9VMzdvNjcwZG5yckFfZEFMbVQwRGtzdGxWM0UtUlg4a3hwTUdVem5oeEdLOGNtWEFVNjFXTk9LSU5pZ2JtdnkwOXhTS3hZOEZ1NDR0cWwxYWFvMHF0RXVGSGc3eEV2X3FSSkstb3RqZHJDbHcxU0JfR3dSOW13NTN0TVZub3BJT3JaT3VtYmlVaEhkMkx3X2xmMGpQRXR3MHpCdGZNZnpDcUlmSWstZHdQaUtVOGw0UXE5MU41YXhDdjZhdmtFbXpDQk83eDRNY2FVWnFRYk5oeGg5a3NvZkNraFduc21qQ2R1MUoxWGN1cWNzWDE3amgyanhRTTFQUGlqRW4xamxDMGFOUGVaLUNYRUpUenFFbF9kZmpGa0c1d2EtcmNVQXY4am50QUs5NmdmbWhOWmN1ZFpQNXJfcm52Uk53YXZfZlRYeldpaU9KYUlDUGJPRF9XVXJpbHJ1QUpwQWNrTTd4eV9wRUNDcnNTeHh0dUZGSnlHdXMyR1Y4eWU3aFFQbjZZbGVrOHVYQWwtaW1XUFJfZ1dXeDVqNjlVTkxpanI3Z3ZLcklkNTFYby1peGJXclZzZnBoaUx1OUFjZTZ6UGVyVlNCbnI5cDhTUnR2bzJuNnBnWFhqam5wdGZWUFhFWjB3RHNaQlNWd2M0VHItV0k3Y2Y5czh6cFU3bF81TVdFTGdXY3lYN21lX2NnT3FoX3Q1R1VBRjl4eHhLRTdFNFZyLVNFbjVvV2dzN0VJYk9ucXYwWjUtV2tKSkZnQy12dDdnc1p1d3AyQVdabk5OUVlHWWVPblY1ZHdNVmdXUjJBbkVIUEdCN0hJMkV4c0xHWVdSNVBVd0dvM2FDNmszX0tvWlM2QXdqaUl4anhxX1lVVHFES28wR3cwV3RrY21GUTVHSEhweHJNM3JYbktQTklUWmwweVVpZEJobDhNNmk4WGNjWjFoM3FXZkxjdkZ1dUdXN1hibVp1bTJneUV1LXNja2tUX0x2UFVqLUtEZ3hWeUZTOHdyckowei05MS11Tzg2N0dtZC1LRXA0V093OFgzSU5yMWtrX19EM0V2eDRERTVPU3NwYUcxSG9PSlZPYXhoclpIa3hrX3BjNVBfZ0duNXdnYjhSOHlfWC1ESWk3UGQ4RVdiNjg0dVc4ckFqNkJHYzREbmpCUlZRQi1ZMlRrZlRQYzBNVlQzcTdsd0RpbVl2MFdZbnB6RHkta0ZZclFLQ2Z2Rk5sNGdWUzRfMlJDNmUwbTJfazd2SlQ3QW5raG5mRzNaQV9Id1F4VW82RU50NnNDRF9oMVVoQko2azlfbDgtRGRMVG1DV2ZmQVMwRkJZZlZhQ1UzWk9XeGtJWTZaTWQ0MGlXRHpXckZjNEpwWXpUd0tTSlBhQVJYWEl5aG5hX0NHVVdFbFRpbkVGeGdJWGQ0bjNTdG1CcHRCTTJjTVJRem9qN0d3MDV0bjU1dGVSNTMxLTN4S3MtU2ZVZVo5cjVxemlJeGpKQjd3cV82OXJISEkyZ3MwcWJsc1JwcUVaaXVkXzhDNERIV1VFblJqd0xxQ2pZcnZLNFNwazFXcUVaenFOY0FTeE1vdE9ocTRVdmdKeFE2VHFfNE5faWludXhEQWUxTVdIZWNOMlE4Zms4QWcwNUhwTkFtWnZzRDdXVFlVSUVWSEprZ0YwanNsdFNwZXJBT0VPSXp0Qy1JZ05YS1FGQ0FJWmd5WWMwbGNmRzgtYi0xT0dJRzVqeWhCeFl4bXhrbFhaTFVVNGVPNVMyUWpYajRmRDJMSFp0SWNKVjdITjFBbG1ESVJBaXh4eWd5OW9zaWw5a1JrdnQ3dktDZ2h0OFFucVB0X1ZNeFFvX2laR1dHYUNtOW5ORlU3NHdSZGpsUnNRQWltZloxR1liS0Z6c25MeFAzc09YN3hBMTNvZDU2c2ROVmNXSVhYRk5CeS11a2c1VW84NDdEZ2hhaG8tdGRjaFlqbDhsY0dVVjloQVNwOEVkcEM3N2NtLWtva0k0TVIxNmVYdGtSYzVtUDhuVXQ2RWtLb3RObzgtWmhQa3d2SERaQlZJd3V4ejJ1SW80c1NCVi13QTJhaVFaWnBLSFd4QW1QS1pSa2s2Q1FwVnd6RWtFQkgzd1FlSDkzeTdSeWxQRC1mdlN4VDZ0b0tVN1E2UUZ0ME1INlZscExXTE5ONmhTa3hsTjR6Njc3MFNaaS15VlZmTUdPUkkyZl8yc0NnVGdELTJNQU0xMmdrbHBuSV90bEx0ekgteVhmRkpxNVh0OEVzVE9Cd3owQXdSOG5STEY4NmloZzFSaEV0dy0tNm0xaGk5ZkNJTExjd281ZUlTaktlX2thWnpwQ0cwRk1BRzNoSlR2bjBwaTJ1NVNqNkM4MHpOTDdWODFKSmJKT3cwcEZqMDFYQUdkZWE3d180NExtMHJzcElwUlluVUJRM1pmZUZGMDdfb2RsSU9vbnpSbUg1Um44RS1VMlNDSlNXU1YxOGNtZE9tTkV3RGxRTllia2dabkxROEdzYzhWeElabUxBdnU3LWtjQ1VUNzhTXzc2RUpPZEJBMXlqbzZROHljemhKY2NXN1pzLUJubjVBMGF3TDh4aFBLLWZpTmUxTEN0WFNfQ1lGbExCMlAzS0hHeGZhT1V1ay13bzJVRWl5OURaZjEyQ2kzb2RnT2xXZWxXSk9VWEtPdEwteTNrRVUtbWEyRkluVlBxQWdaN1BGd0hyV0o4QzlDbWk5TnVPbnRMR1lWdEVza0lUU0tpX3R3UUZ1NXNWbTBKamhuWmZVZ21qRklfMC1MTzFiVVk2UlllbFpQMjJKZ2dQTDZ2bzAyWEE0Vzdab2E0cGlPTHlJZWVlSDIxUC1pWW95azFFNklrcDJJMktSbUl0aXRoaDA5cFoxbVE0dnJkS29UQU4xNVNsMVhwckpJckFyTjVFUUpVNFV1dDVSMGNlVFZnMDVrX1pEUEJ0bFZGckxpX3BGcThTbmtXQlR6QkRpcml4X0ZpV2t0Z3BrMlJSdDVINHZpT0l5ZXpkdlBZN0xqVzFUTzZEOTl4YXowZlV1OVVPdjNZQV8yT2U0OXVkb0FUdVl6bTBpdmFnelhFV25zZVhfRm1hazRSdmFZSnhsYzZEY1ZKRW5hX2JlN0dFVU43WnZKMTdLVkNvQVdUd2tPUnpQd3VKb0M4eGFBekVZeVltUFI3Snc2am5iT1dPd3ByTHMzNmpLTUZMMDBIRXNPLXp2LVBVZWlnQmJ6UTVITTBfQ3JUOFhfUmlUWlNSeTRMZmhBWFdoOS1HcFlZMWdNbFluSnN2YnRNbEcxell2b0VWaVRwTm1uRERLWlZKOC1QaDdLUVFfajV5eDJzVTh3ZFZKQURhczd0YUF4VkpoM3BvRmotYzItcktxYlhReF9zOTZrcTFrUllCS0ctRzVMWmotN21SZ1lNek53Sm9UY3k4VTFVdjZCb05TNnphZzdWWlN5dUh5Sl9TS2JiMkpuN2Y3NHZYVG1qTTFpbzFKV1cySHdET3ZEcXl0QU5DeEtfbXpyWENXenNUYzk0VmxnM0x6UlJ0cWVXYmZGdkR3elNnX2RlNnZ4VHdta1FEb3FHSlphNFZGOFdYSkxXVUpsUE43WVc0MWxteWFWdUtVb2JUTklDdFFFMXhKM2o5ZG84ZjZyaXVjUXlQM2Y1ZnE0UXZiMFRvVmF4Q0w5LUF6NjllMXEtbkZMdUZBR09yQ3MyOUdKSUw4ZnFjcVFwYVF5T1puTUd3ZDloOV9qSlpQQThrQnRWbFBsR2Q4YUt4OGlJRnB5NWRfWnJKQkFfTER3LTB3RURCZUtqaGw2UzRyQ2tfNG0yZTR5Wkg3SkVjelM5MjdPNS1wNy1LYXhRRjdJZlZYYkxSTDJIVkZCdlpDUDRjbm04UnNyMEFsLW1UN1d2UVMycEVsSlNuWjBpdTQxWG9qd0hQeS01UHlXZnN1LUwwVGxlVlhONlkwckl0Y2xiY3AtY2lIcjBTR3pEYWVPMUktMEU4WnhEQU5Ed0ZuMktMeThNVkhDM2RORUROMVR5OFRJTGRjOTF0dVhWSk1YcllPaGNaeDZ6bXRiNHdIN19KcnpKdmVCRC1CREdCR19LVmhwZmIzdk1wLURjQkJPenB4ZDN0Uzl2ek5zTmxKdE1YamtXbnNKcExqZnBTU0ZBc2ZuOW1FT0UxTkI2MEhTUDJ1aDdSVUV4a05uamhXRkR0elk0Z1ZVN3htXzVLeENLNVY1Ul9sYjVGMEpmUVYxSnRlamN1LUdEQWZEeEJVRTdOMll1b0dqSU5razA1WTBFMTFSTUxUY1pjdl9qMmdndW12Snd6Y3JabFFhUDNUWk9aQ3VScVRyMVdjdFVOYUhtUHdMWVdYSF9lRFdZNXRyTEhQYkVscWNLb1FuazlBbDVEWjVRNjltaUhsSGFDajJ5b1l0M3MtazliSHptd3ZWMVljR1Fzc0tsbC1teWNVVGJWYkhGcGZaTUhSOEtwYW5QcnJpaEx1eFp6UWR0MFRzWUJ5cHBIVzN4QXR2RXMyX3dKNUxLNHRPZDJySVQ1NmRFN2ZwZFBWTEc1MzV2LWc2ZVRxVWZ5UnVQRlROb21QaW9qemQtS2xqQ0kzR1A0ZDBFR0NBTUw3MkdiSE0xTFc0OU5nbTNlT1NjUVRDbC00czFXZEY2dUhDZ2JaNXloTmJ0cjBjLXp5QnZ6cHcwMDV3QjlLRDczX2hIRUV0dldBMndMS0sxdW95elRiN05ZN0JkT2xHalFKZnBHMVVVaWFEU0JiRk0tU2dURERNcnUzREttZ2JzaTM5STZfOUZHVDM2VVdVb0pOamtQWEt2RVBtcG14Z0VTMW1oc3VZWUM5NWhhY2VvRVM5QXFNaEIxdUZfLUZxdkw4bi16YnJMeXlyNnlURFc2SW9sUWhIalROdkplRDhxV2xzT0pZRHZmeG1TbWxPSDJCOWxMaERSMmxXSkFVYVQwcDBIeXVidDVoamphTHJxQ0NIN0xxZzZUTUFKd0JlaTZfQllBTElTYUs2UFkzNkpSV1BCWVFXelhiRENtdXBjZ0RlUDIxNEdoWV9udGRKRGw1MzNpUkdPTHYxQnU2Q19qdVV1TTFEYkFDdHFKbnJaZnlGYzRRUjR5MjFVSmdrbjFlV3RUMjJpYXNjVG1UN1VqV2RieUJuM2ZSWWd5TGo2MG9qS1pDWGRobDBjMGEwUVlHMExPeW5pWDNOQWRaWlotQUhLLUVVbHdycU5Qekd1RWdmNUdhMkFVZ1lScVlmWFNjMDhQWEM3SHBuQnc2UVhFLU95UG4zRzVmLVNRLUNYWFNabktVdlZnVGpIN0REMno4aFJZcGt4VVViMG5NMklzVTVJQXNuMG1JTTZfeGc5OVFKZTJCVmExRE1Ga1RvRW9kQVFDOXhwUERDMWVZd0dnTlAzZVlxZFl4TVNVRTBrNzRNdmJfV2owQUg3V2FqMWNfTDR3ODJ4RmYwTU1KRG8ycWxCUEtBS2xacUR2S0RWX1JaNTE1UnUxS2liaWtFMTl5bWtMRV9kU3Rhd1JZQm00RjNiOXM2WTVOMFUzMm1vcnZzemxtbTJ6MTFDY09ObFhuNlhFbUl4ME1JQmdwRzVSLUZTeGsxNUFpSWZiR3o2dnhfRWZMcHdYdGtZdlJrTFJjM21hQVpZZXRHN2hSdmlRajZZUWdLTXZGU3hYWTVvbHV1QXh3WHBhNU9LUjl1enBDdjdPRVpHajNUNUF3bU9UTGhZRE9CT19LTFZ4Ql9TdGNMWGxrbGlJWmVMVHBHay1TcnlycE9Jb2JtdENhLVFfZmpLYURPMjBhX0xTQ0d2RlZJLW1HaXJFdzFIY1hfTjFRTFJSbTJXc2JiX0FHVWVma3FFTDB3aFFabVJNSXo2dUZmNnlDaGtpRVUxV1otTnVOaDZPbW5Mdms5MEpMYjlYaGhyUDR0bFJvZWU4Y0U0UXctVVNaWWlPM19XNzQtWERBa1lGU2NTa1VaX1hIc3IwaDE5X1hENFh1TG1RWmluMlc2U1NzU0Z3Vk10QWZ0SjBpMURkVGVSQmtYcEU2RzNpbkZCNUNCTlM3NTdLVTlqNDlnQm1rZlhDQUQ2NEhad1E2cEdMMU5zZW1ZeVJsR0RiMzQ0OThLNFlRS1lRTVpiRG1IeHFCekVscVhNdW9KWVV2UXg2N1RQUXFSQThHU2hKdlpEZDZaaFJualBYV3NRakh1YUUxZHJUTnNGMmg2Z0p4ZGZWNVlHOTlvRld4eDVRMk1aU0U4X2FtbkppSEVTMVZPX0tLNUpTbjFnRThIQkdyel9mamtjWUhjeWZqUmFVclpYeWl6N2Q5U3FuWVJ1eG4zMlZrTEFwZ3JYbG0yTXBmUTVZUkJjV1ZQOG9hX29JcGRtUTVxellJZ3M1Tk1MTWJhZ1BOUWVNVEpUaWdFd1laSlpZWXNBWkFSa3F3VzRITVVsVnc4MThDRFRPY1pibnp3Um5Fc2thM0toc0c1RjRIMXNjUERFMlpxc29nWjNubkFqaFRuMEpWN09kYWJrdjk5NlN4Z1dqUUpZckduUjhsQTJob1l5LVQ1ZDM0STNWN3FJdmdXWHF4NWtxZXc3ZGxXQXZXNXhXd3N5WU1EbFRSTGtwT0hmZHBTUkZ4bGgzb3pZblllVHoweWUxTlZZdXRKTlY4Z1pUSGQ3SzI4d1MxTFB0SEFzeFlmVUV2R3NiNVljaFE2ZTBrSGNUZWkwVXliWXhJWE1WaENlcTB6bV9UYnBBUXNCZWNEZTVxV1Q3VjlVbVZKV1lKam9UT0xLUUM0ZDUtNkwtV3NQeWpjTXRwT2R4NERRbXdNSTVSbE1odUhWT3FjNDlYaG5CN0NZcGlLUjFSTEpmOHZLdzRHakl1STIzZE5kcktYaDFtdHdSSnZ4MVNWOUhlVXc1U2k2YnEzMGNhOUlPdk9PUFV0TDVzSnd5OFBSNXRSUnlNM3NHZTFJQTJfLXg3SHNaemRTZHpOVVc5TUotdDRBcXlSaWtQYzV4ZlVTR1EyU0JPSkxiUVlWN1F0XzlEX1VfcGlPcXN2ei1naXlONzkxRXRWM3dCVTNfX1ItbHJqMHNhYjllNW1BWWJsQlU4LUNfeUtuMXpSRTFBck92aGE2UjY2UjRjSGwtNDkxOXRzUFV6TEhtSEYyQVBvT012emJfTjN3RzZRQWVXU3BKdm5pUnQ5QzFJRzM2eFMxV2RDekgyWVBBajljMXVDdjBCaVIzNEgwcG52UnFOcTB0eWR1SlpqZ3JSOGhPNG5YRDJ5X0VUYjNLRW9VSkJFcTI0d2FFZVZFMjZKSG5tdkRuOTJ1TTQtM3dZSU01Z2pXYjE1X3Bjb3hFYi1kOG11aVo0YWxGMjlFcFVuYllXXzA4U0FWemRPUk1EM1E3VTVsYUUyZmNZc29nWlRwZjFGcldGN216VHFuaDNHNEFPU3Fta1ZuWDFVMUtwQk1qQUo0NzN4d0ZCZVo4cXY5OGtsN25hRy1CdEt0TThqaGJPQTRVVld6QkdFQnBQZzhMa0JOVEU1dE9KZUNFdWhVbno5NlI2T3lac0p1dC1IeTM5T29HWFUwNU1SNUNPbndtVzAzeDB3WHk5WmtjV3JBZ2RZT2g1ZHJZWHBhVE50X3EtWnFONGpKMmJMYlUyREFYcDlBR2V4dDhOampEcThEbWxuYjZFU05WR2p1RzVwR202S0lCSlRhSEstcVJfY2YzZDFpMTVXRXFGQlczRHZVTDA0XzlRMG1BUmcya0gzN0tOSDEtX0pYQmRsMHRYNW93cFQ3MkJyV2V3aGt1bUlwSFQ0OU9pdmxKNjJZOXhXLW04aWVsbVg2YnhXdDZVbnhfeXpuSnAtQkFOWFZmRHl5ZWc0N1l1UjFkYS03YlhmYjhVMEl6VlN1dzJPaHp6MElaYl9rekRBb0pnSnpYMkpvOG1Ja3JtaVIyV3E2MXhqeERIcjJTMHJ1aGxRSkk2MWFMS2g2R0pZMFdpZE1DRmZndjQ1eHkzTy1DUzlpQVBBMnI1WEFvR2JpZzlNQmdVaHNJcGZVSkZ5R3A3RTFaeFhTNWh3TS1NWnlKWjNMSnI5dndiRWE0YkY0UW0zV0loQ2w1WnZSQkI5enRtRzFvU2tKd090VEt6WEh3WDM1a2QwOUJqUWRSaEVQLTRmbFFiWnRiWGM0M0ZrZnNCUmxPVEtYbWpDSldQV3lqS2pwMW9la3gxYVVBQnctb1dyQVFPMVIzb2lUekdDYWdMSjhmZjRlZ2RMaF9ZbXV0RGZIOU9uZWhCaURGUHFFbDVtRjVGd2w3VWhVWHR0OUxtVEE4bjY0NDZnWUxIOGtyUFg1Y1IyanRrcXNub2NEOFZJOGFKU093VWpZcEdjOS02Zk95SHVhSTB2RHozMzE5SVNtajRGcWZhQldGWm5VeWNOVTM3MXRXYk9NSVNtYjFxNmxHN2tRQzQ2N2YwNDdLUmt4bXNXZjh3UVFPVlg1VEFKVVZJd1ZncEpkZFlPQ0kxQlpaa1ZVTnpoeThaeC0yRzVDbEU4LVFjbVdTeDdZUVVlbl84d2EyWDNLUlRhUWJ0X1lxcU1sZzZ1T3I5d00yZktvZ1owd0Z6alJLR2hBRVVzbWc1WTdtY3J1XzJtQXVkbGNOTzN0Ni1Qa1A4WEdkRHpBR25wVDlSRXJPcjR5eGRZdFpxRDZrVjd3MDAxN19pekpBb3NMaXhGeVl0eU45dTFfRDFqbHYwM0hfNnlyRWJzSFhvZWJIaEpoN2FaNmxrVHdqM2pnM3BoMHQ3bklXeWhDNS1qVFYzV0NXWGJDRFo3NnhqQlBQbkdoQ1hFNFRncTh1bWVxZ05FcHpzWGpzTjg1OTFDUE9MSUtRTGJobFQ2ODJ5SFRsX0hJOGtkLTYzbHE0WHZ0eEd3SzVfamN1ZXMxVEM1Ylc4aEg1S0JVb0UzQng5RmtXdDBPeGZWOEhnNE1kSlFXR0JiYm1UZFdrVjZ3cTkyaGJUeVF0VFZoN2twMk5nTDlOSk9zOXBscHdsT2NjcmhyVEFjMFQ4Z1NxNHRFTU4wNTJFTUxIX3dxM2hVU1QxLW5raFZTUURDaXBlUGF3dEFhUERLLWxPb3hXa2NlOWo4TGxjTTloYUhYSzI2RW5QLUFTUXRSUWtONjhUZ0JIbXVYYzdlX3pGVXIxOGs1V2FDSlZPa1F5eGhLTUNSckp6bVVOcEJiSlYwRDJDbjlFbDVEWWtNR001cE91cU1VVzBBZXhmNFRST3haWUhaM2x6Wkc2cWxvM1ctdm9WTFJoZmdFTDkydUtld3ExRXAyS1I1TTBSb1J3THBtMGJBSkF4bFVJWUE3amNzNm0tcWllVnBYc09CY1k0UkRJNEYxaGdQSWwtbXFsRHBVV1c0MFhxOUQ3R0o2SVJDT3FJMEExM25qZmF2N0NCTERVTVhncEd5LUJjUWZjWW43M1drZ0pHaWE1bjFqbkFMODM0dzc4S3BoS29oMXpfNlZ4MXB0eFpfNEtXN1VIaTE1Q1JtcmFfeGtlbWpLU2ZJbklXZGlWdWZYcFBWbjd3NHBZWFV4T2diUjQxTVNMVTloZXdESmlPSG42YXpaaHpkSXY5Si1FZUJWN0h1YXV1Z1cxNGY1Vi16X1hfZ3lPRjc5T0lDRE13bWdzUmF3a2xiRW51SVFETlp4ejNoZlBEbG1OM0w3V1lVQzNZWFVMT01TTlQwWmpwX2wyOGpCRmRGT0hBWVhhaXZiTTBES1ljd05wRHZzOW51bXBYaXE1SXFwTnFXYmV3SmpRVGloNllIZ1NmaGV0R0Jfc3ZVUC0yM2lLYnRITlBlTUYtcEJNUS1yYi1MR3ZKOEZYZG83R0FuaGF3R2ZLeENtUlZMSVM2dEw1VUxtS2Q2SmFpbVpzQTZEeU1ydEc3ZE9DM21ONFJ0N3NWSDdXNkVkVlVHTkdMUUVZS1FaOVRXcHNuRzZoSWNRdFBwUERGWEJVcnYwNXV1LUlVbXhabW5HZ1lYYWF1ZHl2N0pBSHRFbGpXdXVWRFZkZURYbi1jYkd1cGZlTTJDaUtiMkZPcG9JMGFXOXRVQWZjVkJGY2o4Zm1kVkhzNGU3dFpqWVlsbEZxcGVmWVl1Y2pWTzJ3cjhSZFFaQ0VRXzd6S1pVY1JXUFppS2k4T0JFMG1TNF9xWm5RVURiQjJQRC1CZWRnTnlNNlZnYUdIb0ZwZ0VVOUp0SFdfUHVZcGZoaEREeDF6eHZVY1N4c0t4WUZlQU9hSzVlLWRjQzhNOHA5T2VvNUtVaEN4dV9hdEFEOGRpUjJaRFZYdE1yQ1lBNWdPSHRiRVFMb2hyYUVidFlWNWtDaDljVVZpZXRhR0NJZ0FlTHBLbjZJS3lHMWhYUmM5cTN3eTJvN0JYa1VvWjFZX3Rvdlc3R2I3RU9VekxXQ2tMWXk4YkNjT1c4WDJGZUpyaXlnMTQtWVpWdmNsalRhU05iZzduLWZLbmdjSDM3RjVTelpDQWxORkFvYnJBMk1ZeFdlNG1OSkZDV0V1ekVDNWdSWHpWMkVnMkJqVkxINmdmV21jd2NzSnF2aVJWc2V2NFE4YlN6MTIzMU43YkhMT3dKcFNMSG91NFcyaV9VNkl4T19CNWI3Y0pkZktJeEJ1QXZYSEVTSnJ3bkVfTDA5MDBOZHZPNkp5WDVSSjlfTEd5cGxMNGtsTGZSeHVHd19Xb0R1TThwZTdTbWtlX2dXbTc3TF81dk1DQThEbTI5MXVfV05DM3lSUVltVXZNOXpuaHpqTno0aFVhYVg0R1k2NTJyNnhZak5BSzhla25DQTdyVXNUeV90MVFyOG9TYXdHX19GX1B0MkxmamhUdVJfYlpWa3FfTDdZMnphUzk0dnZ0UHdxNk8tMkxKdkZSMHprVXlMcERIOUZTeVNYZkJYb3FDYlFqU0VLS2x5NXlWU1dpODFmWE9xSjZmTnNNUVl4MEx0Rnh2SXhVUWw5bDFST2tNdHNaOGpfZEluT3ltc2dDUU44dFR1dkxYZTY4eXg3c1A3dVVoWTczYlBVeHgxOXlRVUJDcVA3VUc2a0syTDRrUlZtSXJvZm8yMVlCbklXWndzZW5YNHRuTG9LcFlNejhnTjJGOXJQNjI2cElJRDktUzVtbVNNcVdJRFdqLWhrdGhRdjVOd0RsR2U5Tk1GVFRsenR3RHdYNi1tNWFmTjc3M1Rjb2h5Rjk2a0RjYXdqcVhlUWtsdHgxaFJHX0xFM1E2WnNmZi1LeWlUbjNCenV5WG9iLW9GX3QwREctSzlMWmNjRUo0UzFobVk1QjZyVk9FN185RUtoRnZveEFiYkpSVkVrbkZ6cThiRnlRd1ZLSFlFekltdjhxNW1fZzRRWXczOEJiZkNpeDRHOC1LS0xDQW81YjRfbk84RGFMR200aGhYdDl1bmxFN056SzFGZVpqNlo4SFdKbWZUQzItTElCQmJrMURTaE50VnpYSmdFc3RSSzcybGVDU2ZhRFQwSEV5VmNFODIyQVp2QmNnLUk2RVNPWXFIVVBlb3BiOVdPVmFBN0ZONEpuSTdPUXZuUWxOaUJCaF9yY3JJa0xyWmVnM2dRNFZUdXUtRTY1TGtKZVBqSlQ3SlcyTkhiUkNSUEVRZWJ0Zi1pQTIzN0NyV3hTMjJFbVR4VUdiRURqeDF4aVFOUmVjdU9Ud25tVi15YzFUUzdLV3BCakFXZVZQZlQyVXk1N0sxNFRRd3daOVBVTEJRTTVHWERrSnk0WmR5azRlT1RyMWlrWTJmOXA5X2VkYVphUllHRWdKZzQ2Zlc4VnFrRWRUOFBJMXR2ZmVVRURuZC1BN1NhUkM4dnNGRG02VkltXzlGSHJPY0NvTFhsanZ6MmJjS1JIUzZMck9kdFNGU0JoTzJNU18wOTc4MkwwTzBzVjhMNlNqa0tLQW5ScFRxRTN0VWVuY1dGMEhOSHJoTnNJS0dxUmRqODJWMEdOVTROQVpvWVNaMGZnNmFHWTVvNkt6YWpCZS1aelZweGZvbF9KcmJub0g4bld4alJkY2xjUEhWMnYwMmVIeFZSS2hCa2ZhNXBXTEVpMHJ6eHM5RlQ5Y0NrSkZhZnFJeS0xbXRsTDk0SkJMRzhHNlh2MXZuNkJQVXNZM1VadVNQcFdrckxRT1gwZFZjWEJkeDdVUWFXR1lpWUVIY0Q4TXRabFdpOE9qaEhIem10amMxOFM3dUNMVHN3bWJBWUZYenEwQkFhRVhVcmN5NzJPTDgxcDRKNzNXSWNuVkdpeVM4TGNuVTliUGRDTDkxTjJjbWtwbFZBanhFd0twbHlyc0VtZV9yYXBodm55ZEtSVVlQQ2M1RFY5WTh6ZDlRSTZvM0lySUFkNTRyckJCQ0VOTG5ic0hGYmxyVGRENl9kTkV4b1hHbmJFTGR1TUJ5UUN2dFFwNXROYzNsMU5HQm0wYkE3bWxmTFpBN0RRVHd1VXJoNGt1SnJzYmsxNGFlcHVBYlJRQ1J0cl9qblpZZEgzUklJOXYyZDE0Sy05ZFFsS1hmWnl1d3d3Q0k1eXpSaWlnN1daN2l6N19BcFVsWjZXODE3eFA5ZDdGUTlOTWRGU19USUZrZGNtc05UblYtT0prRUNuOVRlR3ZIcGszd0hmU1hJRUlOQnQ4WmNOSGpxWnY5TnNLNDlzeWs3cUhTZURDak5XMlJJUTcxaWJnWFllU0hJZHZoTE50VXg1ZlpOdmdkbko2d1FsY2lzNmNyaUMwSHd3TnExN2N2bWVSaWxFbjZmX2c2RmppVjkzN0pEY2ppMktnR0NsVUlyT3RDcnlRY0tYZ05SSER5bTlKSlRTeC1RSlllR0pLbFdUWDlLampmbkkyblpMVUVZNlVFRFFLVG9hMUs0YmxQU3gyMmd6bm5mTVg2YXZEckt0VHVxVUZzcWVid3ZmUnhTbXEtV1JQRnZFdzZlbWVMbzZOTkpNcWhpSmFNbHRCQmsyb3lLWk1oR3F4VVFuNnR6ekJFcFpXY01nUkE0NmszdUprVTE4ZWh0UzdhLWE1UDViMlBBZk5BZ2NJbkgtMy1GLTNMcG9leTRKLUxSeFNCeTN1clZQZE96djhSUjJ3RXkyZ3BJWW5DenZnM1NjdFFRVW9oMDdHdThMOFhPTktKNzY0Q2RxLTBFRi1SR3VTZUlZbVFZYzZsV2VpNUthMFlfVVZIUUl0SHIzM0R3VDFLRTJSOEZVZjI3N3E0WjFQTTd0R3NvYXRkZzdRMkplRDI3bVZvUnVpV0FLT1pKbHdJbnJZOTdBWWtaUVczZHI2ckhGa3BxOEJIbnJnYUxmZkZIZHluN3lybWd2eWZ5MmU5QlZLaVBLN1NVSFoyV2F0ZmVPR0lrNXhMM0RrR3U1c1FLa25oUnlRSDFMelk4M29QSkZPSEthNzdnZE5ZbUx0cGNEZXBQbUJsOVpNeGhTZEQxcVBNVVpXd1ZEOHVHMndQZWtsSE1Jamp4TjJCYV9UZDlhQ0tHbnEwLWd0WHNoUXozXzFpUm4zQktzMzZVcE5UM3p1d0pOaFE4TllZbERuODBOZmlZdW81TEx2WVFDYnpNb0pWei11TGV0R0xJeVRxWVdZMFAyNVBnU0ZiR01NU2U3MUJpYzJLYzAzMXU2MEx0eWJxcUZSOHVSSURmUW1tMlpib0ZFNUtZUERtbl81RlJxMExDdE1faGJnV0Y0ZFlHVm9WT3p1YnlFanNVRzh6ZGVxclNvbXZDelRZSkhiWF9MOWR6M1VrZU5KaHhiSkNWSXJFeVFTanNXUGMxN0VvVVg2S3d5aUlYYi1pd2JUUmJhWXU3eDFaTjZKNC1JcV9kVDhHU0dQTzJnRFdSUVhwTy01WlVHalozSWpEeEdNNG5xSlF2c0FCQWJfX25VTUhBS1BvY2hnZDBTYjYtVFZfMU9qY0VoZ1pHQUktMG9uS3phMXpwamZSRmNZRDkzTmxkclpZYTJxNkl1ak13dy1EZWZ4SXl5OHktMjhIT211ZWVVVE53YkQ0dEZqZnZHMXQzMzRrZzRzZWxjdnZfSmhTLVJVZFhLWFlDRExTQlNwb0ZVbDRnTG5aanBFeHhjZUpHdFVDc1pBTUpxMVRJWXowV0V5Sk5DRHA0WEYzZnVTdkY1MlNaVjJleWFySWpKRV9hVXl6TUJMV2hwNGo3VkRVeEE2dzlLeXF0NHNwNGtkanZQWWlwVEpUUGh3enVJQ0drQUJJeXZQZFdObXBzdWxPRDZEd216elpmR01PU0gyWkExT29kY1B6dEdLSUExY3JpRE1jUnpGTjlncDZYeXZXWTEyaHgyblp2WDhrc2NQeUVENFJCQWk5Y1lmSF9zOS1aMFZoOC1SWE5fcjNwMjN1UHFhMDFNaGY2OWxENU9oUWNzRE1VeHdzeDB0aU1CQm1EVzNNSllON0NFTFpsV003d1FqTXItTnNURGFFVFBWTmxiQkxfWTlwdjBMdVVFaDhORjMzQ3VIcVdSTlZ0dGVIdWZfd09WNVZjczgyVm04WHVFMk96VFE5Zkt6cjgxMlVUdVFNMzJ4NF9aV0w5MjhzQjRyOHdibVg0N2RJdVZER2hmbG9udEpvMmlkQ3dnYk9YSXZWbnBLUk5oSnEyRWQzQW5uVlBrYk4ycWR2WHhLNFhOMVhoQXhlMDR6bmVqV2E0cHVvb3hfbGdUWlFMYTM0dUNaUkJScXA4THB0ZXB1VGVmV05ZQ0ZpY1FKUGo1SG1kQ1ItaGlzZi11eXpmNy1JRVNNQXBxLS00ZkdENVZVcEwtQXZfU0U3aEZHTTBwZUpQb2xzWE02WmVQcWhjNHc3OG91MDRHN1BONE1hYVJzSDVhdHJVSmJnYS1RTHh0b3pQZzhXNHZvSE5CTkdBa01NckZ0bHFmXy1GWWtES1Rtcm9CeEhCVjFjcFY4SS1tR2hZcUkyTS1mSHF0RUNJYTZLS2hzLTNNOVhFd0JCSkVzWnJnOVp2Y001TnRzcmNBSk9aZ2ljR21jYUMyb1Fka3ZscjlseW1kbEdlN1pocXB2dVZYZlo5eWVPTlE1VEliSVQtM3JFd2V5TGJId2ZNV0xKdlFhSDIzUmdMNGNmT1dwXzZwRXVYMWhvc3huT3hBUE5ObnFHQ3RkTUtRb1F6RWlIZ2M4WE5IU19qcHY4N2R1MUZpcFU3YTRtbVZrN3ZLZnNsbk5EMHR6SGpHekRITXJjeERDY2lza0QwMTBCSWoxdS1oc2FtcF9adzFHU2xtSklQTzNMS2hqVjNuRGVGMWF6Wmd0REhBdXdQS3lzekNPcThIYmtkU1czYWtSdjRZaEo3Sm1KZDluQVliclNnM2JjTlNLM2p5RnJVcHN4cndfRnRqUHloWUtrdDRlLVJVUUZpcW55UmNod0N1OVRMWWZfSmdTdk1obE9XOEZ4Ylk5NktFUzNBOTFkRnEzNzRsMDNsajJsVUZlem9WRFBlb3d3OU5BLTI3RXRaY3JMTzVGNlBwcXFkSXZmR05NSHAxdl9SNTVzYk9VM1E4SW9JNTk4T3V0QUxDS2hoXzh4TnEtaVM0Q3gzMGZYRGhqOGRXWkhFMkZWVmZRX01uLUpxOTlFcHV1OVpRcWJKT2p4dFkxcUpkLXIzNFMtZ0hsV3pVOHpvVFg2dndEWkdEdFQ5NUs4UjB6ZjQ4YjNNQ1dyY1NROUw0Yk9POWYyTHRJRk9nTDVxcjFUQk9oQkJkOVhkbHYwYTU5ZWJPcVZZUmlEZjV6cXV3c0NoOGt1X093T2gyeWVuRjl1TS1lcExQWTRDcC1NSVczdlJ4TURPZUNiUlIyUmNDWkdyOUQ4ckhURXZHbGlZbHY4Y2VGUHBLZ1U3UThtSGZURWQyTmpQSlZjUU43ZFRyUDMyTEx0bE1PVlFmMFhOWXhkd1JGTFY4TnRYWHJSbGxYVW9Yc1BkaHFSZGhPME9IOUF5bXlWc294YlFMRkFGT0JWZFhTVGtmQ05xalJ4VDJ5Q0RlX2ZBMENEenhDOVZ5Z3I4bkpwOC04Nkk0RUlVck54YXJWYkFnNXgzbmZuVkUxRVh6b3pTUnZya2RYQ09rbm0tM2hoWEZsRTJaRUNzcVdiZnI1d19FSFBRTDFSYU44MDNuNHB3VXdVZkFsSzFFQWpybHlsa1hSRG9EWW53MkZ4SGptbDdLT21GUGJ3V3dPTHpVX05Md3ZuaHNVUlhNbXQwMFBkYXpVUWRabXJBTXFJZURYT0dQc0hxMnBWZWFOVUxFTmxPX1BpeV9ER2lDNUdIZktZQk1rRFBIUWlVaGF5cFpkLW9iczVsZDVyeHZ0NUgwcEswMi1UbjR5R3hsTkJtRUhYYzN2ZWFjYXQ2SnZvVERqakwtaW1oNjE5aW1tME8yM1loaFB5QkFITjFaT0M1aFppRjJ5aWlSYjM1TXpLSHNWOVdrdW05M3RWVUE4RDJlXzUwZHJxSnMtd0F5N0NwcHN4TVhkRjE2dW84ZkJsQml3Wm41N1NiT3lLbEJTZ1pEN1E2LTRrVGlSRG1qdm1LLTBNZGxuWVFLczIwbU4zY3RLbmtGUU56RFFHR21ZX2Y0ZGRaVVVmRHlDWHM0VWluRUwycHk3UzZITGFheDllUjBwVEkyZEJ2LXJTblBuXzdGaHlkTnF5MW5PSUZIbU9hWjNrbFgzZ1VHNjR3MmJDNy1xUHRFYWw1VTJfNVcwZHNsRVpSa2tsUVdlQWFwOEpxNVVoQ0szVTE5eVpWaFhZRTR2T2VIVTlhZDFxb3ZVc1NPTkJSUkN2OEljT3NMc0ZSamIxSG5JM1FPRHFNMk9Bb0c1Qm5SQVdNVHY0Zmd6Q3k4clk4NFBFT1pVejZieV9GRDRzNnhUZXJYWVk3X1pucHk5cEVSMzdWbzZBSzN1SXdjWmFHZlpEby05VGtVVEN3TUp3MjJvMVd0VXNoVVhpbkw4aGdSTnAzLXpVWXJkbkR6QjRpMTJZelZ1ZEpHcC1pR2J0WnQxU1VndXlUNXpJT3JwSTRTZzYxRjFtb2FZRFItSVZySmp6ZWttSk9ZRjNROFBrWEV1YnBWSDNOVy1fa3dtVHE0MWp4dl9JSjBCREhkRTlael9XazBGSlU0WnRUQ0pheG1Ja29YZV9WY3JST3hyTTVKajY1X1hPcFNEalptdUJnY2pjZ1ZhR1B5RGJUTlVISjhsUDZMWDFrYnk2a1FfcDBtYnktbEdVd0h1enZmTmQxbWJBQjM1RExKdmpVV2xsMlZhbUVjTXlzVXNRejUwdWsyOWI1dEtaeHlGcFdtOEoxVGNSUVRxZU4wek05SzJWRGdmUmlrMmhCZDFOd3hCTnJYUVQxUjJHQXplRWR4M1NDUWhZT2E4djlwZm82UkF6RGRTQnRGOGtNbW1wZ1dYNy1JTFZnZ2loUFJnMFl0elE0TU9jSmRvLTlyY1hsTXllbkNtTlk1M19Yal80VlA3V1hEVjhBT1dGUzFabTdoQXFqb3h6YktsSXVsdHBVbjNzX0xiUUswSF9wUTRuMmZWYm1FUkI2TmpVRko1WGlmbXpIS2JhWFhHcUFGd0Z6WUN1WWdvamg5cU13UkRGZG1GUmVxQ2ZhWUdrYVNydFg2d1pBSWJBNzVGTk9RWkFnaUNScTVXYXJTejJGcTdONDZmX0c1NFVhcWR6WDRLSmZua3A3RmYzWUpfYVZSVXA5T1JtRTBEbUk2eTVZVzh3X1JwdUZBcUZUWXliM0tVR01ldFFGN3JiVElTaV9acU5xa2FYTzlhbnJsNDgxOWZRUHhqM1VYMlZKbjU1bjI3ZnRoMl9YdXNLRDJQU2YyV0F5R2tTa1ZDLTBqY3duZFJOTGFReDAta25SR1lKR1lDbzhlTjJqRFhhS0xxb3FSQkRLb1lIMXdRNFFzakgzM1dqZllkS195MGNSLWNBUDdFVnhDN3hrWm9vZW95cVB3WHZ4VF9uREp2T3dYV2Q0Nkxmcjc5Ti1oU05qUVFxWnRCakNlV2RCQVB3U1F6QVAwYW8xaDJxd29aOUIycjhCTjBKdWVQeG4wUEhmTEo4S3VpMnN6OWF4VzY4dGd5V01UYUM3QWdaeW5aNHZXUS5ZT2dqZkpnaG5EOEpvejFTaG5YZzVn"}'} + headers: + cache-control: [no-cache] + content-length: ['43460'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599978e271b27.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/a6007e896c074b10b0a266cb365f4afe","kid":"https://vault10511599978e271b27.vault.azure.net/keys/cert-name/a6007e896c074b10b0a266cb365f4afe","sid":"https://vault10511599978e271b27.vault.azure.net/secrets/cert-name/a6007e896c074b10b0a266cb365f4afe","x5t":"gny9IWSkH_pLqJUEM7lfRWV0IR4","cer":"MIIDczCCAlugAwIBAgIQPUYG1Vf1QPuOVZQDO20qMzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDR6WlhZZ9tJin7CAB+nj0fIWXqn+RM31rxKm6enxP8ESokdZZOrXOT9VpEFOxCJY4C7MSpZqS0yVIeTGouiAaM2dQEZws+Dy/3PnyCPcXn7vmnX3z/mAYtgYMERaOV2O4ZV+q5Ojh77bqX/4O4y7Jltas9aTYkNq9azLIStTXguE1lV5DHmIAU3wRtKN02bRKqXXvkl64QhpqnxQ8FAIOtuheZmQgVxftJq7MT0Tsu8a6jAc6O3HKT5IFYah1xwXOs9d4gUYrMubkVz/k5rzapRmkeiOrMJDcvApBYxmoZj23mbcf3AVB+JEfrm9638A/vHvqkTOLorujeodf3xE55AgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBSq4JWfuAOiAfkLg9XZFZgAIxwc3DAdBgNVHQ4EFgQUquCVn7gDogH5C4PV2RWYACMcHNwwDQYJKoZIhvcNAQELBQADggEBAC8Y56TAFsmK/JOtQ49EsnAbskDpfGM/mlZZJDJLP3ZmXXWo8jsHmqJw0bW1rXsU7TxRZFX8Wv0ZjOocywDE1jirXWQ3R5Znt+MvfqMM6ia0DXNpnZTVqHqY/e3I1Sl912YKhNPTeAwb443e4nIE6JPzIKXm56bsnHePUoB039Ah0iwAMjA9uPLozeCtRjZB16Lc2QRR/CMJh92/Me432Z7TkGfqu1bXRKtxOwALQBhQDIZ5g4gT+EpkceSmzfdK67TOFIapM23IultwjsJfSlBMCp6tR0JKJeD28oBF/NShlVi8L/3sFRoI94hFjfWNS0cqqy4cpHTjY/1huaZdIxg=","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639273,"updated":1567639273}},"pending":{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2475'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:38 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnJWaFNhSERkY1FSNnRkNWN3RlU5XzEyRjZ0RDNxeG5SU2gta1ZIbmROWGl3WFFjazM2ZDNUdmExNkdlajVBQVIyeE9lSk9BeG5NUFBPaWsyN1JIRU5lRnJSMzBrdEx5YnlXblo4Tk5XRXlMTFlIN2M0dlpPTHJjeUgxYlVNZ1hvb1FlcTdndThIc0NxWndzWVgwNlZVVGE1LXJTZ3pYc0JLMWg4dDBFRm9CcUlFZzNaLU8yM3FRYkg0Mks0cC1yenBJY0I4bC1FYkQwSVZRQXNQTjJPNU5GRTZDM2hudGlQM0R5RGJtSDF2dEpPNlhYN0JwSmU0Z2ZHV3pDdThLOF80R1htZzBxcFRfUVFvd1dqSnl1MmJsOTBlZllERGszemJRODFlRHUxTEdWS0dVekpJY3lDaV94bHlrSWVFOXo5Y3otVVdKamx0a3VhVTdqanVSVUN0QS5ZcGdhRzJHeWR0c0lUQjlSRFB6Q29nLk5IeTl6X3pTSi05a053NkM4anhaYUdCMGxzQ0swcVdKazJEN2RoNUVCTXJMdEhMSk5kTE5NU0Y4M1VNcFNwN3lKWlFzUUlwSXpSbTNaNlVqYzd4THRkbndkUENMQllfeTJrOXhVMk5MQkVYZmoyUGs5bWhGbDNyM1V2alVFYzEwaUcyNzhxd3hoM0xCU0oySEZvelAxVUNaSHN3WjVmc0RyMDlOVE1BZTdmT1gtUUFERkt2Q1ltVERDMHVVSFF5elg4N2g0dzRWVlY2QnFhcGdOZ3FkeWZ0SnFHaFJpbXFnV0xRVE1OYldBVXNsdF9JemdzazRKYldKU3ZHMWt0NUgybUczb21COE12T190QllqSTVRdEdfeVdIVW1xV2NJbWtWMXl4Zml2bUhUQkRuQjlTZ2Zhelp4NVVkeDdDS2xMdmVZTHhkN1Q0VDN6anlvSjAtMlFoVzZuak1XMTBVbEtxRWNLNnIwUUhtRFEtcUJrbklTdnBDNURabDBWdFRTeUtJNGg5R05nZVQ4SlFaWkpOZFdKb0ZrcGpoemZvOU8zY2RkeU8tdWw2NjY1OG9SZUpnUDY2SThNcXdCMi1aYk0wR1ktVUVRMno4aTBVMUpQWTF4RE9hT1JOcW9hTmVOVTg5cUFKaUFJNWV6MXVKMGliS2lNb3M2TTczaEhsMUc2aEhtaEtudkJYbU9FSXdhZU9VRFk2amkxdS03RlI1RV9VUHlLNDA5ZUdIT1c3ZGJlX1c5My1DUVFWRGpHRE1KdkhBN2w2ZC1jYloyUmlnYmdDblRoSE93ZFV3aDdzcHZSb3hIbW42d2dTd2FUQTFoeFFtT28wYlIwTmc4WTlicWc3eUR1b0Y3OWR0UTlvUFZzLURPR0dDbXlzMlpELU9EUk96eS16eFVCblVBZ0o5UDB2WHFaNEc4SElac2xaWnBpV3V0THdPT0U3dlhzUGlBdFl0ZGJiOUt1cHZHOGkzd2NZSjdycDBMWGZteUN2clZ3QVRUcWlXQ0tCMTBMTHZNVmZSYVZqRWRZSU9RRXFKVDljMWc0VUY0NWhLS3hpMzhlamlSRVc2OHVmQ2t3cnNsaGRzUUZ4ZGdGd1VkVS1CVXdEQmRwajZ2MTlURmY4Xy1hcE10MUtvSERQRjc1TDR3aTBEX2hwcl9VUGJFOTdxSDNGZ3EwaGx6R3JuampRZXg2NXNJZWh1V3M0UXVDRjFaZDNSTmF1Sy14QzUzWko4RVA0MlBQUWQ0ZFVrZWJfM1hYWEdvYW5uRHgwSTFPTnJQUWZiU0tNbmNaYjZ0dTVoMTFQZHA4Wi1tRjJWdnU4cEgtd2hZMk9yNXI1SFhrQnA0X3pQbjZLMnlRNEkzMnZvY2dNNmQ0WXU4RDJUbFBPb2lWclZmeHdLOU5IWlFxalF2MTMtMWpaY0tydWJMZWlwY2pqeldZcFQtLWJwZmRtSG5yNWFZT2lHNS1JR0RHUzJDZzNnZGw0NlZzUFdwQUh6MWJGOHNYakVGSlVXZ0J1MVdzOUlZby1tRWJfM0tiSHVUTFdfSkstWkZVbUliWnAtR1pTNFpWMThiM2JsR1k5NWMwQldSV1R1OFZDNmpoaG1TbkcwM090XzV6RkNCaFR0WDlNWHV0Q191YnJwcUJuOHpfN2ZkUTVhT3k4QXZqSEJ1S19pMUtZTkdQVE1RaVp1VXBiU2VNRVhFVUFzYzloY1lSZ0pFc0ZzeERNRzIzcUFSeDBCMGJINDF4emZmbm54LXJUWXpTRks3V2gxRThMOV93VXVTZng3dDBoSjJ0SEFuMTJ0Zm4zNmpteHZyQzZrV0RxTmJKNzdUOHczLUM5QWlHMlpJMnpEem0tMTBDZEVKSF9FWXJidXFpbXdMcW44cl82TWdNV25TTTJrU0x1ZUEyOGFhRE1SN2hPUXUyZ3V0d2x0eXJacHhnM0JCWHdQTEUySGxIZnBjX2llSnJhdlByeWNHYlJQVE83X0s1SGZxYUxsYVh6QXA0RmtIMXpiRmFfMGx2Vk9sSWRreGM3NWdGeURCSXVva3lldnVqUlExMHctd1NrNWlnRG8xWGtDT0o3M3JFeU9hcU9XRWhVSldhcUdaMXVicWNuUkpndGlIZ0ZrVmpFN1phcUlWbUpwLVJmcTFhZ3FYYkhoQmJ3QU5OM0dNZWl6dWFST2QzU3JsVldjZkRWWS03b0Z0bVlqWXE5OWxlbHl0ZGsyME02QVlXeGwtM0ZfdnV4eEVXc0F3ZGdxMVEwS2RrYXBhZ3J3d3czb19IQWQ0T2NJZ1AxMGtpelFhOUozMnM0SFdNbVJLYlJETGtlX2dCZDd1Wl9ZWC1nbTVBbTdHc0d3VnJqY1NmV08yOGFvdmFtNVFRdkozcWVzNXhlQ3JkNlhlUlZJVjVsRGpWUlQybDhzVFA4TlRNS3g5SWhRTC1tVlB0ZloxNnl4RV9GWU95NGN3V3hnamNTNmlxZExxclJYdTZhX3J3MGhpRDNneGRQaGJTVm1ndUd6UFhrS0xqU09XTEYySloyUUlsQ3M4c3dTQUxLQ051TnZUejZtcXF3bk9lN3cza3pobW9DNTJtVVlIUGFmaUwtbDNxSE5PZzZFWENsM3g2aXB6alVPZnhfVzdsaVNmdWYyczVVWGxHSG5pdzI1NVRXeVU1QjhTOVUwOGVyd2tad09HLWJhVndDNXliQWNZZHZtQUxSZWtac0RlZXZIREtSWm5WNUh6Y3lOcXVYbVkzZ3M4V2dGY1ZQc2ZKRVpHQ29rWWZRTTdtRmItT1hycldFRF9RTHlQeTdUUGFLVjc2YmowZVdqYXliWkcwNmtBZFgtTndLWEtPaF9CVkdIYXl2UVVDRHRyQ0NtUGVUa0p3X2dZbjJJemtMamI2Z2dDMkRNbzZNUmxLRDNGWW1pVlcxVngzNlhja2tXTHMtZHpuaUQ0WmRPd1lCUVRYckIwQkN5S2l3U3BqNGx3QkpnYjBhMEFHSjVIQTBKQS1iNDI1TGZCQ1pFODd4ZHpURG02clJ3VlRjT21uaVdCQlJyZmxmLS1RWWtIalpyVWhwSnU0VktpWng0V3hocExhOERZYnpTN3QtbURMeW9fRnJ4eWl5S1hiVE1FN2xPOVViWE5zcURXUFRBV1pscDFQNE9IWkg3Vnk1T2tZY2dwYlY0dHZYbl9HcDNPaVg5VE94bXRkWmZHcW42UzVKUjFocDYtSEMwcEgyVFRyNlM1T0daOHI1elBsUEVmbFFJenF4cjZ0Tlh0MjFHVk9fSWN5cmhsZ2NiWXpuYmcxWk5YOEJWYy15dDVTajdZZG9KbUQ2WkJwMjVmY2tRNlVfRlVkb0VCOU9ETmdLWUlnMUwyVE10WXNQUlIweUxoUUtHcUlwREUwNG9yXzFSR2dLN1lhQm9RekV4d1o1M3lUNU9wNWdMdFI2ckg0Xzh0cTJHTmJYTldlc0p6dnBtdjFVbnZjQTFqNXlNdmNaWC1DN1pNVkQzWlF1VnktTUNRWFNDWUE2aWpDbGcwU08xajh3cXFodGczV0dCREtXZmRSQ0ZJWlhjNUx2aHZzTGs0RTJQcmtTWi1YNVRpZ01ueDBOeGJhODFQZmFwZnVYdWw3S3M5YUpIOXl3QlFSaHdyeER1SHVueTBMWGt4UWJLbEx1c1ZoekNLeGx2QzhCVXhNWlVLZDFUS1hWb09KbmdqUTRCZ1Vob1ZJMGNhQ0RCbHlrbTZheHZkWjBiVV85U3RpZkpRTHNseHBic0xrcW1ZRHl3NUxHSVVFWE5mMy1UQTZBWVZpdTM3R3J6RHZfMUJkNW1DX2lsaEFaSDhXYTV2R0IxYTVTTDRWdHZsdDZmako4bTU0MDlPTFVMYVlRbGs4ZnQ5T1EwT3RYVkFuQVdMclltUDVmVEM0LThyYVYxajhvS1pucDJNMklqSVk3c245SkdyaFE5NTlpSlhrcWFEU3h6bFZBTkZob0d3bEJqRTU1RV9QWkx2ODlUaUZteXJVdTgzbmtOQXVXd1NuSTZqV0RFdEdrcWdCdng3RlZ6dU9DWm94a2xkRzFNTndXSGEzNXBoQ0hpa0ZPUmNjVjEzdFNHVUtWRllTQVowdUZYWlJ1V08zUW1iV21mMm11SVhYdzBwZGhVc2FCeUs0d0hnZzRRLXREcFNSRFVrWlpBM25nY2U1QjAxMWhBUEVjV0M1bk1sVHhSRkQtSkx0Z1daTVAwMTNyNXBvbC1kZjVpblh5Qy14RENZWFJ1MHN5cmVtcEw0a0dlVVFYaVBGSloyaEZPbkxNbEZSaFlMTVdfZFlRcWg2MjVqdDRxS1BQY3o1WHVmel9UckR5dmRpaHMzWXJEdFY2ZU1MSHNTY3FSYzVRenlCVzdISEs4UnlDWlVqZnUxTXllMGZreml4eDExREYyVmtVT2JFU3A2RS1JY28zRU13ZnN2VTJBOFY2NnlMcGwyT1lEQVlLSWhHcWhhd3ZqUjNxZGRMWThhb2xiTlpFUmRYUWRMa3d0aFlBcHFNb0hZeURibWpBQlhZU0FZeVBsN1BaWE4wUTFBQzhhU1JCb3hZUTJmWFl4OHB3bExsVVFEVVdYaDk1eGJWM3dTbjhTcVpKdjV0Mm9uMEZiUHFSQWlpUDNoeVF4eDhhTnc1QmJjSng4bWVpTkJtMkZLUkJpbzUyT28wOHFkVERWbWlIVjd3WHdmWEJrNkNpYUswNVduUTdfUFI1Y1RtZ3FIQnE1Z3oxLU5fWnctZVZSUFBCNEZ0V2FhcXFDMTZySjI1MjBTZlFETWxvRG8wcXBPcGU4VXJTUFJndXJiYXZ3UWJtTUtpTmdJc1djcUFTaW8xLUJIVjNlcFllaHNHdllXVjBteVlpblN5R0hRVzBTR0tNeXljMmZvN2dpVjM4RG5DdlNSak16cXdLNlBBNUlva0x6N3hjTGpQT2E0VDJ5cHAtNHY5YmVTbUVTSkI3U0huNThmY1M0OXc4ZWY0Q3ZGVXRWckJoSHlZS2k3VnNwVkJSOEQtNms5czExQlROaGtRNW1leDFWQmFJUndTMXB6UU1JbDZ1QkIyenJYVEdmRnVoZVNvZGkwMGJ1NXFmamdvdE8yX3J3MUlGVlBPdFc0c29NVU9jeW1PRVROOE84dnd0WEZfbDFsVkJBLUlfSDl0RC0xT25mYzVyRVpKMzctSE1wMXVtS083RXBtQ2lIbDhhdHZ1b1FsRERmY2NfbjJfRHFqQWItSTQ4SFIxZ2YyZ1BhRlI2a25oQnNvcTlERGR5S2EwWFViekRaQ3daMFdSYUFOc00ycFdoU0U5RURHZkxQVThMMVQxTGxucnpUYnVYUm11UHlRb0k2dFQzUjJFN184cVlQWjlKMGw1cHhuNFRoa2pMalFqckNLRjZ4VllPejRGMDU4OXhaUjVCSUp2TmNYMTgxSkZWakY4NFktU29OREZsUklsX0Z4ZmJHYXVlYmV6X1RWMVB0MWFWM3A3UVRCRlRUb2RTemt1RVJzTFdJUjRZN1M4dnBUV2FNWGlVUS1ncy1saXlfWE5sc2lfTkExRkwtZUlVUzU2QVVOSWk4QV9iUkx2V0kyTHpZcVhXSUNOMngtd3QxTW84Qm11MGZqX1pkVVkzR00xUVhkSFNjMXJ2d2VWblN2c2pkUmZUUGc0V2xRUTBxT1pxMVJNSjhpWTdkSlRXTXJmeVo3eFVRVTdBVWRLeTk4ajhIc0FPVHZtVlNkWDl0aVVLSWZUNUZKekdDRnR6RVJ1WUp2SHl2clczYjhPVWpGc1FQSWJVUi00dEprelFjX3BsaEJVd2lvUlM3UXNuVklhX3lPcmludklzRkxWSE9qY2F1SS1JaEtPcGZjb1RNSmV2dHI4bHlBNHZseW9PS19hN3BDR29uOHV4dUtlT1JLTnVuVkRhVEhLYndpVllsaEFkYm5MYlB5emZSc3JKdE9DdTM1Yy15QWVKdW9naWQtemJPc3VuRXUyRTFOYTByY2hMMUVtb0dpcFk3N1kxMTZIZDRZYVBzRXp2TEp1U3ZWX25QWnROT05IRkdidDFjMUh1d21FTXFxZmJvbTJCU3lqbW91UlM5WVFEQ3pLZ2xTV3JSWU5KRlhLS0pjdDlnZWFZR0l1dlNGdG52cUttNnBTaTJHNl9hOGpoUDJJSkxCdkVXV0FMbHBRRFFTMUZTN3Ria3FtMzAyTTZHYVUzNTFQRURBRTRFaVQ5LXhITkRFT2xvMUx3Q1JXOUdncjNDUnhoTjBvZ1pyQTZWclhoM05aeENjYnR3WkFQSS1oaWZtTnhfR0ZqNno4bVhOcEk5WGhRNkJxY3E0Vk80eXFRdHpnNkVZTHkxM2ZKaFViREc2aGpwWkY3dTFaaWpxdzFjMEhfLV93dlNJYWdONVJXdjRlMHdSVzhXWXZjaWl3WWs1dFJXWUdIeV9hdVdfNUVrUUlEa0lEcEpSdkoyaENFcjhGeUdoN1NjdjJQUHU0dGxhS040d3JoRzhKR1VVbWRfRzRaUURuYk56MHQ3Qi04UE00cExrUkZzWW45eVAzS2RoX3FDU2JpaXNTa1RScVNHeXZZXzBaZVBTa0JPRmh5X21KSzRtdGU4eHBQYVVkTUNITVhxV3VrcWRiTmFQaVZjR2U2bUJia1hZME5YY1BBWWE2ZEJXU0tLVDdSTV9mYlg3RVd6WEZ4OGxZVVAtODEzVGJnYWVjeExidC1hc05MWmZ0dTUtNzJDRVlEd3NOUUVoZFdTOVk0aktlRlVuSU9Ba2RlMFVYN0NpNk9wV1NCTW1TQm1SOHNWdnp2UUdaVlUyNFlZdmtEaVM3SzVsU2hERDNRTmY4MVdfVnJtc0F5Rlk4QzNyUEZTMzM5TXFBMEZyVnZMS2NtX2kyOVVPWEZBaUtlYTJuY21BUm5xUW4xZUwzYThJYUx1RXRtOHRsdnk4Vk1vVjdfLTY0ZmtpM1NDSmVWZVpad2MzRWdFZ3FIN1RQa0tlUks3NTBRT1ZTdzlGYVZnYUVUeGQ4cmM2NHZXeDBDUkcyVXo0dGtmM0pTZHF5bVhFTUFlZzMxcExITHJfSXRuaWxhTE9PcVVfSEc0RjkxeTdfNUpVcHR3Q1R0Y0U2MlVQS0o5bVB6bXk4MVlnS0djZFBUOEJCdTlua0pnWmljSjVyMnhRWGlzNUZIUG5TV3lDMEVMRm43bnpWOWhNcF94N09fM2s0UzMxQUFyR2lmR1c1MFBqV0hTdFZVSzFiUW5CYmlwc29vUkhIVHJFcTl4NlZBNS1wNk5KWU9CeW5tVUhrNXFyTGh2ZENLQ1dPT2hlM2E4OW5fSnZWVlBhcG9KVGdIeXpPUDJ1UFJLaWZGLXBzMUxrQlYzbGFHeFdQR2dESjk2MUxtN2tjQlB0bGpBZWZpU3pRaUVEcXhjbHhBRGpxOTNUeDVtOERuZ2xfV2p6MlNiR0VfUUpXVmpIVnhJNXJEaFhwWGFCYnkwUDlyRzJQMHVYSG1SNzR1Nkd4NURFcW95ajNjWEppYmpwV09UYjhVQTM4a05xVkt3YjhqTnhBeUJ6UXV6YjBGcFBNOFk5MDZRajhDSmxmT0x4b0xRbXdTellya2w3QnMwM3hTajQ0c3RtQ1dLY0JkSUxkb0N3bWNfb3RzRUY5ZWFJdHZsdGRhZlJCMlEwRTBseTl3ZnU1NW5PeFN6ZEdKQVI0TUI1VVBZdGZGMng0Yy1TSHAtMHdTczE5SVdpU3N4WXAtYUtQTXVjZ3VBR3AzUGZMRW9jMnpHYXFPUmFLZUxqMnhEdW5zS2VSZDY2dUJPZzgyWl9ITVdTRXVqU29fdDVqeDBCSUZPcTd2czdOcW1NNUItUjVHLUUyZTMwTThCU2JPQkd2UDNVRTU2OFloQ3VIMUdidjdubnBjd2h4YjV6NG8yRDNobWhKQU5mWGU4eXdVMkxQc3VCcU44SkwtZDI1czBkUHZIT0theWt1TDZXWkdEUFpPQVoxWnNzLXJXOEYycTRvYnZrc19IWVg1eWtRZlNPdFBKZDdmZmo3Z3ZaTG9hMFFHbGs3cnRhN05kQTRrYnNJMXZHZ0xONkxNQlVtUFBaMW5rTm94OTE5NWNuUHpfOGtxYUNzaVQtQXVuZW82cW9sUERvcWhTTDdjS2RGbF9DMVRnZThGMHI3TENfTC1ROUdxUno1THc2LXlGYjZDWmhOQkQ5SVN0R3FZS0l4X1dMV094dVVTQlJoWUhYSU1KYjJEVUVNZlh0VkRyMjNmMTRUczV2cjIwTG9oQ0s1MWdkeng4SUtWMTRDa1prM0hXQi00QkluaTl4clFmWC1zcFNOX3g0OTdzRkFobF9WUGN0Rmc4RGY5T3lrcnZSdm1XOTZQRjBaSlNOV0NtWkRuR3ZtN3kxc2FTV0hTXzVxQW14SmZWdTFoOHgyNWZDRjZsSjItQWVmVTVTUFo4NTZOakk3YUwzb2ZfM3ljZWV3VWRfbWpnclFmV0c4RHUwNUlhUU1UdVhwUS1OSWFUNEZ3dmdWdEFrbGJWdkNnOFRMbTF1WkQxVkpPZ3dPWTFhSlFaZmxKOVRrT05Rb2RUNldzallLWnFTaXVTWlNsTU5NcHVYQlU2Um5PU2FaX1NpdWkyWlF4ZTBENHpBak50VUtUam1MdE1abWhFRWdVVUhhcUdvVHg3YXJDTy1Ec0xfZW9uMFlYWGpMN1RadXp6blNSYXI1TV9zSk5LblE0aG5OQUZGcUgtSDZqRVdRbUVaUGtkX0lEeHVQNHB0SDJYSm5fOFZaekUzelpDLXFVQ0FEaFl6dnlDUkVKdkp3WURNUHgtOENWUU8yRW00VXVsWWlPR01BM19rRUFIZk1hcGhYMGd4UGdfZHdLR3BGclotZkF6Uk9rbXZyZnlnakppb1ZRakVUVWJ2bTBjRzloZ3QyWmdSWlFsUjQ4bi1LUDFPZ2hYQkxVbTlqR1Z2NFJ1akhzUGRVaHlqdzl5MFJFQVJXQ3JrLWtDLWVVNWFHSHNQRUxONThmbHE0eENDU3VwemVqWXhObkpCbXBJQ2dYcC11d2xxWFpualJ1NHJ1dzdvSkw4NHpvUk1fN0tpZW5lU3JNYk5Eb2hvVzUxdGVVcUVxQ0dNZi1fdmVEM2JiMWdNSndnT0JYNlFUdFh2azNsSGtpQjFfYS1NbFB6TThoNS0xcURRVC1WRnIxRnRLcGhRTG1mRU9KSWYwWG9xMFpFYmlRczlZeVA5TDRfYmR2dFF3Zy1hOUpJS1d4aFY3Zjg2UC1RTTRCMGUxV3ZhUGFRSFh6Y2N2aWtxXy1nNmtvSU52czZPY1FQMEtRT1FHMmhIMjI0eU1nTWlFdzJiQlhDS1ZrWk9VTVB6cUN3RHlrMEk1M0xKclp0MUVQYnlWMGpNSElJdkd0dnlNbkxqWVQ1N09ER016WjVoN1VZQURPcHpJd25qbWdQeFZKeVVsR2NYYjBISmxjTUFxakUyRFNGOEZ5Y2FBRktkSXg0MWdKOUg1TzBtTXN0aE5iU2pPOUpjWXlBRFFHR1h4aDU3RHZhNDVrS1Zza3ZNbTRkMEdsVXdvU0M1VGJJeEViRUVtZmtSbVFHeFVDVlBKRnc3czNSZzRZLVhYWHY2azBONG5DV3Z4QVdrbXJnUTZHaFpFSVdfYWNDUHNyMEhhZWtEeGdHTWIydXVwSHV0eFdxMTdEUENMRXpnWllhaTNPbW9HRURYSW1oZmhTRUNJcmZCc1RlcUw5QTRxR1F2aGtMbm82bGlfZkJ5MkdlV0NzaXE1aE11dXhFYnRINnVyTkVsTDZIRDkxX0lrNEFnbGtsWlYzdHNVc2FmWDNqdS1TVDk0dkhSZWpHQ2JuVjNKY0MxV3dfcnNRTGtybjFkOXpuTnFBRV9vYmktVkJaLWFDVF9ReV9TdFNBbzRkQU5ONDBkU0V6U0oteEVDYXZxckhRdFVScHVhV2VjcEFFZTN1VDZ3b1hiYlJzSTMzQV84ZV9DbzhZTXA5U2NBeDZCbjdsZ0RYNlNWMDY4U0RpZWl6R18wb2NucG1XeDhHQXJJWWlJRllmMmMwZjNOd2tHWnM1SF95RXRoajI3bGg2ZVRZYlVOT1lBbnlhTzdvdEhNY1J6UFhYOGRCSDZiYmtkUEpPQzlwUWlRcXgxandYWWNRa2tYZnVObHhUU1FyUVN2aHU1VFYwY1J5QW5sbGRTMk9GZVNOOFN5SFJMRFJ4NDhCS0ZTLXpRNk5MV0lRVFpVTlpUNlFWdFJSY2lmUV9ENkxKZ0dleVBXSFN6VWlTWThxV3lZQ21wTW81Z1VZNHlHWmdwOW9WUWNwWENTMFVobE9MSEthZklPUUZORlZCOVlVaEd0dnZBR3hnUUZDT0l1S0w3QV9KUk1SU0lqSlVJWmlIZHYyc0NxX3psQkl4ODd5Q2lkMmJva3FtMDJhNks2RWhodUhvcnlkRWpvdFJMSzJwdzFQLWRsNV9ORTQwbTdsN1IyOF9WUUZyaVRlcFUwYXdJYkU5Q0ptVEUwTnVDNS1XLWZaMWdTb2wtVXF5RjFWOVk0dklWeHU3UEdxOERPak94ejFMd2ROb0JjUnp0Y1JaZWpnaXBYd0dUU2xOQmtoVHdLVG5jLXpEcUJTcDBqVkRkenN2SmRYdEh2VTVRc05iR1Rhb0s0WmJ0ZnpnZUFESFVCYi1qWDF1MV9OcEZCM29ENC1HV3dWclZIYlBOVjhDRVFCN3BaRnEtRWhhSkk3c3NQQWFzRzRId1BMX3hzQmpaay1DVmp5aHdrZkViUEI4WFZENW01WFkwOFhLMGpiQVBMYXpqNlpreElJanJRcnZJSWIxTnE4QVhlcFZHal82Q2sxRlU1eUZfTEZNTnpZT1U4UUxfQlFRMmFrOGhPWEJwRjZlLXJKUUotdFRXVGxaZEJhc2lCRGYyYjVMU1F4UnhnbWRjWE01UVRIVEI4NVRHa1l4eGZRN1NRUWhuWXZiUWhVeUJrWG5XQjdCaUxvZFJ4WEYxYk1obFF0NFdhcEhpek5VNS1jWjl6YWJlYUNyVFdLMERtWE5adHN5Q0h1aWxjWm93cWNZbTRqZXRWNXk4ajI0UHJJeS1jRlozTllOSEllTVlGTU5MeUFJMWZtMXJmU2JCOHdvWWZwRDJrRFJMOG81MGtVUHhJcjNtaHFLbmNlT0JIV2lTYmtDbllYR0hRYXJGZE41Q1BBQVlnS0RoaHRkemVxbkJKUnl5VFZYalZLMWE2R1ZWU0lONmlVR2NXVFVfdHNjSy1mSl9NTE93ZlA3TmFKSS1PWFY0VUkwVGdxVVo4anJEX2hrVl9wRU13dUNNWDRSYWZsWjFrUEFILXd6RnUxcFY1M3RqTDVodmUwVHQ4N1U5ajJaOUdSOUxNM19FQ3NvaC1rODhzWFNFaXFsNG9RazV1UVl1anNGanloUkp6OXJicDc4OXZQUG9ubG9Bc0FNc0VDLXBvbDNLTl9POWxRZ211V0JscmhhZDFueFRDWnl5emR6NzlxeV9fekpHTWpKLXhfN1JZVk8zbFpseV9pTmxuZHl2UUR1UlVzc1NxQVdQRURQYTExOXFjLVlxVzBQaFk2a3luQ0lHc0ZoVUhSNGFCamZrenNyVi1wTGt1d2hDaVVtMkNBc1Z3ODUtNjNDcU1JcWNucmlLUlhxeVNwUUhNZHRqU05yZld4N05YTGJhYWV4WHBKZmJfanVWMlltV2UwME1CWkxfeVRmTVh4VXFZTnhwYjRmWHFMelpGSWI4U05fZGxucnlKVW9DRlcwZ1JiMnNMM0ZVNjM0bDlnQTFTSmtBSjB3QmJuVXVTWEUwdV9xbG5fZXBkTk9yQ0lla21HajcwY190aTMxT2phcUxpM29RZXMwQVo0U3BnUGNwV1BIOFlNMDl2aDkzMjVGX0JwVXd3TmhlN094XzZVbVk1eUUwZHBGeG1kTEQzZTdrancwQkdpeHpfQ25UU25kand1b1NfemljcGYwTEh0Z1ljalZ4OXhGYW1yU2kzUm5obWZZU0ZDa2ZJMS1xMUNvU2FuU1lnVWpMMk11VnVMT2NSVjdZdTVEak1nbFRLWGpCUkdjdDZ4YVUxc3Rad0U3dnpRUjlMQmZjbkQ0SEE1TGFIcEpqa3BkRGZkM25QWlQ3WlRHSThEOU9FWExwNHB3OEllM0FzZVJvSHBPbVV2TEc3TGNBRHozNkREVzJqcUdIT0ItbVNkODJuS3BfaWw4czc0VlVjSHk0SVd1bnVjZjQ5ZE5maWhBUGsxSUNJVVpiX3JpOWlFVjZpa0RRQjhIOUZvMjY4Qmw1S0tySjJfRnpBcTQwNTB4MkViSlp2eGlqTUVSOFNBaWZEQlQ0dG1naFFxRHN4Q1lObWQyVzBFTDNUZElCeEJlM0t0UzJiQ0N1bC1xeEFJUlVtcHdCZEg5anE3ZFRRR2VRU1VlNi0xLUhBTDVZdnpKZ05wbDZoNE9ZdjM1TTRpa05nSENVUzV0Q0g4dDU4OTVuVl9FZkhzWkRFLTJ2akVJRjdKRldFRlI4NlBOekFraEV6REhIMW56SDJzRnRLTHpQcEs1MGprR1BXWGg5R1B6Q2JJd1g0MXgwQk9MZHNmNjlzSGF5dWVoVDI0Q2xsOGYwbV9hVXB3MWNMSjM1TmJaUXVuY1c2UWtLb2FnOVlfMm1kSUx0TFh5c2NkQU1XbFc4QzZOOFdsTHlhRF93bEY0dHA4UmNGci03RmVSYWZYRnVMbzBpRnRSWThQV2lmbkcxS1ExZ3VUQlJma25LTEFhWEtpWWIzdVNwXzVOZXN6TXdveDNmVmdLTXlSYmhnQ1JGYk82MzRFV2M1Z25HT2Z5SGlMSWg1dGRpb0NwVC1EaE5fZkowRVZZbkNoMDJkMjJNam1kYXpNc2ZwTnBGTVJSMXRUUHdLRWlYNE9aUWZRY19DRVpwOS1NZ2Q4T1VtY0UzYnkwWVBBalBLazhLRTIyVlBiNWdyTl85NzhUNFFzcDdJby1rOGVoWUZ2WVNoRXNsVlZLWjZOWExpSnBET1J4bU5Nb1FsVHA4X2drcUZiWklmeHZrM0NSMUpNS0NLT3FlYWRsQ0hEVXo5YjBmUl81amhmRVJtNy1VY0s2VURROFJSWm9BWGJsSFZ6a2J4QlJTb2Y3REN1UTAyVDl5ZU1HZk80UlE4RUE3ZllVNWNUSWV6WDdWTlhfbFQ0RXNTSF9lR2xrXzRQcEI2N1phRUVPODU5SnVtQ0twUUgtUUJKVVpBelNKYWxMT3NxallCaFJZSXY2NmNERWJUdHdtTUo2alpVU2g1TzVHWGVtZ0xZOC01UG52Rl9ZVjlrcXhrV0RwVVJ1Wjg5V3dQenctX2g4Y3J1NU03RFBTOU4ycnlEeHFWTWUzemFaN09sNFFCbGlEY1NzRjdXbTVsek56WFJsUDRTaXhEWHpsNVdkTlpGb0lhVzdqQjAyQzlWVmJsSUtOUG9ZUmZWOWN3SjE1S25ta3dOOGFSbTYxci1rZ192OElvRWwtMkl1TjBWU2p5WF9WTkJrSnN1ZENybWo4YTlSMWs3QTYySFdhY21NbWc0OUlrRFdNNmVsQWxxTE1EcDRvb1dDSzFoZ3hlTERYaWE5aUlGOE5yOHJaZGdvbmNIYlVlSjhxMlNlOUNtdjRMcVdWMVZxYUpxbzZpc1AzVURhenpHaW03RFZBQVU3YzFyRjVpcGhycXo0akRyUzhBOW5zMXhFR3FPUGNDUVVnN2NDMjczUTFvM2IzRmhzcm9rU1RPVDJvcjJoNFljZW5QT1hOdVFtQktnUEVqTkxrUFV6ZkwwS09wdVgySXVoendDQ0dLLTVFZ1J2SGhmMGE4c1RfbHhLTjItWl92bTREenpTbDVHQk5QUHVlRkNFbXQ1XzBIN1ZZeWxaNVl0T1EwN3l4MUlWd3pUY1Q1ZjRJeEtEYU1GZ0sxZTlvQlIxblVZZjNibDJOd1BjSDRrT1RfenBzSWZyTGwwRmtVV01yTTFXUWJzbGI3N2x0RjFCcUgtVGpSd05hbm5RRzZNbjZBNm1ablV3dzlEYjF3cmgtQnp2NHRMSzYwQ1dFQl9nYzBNZF9NZ3l4RjZlUFp5ckhEQnRqVm55ck9TY0FQTUVGN2JFQ3hDVTVvSUhFMDctaUJiLXM3QkZaOXhzM3hUSERzNnhQR2UtNjA0bTFvNFhzdmFLUEtrbG55QXlDTlM0M2dyMHR6VUtGb2FESHZuNERyZG5JYXY1QmRwQi0yLUFaMDdMNzU3M2NwM2tDbVRfUG9TNWR4TTJacDlWNjBUUVdnSFBvU1ctcDBOOGpvaGVVWlJ6N0FMTUU3Um5pYmp1ZndHNVpTYTNIa2hGNTgtY01rOFdjZnZlU1ZUZUdpRm1nU3Q3UjNQanl4ZnRGY0dweXprYm9SNldzVG9FQjlXOUk0Y2VOT213dTVJaGtDcF9yaHd1OHJqa09sVzJvelNiTWRETlhRMUV5QUtvT0x3NjlQYmJYbXpHZDJYQS1XS1hiMVNJbFZzTnl5Tlp4Mm5HcU9nLWtvdlFReldtSEg0NGlieHVIc0NiTVJBZk9fV3c1ay0xdzhQN2NjNjBTNnd4NGU4RURWM2R3UkMwQjNRbC0xUnpqSDQ5YVR1bTFySTczeC10QjR2Y1ZWbnZIZU1Tek41MWQyODVTeEdnY0R2YW1BWGs4M0l5OVhFaGsxS0QtdjlwVUpiVmtiUEVjNEtKZ3ZrRnl1SDR6S0N0M0Q3S1QwbGpIb1Jhb3hVY2pLeUlyOVFWWXBLWkRvVkFPUDdnU2JadUpGOXRLN3l4dl9sczRvQWVxbnl2TzRmbHhTY0xNMU9ydnRSNXFvUURWUldxeXNxb3c4RnFCdHpzRFM1NWdjVmdQWXNVNVlXSFMxT1hfYmtFTk0waTdUdFMzeWtBOHpfZVhHUWEyWHFiWE40RnotTGROc3B4bHBMek9DWlY1a0hTR2E4TlU0bUhORFFpQkN2aFdEeEl2S0ZDZEwwNGFTZ2FhMjh1ZXNHTXdhZlRUMTRHaXhKNUpXSmlGMTFDcHB5RXdpbWJkMldXRlE5dTJ0cnNNRDFvZm5FMXJ1bWRLVEVjZWh5MTJ5TTdvMFhxUkx4dEN5bGNrZ3NXRlNleGtaSmVleHhGelRyLXNjaG9ueVRfYkJDR05IMnpHNm5Qa0RabVJUNEhPTFJyeUxoMjNaWXFWdDNHQWdib2M5X1FpNDl5WG9vWlNIQXd0S2xiMU13MzNiTTR4bldBdUUydTZJOU9jUDc3OEl3MEVJbzVVU1A4MHY5MlhrTEFwVWFnWjNkemhWLU43WG0tclphdXR0WE1pSF9GS2p3SkozRkdtV0t1My0xTWtKRWUzdkI0LWhMeGo3MC1kWW5WRmVOWThmcy1ObUlBc19uek1UendEN3JVU25pSTVuQWkxLXUzMGdiLU5VNG1vU1dOcG4tQVNudDZOM1ZueDBoSFJqbkdCZWhwdmJJWlprZ191X1FCYUdPejhWMlN3ZzV6VUVCclBLZlNCT0tGSV8wX2xSWUg2Q2RqMzhvRmlHV3BCQ1o2amRSV1laMjJiczRzWnF2R192dk40MWx4XzcxZDdzSGlrT2hfYmpDWGM5M0FHak42SXhCdXJSREZGT2o2R0JrZnhJUkQxTzdwTDZuVjFkNlRNb000Z1VxNlM0RWlnalBpTnJrSlNkaE5YMUZPNGV3N0VDQW1FRTNzc0tYc2RiYzdmTy1tV2Y4UjZOYkVybW9YR3hKMVM5eEdPaGw2U05FMHVRVU82V0xxaUs4VFMyVTFjSkR3YVNOS3h2cjZWUjJlaHZ6bXBCOHA5UXV1YnYtRjdERDlUUjhkdDJiRWx3V1JPV1VwZlZtWWJKaW9tS2JwRENLVGhPSGphd01fcnVCNFVWM1d0cUV6bjhJRkpEeURnNXZhM1BjZkpQNmFibGN0WlBYSmhZUFM4c2pNTnF3WXFnMW4wQUpuYVFiY01YQmhzTkpGTkota05zMmF2T0tTYXVySkdVRUhNVUVVc1FvamlaX3J6SFpnOE40MUlyY2xVT2RvSVBPWDBTaEFHVXNta1p0a3Y1dlVBenZlVU9rNjNsZXFlVjlrRU82S3FrTDhJNUZOa2JuQjQzZ3I1ZGZ2cDNNdk85TGdXeHJpNzlYYTk4LUNJQ0szTHpIQ0V4elFxd0dBamJWN0phRnZkMkFXNTRqMEVEVVNBSXd5aHNQM0NuM2ZfeGdENkk0a1FBcHg4Wkt4UkE0ZWJwRFNVWEFEMmdzMnpoY2pPT3A4dzJsUm5hNkZTeV9Idm42Z1FTV21rOXFQOWVsQ0FROVczMlNsYl8wOHhXT01wRFozbVNhaEJBV0xQRjhrbnFaRlBfTUpOc2Z3R05tS2NOSGRhS3BqV3hSY0Q5OXhNc3E0WmJrd1prcXkzTlF4akZvQTR4MGpCN1Rra2gxM0x5UFVqdWZLNlg1dDdXMlBkbUFmYkp2UHpOTTZkSnRaV3hJSkkzbUtMWVFoRmVITDBxMDN0MnoybDE4bmhaenlXX0NJSVROWHRhVEFVNFU3OXBnc0Fha2RlVmNVMzVfSjFzbE0xOVlyMTA3VTRRZnlldTItOWNrcllCQWh4NmF4TWRTZDdIVlVZYk1pTDZGMklwZGY3WDRGeEgxTXZjUWE4RWJETkU2VGNxSXRwRk9UZ2R5M0RGYU1vSV8xRC1wQnplZEZXOTZYRmFOTEVteFdFQ1psRnZmYzNWU0N5SkQ0Ml82SWQ4ZE5RWC1lOC1iZ1JJcFJ0RjEtT2doUEE3dWYxbm9idUpfdjM2S2k4Yi11anFUQmtuMmZSNzJMaTRJYmVLTFEwTVktVk9RN1NudlRTWmp2RjlyQkNaSnhTNjJNQ3hLakExNWxBeENjc0c5cmpZelJKV1VmcUxvVHBUeTVQbEVGaDIzVGtnRU0taTNmMWRnSlRlc09zZnBSamlOUFRpckZIaXJFNzRmcHJmX1NlMkt6U0dyVE94akY4dGNkU19VQXdaZXFFRE9GOUs0YW1VcC0tRU9Ta0UwWjZscnNXVGo1a3prXy1ILXNmSkU0b0RoN1Jwc1JabkM4dm9lQ1JhVVRYd1hJMWgzZFQ5VXNYckgwR29PUW1PdV8tdXdKQlZtNWt1WU44Nmp2am8tTDZWeXNJNEt2aExlZFhINmI3WFlidWdFMnV4b2VfNWFIN3ZDOG9hUUh4dkFpYkktckdRYXd1OTRXdk1LdlNOdUtIUGRrcnhWX0VEdjdkenNWVjBTUzFDOC1vZExwLUtmblBQaWQtN2NYS2xwaWdJcC1BX0x0TzBfSkg3eGV0aE8tZ0dFNVdBTzFpN0Q5Ry0xWk9rN1p4eDhwdkZrQlZrRm5tWk1feVNSR01NaG9STjJxQnJXTFZ3dGJoY21va3JQZkhFRDNNRnJ2MU94b2FQYkRxdDhLeUdabllTZ05VYzN6RmpJSEYzTVU3WGowRXcyYnF2ZWVEX1ZpcEtScmhDZVdyOGxlZzM3eUFzLXZFSlBwMzV2X2pPY1REdVlwNmNwU3ZPd2x5SnJEaTJlbkxadkktVW1KLUY1dXlEYWpxa29VenRaR3diODRVNDNsOW54V1RiMmpzMUJPM2x0bWxtU0VGWVhIUDk5amJoUXJ1aVpqRHBZbGd0OHgxM3FIQTc2aXZtNTNnanh5YnlTZHNHS3lKcDdIQU9hcVFyMEZfUjR0bTZDbm1sclhLbGlBeVRuOFN0N3JWMXdjWnNBcFRQbGF2bTBaNzRvSUp2TDVWMVQ5aHBYNExPei00ZjFWOTNmYktmQUVhRlRVM0JDQU0wWm1MblJTVGNER3pGakRjNUx2c2ZXY0xmWlhueW5nMzRkdUlSeUQwbzlHaXc5NjlnSVZVai10bVQtR1M0cHYwaHpsY0pRZUV3MlVRU2J3d20tdUktdzN6NzUxcXFYS3BVV0ZRdVc4M19jS3hYT3F1alA4VHJOWjNMb1VaakNHV3lhTVlySTdaQWNobVVvSlc0bE1LNXBfemNaWE9ER2N0ZWdIY2ZqcVVkNTd4SG43LU1aV1lmS2hDdGswaG1YNGlDSGc2MnN3ZUVZU2hBNnFvb1BMUmhnS2EwM2lNQnlCZlZ2aDJGWUNYZDV2NUlLVWswYjFMeGdqVkRDWXJzaWtCMDRlRnVDMGNWMVBZVkFxRk4zQUxpZzZvX3lrTkJXRHgxekxjMU43NDdlbjR2aXVmOExhVWVCeXpOR0NLVUFBUlpISHp2QkQtUno0R3dzNG1BdmtBZ2pPcUFwc2FCak85VzE0OHJEMFEtMUs4b3Rid1ZJbzI2MzRSSW1wRXNLNG1NeV9VRGF0YzRaUFhSWWlFR2FVYVJWc21KekxkNGlGd1ZnN0pYX1o5UlQtWXV6dDNVZW9HUEdta0VGck5ZYUN2eEMzc0dTNUdpaXJ2TkNOQ3Z0c3owbUxFUXNtT1hQUlU2UkNxM29TelRnY2c5bkVKa29nd3hWNlVMRm1lQVNiUVBJczE4TXFudU5nVWo4SFZvTENDYnoyQWNyRnFzMkR1LTJSTDZrTmRJOFJleTFDN3dDNGVzN3pzN1diZzVoS3VkQ3JoUFliZ2hmenI2Y0Q5aUtaUlJqYXQ5aXFPR0FOd3BDTkF6VlpCbzJlcS1xVXE1V2xJTXhIN1dkLXA4a1RXMVZxbjNmNTk2TGtGU2p0SzFlZ2JVMEYzX2RBdlh6NkItRDcyTmEyZW84TmlKZDc2dmFmNGd2OGtDWm1ncDNla0xQYmVvaDJZNjJXb1dsS1dTZWptRTRqeU1pMWlYQ0V5T0pfNmVpMUZKSFJUdktLalZKNTRLeHNhVVJhczlTTExxRUlQQ0xGMXNhYlp5bXlqclVGckdxVGx5elRSWXdYa2JtV3B1cDdZQ1NCdjB0UDJoT2ZtNHNTdm5yb184YVNZTmJCREI5c3dpT1hpNkF5d0NCQ3FNTl9WS2Y0QjUtMjJ5a1owTDVLbThrSzF2ZHFNaFNCVjRLd1Rad0tOWUMxTXZlVVlUY2JraUppeEVKbW52T2RGQnI1RUtldVpkVFduRDJ1bnhDWktrNHNPMzBrYUthMXN3a1czQWlwZmVJdDExUl9RNHJSeDB3VTBubnJTLUdPQk10Y3MwNXlJZEVQT0RGUnQ5MDhJdURpSG12QV81OVVZUExINWI2eDRDSnN5d2U4RjE4cnZTTkhGd3ExYXV6MktsTWZ2Q1o5N1A3N0h6NHowQmh5Q3JENURudWJHdFYyQ3U5WFJqb1hjQmZHdzlRZHdIU2s5LUM5YXluNGNaU2JZUUU4aUVqbnQ2d2RRODhWdDhjampKQ0g2SGd5YlRrYW5ReWNPeXAwMUhOQ18wTUZGZ2U3YVo0M2tFNzBPd0FIZm9hZGpqVWh5d0FsQXFzZ2tPakd3VjJBMzVsQ0VDUWdKMzRvTFJmT1hxMVVoOVIyR2l1OGFZVGE4QWJTZlpVZTJOQzE5Mm1LTU1paGxOdy1QZThsclVVT3UyaWk5WWtySE1Ub1g0bDM2a2ZfQzBFYjFkZmtLTTJDYUUwblprY0o0cE1ockpTZXNfcmxJdnVDM0NZR1RmeWtjV0dYY3RvWGJpVVREMUVCNHpCZ0hRQkJhNnBNdFByYWFiQzVRN1ZaY3VFY2FxQ3VPYlJ2ZjBlRElVNkM3amRHdEkzWDZUNjljY2J0LWJtc2tmdHhlLUREakRjb0RzaGV2bE4yYlU2RUZmdjViN0xmZk1jaUJDVnl2R2swcEFraVBsaG9GX1QzbmtYV0xpY2lmWURKTFVBOGMxbENlY0o4anBsRFZRazlYOFo0bWFGWVl1Zl9hZDZBRlJZWWR3WkxvU3pCS09Pa18xZXE3ai12b3FVZDNmRm9ueEppQzlSQkZKQk16aWJZQVp1QXlQdEp4WWVtOWdOOF9iWE5uMXBoeFBJMGg4a3F2WUM2cGZVVVhYb0FnQTZfazh4SE5JOUpVS2VMX1FnVGpseDVzU29jdEFUT043STh5MTl4aUpSRXJtUTZibkF2OU5IQVVMbXVaMlphZVljaXpWdWpsN0dnMU9FVmtZMHo0ekpLSkZqYUZHZFdkQm5rRUptampIaWdIT2Rzc2dCcVRvTmZOWGNDVmlkYm9yWnU4SEU5SjhZV1JTNGhMRTRfUnNxZ2kzVzc3dWNZYjkwaU00MnVtWVlIUlhyLWxJbDlFMWFRYm1zZVNTN1dLNEJPdDZqSkRRbVl1cUNwTjJGd2tKd2h0S3lIdFpJcDdnVzZiUlpIaWNtU0hiNlZHWnBGQjBfWHdTSFlVcVJUVUd3S1oxRmpjeUpyWi13RlIyY25YcWR2aWcxUGVSdlpQOWZiNXg5TjFFNmdMcFhLQzBnU3FYalZfV2ZfZHF5Vmt5TlROdDRLLWd6QlZSWDk3TUw1Vmw5bE90eG5YSmVkamhGa1FEUjhxUmZ5QjNSb2tMVC10bGhfS3NpSXFLdkRtdjYyaWlaWENPYmlxejRHTFE1RjR4dG9QWGlSQ1FEc2k4aF9hdWhRU1FQbk1SNnpXVnBsSm4wdDk0bDdaNzFoMWNYeERBLXQ1Vy1BX0FSclZmTVNjVjllUGZwLXJFNGdocjJYbjhVNnA4X3JYT1U3emwwbWxjaWdKLWRqa25Hb29OeGZpN3VLWDg2N0UxLWpvRkZHYlZKOFhSY2RVTzJFbGZFTWpaVnhhdjJiU0tXNk9wVmM5aFJPZ3BEaHBfeU9OWE5KVEF4Q05rZ3hremNDRFRINFBLMmZnd0tMLTdTSzFXUUViVXk3NW1fWnM0Q0JxNEpRc3pib05adWJIQmhhckNwXzEtN2lFZll1WXVHX19JSmRhSFVOY2JUQTBsRUZkV1VWSnBvTjBQdjdrRGZ1OG5uRDJtQi1vNTdGXzJodmdOVWtycjNpdmVYZ2lKWEFpSkRuSXhoMWpZLWxJS3dJOFF1XzZtR3VJcmF2WjV1SXkzN3Bmcmd0SlpTc0NZZnN1V3NzWFpSem40Y2F4R0dkcl9ja2kwYVpHWndkQWp4cjVVb09CMS1zeXM5Ty00MEhKTG1tMjk5S1doOFoxN2d0d0l0NXNWT3RnTU5HVlpRTmtHTmIweUwyQ0FmRURHejNOQTFpNEVaaVRadWNPQVRVTUZOeXVlenV4Q3hnS3NQWkZEUV9FTlg3dE9wN1ZwbC1saWU3VGN6ZnRieXpLT1hzekpTbGlCMS1TUzJvTHdFUTRVNV9jcVpfcGNwSWJTRTlUMEEzZkJsdmxudUMwS09VUU9acHROOE1QWDVnTmxXZE9uV0pSS0U0LXQxd0lmaUNtU2JIY0FpWEJoNmx3TDU3OVpMc0ZoNThIbHVxbDRGenY5V1g1YVRkX01tQXRlU2JlMGtHejFOaWZVSzdKNDY3ZkhLSnROV3FVcHZ3eWFjcFVwa01FMTZnelF4SFVpMXMyNEpOT3NBWVc2c0Y3QkRCT2c4YndvVS13OFNudHVtOTY4aF8wSWxKUlhoNzFSNVV1c3FUZVNsQkVjN0wzU1VORmxwQ21fRV9fR2NKWW14Ymg1czNNck5aeHYzOHBGTzB0ZDNtMnhhZXhNVEFMZm9uRi1SYm9UQTVzYkczSTd2OXpKTlRKTS1uYTVIZ1AxTWlrcElGN0NZZUtMSVFPdlVTQUZneTRlRTNvTHFfaWRMMTktWmVmekRIOS1tVDExVVk3MEJtUUFJV2dxWjNNYlBSZzFGZTZpU2xLZnNGZjNxRldrVmd6NWJXX0ZSMHE5ZElkekoyNENEdTVjNFZYbmY0d194VzBsZjZfbFE2c1NXS1V0d2N2Zjg4cjVBOWZzdVZwamo5SDE3bmdueUx5Wmc5ZmtXdjVjWUYxUGxOVExRS1JhMzJHSExyaGtmcUhWb01SU2JHamhaZ0w5blNWX1poTmsxSC1od3VrX2pWRHcwc0diaDYtX3lyNUQ1eVE0eU9DODRsRFltWUpVaEJydl9KRG9zMGdRVWw1X01qZks5cFBZQ0JCS2JRYl9VVEJKVjJpcWpTeVpjcjVKSUxfQ1NNU3JtdXZDUXI4a05QbVNmaUUtYV8yNS1zdnoxYkU5MFJoSEZYdkdVT3FWSjB2VEVva2U1Zy1pQ0lHM2EwQUhSUEZISExxVkxQbW5rQ3dQMWlXT01tdGF2SXdqVl9uYjBDaHZ5cm1kNWlEYm5vVGJ3UnZPN3JFNkFxNXJmR1c2aXVCRWEtVExtRTk2NWFpaEZna0NSRm5sUWl0ZkhTZDV4ekRXVmlXRDBab1cyRTRoYkV5QTFPLTNidThCMFhRdUhFNDlxendSSkctakpub1hRY0FDRkJxcDh2ZVlUWTlLQ1JwRVFJNnFvaTFWZG8wVXZVT3B6bFhpWURNd2JIMzYxdkk1ck5aLWRpWHBGMkJfQVhqVGNKMktyZHVfRjV5d1hocWpLdEh6LU9yeUx6WUtZb3NlVGRaaW5qYVZqMHB3ZjlwelVldmpEWHI0bUpoNU1fcWhuX2hVeXg2YmlmX2FEQUVDYXBUMHNpdjhDb0FKU2F0LWp1S19hRnhMLXZrSUxwb2swZHVzUEk2Y2hnd3k2dUljZG9iODZNQUdjRUN5Mm15VTd1aEo1b2NqZ2dmRmZNZENfZVhnQmZHdTE4SjdMYXhQMDVuZ0d1ZUdJTWlkeXBVbGtpakFBcHhLM0hsLUVxdFJ6ZXhTd056XzVxdUttWjdlZUZ3RWNSUDVTcVY5QTBDWVNTV21iRno2LVZ4TUxEV0FDb3VlSVF3Q3IwUl8tRi0zSFMyWXEtRnFxbXhxdkU4MFJ0TlhqVng3RUhnSWMzTjFGc0o4c2hPRmpRN0hxWjAyYmFmN2NnLUNNbGdRSjJoamJRanRYUGZwTlNuRkQ0QnNtM2Y2Z2FiZjhWZ0NBaTFrVnVLNkpqeERWdWo2dGloNVR6T2JpWHJPR2FsVEh3OWVCSDY1SmhPSkFlWXpPUElNTEV1RHh5a3JYa3pKTU9xdGxjYm1SUXpkb2R0RUhrdlhOZGpiWGZHeEFYdkl2OG5JMkZmcWU2NHZBbjNiOU0yWkVONlR1M21hdFQ1RFIwc3BfNHc1T0hxeUZiQmpHWF9oSkZ6OS1FMmVKTmdibmRveW81TGJHRU9xN20tNDRDNUFDSVdvSS1fMGFXajFQUDZhWlJQX015cm1vSTl5eVJSeTJqdWtpZWpaNGFiVlVJc2xDem90THhtTmM3Yk1mWnAxWHJRTmZ4bklFWW9DdU9iVEdWaDQwMGtrUDFheXB3V1FQc3ZGajlLWUhiMVhHUmVQUEllSVpSX0thUDh3YjJyenNYeEdGVkpYdnUxZVduZ0pBa0Fjd0lHc1RNOWRRbnNJQjVNSW1VaDFDSkZFM3A2U2NsTDhDTE1uMlZkTE9rOW5iaXFvR0Y2UktoLXVsLVRFSGdHRkp0RGs2MG9BMno3czdDQWtMMElTeHcwSEtwekxBb1ZscU9BRmNjTm84OFJmcEVRWnFLRlNKY3hUeXpTbjJsZ0p2Mlc0VU5BYkhGNHhQaTY2UXFpWWdVQ21WSmNCU3QyTGZSU0tGVlVGSlVTR2lSb0Uwc3FqaDQ5OG0zbXlvWWZrZkpDYzI3YmdhdnVZbm5QeFdJX0l3WnlCNndlNzkzamxOblYyY0RKcW92UWl5ZVVEajRMaE1GSHZ6VUV2cnNwUWhzVHk4akJQR3ZEV1E4NGNXSFhuZWdOYnViUjZOcHNmNGhTdmU1NWF4bDhtLXBFdkJ3RDR2YnI2aHh3RGZhSkV4ZUlnbm5EUVVYTE9DdjB1U0hpaGV5dDJmeVZTTmJ3RVdmRUY2NFh5WElwTTE3UGdLZ21RWFJLNXRJaEc4QnBjNEhyUWszcHh3TEtDZzRJVlN1X2ZTRnUyTER1SjByalZ1WnFQdVB1bUZXOTBPZ0FZaW5ZdnBMcTVPNG1XWkl0dktLUkprcEJyTFNOYks0MnBDOUtscU9rZUNCTU5nSlRpSVZfTG1XYlVvNnoxS1ZBTUd5QVBjemNSRXRWdnBna2taSXRtZk1ISldnbjV0SUVGVDk5VGhReXJlbVVVUUg4bWZpUm9lZVBHY2NzY1lOLTFxaWpTeUsyaUQzMnlKdUtweFB6M1l6UF9aaVRPSFBxTUtSRWdXTGI4Rm1xQ0cwcnNSbGZGUUsyOURIdU1fVGpnZ29FSjl3SWlqbmUtWndJU3VoQnRQQ0tEbU53eFNIeVpMZk1POHVNblc4cHd0cVZqUGhOMllGWDczRUk4ZU52UlNxbzdsWm5EczRZT2ZncUdLRUdSYW1lc0VYSkY0TjBSV21ralloekpoeGhtZmJYYTdrWFl1V2otQUpRS01PV3A3UmRuQWUzdkNRQXdmckZLMVloNEtpcFNLeTJBdTNyTmx5NXl0ZXEyel9Eb0ttQml5bGU0NXRRRHhydnpQMlVpa3NLalpHUVBXOTFrUExXVW5KTG1NOEZmQXpuNy1ZY1RFaWxBZV91LVZlQ3ZRdlZEYWRGSE9kaTVaUDlUWldPdlhKZV8xZm9HVnBNTXdFeTF1Z3dYY2JFcEJnb0xsU3loakdma0ZJWFVQMlFXek5QX21uUE13ZTlyR0x6U0dsd09kVGE2eEoyYnlheHVocm9SUkZ4Z3MyMEUtNENtS1lISUxPQTJRYVhXNFVFZGZBem5FeVpDYXN1cmVvRHFibnFTNmEyS2JaZ0VhekIyVTlobjJMeldQcWR0aWNOLWUxU2NRSnN5alZJQ3hCWjJiLVNDcmJNd0Fic2lXNkFrUjZNX29BQWFxcUpUVzk5SkxiUkIzYmc2Q2ZpU0tXZ24zck1iU1hYS3dvUkV2amlXSDlMaTlSRTVlUXBFTjRlYnJVUm9odldFbEU4Mk9MVlhicU1LR2xqaW9zeEhnTGhyeXpTdWZuc1EwQm9VMzdvNjcwZG5yckFfZEFMbVQwRGtzdGxWM0UtUlg4a3hwTUdVem5oeEdLOGNtWEFVNjFXTk9LSU5pZ2JtdnkwOXhTS3hZOEZ1NDR0cWwxYWFvMHF0RXVGSGc3eEV2X3FSSkstb3RqZHJDbHcxU0JfR3dSOW13NTN0TVZub3BJT3JaT3VtYmlVaEhkMkx3X2xmMGpQRXR3MHpCdGZNZnpDcUlmSWstZHdQaUtVOGw0UXE5MU41YXhDdjZhdmtFbXpDQk83eDRNY2FVWnFRYk5oeGg5a3NvZkNraFduc21qQ2R1MUoxWGN1cWNzWDE3amgyanhRTTFQUGlqRW4xamxDMGFOUGVaLUNYRUpUenFFbF9kZmpGa0c1d2EtcmNVQXY4am50QUs5NmdmbWhOWmN1ZFpQNXJfcm52Uk53YXZfZlRYeldpaU9KYUlDUGJPRF9XVXJpbHJ1QUpwQWNrTTd4eV9wRUNDcnNTeHh0dUZGSnlHdXMyR1Y4eWU3aFFQbjZZbGVrOHVYQWwtaW1XUFJfZ1dXeDVqNjlVTkxpanI3Z3ZLcklkNTFYby1peGJXclZzZnBoaUx1OUFjZTZ6UGVyVlNCbnI5cDhTUnR2bzJuNnBnWFhqam5wdGZWUFhFWjB3RHNaQlNWd2M0VHItV0k3Y2Y5czh6cFU3bF81TVdFTGdXY3lYN21lX2NnT3FoX3Q1R1VBRjl4eHhLRTdFNFZyLVNFbjVvV2dzN0VJYk9ucXYwWjUtV2tKSkZnQy12dDdnc1p1d3AyQVdabk5OUVlHWWVPblY1ZHdNVmdXUjJBbkVIUEdCN0hJMkV4c0xHWVdSNVBVd0dvM2FDNmszX0tvWlM2QXdqaUl4anhxX1lVVHFES28wR3cwV3RrY21GUTVHSEhweHJNM3JYbktQTklUWmwweVVpZEJobDhNNmk4WGNjWjFoM3FXZkxjdkZ1dUdXN1hibVp1bTJneUV1LXNja2tUX0x2UFVqLUtEZ3hWeUZTOHdyckowei05MS11Tzg2N0dtZC1LRXA0V093OFgzSU5yMWtrX19EM0V2eDRERTVPU3NwYUcxSG9PSlZPYXhoclpIa3hrX3BjNVBfZ0duNXdnYjhSOHlfWC1ESWk3UGQ4RVdiNjg0dVc4ckFqNkJHYzREbmpCUlZRQi1ZMlRrZlRQYzBNVlQzcTdsd0RpbVl2MFdZbnB6RHkta0ZZclFLQ2Z2Rk5sNGdWUzRfMlJDNmUwbTJfazd2SlQ3QW5raG5mRzNaQV9Id1F4VW82RU50NnNDRF9oMVVoQko2azlfbDgtRGRMVG1DV2ZmQVMwRkJZZlZhQ1UzWk9XeGtJWTZaTWQ0MGlXRHpXckZjNEpwWXpUd0tTSlBhQVJYWEl5aG5hX0NHVVdFbFRpbkVGeGdJWGQ0bjNTdG1CcHRCTTJjTVJRem9qN0d3MDV0bjU1dGVSNTMxLTN4S3MtU2ZVZVo5cjVxemlJeGpKQjd3cV82OXJISEkyZ3MwcWJsc1JwcUVaaXVkXzhDNERIV1VFblJqd0xxQ2pZcnZLNFNwazFXcUVaenFOY0FTeE1vdE9ocTRVdmdKeFE2VHFfNE5faWludXhEQWUxTVdIZWNOMlE4Zms4QWcwNUhwTkFtWnZzRDdXVFlVSUVWSEprZ0YwanNsdFNwZXJBT0VPSXp0Qy1JZ05YS1FGQ0FJWmd5WWMwbGNmRzgtYi0xT0dJRzVqeWhCeFl4bXhrbFhaTFVVNGVPNVMyUWpYajRmRDJMSFp0SWNKVjdITjFBbG1ESVJBaXh4eWd5OW9zaWw5a1JrdnQ3dktDZ2h0OFFucVB0X1ZNeFFvX2laR1dHYUNtOW5ORlU3NHdSZGpsUnNRQWltZloxR1liS0Z6c25MeFAzc09YN3hBMTNvZDU2c2ROVmNXSVhYRk5CeS11a2c1VW84NDdEZ2hhaG8tdGRjaFlqbDhsY0dVVjloQVNwOEVkcEM3N2NtLWtva0k0TVIxNmVYdGtSYzVtUDhuVXQ2RWtLb3RObzgtWmhQa3d2SERaQlZJd3V4ejJ1SW80c1NCVi13QTJhaVFaWnBLSFd4QW1QS1pSa2s2Q1FwVnd6RWtFQkgzd1FlSDkzeTdSeWxQRC1mdlN4VDZ0b0tVN1E2UUZ0ME1INlZscExXTE5ONmhTa3hsTjR6Njc3MFNaaS15VlZmTUdPUkkyZl8yc0NnVGdELTJNQU0xMmdrbHBuSV90bEx0ekgteVhmRkpxNVh0OEVzVE9Cd3owQXdSOG5STEY4NmloZzFSaEV0dy0tNm0xaGk5ZkNJTExjd281ZUlTaktlX2thWnpwQ0cwRk1BRzNoSlR2bjBwaTJ1NVNqNkM4MHpOTDdWODFKSmJKT3cwcEZqMDFYQUdkZWE3d180NExtMHJzcElwUlluVUJRM1pmZUZGMDdfb2RsSU9vbnpSbUg1Um44RS1VMlNDSlNXU1YxOGNtZE9tTkV3RGxRTllia2dabkxROEdzYzhWeElabUxBdnU3LWtjQ1VUNzhTXzc2RUpPZEJBMXlqbzZROHljemhKY2NXN1pzLUJubjVBMGF3TDh4aFBLLWZpTmUxTEN0WFNfQ1lGbExCMlAzS0hHeGZhT1V1ay13bzJVRWl5OURaZjEyQ2kzb2RnT2xXZWxXSk9VWEtPdEwteTNrRVUtbWEyRkluVlBxQWdaN1BGd0hyV0o4QzlDbWk5TnVPbnRMR1lWdEVza0lUU0tpX3R3UUZ1NXNWbTBKamhuWmZVZ21qRklfMC1MTzFiVVk2UlllbFpQMjJKZ2dQTDZ2bzAyWEE0Vzdab2E0cGlPTHlJZWVlSDIxUC1pWW95azFFNklrcDJJMktSbUl0aXRoaDA5cFoxbVE0dnJkS29UQU4xNVNsMVhwckpJckFyTjVFUUpVNFV1dDVSMGNlVFZnMDVrX1pEUEJ0bFZGckxpX3BGcThTbmtXQlR6QkRpcml4X0ZpV2t0Z3BrMlJSdDVINHZpT0l5ZXpkdlBZN0xqVzFUTzZEOTl4YXowZlV1OVVPdjNZQV8yT2U0OXVkb0FUdVl6bTBpdmFnelhFV25zZVhfRm1hazRSdmFZSnhsYzZEY1ZKRW5hX2JlN0dFVU43WnZKMTdLVkNvQVdUd2tPUnpQd3VKb0M4eGFBekVZeVltUFI3Snc2am5iT1dPd3ByTHMzNmpLTUZMMDBIRXNPLXp2LVBVZWlnQmJ6UTVITTBfQ3JUOFhfUmlUWlNSeTRMZmhBWFdoOS1HcFlZMWdNbFluSnN2YnRNbEcxell2b0VWaVRwTm1uRERLWlZKOC1QaDdLUVFfajV5eDJzVTh3ZFZKQURhczd0YUF4VkpoM3BvRmotYzItcktxYlhReF9zOTZrcTFrUllCS0ctRzVMWmotN21SZ1lNek53Sm9UY3k4VTFVdjZCb05TNnphZzdWWlN5dUh5Sl9TS2JiMkpuN2Y3NHZYVG1qTTFpbzFKV1cySHdET3ZEcXl0QU5DeEtfbXpyWENXenNUYzk0VmxnM0x6UlJ0cWVXYmZGdkR3elNnX2RlNnZ4VHdta1FEb3FHSlphNFZGOFdYSkxXVUpsUE43WVc0MWxteWFWdUtVb2JUTklDdFFFMXhKM2o5ZG84ZjZyaXVjUXlQM2Y1ZnE0UXZiMFRvVmF4Q0w5LUF6NjllMXEtbkZMdUZBR09yQ3MyOUdKSUw4ZnFjcVFwYVF5T1puTUd3ZDloOV9qSlpQQThrQnRWbFBsR2Q4YUt4OGlJRnB5NWRfWnJKQkFfTER3LTB3RURCZUtqaGw2UzRyQ2tfNG0yZTR5Wkg3SkVjelM5MjdPNS1wNy1LYXhRRjdJZlZYYkxSTDJIVkZCdlpDUDRjbm04UnNyMEFsLW1UN1d2UVMycEVsSlNuWjBpdTQxWG9qd0hQeS01UHlXZnN1LUwwVGxlVlhONlkwckl0Y2xiY3AtY2lIcjBTR3pEYWVPMUktMEU4WnhEQU5Ed0ZuMktMeThNVkhDM2RORUROMVR5OFRJTGRjOTF0dVhWSk1YcllPaGNaeDZ6bXRiNHdIN19KcnpKdmVCRC1CREdCR19LVmhwZmIzdk1wLURjQkJPenB4ZDN0Uzl2ek5zTmxKdE1YamtXbnNKcExqZnBTU0ZBc2ZuOW1FT0UxTkI2MEhTUDJ1aDdSVUV4a05uamhXRkR0elk0Z1ZVN3htXzVLeENLNVY1Ul9sYjVGMEpmUVYxSnRlamN1LUdEQWZEeEJVRTdOMll1b0dqSU5razA1WTBFMTFSTUxUY1pjdl9qMmdndW12Snd6Y3JabFFhUDNUWk9aQ3VScVRyMVdjdFVOYUhtUHdMWVdYSF9lRFdZNXRyTEhQYkVscWNLb1FuazlBbDVEWjVRNjltaUhsSGFDajJ5b1l0M3MtazliSHptd3ZWMVljR1Fzc0tsbC1teWNVVGJWYkhGcGZaTUhSOEtwYW5QcnJpaEx1eFp6UWR0MFRzWUJ5cHBIVzN4QXR2RXMyX3dKNUxLNHRPZDJySVQ1NmRFN2ZwZFBWTEc1MzV2LWc2ZVRxVWZ5UnVQRlROb21QaW9qemQtS2xqQ0kzR1A0ZDBFR0NBTUw3MkdiSE0xTFc0OU5nbTNlT1NjUVRDbC00czFXZEY2dUhDZ2JaNXloTmJ0cjBjLXp5QnZ6cHcwMDV3QjlLRDczX2hIRUV0dldBMndMS0sxdW95elRiN05ZN0JkT2xHalFKZnBHMVVVaWFEU0JiRk0tU2dURERNcnUzREttZ2JzaTM5STZfOUZHVDM2VVdVb0pOamtQWEt2RVBtcG14Z0VTMW1oc3VZWUM5NWhhY2VvRVM5QXFNaEIxdUZfLUZxdkw4bi16YnJMeXlyNnlURFc2SW9sUWhIalROdkplRDhxV2xzT0pZRHZmeG1TbWxPSDJCOWxMaERSMmxXSkFVYVQwcDBIeXVidDVoamphTHJxQ0NIN0xxZzZUTUFKd0JlaTZfQllBTElTYUs2UFkzNkpSV1BCWVFXelhiRENtdXBjZ0RlUDIxNEdoWV9udGRKRGw1MzNpUkdPTHYxQnU2Q19qdVV1TTFEYkFDdHFKbnJaZnlGYzRRUjR5MjFVSmdrbjFlV3RUMjJpYXNjVG1UN1VqV2RieUJuM2ZSWWd5TGo2MG9qS1pDWGRobDBjMGEwUVlHMExPeW5pWDNOQWRaWlotQUhLLUVVbHdycU5Qekd1RWdmNUdhMkFVZ1lScVlmWFNjMDhQWEM3SHBuQnc2UVhFLU95UG4zRzVmLVNRLUNYWFNabktVdlZnVGpIN0REMno4aFJZcGt4VVViMG5NMklzVTVJQXNuMG1JTTZfeGc5OVFKZTJCVmExRE1Ga1RvRW9kQVFDOXhwUERDMWVZd0dnTlAzZVlxZFl4TVNVRTBrNzRNdmJfV2owQUg3V2FqMWNfTDR3ODJ4RmYwTU1KRG8ycWxCUEtBS2xacUR2S0RWX1JaNTE1UnUxS2liaWtFMTl5bWtMRV9kU3Rhd1JZQm00RjNiOXM2WTVOMFUzMm1vcnZzemxtbTJ6MTFDY09ObFhuNlhFbUl4ME1JQmdwRzVSLUZTeGsxNUFpSWZiR3o2dnhfRWZMcHdYdGtZdlJrTFJjM21hQVpZZXRHN2hSdmlRajZZUWdLTXZGU3hYWTVvbHV1QXh3WHBhNU9LUjl1enBDdjdPRVpHajNUNUF3bU9UTGhZRE9CT19LTFZ4Ql9TdGNMWGxrbGlJWmVMVHBHay1TcnlycE9Jb2JtdENhLVFfZmpLYURPMjBhX0xTQ0d2RlZJLW1HaXJFdzFIY1hfTjFRTFJSbTJXc2JiX0FHVWVma3FFTDB3aFFabVJNSXo2dUZmNnlDaGtpRVUxV1otTnVOaDZPbW5Mdms5MEpMYjlYaGhyUDR0bFJvZWU4Y0U0UXctVVNaWWlPM19XNzQtWERBa1lGU2NTa1VaX1hIc3IwaDE5X1hENFh1TG1RWmluMlc2U1NzU0Z3Vk10QWZ0SjBpMURkVGVSQmtYcEU2RzNpbkZCNUNCTlM3NTdLVTlqNDlnQm1rZlhDQUQ2NEhad1E2cEdMMU5zZW1ZeVJsR0RiMzQ0OThLNFlRS1lRTVpiRG1IeHFCekVscVhNdW9KWVV2UXg2N1RQUXFSQThHU2hKdlpEZDZaaFJualBYV3NRakh1YUUxZHJUTnNGMmg2Z0p4ZGZWNVlHOTlvRld4eDVRMk1aU0U4X2FtbkppSEVTMVZPX0tLNUpTbjFnRThIQkdyel9mamtjWUhjeWZqUmFVclpYeWl6N2Q5U3FuWVJ1eG4zMlZrTEFwZ3JYbG0yTXBmUTVZUkJjV1ZQOG9hX29JcGRtUTVxellJZ3M1Tk1MTWJhZ1BOUWVNVEpUaWdFd1laSlpZWXNBWkFSa3F3VzRITVVsVnc4MThDRFRPY1pibnp3Um5Fc2thM0toc0c1RjRIMXNjUERFMlpxc29nWjNubkFqaFRuMEpWN09kYWJrdjk5NlN4Z1dqUUpZckduUjhsQTJob1l5LVQ1ZDM0STNWN3FJdmdXWHF4NWtxZXc3ZGxXQXZXNXhXd3N5WU1EbFRSTGtwT0hmZHBTUkZ4bGgzb3pZblllVHoweWUxTlZZdXRKTlY4Z1pUSGQ3SzI4d1MxTFB0SEFzeFlmVUV2R3NiNVljaFE2ZTBrSGNUZWkwVXliWXhJWE1WaENlcTB6bV9UYnBBUXNCZWNEZTVxV1Q3VjlVbVZKV1lKam9UT0xLUUM0ZDUtNkwtV3NQeWpjTXRwT2R4NERRbXdNSTVSbE1odUhWT3FjNDlYaG5CN0NZcGlLUjFSTEpmOHZLdzRHakl1STIzZE5kcktYaDFtdHdSSnZ4MVNWOUhlVXc1U2k2YnEzMGNhOUlPdk9PUFV0TDVzSnd5OFBSNXRSUnlNM3NHZTFJQTJfLXg3SHNaemRTZHpOVVc5TUotdDRBcXlSaWtQYzV4ZlVTR1EyU0JPSkxiUVlWN1F0XzlEX1VfcGlPcXN2ei1naXlONzkxRXRWM3dCVTNfX1ItbHJqMHNhYjllNW1BWWJsQlU4LUNfeUtuMXpSRTFBck92aGE2UjY2UjRjSGwtNDkxOXRzUFV6TEhtSEYyQVBvT012emJfTjN3RzZRQWVXU3BKdm5pUnQ5QzFJRzM2eFMxV2RDekgyWVBBajljMXVDdjBCaVIzNEgwcG52UnFOcTB0eWR1SlpqZ3JSOGhPNG5YRDJ5X0VUYjNLRW9VSkJFcTI0d2FFZVZFMjZKSG5tdkRuOTJ1TTQtM3dZSU01Z2pXYjE1X3Bjb3hFYi1kOG11aVo0YWxGMjlFcFVuYllXXzA4U0FWemRPUk1EM1E3VTVsYUUyZmNZc29nWlRwZjFGcldGN216VHFuaDNHNEFPU3Fta1ZuWDFVMUtwQk1qQUo0NzN4d0ZCZVo4cXY5OGtsN25hRy1CdEt0TThqaGJPQTRVVld6QkdFQnBQZzhMa0JOVEU1dE9KZUNFdWhVbno5NlI2T3lac0p1dC1IeTM5T29HWFUwNU1SNUNPbndtVzAzeDB3WHk5WmtjV3JBZ2RZT2g1ZHJZWHBhVE50X3EtWnFONGpKMmJMYlUyREFYcDlBR2V4dDhOampEcThEbWxuYjZFU05WR2p1RzVwR202S0lCSlRhSEstcVJfY2YzZDFpMTVXRXFGQlczRHZVTDA0XzlRMG1BUmcya0gzN0tOSDEtX0pYQmRsMHRYNW93cFQ3MkJyV2V3aGt1bUlwSFQ0OU9pdmxKNjJZOXhXLW04aWVsbVg2YnhXdDZVbnhfeXpuSnAtQkFOWFZmRHl5ZWc0N1l1UjFkYS03YlhmYjhVMEl6VlN1dzJPaHp6MElaYl9rekRBb0pnSnpYMkpvOG1Ja3JtaVIyV3E2MXhqeERIcjJTMHJ1aGxRSkk2MWFMS2g2R0pZMFdpZE1DRmZndjQ1eHkzTy1DUzlpQVBBMnI1WEFvR2JpZzlNQmdVaHNJcGZVSkZ5R3A3RTFaeFhTNWh3TS1NWnlKWjNMSnI5dndiRWE0YkY0UW0zV0loQ2w1WnZSQkI5enRtRzFvU2tKd090VEt6WEh3WDM1a2QwOUJqUWRSaEVQLTRmbFFiWnRiWGM0M0ZrZnNCUmxPVEtYbWpDSldQV3lqS2pwMW9la3gxYVVBQnctb1dyQVFPMVIzb2lUekdDYWdMSjhmZjRlZ2RMaF9ZbXV0RGZIOU9uZWhCaURGUHFFbDVtRjVGd2w3VWhVWHR0OUxtVEE4bjY0NDZnWUxIOGtyUFg1Y1IyanRrcXNub2NEOFZJOGFKU093VWpZcEdjOS02Zk95SHVhSTB2RHozMzE5SVNtajRGcWZhQldGWm5VeWNOVTM3MXRXYk9NSVNtYjFxNmxHN2tRQzQ2N2YwNDdLUmt4bXNXZjh3UVFPVlg1VEFKVVZJd1ZncEpkZFlPQ0kxQlpaa1ZVTnpoeThaeC0yRzVDbEU4LVFjbVdTeDdZUVVlbl84d2EyWDNLUlRhUWJ0X1lxcU1sZzZ1T3I5d00yZktvZ1owd0Z6alJLR2hBRVVzbWc1WTdtY3J1XzJtQXVkbGNOTzN0Ni1Qa1A4WEdkRHpBR25wVDlSRXJPcjR5eGRZdFpxRDZrVjd3MDAxN19pekpBb3NMaXhGeVl0eU45dTFfRDFqbHYwM0hfNnlyRWJzSFhvZWJIaEpoN2FaNmxrVHdqM2pnM3BoMHQ3bklXeWhDNS1qVFYzV0NXWGJDRFo3NnhqQlBQbkdoQ1hFNFRncTh1bWVxZ05FcHpzWGpzTjg1OTFDUE9MSUtRTGJobFQ2ODJ5SFRsX0hJOGtkLTYzbHE0WHZ0eEd3SzVfamN1ZXMxVEM1Ylc4aEg1S0JVb0UzQng5RmtXdDBPeGZWOEhnNE1kSlFXR0JiYm1UZFdrVjZ3cTkyaGJUeVF0VFZoN2twMk5nTDlOSk9zOXBscHdsT2NjcmhyVEFjMFQ4Z1NxNHRFTU4wNTJFTUxIX3dxM2hVU1QxLW5raFZTUURDaXBlUGF3dEFhUERLLWxPb3hXa2NlOWo4TGxjTTloYUhYSzI2RW5QLUFTUXRSUWtONjhUZ0JIbXVYYzdlX3pGVXIxOGs1V2FDSlZPa1F5eGhLTUNSckp6bVVOcEJiSlYwRDJDbjlFbDVEWWtNR001cE91cU1VVzBBZXhmNFRST3haWUhaM2x6Wkc2cWxvM1ctdm9WTFJoZmdFTDkydUtld3ExRXAyS1I1TTBSb1J3THBtMGJBSkF4bFVJWUE3amNzNm0tcWllVnBYc09CY1k0UkRJNEYxaGdQSWwtbXFsRHBVV1c0MFhxOUQ3R0o2SVJDT3FJMEExM25qZmF2N0NCTERVTVhncEd5LUJjUWZjWW43M1drZ0pHaWE1bjFqbkFMODM0dzc4S3BoS29oMXpfNlZ4MXB0eFpfNEtXN1VIaTE1Q1JtcmFfeGtlbWpLU2ZJbklXZGlWdWZYcFBWbjd3NHBZWFV4T2diUjQxTVNMVTloZXdESmlPSG42YXpaaHpkSXY5Si1FZUJWN0h1YXV1Z1cxNGY1Vi16X1hfZ3lPRjc5T0lDRE13bWdzUmF3a2xiRW51SVFETlp4ejNoZlBEbG1OM0w3V1lVQzNZWFVMT01TTlQwWmpwX2wyOGpCRmRGT0hBWVhhaXZiTTBES1ljd05wRHZzOW51bXBYaXE1SXFwTnFXYmV3SmpRVGloNllIZ1NmaGV0R0Jfc3ZVUC0yM2lLYnRITlBlTUYtcEJNUS1yYi1MR3ZKOEZYZG83R0FuaGF3R2ZLeENtUlZMSVM2dEw1VUxtS2Q2SmFpbVpzQTZEeU1ydEc3ZE9DM21ONFJ0N3NWSDdXNkVkVlVHTkdMUUVZS1FaOVRXcHNuRzZoSWNRdFBwUERGWEJVcnYwNXV1LUlVbXhabW5HZ1lYYWF1ZHl2N0pBSHRFbGpXdXVWRFZkZURYbi1jYkd1cGZlTTJDaUtiMkZPcG9JMGFXOXRVQWZjVkJGY2o4Zm1kVkhzNGU3dFpqWVlsbEZxcGVmWVl1Y2pWTzJ3cjhSZFFaQ0VRXzd6S1pVY1JXUFppS2k4T0JFMG1TNF9xWm5RVURiQjJQRC1CZWRnTnlNNlZnYUdIb0ZwZ0VVOUp0SFdfUHVZcGZoaEREeDF6eHZVY1N4c0t4WUZlQU9hSzVlLWRjQzhNOHA5T2VvNUtVaEN4dV9hdEFEOGRpUjJaRFZYdE1yQ1lBNWdPSHRiRVFMb2hyYUVidFlWNWtDaDljVVZpZXRhR0NJZ0FlTHBLbjZJS3lHMWhYUmM5cTN3eTJvN0JYa1VvWjFZX3Rvdlc3R2I3RU9VekxXQ2tMWXk4YkNjT1c4WDJGZUpyaXlnMTQtWVpWdmNsalRhU05iZzduLWZLbmdjSDM3RjVTelpDQWxORkFvYnJBMk1ZeFdlNG1OSkZDV0V1ekVDNWdSWHpWMkVnMkJqVkxINmdmV21jd2NzSnF2aVJWc2V2NFE4YlN6MTIzMU43YkhMT3dKcFNMSG91NFcyaV9VNkl4T19CNWI3Y0pkZktJeEJ1QXZYSEVTSnJ3bkVfTDA5MDBOZHZPNkp5WDVSSjlfTEd5cGxMNGtsTGZSeHVHd19Xb0R1TThwZTdTbWtlX2dXbTc3TF81dk1DQThEbTI5MXVfV05DM3lSUVltVXZNOXpuaHpqTno0aFVhYVg0R1k2NTJyNnhZak5BSzhla25DQTdyVXNUeV90MVFyOG9TYXdHX19GX1B0MkxmamhUdVJfYlpWa3FfTDdZMnphUzk0dnZ0UHdxNk8tMkxKdkZSMHprVXlMcERIOUZTeVNYZkJYb3FDYlFqU0VLS2x5NXlWU1dpODFmWE9xSjZmTnNNUVl4MEx0Rnh2SXhVUWw5bDFST2tNdHNaOGpfZEluT3ltc2dDUU44dFR1dkxYZTY4eXg3c1A3dVVoWTczYlBVeHgxOXlRVUJDcVA3VUc2a0syTDRrUlZtSXJvZm8yMVlCbklXWndzZW5YNHRuTG9LcFlNejhnTjJGOXJQNjI2cElJRDktUzVtbVNNcVdJRFdqLWhrdGhRdjVOd0RsR2U5Tk1GVFRsenR3RHdYNi1tNWFmTjc3M1Rjb2h5Rjk2a0RjYXdqcVhlUWtsdHgxaFJHX0xFM1E2WnNmZi1LeWlUbjNCenV5WG9iLW9GX3QwREctSzlMWmNjRUo0UzFobVk1QjZyVk9FN185RUtoRnZveEFiYkpSVkVrbkZ6cThiRnlRd1ZLSFlFekltdjhxNW1fZzRRWXczOEJiZkNpeDRHOC1LS0xDQW81YjRfbk84RGFMR200aGhYdDl1bmxFN056SzFGZVpqNlo4SFdKbWZUQzItTElCQmJrMURTaE50VnpYSmdFc3RSSzcybGVDU2ZhRFQwSEV5VmNFODIyQVp2QmNnLUk2RVNPWXFIVVBlb3BiOVdPVmFBN0ZONEpuSTdPUXZuUWxOaUJCaF9yY3JJa0xyWmVnM2dRNFZUdXUtRTY1TGtKZVBqSlQ3SlcyTkhiUkNSUEVRZWJ0Zi1pQTIzN0NyV3hTMjJFbVR4VUdiRURqeDF4aVFOUmVjdU9Ud25tVi15YzFUUzdLV3BCakFXZVZQZlQyVXk1N0sxNFRRd3daOVBVTEJRTTVHWERrSnk0WmR5azRlT1RyMWlrWTJmOXA5X2VkYVphUllHRWdKZzQ2Zlc4VnFrRWRUOFBJMXR2ZmVVRURuZC1BN1NhUkM4dnNGRG02VkltXzlGSHJPY0NvTFhsanZ6MmJjS1JIUzZMck9kdFNGU0JoTzJNU18wOTc4MkwwTzBzVjhMNlNqa0tLQW5ScFRxRTN0VWVuY1dGMEhOSHJoTnNJS0dxUmRqODJWMEdOVTROQVpvWVNaMGZnNmFHWTVvNkt6YWpCZS1aelZweGZvbF9KcmJub0g4bld4alJkY2xjUEhWMnYwMmVIeFZSS2hCa2ZhNXBXTEVpMHJ6eHM5RlQ5Y0NrSkZhZnFJeS0xbXRsTDk0SkJMRzhHNlh2MXZuNkJQVXNZM1VadVNQcFdrckxRT1gwZFZjWEJkeDdVUWFXR1lpWUVIY0Q4TXRabFdpOE9qaEhIem10amMxOFM3dUNMVHN3bWJBWUZYenEwQkFhRVhVcmN5NzJPTDgxcDRKNzNXSWNuVkdpeVM4TGNuVTliUGRDTDkxTjJjbWtwbFZBanhFd0twbHlyc0VtZV9yYXBodm55ZEtSVVlQQ2M1RFY5WTh6ZDlRSTZvM0lySUFkNTRyckJCQ0VOTG5ic0hGYmxyVGRENl9kTkV4b1hHbmJFTGR1TUJ5UUN2dFFwNXROYzNsMU5HQm0wYkE3bWxmTFpBN0RRVHd1VXJoNGt1SnJzYmsxNGFlcHVBYlJRQ1J0cl9qblpZZEgzUklJOXYyZDE0Sy05ZFFsS1hmWnl1d3d3Q0k1eXpSaWlnN1daN2l6N19BcFVsWjZXODE3eFA5ZDdGUTlOTWRGU19USUZrZGNtc05UblYtT0prRUNuOVRlR3ZIcGszd0hmU1hJRUlOQnQ4WmNOSGpxWnY5TnNLNDlzeWs3cUhTZURDak5XMlJJUTcxaWJnWFllU0hJZHZoTE50VXg1ZlpOdmdkbko2d1FsY2lzNmNyaUMwSHd3TnExN2N2bWVSaWxFbjZmX2c2RmppVjkzN0pEY2ppMktnR0NsVUlyT3RDcnlRY0tYZ05SSER5bTlKSlRTeC1RSlllR0pLbFdUWDlLampmbkkyblpMVUVZNlVFRFFLVG9hMUs0YmxQU3gyMmd6bm5mTVg2YXZEckt0VHVxVUZzcWVid3ZmUnhTbXEtV1JQRnZFdzZlbWVMbzZOTkpNcWhpSmFNbHRCQmsyb3lLWk1oR3F4VVFuNnR6ekJFcFpXY01nUkE0NmszdUprVTE4ZWh0UzdhLWE1UDViMlBBZk5BZ2NJbkgtMy1GLTNMcG9leTRKLUxSeFNCeTN1clZQZE96djhSUjJ3RXkyZ3BJWW5DenZnM1NjdFFRVW9oMDdHdThMOFhPTktKNzY0Q2RxLTBFRi1SR3VTZUlZbVFZYzZsV2VpNUthMFlfVVZIUUl0SHIzM0R3VDFLRTJSOEZVZjI3N3E0WjFQTTd0R3NvYXRkZzdRMkplRDI3bVZvUnVpV0FLT1pKbHdJbnJZOTdBWWtaUVczZHI2ckhGa3BxOEJIbnJnYUxmZkZIZHluN3lybWd2eWZ5MmU5QlZLaVBLN1NVSFoyV2F0ZmVPR0lrNXhMM0RrR3U1c1FLa25oUnlRSDFMelk4M29QSkZPSEthNzdnZE5ZbUx0cGNEZXBQbUJsOVpNeGhTZEQxcVBNVVpXd1ZEOHVHMndQZWtsSE1Jamp4TjJCYV9UZDlhQ0tHbnEwLWd0WHNoUXozXzFpUm4zQktzMzZVcE5UM3p1d0pOaFE4TllZbERuODBOZmlZdW81TEx2WVFDYnpNb0pWei11TGV0R0xJeVRxWVdZMFAyNVBnU0ZiR01NU2U3MUJpYzJLYzAzMXU2MEx0eWJxcUZSOHVSSURmUW1tMlpib0ZFNUtZUERtbl81RlJxMExDdE1faGJnV0Y0ZFlHVm9WT3p1YnlFanNVRzh6ZGVxclNvbXZDelRZSkhiWF9MOWR6M1VrZU5KaHhiSkNWSXJFeVFTanNXUGMxN0VvVVg2S3d5aUlYYi1pd2JUUmJhWXU3eDFaTjZKNC1JcV9kVDhHU0dQTzJnRFdSUVhwTy01WlVHalozSWpEeEdNNG5xSlF2c0FCQWJfX25VTUhBS1BvY2hnZDBTYjYtVFZfMU9qY0VoZ1pHQUktMG9uS3phMXpwamZSRmNZRDkzTmxkclpZYTJxNkl1ak13dy1EZWZ4SXl5OHktMjhIT211ZWVVVE53YkQ0dEZqZnZHMXQzMzRrZzRzZWxjdnZfSmhTLVJVZFhLWFlDRExTQlNwb0ZVbDRnTG5aanBFeHhjZUpHdFVDc1pBTUpxMVRJWXowV0V5Sk5DRHA0WEYzZnVTdkY1MlNaVjJleWFySWpKRV9hVXl6TUJMV2hwNGo3VkRVeEE2dzlLeXF0NHNwNGtkanZQWWlwVEpUUGh3enVJQ0drQUJJeXZQZFdObXBzdWxPRDZEd216elpmR01PU0gyWkExT29kY1B6dEdLSUExY3JpRE1jUnpGTjlncDZYeXZXWTEyaHgyblp2WDhrc2NQeUVENFJCQWk5Y1lmSF9zOS1aMFZoOC1SWE5fcjNwMjN1UHFhMDFNaGY2OWxENU9oUWNzRE1VeHdzeDB0aU1CQm1EVzNNSllON0NFTFpsV003d1FqTXItTnNURGFFVFBWTmxiQkxfWTlwdjBMdVVFaDhORjMzQ3VIcVdSTlZ0dGVIdWZfd09WNVZjczgyVm04WHVFMk96VFE5Zkt6cjgxMlVUdVFNMzJ4NF9aV0w5MjhzQjRyOHdibVg0N2RJdVZER2hmbG9udEpvMmlkQ3dnYk9YSXZWbnBLUk5oSnEyRWQzQW5uVlBrYk4ycWR2WHhLNFhOMVhoQXhlMDR6bmVqV2E0cHVvb3hfbGdUWlFMYTM0dUNaUkJScXA4THB0ZXB1VGVmV05ZQ0ZpY1FKUGo1SG1kQ1ItaGlzZi11eXpmNy1JRVNNQXBxLS00ZkdENVZVcEwtQXZfU0U3aEZHTTBwZUpQb2xzWE02WmVQcWhjNHc3OG91MDRHN1BONE1hYVJzSDVhdHJVSmJnYS1RTHh0b3pQZzhXNHZvSE5CTkdBa01NckZ0bHFmXy1GWWtES1Rtcm9CeEhCVjFjcFY4SS1tR2hZcUkyTS1mSHF0RUNJYTZLS2hzLTNNOVhFd0JCSkVzWnJnOVp2Y001TnRzcmNBSk9aZ2ljR21jYUMyb1Fka3ZscjlseW1kbEdlN1pocXB2dVZYZlo5eWVPTlE1VEliSVQtM3JFd2V5TGJId2ZNV0xKdlFhSDIzUmdMNGNmT1dwXzZwRXVYMWhvc3huT3hBUE5ObnFHQ3RkTUtRb1F6RWlIZ2M4WE5IU19qcHY4N2R1MUZpcFU3YTRtbVZrN3ZLZnNsbk5EMHR6SGpHekRITXJjeERDY2lza0QwMTBCSWoxdS1oc2FtcF9adzFHU2xtSklQTzNMS2hqVjNuRGVGMWF6Wmd0REhBdXdQS3lzekNPcThIYmtkU1czYWtSdjRZaEo3Sm1KZDluQVliclNnM2JjTlNLM2p5RnJVcHN4cndfRnRqUHloWUtrdDRlLVJVUUZpcW55UmNod0N1OVRMWWZfSmdTdk1obE9XOEZ4Ylk5NktFUzNBOTFkRnEzNzRsMDNsajJsVUZlem9WRFBlb3d3OU5BLTI3RXRaY3JMTzVGNlBwcXFkSXZmR05NSHAxdl9SNTVzYk9VM1E4SW9JNTk4T3V0QUxDS2hoXzh4TnEtaVM0Q3gzMGZYRGhqOGRXWkhFMkZWVmZRX01uLUpxOTlFcHV1OVpRcWJKT2p4dFkxcUpkLXIzNFMtZ0hsV3pVOHpvVFg2dndEWkdEdFQ5NUs4UjB6ZjQ4YjNNQ1dyY1NROUw0Yk9POWYyTHRJRk9nTDVxcjFUQk9oQkJkOVhkbHYwYTU5ZWJPcVZZUmlEZjV6cXV3c0NoOGt1X093T2gyeWVuRjl1TS1lcExQWTRDcC1NSVczdlJ4TURPZUNiUlIyUmNDWkdyOUQ4ckhURXZHbGlZbHY4Y2VGUHBLZ1U3UThtSGZURWQyTmpQSlZjUU43ZFRyUDMyTEx0bE1PVlFmMFhOWXhkd1JGTFY4TnRYWHJSbGxYVW9Yc1BkaHFSZGhPME9IOUF5bXlWc294YlFMRkFGT0JWZFhTVGtmQ05xalJ4VDJ5Q0RlX2ZBMENEenhDOVZ5Z3I4bkpwOC04Nkk0RUlVck54YXJWYkFnNXgzbmZuVkUxRVh6b3pTUnZya2RYQ09rbm0tM2hoWEZsRTJaRUNzcVdiZnI1d19FSFBRTDFSYU44MDNuNHB3VXdVZkFsSzFFQWpybHlsa1hSRG9EWW53MkZ4SGptbDdLT21GUGJ3V3dPTHpVX05Md3ZuaHNVUlhNbXQwMFBkYXpVUWRabXJBTXFJZURYT0dQc0hxMnBWZWFOVUxFTmxPX1BpeV9ER2lDNUdIZktZQk1rRFBIUWlVaGF5cFpkLW9iczVsZDVyeHZ0NUgwcEswMi1UbjR5R3hsTkJtRUhYYzN2ZWFjYXQ2SnZvVERqakwtaW1oNjE5aW1tME8yM1loaFB5QkFITjFaT0M1aFppRjJ5aWlSYjM1TXpLSHNWOVdrdW05M3RWVUE4RDJlXzUwZHJxSnMtd0F5N0NwcHN4TVhkRjE2dW84ZkJsQml3Wm41N1NiT3lLbEJTZ1pEN1E2LTRrVGlSRG1qdm1LLTBNZGxuWVFLczIwbU4zY3RLbmtGUU56RFFHR21ZX2Y0ZGRaVVVmRHlDWHM0VWluRUwycHk3UzZITGFheDllUjBwVEkyZEJ2LXJTblBuXzdGaHlkTnF5MW5PSUZIbU9hWjNrbFgzZ1VHNjR3MmJDNy1xUHRFYWw1VTJfNVcwZHNsRVpSa2tsUVdlQWFwOEpxNVVoQ0szVTE5eVpWaFhZRTR2T2VIVTlhZDFxb3ZVc1NPTkJSUkN2OEljT3NMc0ZSamIxSG5JM1FPRHFNMk9Bb0c1Qm5SQVdNVHY0Zmd6Q3k4clk4NFBFT1pVejZieV9GRDRzNnhUZXJYWVk3X1pucHk5cEVSMzdWbzZBSzN1SXdjWmFHZlpEby05VGtVVEN3TUp3MjJvMVd0VXNoVVhpbkw4aGdSTnAzLXpVWXJkbkR6QjRpMTJZelZ1ZEpHcC1pR2J0WnQxU1VndXlUNXpJT3JwSTRTZzYxRjFtb2FZRFItSVZySmp6ZWttSk9ZRjNROFBrWEV1YnBWSDNOVy1fa3dtVHE0MWp4dl9JSjBCREhkRTlael9XazBGSlU0WnRUQ0pheG1Ja29YZV9WY3JST3hyTTVKajY1X1hPcFNEalptdUJnY2pjZ1ZhR1B5RGJUTlVISjhsUDZMWDFrYnk2a1FfcDBtYnktbEdVd0h1enZmTmQxbWJBQjM1RExKdmpVV2xsMlZhbUVjTXlzVXNRejUwdWsyOWI1dEtaeHlGcFdtOEoxVGNSUVRxZU4wek05SzJWRGdmUmlrMmhCZDFOd3hCTnJYUVQxUjJHQXplRWR4M1NDUWhZT2E4djlwZm82UkF6RGRTQnRGOGtNbW1wZ1dYNy1JTFZnZ2loUFJnMFl0elE0TU9jSmRvLTlyY1hsTXllbkNtTlk1M19Yal80VlA3V1hEVjhBT1dGUzFabTdoQXFqb3h6YktsSXVsdHBVbjNzX0xiUUswSF9wUTRuMmZWYm1FUkI2TmpVRko1WGlmbXpIS2JhWFhHcUFGd0Z6WUN1WWdvamg5cU13UkRGZG1GUmVxQ2ZhWUdrYVNydFg2d1pBSWJBNzVGTk9RWkFnaUNScTVXYXJTejJGcTdONDZmX0c1NFVhcWR6WDRLSmZua3A3RmYzWUpfYVZSVXA5T1JtRTBEbUk2eTVZVzh3X1JwdUZBcUZUWXliM0tVR01ldFFGN3JiVElTaV9acU5xa2FYTzlhbnJsNDgxOWZRUHhqM1VYMlZKbjU1bjI3ZnRoMl9YdXNLRDJQU2YyV0F5R2tTa1ZDLTBqY3duZFJOTGFReDAta25SR1lKR1lDbzhlTjJqRFhhS0xxb3FSQkRLb1lIMXdRNFFzakgzM1dqZllkS195MGNSLWNBUDdFVnhDN3hrWm9vZW95cVB3WHZ4VF9uREp2T3dYV2Q0Nkxmcjc5Ti1oU05qUVFxWnRCakNlV2RCQVB3U1F6QVAwYW8xaDJxd29aOUIycjhCTjBKdWVQeG4wUEhmTEo4S3VpMnN6OWF4VzY4dGd5V01UYUM3QWdaeW5aNHZXUS5ZT2dqZkpnaG5EOEpvejFTaG5YZzVn"}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['43461'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599978e271b27.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/a6007e896c074b10b0a266cb365f4afe","kid":"https://vault10511599978e271b27.vault.azure.net/keys/cert-name/a6007e896c074b10b0a266cb365f4afe","sid":"https://vault10511599978e271b27.vault.azure.net/secrets/cert-name/a6007e896c074b10b0a266cb365f4afe","x5t":"gny9IWSkH_pLqJUEM7lfRWV0IR4","cer":"MIIDczCCAlugAwIBAgIQPUYG1Vf1QPuOVZQDO20qMzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDR6WlhZZ9tJin7CAB+nj0fIWXqn+RM31rxKm6enxP8ESokdZZOrXOT9VpEFOxCJY4C7MSpZqS0yVIeTGouiAaM2dQEZws+Dy/3PnyCPcXn7vmnX3z/mAYtgYMERaOV2O4ZV+q5Ojh77bqX/4O4y7Jltas9aTYkNq9azLIStTXguE1lV5DHmIAU3wRtKN02bRKqXXvkl64QhpqnxQ8FAIOtuheZmQgVxftJq7MT0Tsu8a6jAc6O3HKT5IFYah1xwXOs9d4gUYrMubkVz/k5rzapRmkeiOrMJDcvApBYxmoZj23mbcf3AVB+JEfrm9638A/vHvqkTOLorujeodf3xE55AgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBSq4JWfuAOiAfkLg9XZFZgAIxwc3DAdBgNVHQ4EFgQUquCVn7gDogH5C4PV2RWYACMcHNwwDQYJKoZIhvcNAQELBQADggEBAC8Y56TAFsmK/JOtQ49EsnAbskDpfGM/mlZZJDJLP3ZmXXWo8jsHmqJw0bW1rXsU7TxRZFX8Wv0ZjOocywDE1jirXWQ3R5Znt+MvfqMM6ia0DXNpnZTVqHqY/e3I1Sl912YKhNPTeAwb443e4nIE6JPzIKXm56bsnHePUoB039Ah0iwAMjA9uPLozeCtRjZB16Lc2QRR/CMJh92/Me432Z7TkGfqu1bXRKtxOwALQBhQDIZ5g4gT+EpkceSmzfdK67TOFIapM23IultwjsJfSlBMCp6tR0JKJeD28oBF/NShlVi8L/3sFRoI94hFjfWNS0cqqy4cpHTjY/1huaZdIxg=","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault10511599978e271b27.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639273,"updated":1567639273}}}'} + headers: + cache-control: [no-cache] + content-length: ['2308'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:39 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_crud_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_crud_operations.yaml new file mode 100644 index 000000000000..d5248f52974c --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_crud_operations.yaml @@ -0,0 +1,240 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:48 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["onedrive.microsoft.com", + "xbox.microsoft.com"]}, "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['329'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7crY0RkU5VinzX5JpDISK8gDsAXpWYkx7L/cZ+sfjFElQodnK7ER/yC4KBG0Dsntew0tcX4DRtQE3dFhJEl1lqNRuiY69RgyGj3nAa5ebNMrZ3U1G6/qlOQgIcANgw+j4Wx/NUPjbMy2x5dkKcAZapsMTkG+VPjsaokA2/KQSYYEG7RnwexvWH+n6CBlMSTE7Q54lI+cTnRlx7kg5judjdWnEtJb2SjndTy6Jxz63lhw1olgwEKa9gCWf+0A8mRpqz+H1wGyVDB2rD1TbewuzTBevRtGPL1fKy3RdRmrpPaungrbOmbDU2pjhPpSAoc82MAR02R9sLMnwnsdSi5BPwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADzx1ye+PNyQz4RBHN53UKljqClIpQKbOivNKJHinSv5yebMLd9zAcMtt7CV7Dk5XOUxNXoPi4K1hvD6btENCA+9G6IMglZ9YNgKoZUhuq0GC6XAKSiOHjvwd67lOgvxRvTQ7RV2hgEfHkKXvNieRQKMiv0KyqUYMIt9AzfnEZIDndu2e0RaZ0JuBLsJXas+H+hLRiQc2Cct2cp+YrVohNd3Tkq53Ff0JQcimj2p/uNuEyL4n2HMFdUB3+7dgn2nfbNOs4ksD1VDQaQYQwCjj9Ib+RlTG8C9qvejh7baHW0JA19CxhREB/pnbkXFjRaRhqsEVgPYcHCuDEGML2EvkdY=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"8a60412fdd4343ffb7cf881424bc4b2e"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:49 GMT'] + expires: ['-1'] + location: ['https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=8a60412fdd4343ffb7cf881424bc4b2e'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7crY0RkU5VinzX5JpDISK8gDsAXpWYkx7L/cZ+sfjFElQodnK7ER/yC4KBG0Dsntew0tcX4DRtQE3dFhJEl1lqNRuiY69RgyGj3nAa5ebNMrZ3U1G6/qlOQgIcANgw+j4Wx/NUPjbMy2x5dkKcAZapsMTkG+VPjsaokA2/KQSYYEG7RnwexvWH+n6CBlMSTE7Q54lI+cTnRlx7kg5judjdWnEtJb2SjndTy6Jxz63lhw1olgwEKa9gCWf+0A8mRpqz+H1wGyVDB2rD1TbewuzTBevRtGPL1fKy3RdRmrpPaungrbOmbDU2pjhPpSAoc82MAR02R9sLMnwnsdSi5BPwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADzx1ye+PNyQz4RBHN53UKljqClIpQKbOivNKJHinSv5yebMLd9zAcMtt7CV7Dk5XOUxNXoPi4K1hvD6btENCA+9G6IMglZ9YNgKoZUhuq0GC6XAKSiOHjvwd67lOgvxRvTQ7RV2hgEfHkKXvNieRQKMiv0KyqUYMIt9AzfnEZIDndu2e0RaZ0JuBLsJXas+H+hLRiQc2Cct2cp+YrVohNd3Tkq53Ff0JQcimj2p/uNuEyL4n2HMFdUB3+7dgn2nfbNOs4ksD1VDQaQYQwCjj9Ib+RlTG8C9qvejh7baHW0JA19CxhREB/pnbkXFjRaRhqsEVgPYcHCuDEGML2EvkdY=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"8a60412fdd4343ffb7cf881424bc4b2e"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:49 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7crY0RkU5VinzX5JpDISK8gDsAXpWYkx7L/cZ+sfjFElQodnK7ER/yC4KBG0Dsntew0tcX4DRtQE3dFhJEl1lqNRuiY69RgyGj3nAa5ebNMrZ3U1G6/qlOQgIcANgw+j4Wx/NUPjbMy2x5dkKcAZapsMTkG+VPjsaokA2/KQSYYEG7RnwexvWH+n6CBlMSTE7Q54lI+cTnRlx7kg5judjdWnEtJb2SjndTy6Jxz63lhw1olgwEKa9gCWf+0A8mRpqz+H1wGyVDB2rD1TbewuzTBevRtGPL1fKy3RdRmrpPaungrbOmbDU2pjhPpSAoc82MAR02R9sLMnwnsdSi5BPwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADzx1ye+PNyQz4RBHN53UKljqClIpQKbOivNKJHinSv5yebMLd9zAcMtt7CV7Dk5XOUxNXoPi4K1hvD6btENCA+9G6IMglZ9YNgKoZUhuq0GC6XAKSiOHjvwd67lOgvxRvTQ7RV2hgEfHkKXvNieRQKMiv0KyqUYMIt9AzfnEZIDndu2e0RaZ0JuBLsJXas+H+hLRiQc2Cct2cp+YrVohNd3Tkq53Ff0JQcimj2p/uNuEyL4n2HMFdUB3+7dgn2nfbNOs4ksD1VDQaQYQwCjj9Ib+RlTG8C9qvejh7baHW0JA19CxhREB/pnbkXFjRaRhqsEVgPYcHCuDEGML2EvkdY=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"8a60412fdd4343ffb7cf881424bc4b2e"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:59 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7crY0RkU5VinzX5JpDISK8gDsAXpWYkx7L/cZ+sfjFElQodnK7ER/yC4KBG0Dsntew0tcX4DRtQE3dFhJEl1lqNRuiY69RgyGj3nAa5ebNMrZ3U1G6/qlOQgIcANgw+j4Wx/NUPjbMy2x5dkKcAZapsMTkG+VPjsaokA2/KQSYYEG7RnwexvWH+n6CBlMSTE7Q54lI+cTnRlx7kg5judjdWnEtJb2SjndTy6Jxz63lhw1olgwEKa9gCWf+0A8mRpqz+H1wGyVDB2rD1TbewuzTBevRtGPL1fKy3RdRmrpPaungrbOmbDU2pjhPpSAoc82MAR02R9sLMnwnsdSi5BPwIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADzx1ye+PNyQz4RBHN53UKljqClIpQKbOivNKJHinSv5yebMLd9zAcMtt7CV7Dk5XOUxNXoPi4K1hvD6btENCA+9G6IMglZ9YNgKoZUhuq0GC6XAKSiOHjvwd67lOgvxRvTQ7RV2hgEfHkKXvNieRQKMiv0KyqUYMIt9AzfnEZIDndu2e0RaZ0JuBLsJXas+H+hLRiQc2Cct2cp+YrVohNd3Tkq53Ff0JQcimj2p/uNuEyL4n2HMFdUB3+7dgn2nfbNOs4ksD1VDQaQYQwCjj9Ib+RlTG8C9qvejh7baHW0JA19CxhREB/pnbkXFjRaRhqsEVgPYcHCuDEGML2EvkdY=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name","request_id":"8a60412fdd4343ffb7cf881424bc4b2e"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:09 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/822dcdd2168643db9199d2588aa07611","kid":"https://vault1051159997aa691b9f.vault.azure.net/keys/cert-name/822dcdd2168643db9199d2588aa07611","sid":"https://vault1051159997aa691b9f.vault.azure.net/secrets/cert-name/822dcdd2168643db9199d2588aa07611","x5t":"11jJj-gZfwLMdZD1NhBqmbCK644","cer":"MIIDczCCAlugAwIBAgIQIjA07aHTRhi7LDLjaL0ZJDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzA2WhcNMjEwOTA0MjMyMzA2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtytjRGRTlWKfNfkmkMhIryAOwBelZiTHsv9xn6x+MUSVCh2crsRH/ILgoEbQOye17DS1xfgNG1ATd0WEkSXWWo1G6Jjr1GDIaPecBrl5s0ytndTUbr+qU5CAhwA2DD6PhbH81Q+NszLbHl2QpwBlqmwxOQb5U+OxqiQDb8pBJhgQbtGfB7G9Yf6foIGUxJMTtDniUj5xOdGXHuSDmO52N1acS0lvZKOd1PLonHPreWHDWiWDAQpr2AJZ/7QDyZGmrP4fXAbJUMHasPVNt7C7NMF69G0Y8vV8rLdF1Gauk9q6eCts6ZsNTamOE+lIChzzYwBHTZH2wsyfCex1KLkE/AgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRmGsnNjRP0WJ7Sz2cpQ7R+NFpIbjAdBgNVHQ4EFgQUZhrJzY0T9Fie0s9nKUO0fjRaSG4wDQYJKoZIhvcNAQELBQADggEBAA91aptmpW3tdRmPGcd9VN1im1i0S0C5Mb2FZA9uuVx602ji6VJHIjx5XK4AC3qjHiKA0k0zSKWrHaQ/M1UAOcXlKkSHlYUDuGcu+9hcyPCfx2d6iKiGr3eI2b+fnv+l5rKHtUITlexDfIPeZdXkOO42kme/YjmED9sZ/RCHwGyYZuErlSm4DEGyeOJYwoz87jlduumN9yQhFY5YQhHHpihlr2vEAq4wYAp8R8VftWxyiq3dovuugAf2Bvq0lh/lYC4p+UKQenKTYsuphbLD9t/nq2I4zw2QVV6xJ5fxkj/wYMaD0hPMTfI6PMofIOjoTpFICrMC3EJ0GkUqOUPRt8o=","attributes":{"enabled":true,"nbf":1567638786,"exp":1630797786,"created":1567639386,"updated":1567639386,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639369,"updated":1567639369}},"pending":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2487'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:14 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"tags": {"foo": "updated tag"}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['32'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/822dcdd2168643db9199d2588aa07611","kid":"https://vault1051159997aa691b9f.vault.azure.net/keys/cert-name/822dcdd2168643db9199d2588aa07611","sid":"https://vault1051159997aa691b9f.vault.azure.net/secrets/cert-name/822dcdd2168643db9199d2588aa07611","x5t":"11jJj-gZfwLMdZD1NhBqmbCK644","cer":"MIIDczCCAlugAwIBAgIQIjA07aHTRhi7LDLjaL0ZJDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzA2WhcNMjEwOTA0MjMyMzA2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtytjRGRTlWKfNfkmkMhIryAOwBelZiTHsv9xn6x+MUSVCh2crsRH/ILgoEbQOye17DS1xfgNG1ATd0WEkSXWWo1G6Jjr1GDIaPecBrl5s0ytndTUbr+qU5CAhwA2DD6PhbH81Q+NszLbHl2QpwBlqmwxOQb5U+OxqiQDb8pBJhgQbtGfB7G9Yf6foIGUxJMTtDniUj5xOdGXHuSDmO52N1acS0lvZKOd1PLonHPreWHDWiWDAQpr2AJZ/7QDyZGmrP4fXAbJUMHasPVNt7C7NMF69G0Y8vV8rLdF1Gauk9q6eCts6ZsNTamOE+lIChzzYwBHTZH2wsyfCex1KLkE/AgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRmGsnNjRP0WJ7Sz2cpQ7R+NFpIbjAdBgNVHQ4EFgQUZhrJzY0T9Fie0s9nKUO0fjRaSG4wDQYJKoZIhvcNAQELBQADggEBAA91aptmpW3tdRmPGcd9VN1im1i0S0C5Mb2FZA9uuVx602ji6VJHIjx5XK4AC3qjHiKA0k0zSKWrHaQ/M1UAOcXlKkSHlYUDuGcu+9hcyPCfx2d6iKiGr3eI2b+fnv+l5rKHtUITlexDfIPeZdXkOO42kme/YjmED9sZ/RCHwGyYZuErlSm4DEGyeOJYwoz87jlduumN9yQhFY5YQhHHpihlr2vEAq4wYAp8R8VftWxyiq3dovuugAf2Bvq0lh/lYC4p+UKQenKTYsuphbLD9t/nq2I4zw2QVV6xJ5fxkj/wYMaD0hPMTfI6PMofIOjoTpFICrMC3EJ0GkUqOUPRt8o=","attributes":{"enabled":true,"nbf":1567638786,"exp":1630797786,"created":1567639386,"updated":1567639395,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639369,"updated":1567639369}},"pending":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2516'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:14 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997aa691b9f.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639395,"scheduledPurgeDate":1575415395,"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/822dcdd2168643db9199d2588aa07611","kid":"https://vault1051159997aa691b9f.vault.azure.net/keys/cert-name/822dcdd2168643db9199d2588aa07611","sid":"https://vault1051159997aa691b9f.vault.azure.net/secrets/cert-name/822dcdd2168643db9199d2588aa07611","x5t":"11jJj-gZfwLMdZD1NhBqmbCK644","cer":"MIIDczCCAlugAwIBAgIQIjA07aHTRhi7LDLjaL0ZJDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzA2WhcNMjEwOTA0MjMyMzA2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtytjRGRTlWKfNfkmkMhIryAOwBelZiTHsv9xn6x+MUSVCh2crsRH/ILgoEbQOye17DS1xfgNG1ATd0WEkSXWWo1G6Jjr1GDIaPecBrl5s0ytndTUbr+qU5CAhwA2DD6PhbH81Q+NszLbHl2QpwBlqmwxOQb5U+OxqiQDb8pBJhgQbtGfB7G9Yf6foIGUxJMTtDniUj5xOdGXHuSDmO52N1acS0lvZKOd1PLonHPreWHDWiWDAQpr2AJZ/7QDyZGmrP4fXAbJUMHasPVNt7C7NMF69G0Y8vV8rLdF1Gauk9q6eCts6ZsNTamOE+lIChzzYwBHTZH2wsyfCex1KLkE/AgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRmGsnNjRP0WJ7Sz2cpQ7R+NFpIbjAdBgNVHQ4EFgQUZhrJzY0T9Fie0s9nKUO0fjRaSG4wDQYJKoZIhvcNAQELBQADggEBAA91aptmpW3tdRmPGcd9VN1im1i0S0C5Mb2FZA9uuVx602ji6VJHIjx5XK4AC3qjHiKA0k0zSKWrHaQ/M1UAOcXlKkSHlYUDuGcu+9hcyPCfx2d6iKiGr3eI2b+fnv+l5rKHtUITlexDfIPeZdXkOO42kme/YjmED9sZ/RCHwGyYZuErlSm4DEGyeOJYwoz87jlduumN9yQhFY5YQhHHpihlr2vEAq4wYAp8R8VftWxyiq3dovuugAf2Bvq0lh/lYC4p+UKQenKTYsuphbLD9t/nq2I4zw2QVV6xJ5fxkj/wYMaD0hPMTfI6PMofIOjoTpFICrMC3EJ0GkUqOUPRt8o=","attributes":{"enabled":true,"nbf":1567638786,"exp":1630797786,"created":1567639386,"updated":1567639395,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639369,"updated":1567639369}},"pending":{"id":"https://vault1051159997aa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2666'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:14 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_list_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_list_operations.yaml new file mode 100644 index 000000000000..7e2d25e4ebd0 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_list_operations.yaml @@ -0,0 +1,595 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:45 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/vZs8JBirAkEGLvD3eYEgnerjyBXvE3JvWbcqIsm87D82XaLPM8mGLMitse/0kZBa6zUH7d8JsdqeZkO9BHrG7sayBoSOALG6oAze8TH11x4nkhcSQFG7ZGH3BuN5XzS/f4D/P6aLhCLrwpB8QnqiqO5fuJiF/E6NXnXKNKo40pOLKRyRYBHUtbbD5g48o6BjPNnrnJ/2AhIo6q0lD/rl9sOi5uxJ1IwKMZ9sPdvhPClvGF0U4atCsJIRiVAs+Ouev0yxVpoqxvDH15sT6+VgN5dmzOffsHwEpbdlKpomKV8Ez5AvrkdThtyhU/alEI8LSr4T6sXFov5sMR77UchwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIqXFdPxvO4dqgjKCz5dY6sVZBxTFsvI3WCAscg05lkq1CdVI0RrDKRL+vXHqAZfZSEVCbR01t/KrmnpjibDSIYvjL6rYYJhJaqERG+HAu842nm9FPkErBCmcA7pD1yWURwBfybS+PMxJ5huq1h2cz/jSiKq4dCFXzHIEYam6oQwksc5r1npOmA9WNQJDWYwbnhhhPd2yVbr2F2K7UiZ3EO+iEpp5wkvxtju/QWR20FTKxTi6ldm5aFoF62sHQPLqxDneBlFlEmPlaSzr49nndjlWNJDIsgwWe4knmogRX1FK0AzgbUZdkB+p1axi8tr9o5gmkklWUH5/lI8JO6Xbqw=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d29a1f6dc6204d579ef93f6bdb757b12"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:46 GMT'] + expires: ['-1'] + location: ['https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0&request_id=d29a1f6dc6204d579ef93f6bdb757b12'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/vZs8JBirAkEGLvD3eYEgnerjyBXvE3JvWbcqIsm87D82XaLPM8mGLMitse/0kZBa6zUH7d8JsdqeZkO9BHrG7sayBoSOALG6oAze8TH11x4nkhcSQFG7ZGH3BuN5XzS/f4D/P6aLhCLrwpB8QnqiqO5fuJiF/E6NXnXKNKo40pOLKRyRYBHUtbbD5g48o6BjPNnrnJ/2AhIo6q0lD/rl9sOi5uxJ1IwKMZ9sPdvhPClvGF0U4atCsJIRiVAs+Ouev0yxVpoqxvDH15sT6+VgN5dmzOffsHwEpbdlKpomKV8Ez5AvrkdThtyhU/alEI8LSr4T6sXFov5sMR77UchwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIqXFdPxvO4dqgjKCz5dY6sVZBxTFsvI3WCAscg05lkq1CdVI0RrDKRL+vXHqAZfZSEVCbR01t/KrmnpjibDSIYvjL6rYYJhJaqERG+HAu842nm9FPkErBCmcA7pD1yWURwBfybS+PMxJ5huq1h2cz/jSiKq4dCFXzHIEYam6oQwksc5r1npOmA9WNQJDWYwbnhhhPd2yVbr2F2K7UiZ3EO+iEpp5wkvxtju/QWR20FTKxTi6ldm5aFoF62sHQPLqxDneBlFlEmPlaSzr49nndjlWNJDIsgwWe4knmogRX1FK0AzgbUZdkB+p1axi8tr9o5gmkklWUH5/lI8JO6Xbqw=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d29a1f6dc6204d579ef93f6bdb757b12"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:46 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/vZs8JBirAkEGLvD3eYEgnerjyBXvE3JvWbcqIsm87D82XaLPM8mGLMitse/0kZBa6zUH7d8JsdqeZkO9BHrG7sayBoSOALG6oAze8TH11x4nkhcSQFG7ZGH3BuN5XzS/f4D/P6aLhCLrwpB8QnqiqO5fuJiF/E6NXnXKNKo40pOLKRyRYBHUtbbD5g48o6BjPNnrnJ/2AhIo6q0lD/rl9sOi5uxJ1IwKMZ9sPdvhPClvGF0U4atCsJIRiVAs+Ouev0yxVpoqxvDH15sT6+VgN5dmzOffsHwEpbdlKpomKV8Ez5AvrkdThtyhU/alEI8LSr4T6sXFov5sMR77UchwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIqXFdPxvO4dqgjKCz5dY6sVZBxTFsvI3WCAscg05lkq1CdVI0RrDKRL+vXHqAZfZSEVCbR01t/KrmnpjibDSIYvjL6rYYJhJaqERG+HAu842nm9FPkErBCmcA7pD1yWURwBfybS+PMxJ5huq1h2cz/jSiKq4dCFXzHIEYam6oQwksc5r1npOmA9WNQJDWYwbnhhhPd2yVbr2F2K7UiZ3EO+iEpp5wkvxtju/QWR20FTKxTi6ldm5aFoF62sHQPLqxDneBlFlEmPlaSzr49nndjlWNJDIsgwWe4knmogRX1FK0AzgbUZdkB+p1axi8tr9o5gmkklWUH5/lI8JO6Xbqw=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d29a1f6dc6204d579ef93f6bdb757b12"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:20:56 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/vZs8JBirAkEGLvD3eYEgnerjyBXvE3JvWbcqIsm87D82XaLPM8mGLMitse/0kZBa6zUH7d8JsdqeZkO9BHrG7sayBoSOALG6oAze8TH11x4nkhcSQFG7ZGH3BuN5XzS/f4D/P6aLhCLrwpB8QnqiqO5fuJiF/E6NXnXKNKo40pOLKRyRYBHUtbbD5g48o6BjPNnrnJ/2AhIo6q0lD/rl9sOi5uxJ1IwKMZ9sPdvhPClvGF0U4atCsJIRiVAs+Ouev0yxVpoqxvDH15sT6+VgN5dmzOffsHwEpbdlKpomKV8Ez5AvrkdThtyhU/alEI8LSr4T6sXFov5sMR77UchwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIqXFdPxvO4dqgjKCz5dY6sVZBxTFsvI3WCAscg05lkq1CdVI0RrDKRL+vXHqAZfZSEVCbR01t/KrmnpjibDSIYvjL6rYYJhJaqERG+HAu842nm9FPkErBCmcA7pD1yWURwBfybS+PMxJ5huq1h2cz/jSiKq4dCFXzHIEYam6oQwksc5r1npOmA9WNQJDWYwbnhhhPd2yVbr2F2K7UiZ3EO+iEpp5wkvxtju/QWR20FTKxTi6ldm5aFoF62sHQPLqxDneBlFlEmPlaSzr49nndjlWNJDIsgwWe4knmogRX1FK0AzgbUZdkB+p1axi8tr9o5gmkklWUH5/lI8JO6Xbqw=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d29a1f6dc6204d579ef93f6bdb757b12"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:07 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/vZs8JBirAkEGLvD3eYEgnerjyBXvE3JvWbcqIsm87D82XaLPM8mGLMitse/0kZBa6zUH7d8JsdqeZkO9BHrG7sayBoSOALG6oAze8TH11x4nkhcSQFG7ZGH3BuN5XzS/f4D/P6aLhCLrwpB8QnqiqO5fuJiF/E6NXnXKNKo40pOLKRyRYBHUtbbD5g48o6BjPNnrnJ/2AhIo6q0lD/rl9sOi5uxJ1IwKMZ9sPdvhPClvGF0U4atCsJIRiVAs+Ouev0yxVpoqxvDH15sT6+VgN5dmzOffsHwEpbdlKpomKV8Ez5AvrkdThtyhU/alEI8LSr4T6sXFov5sMR77UchwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIqXFdPxvO4dqgjKCz5dY6sVZBxTFsvI3WCAscg05lkq1CdVI0RrDKRL+vXHqAZfZSEVCbR01t/KrmnpjibDSIYvjL6rYYJhJaqERG+HAu842nm9FPkErBCmcA7pD1yWURwBfybS+PMxJ5huq1h2cz/jSiKq4dCFXzHIEYam6oQwksc5r1npOmA9WNQJDWYwbnhhhPd2yVbr2F2K7UiZ3EO+iEpp5wkvxtju/QWR20FTKxTi6ldm5aFoF62sHQPLqxDneBlFlEmPlaSzr49nndjlWNJDIsgwWe4knmogRX1FK0AzgbUZdkB+p1axi8tr9o5gmkklWUH5/lI8JO6Xbqw=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0","request_id":"d29a1f6dc6204d579ef93f6bdb757b12"}'} + headers: + cache-control: [no-cache] + content-length: ['1265'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:16 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuyd3DpY9VNYX//fbMAtMigr2bJxHcg8npeNs2yKYWecZeZg0pHTTDXTDu8lrRk3FgEiawt5r2CpktpU61HV8+mEQdBWS6SIlia7HRkUENiHuIhUuqhZPLFF4zCCsA+Frvqa1gH7ymktlEBA2Wlvx7a1zFHIIGLkAq/DZ6ovevYzNxNTw3bnCo2dbMUX9opS1g8M+cd0z71UTDvHdQoo162maHzXHygkMCt9RbfB0ZNUECPHk1v6MgrKAMRsNtIivwhFNcfdNG3qh/fWg71pwaS9WVTyk6huBg30axkCc6XYyL/2KGduuMCGA8uoX3mY52W+hYDzoYptkuQt7tH2ywIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC0BZPsZYZ3PuPUZVBKGVNIyX7FVIgMfTzjIAsIB+D6TuDqj+hxq4Kl2tAYIn0vu5QdivqW0IbzL9fBAKYx4st3ZZU44EpgrbVGTA/jWc2Mk4YhODQWOIbsvbkjK4t5dXVUSbAVoru4CqBV9X5JetBTXpHOkRbB+wY/qeF5+xaD2LGXGpbUlSaIbi1GC9pncl9yNZMxbe/aqk8Wn0V2EMgot78dk29I9SRDhG5SHKhgfjg4hnWyMh6LScFD6bHu1X0P0boZm0M/qAr3NasDnmVLWsh2qvG/+Aa+BelC0jy/s5RKzJyeVwJRgyHkwfhGFZXoL9/AsczdzBhfTjVXLbl0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"7cf6e662e3ec4324b177dd00993617ca"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:22 GMT'] + expires: ['-1'] + location: ['https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0&request_id=7cf6e662e3ec4324b177dd00993617ca'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuyd3DpY9VNYX//fbMAtMigr2bJxHcg8npeNs2yKYWecZeZg0pHTTDXTDu8lrRk3FgEiawt5r2CpktpU61HV8+mEQdBWS6SIlia7HRkUENiHuIhUuqhZPLFF4zCCsA+Frvqa1gH7ymktlEBA2Wlvx7a1zFHIIGLkAq/DZ6ovevYzNxNTw3bnCo2dbMUX9opS1g8M+cd0z71UTDvHdQoo162maHzXHygkMCt9RbfB0ZNUECPHk1v6MgrKAMRsNtIivwhFNcfdNG3qh/fWg71pwaS9WVTyk6huBg30axkCc6XYyL/2KGduuMCGA8uoX3mY52W+hYDzoYptkuQt7tH2ywIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC0BZPsZYZ3PuPUZVBKGVNIyX7FVIgMfTzjIAsIB+D6TuDqj+hxq4Kl2tAYIn0vu5QdivqW0IbzL9fBAKYx4st3ZZU44EpgrbVGTA/jWc2Mk4YhODQWOIbsvbkjK4t5dXVUSbAVoru4CqBV9X5JetBTXpHOkRbB+wY/qeF5+xaD2LGXGpbUlSaIbi1GC9pncl9yNZMxbe/aqk8Wn0V2EMgot78dk29I9SRDhG5SHKhgfjg4hnWyMh6LScFD6bHu1X0P0boZm0M/qAr3NasDnmVLWsh2qvG/+Aa+BelC0jy/s5RKzJyeVwJRgyHkwfhGFZXoL9/AsczdzBhfTjVXLbl0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"7cf6e662e3ec4324b177dd00993617ca"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:22 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuyd3DpY9VNYX//fbMAtMigr2bJxHcg8npeNs2yKYWecZeZg0pHTTDXTDu8lrRk3FgEiawt5r2CpktpU61HV8+mEQdBWS6SIlia7HRkUENiHuIhUuqhZPLFF4zCCsA+Frvqa1gH7ymktlEBA2Wlvx7a1zFHIIGLkAq/DZ6ovevYzNxNTw3bnCo2dbMUX9opS1g8M+cd0z71UTDvHdQoo162maHzXHygkMCt9RbfB0ZNUECPHk1v6MgrKAMRsNtIivwhFNcfdNG3qh/fWg71pwaS9WVTyk6huBg30axkCc6XYyL/2KGduuMCGA8uoX3mY52W+hYDzoYptkuQt7tH2ywIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC0BZPsZYZ3PuPUZVBKGVNIyX7FVIgMfTzjIAsIB+D6TuDqj+hxq4Kl2tAYIn0vu5QdivqW0IbzL9fBAKYx4st3ZZU44EpgrbVGTA/jWc2Mk4YhODQWOIbsvbkjK4t5dXVUSbAVoru4CqBV9X5JetBTXpHOkRbB+wY/qeF5+xaD2LGXGpbUlSaIbi1GC9pncl9yNZMxbe/aqk8Wn0V2EMgot78dk29I9SRDhG5SHKhgfjg4hnWyMh6LScFD6bHu1X0P0boZm0M/qAr3NasDnmVLWsh2qvG/+Aa+BelC0jy/s5RKzJyeVwJRgyHkwfhGFZXoL9/AsczdzBhfTjVXLbl0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"7cf6e662e3ec4324b177dd00993617ca"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:32 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuyd3DpY9VNYX//fbMAtMigr2bJxHcg8npeNs2yKYWecZeZg0pHTTDXTDu8lrRk3FgEiawt5r2CpktpU61HV8+mEQdBWS6SIlia7HRkUENiHuIhUuqhZPLFF4zCCsA+Frvqa1gH7ymktlEBA2Wlvx7a1zFHIIGLkAq/DZ6ovevYzNxNTw3bnCo2dbMUX9opS1g8M+cd0z71UTDvHdQoo162maHzXHygkMCt9RbfB0ZNUECPHk1v6MgrKAMRsNtIivwhFNcfdNG3qh/fWg71pwaS9WVTyk6huBg30axkCc6XYyL/2KGduuMCGA8uoX3mY52W+hYDzoYptkuQt7tH2ywIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC0BZPsZYZ3PuPUZVBKGVNIyX7FVIgMfTzjIAsIB+D6TuDqj+hxq4Kl2tAYIn0vu5QdivqW0IbzL9fBAKYx4st3ZZU44EpgrbVGTA/jWc2Mk4YhODQWOIbsvbkjK4t5dXVUSbAVoru4CqBV9X5JetBTXpHOkRbB+wY/qeF5+xaD2LGXGpbUlSaIbi1GC9pncl9yNZMxbe/aqk8Wn0V2EMgot78dk29I9SRDhG5SHKhgfjg4hnWyMh6LScFD6bHu1X0P0boZm0M/qAr3NasDnmVLWsh2qvG/+Aa+BelC0jy/s5RKzJyeVwJRgyHkwfhGFZXoL9/AsczdzBhfTjVXLbl0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"7cf6e662e3ec4324b177dd00993617ca"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:42 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkuyd3DpY9VNYX//fbMAtMigr2bJxHcg8npeNs2yKYWecZeZg0pHTTDXTDu8lrRk3FgEiawt5r2CpktpU61HV8+mEQdBWS6SIlia7HRkUENiHuIhUuqhZPLFF4zCCsA+Frvqa1gH7ymktlEBA2Wlvx7a1zFHIIGLkAq/DZ6ovevYzNxNTw3bnCo2dbMUX9opS1g8M+cd0z71UTDvHdQoo162maHzXHygkMCt9RbfB0ZNUECPHk1v6MgrKAMRsNtIivwhFNcfdNG3qh/fWg71pwaS9WVTyk6huBg30axkCc6XYyL/2KGduuMCGA8uoX3mY52W+hYDzoYptkuQt7tH2ywIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC0BZPsZYZ3PuPUZVBKGVNIyX7FVIgMfTzjIAsIB+D6TuDqj+hxq4Kl2tAYIn0vu5QdivqW0IbzL9fBAKYx4st3ZZU44EpgrbVGTA/jWc2Mk4YhODQWOIbsvbkjK4t5dXVUSbAVoru4CqBV9X5JetBTXpHOkRbB+wY/qeF5+xaD2LGXGpbUlSaIbi1GC9pncl9yNZMxbe/aqk8Wn0V2EMgot78dk29I9SRDhG5SHKhgfjg4hnWyMh6LScFD6bHu1X0P0boZm0M/qAr3NasDnmVLWsh2qvG/+Aa+BelC0jy/s5RKzJyeVwJRgyHkwfhGFZXoL9/AsczdzBhfTjVXLbl0=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1","request_id":"7cf6e662e3ec4324b177dd00993617ca"}'} + headers: + cache-control: [no-cache] + content-length: ['1265'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:52 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyrXPBUFWQJjNdqqct2WiDzNWasqL62ica2OoSqrIyOsJqa6JgZ48z+gMZFLSmy3XfAxZf73+XYjsoHbKg3FxI6d4C/3N7AlGxjsD1H9Bd5YnIYqbOYeO6/hKUP9aAUToP0hwUq5P4aW0h9eCMglkbh5I3caVhfdqdKIG6Lm4hhskkpVAAI5kw/o7AU9e5QYlS4pFeLK6nQUEdxSEUzxPVrcI2R6rD8ZaP8hBr9V8vVNaWePieWPTCwva/vdwVspX73YPNNn7Ia49H0+g+CsZpBohDtnqEZOElDDhAsPpN2fA2Wb33sCWbo3X1+Z3hedfg/6DLrA+1lLBmseGfLtBQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGBPiXPhInxRQ6CFi87HqtHYxK8HWsmxz4/6g4wA51z07K3CV/1VzCv3EQ4ePJeJwoHAi5lrdzGuztXKmBOc6s5JuXrSTc7aaWYCKnWsHrp6T6ALdBxJby/iNvEtlu0VGvdVR2WIFFWavesWqq+xxhmt7M+aSqh49ggnppOinSF3Gb0PmJk285PBqX8CngO2GPY+1oVj+zKRX3mD+6bD2yZUje+OlZVI0AJ7ura1cdjXLnlF2Kz73q3ENs5MnlKNbm2Wih0CGIrc2a9bQBzRWoSb9XGqvfIGt+Xa256D5nNDbcsRL1MhwlhMnaasxsOUwwdHgm400q8c9zpMLxzZw+o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"8cfc8ed5e7514f0e8e86e534824528a7"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:59 GMT'] + expires: ['-1'] + location: ['https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0&request_id=8cfc8ed5e7514f0e8e86e534824528a7'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyrXPBUFWQJjNdqqct2WiDzNWasqL62ica2OoSqrIyOsJqa6JgZ48z+gMZFLSmy3XfAxZf73+XYjsoHbKg3FxI6d4C/3N7AlGxjsD1H9Bd5YnIYqbOYeO6/hKUP9aAUToP0hwUq5P4aW0h9eCMglkbh5I3caVhfdqdKIG6Lm4hhskkpVAAI5kw/o7AU9e5QYlS4pFeLK6nQUEdxSEUzxPVrcI2R6rD8ZaP8hBr9V8vVNaWePieWPTCwva/vdwVspX73YPNNn7Ia49H0+g+CsZpBohDtnqEZOElDDhAsPpN2fA2Wb33sCWbo3X1+Z3hedfg/6DLrA+1lLBmseGfLtBQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGBPiXPhInxRQ6CFi87HqtHYxK8HWsmxz4/6g4wA51z07K3CV/1VzCv3EQ4ePJeJwoHAi5lrdzGuztXKmBOc6s5JuXrSTc7aaWYCKnWsHrp6T6ALdBxJby/iNvEtlu0VGvdVR2WIFFWavesWqq+xxhmt7M+aSqh49ggnppOinSF3Gb0PmJk285PBqX8CngO2GPY+1oVj+zKRX3mD+6bD2yZUje+OlZVI0AJ7ura1cdjXLnlF2Kz73q3ENs5MnlKNbm2Wih0CGIrc2a9bQBzRWoSb9XGqvfIGt+Xa256D5nNDbcsRL1MhwlhMnaasxsOUwwdHgm400q8c9zpMLxzZw+o=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"8cfc8ed5e7514f0e8e86e534824528a7"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:21:59 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyrXPBUFWQJjNdqqct2WiDzNWasqL62ica2OoSqrIyOsJqa6JgZ48z+gMZFLSmy3XfAxZf73+XYjsoHbKg3FxI6d4C/3N7AlGxjsD1H9Bd5YnIYqbOYeO6/hKUP9aAUToP0hwUq5P4aW0h9eCMglkbh5I3caVhfdqdKIG6Lm4hhskkpVAAI5kw/o7AU9e5QYlS4pFeLK6nQUEdxSEUzxPVrcI2R6rD8ZaP8hBr9V8vVNaWePieWPTCwva/vdwVspX73YPNNn7Ia49H0+g+CsZpBohDtnqEZOElDDhAsPpN2fA2Wb33sCWbo3X1+Z3hedfg/6DLrA+1lLBmseGfLtBQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGBPiXPhInxRQ6CFi87HqtHYxK8HWsmxz4/6g4wA51z07K3CV/1VzCv3EQ4ePJeJwoHAi5lrdzGuztXKmBOc6s5JuXrSTc7aaWYCKnWsHrp6T6ALdBxJby/iNvEtlu0VGvdVR2WIFFWavesWqq+xxhmt7M+aSqh49ggnppOinSF3Gb0PmJk285PBqX8CngO2GPY+1oVj+zKRX3mD+6bD2yZUje+OlZVI0AJ7ura1cdjXLnlF2Kz73q3ENs5MnlKNbm2Wih0CGIrc2a9bQBzRWoSb9XGqvfIGt+Xa256D5nNDbcsRL1MhwlhMnaasxsOUwwdHgm400q8c9zpMLxzZw+o=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2","request_id":"8cfc8ed5e7514f0e8e86e534824528a7"}'} + headers: + cache-control: [no-cache] + content-length: ['1265'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:09 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApGbfdnytsfRKeeREjq76AeiqbGqIADFUagq2fit/NvTUGZNIgkTVJqz+urbf0MLmbwjzuslg19Qzh44BOvY5ulaty2LHqLkN/cFOvZDr/RB5fTGbhd0+3aA75Qn7kWuCAfvKYCyKekQ7m4kP+fhW68DSeNbgLPbFHaKcYN2mSCQThERJLYagb/22tBCSRHU4ZLcnslWbmEuQVAVOm569KYVJvb3HwH+suJRlBOMGGFkdRdnZ9TBUUhClGvQGKJ3OyJA8ZwCRczmDPBV7vrXPHSmEfRQurm+hzC5De9utGomS8HVPsiGRs1stgMjXsffAJZ8eCa0zQGeezx+Qq2unlQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACrcweTTg31fo905TZ44IOaD3YY6Q6vHIsXJ/3ENJGQj1Enc9d2KCd0u2Zg9Q0jfBOyZE4qgmvNBF7A05XT8OH7R6IvTlZo8XKuTtpJjyouMj/78qj9ZrSTyIpnEQYuhZy0e1742TtANvsYWyQLyMmODZDXHXZGvoC1i6Z/uf8QLD9aNs5ubYMC9MzuhghvDVmI20Z0PLzNXg8kdFKNgTfd90FCWXxPa0F1KmlsRMsD7Tzy+jPhkwQX0kvGiTxH4D/0t2pbXMipanBf6kZH57ExQkgq0a4pJn6KgVVJffv8lUGS7a247PDLKOQnnibJtW1+tWK8maZBEPxDEzB65RvQ=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"6168cbbf3132427ebb58733b33053b39"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:14 GMT'] + expires: ['-1'] + location: ['https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0&request_id=6168cbbf3132427ebb58733b33053b39'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApGbfdnytsfRKeeREjq76AeiqbGqIADFUagq2fit/NvTUGZNIgkTVJqz+urbf0MLmbwjzuslg19Qzh44BOvY5ulaty2LHqLkN/cFOvZDr/RB5fTGbhd0+3aA75Qn7kWuCAfvKYCyKekQ7m4kP+fhW68DSeNbgLPbFHaKcYN2mSCQThERJLYagb/22tBCSRHU4ZLcnslWbmEuQVAVOm569KYVJvb3HwH+suJRlBOMGGFkdRdnZ9TBUUhClGvQGKJ3OyJA8ZwCRczmDPBV7vrXPHSmEfRQurm+hzC5De9utGomS8HVPsiGRs1stgMjXsffAJZ8eCa0zQGeezx+Qq2unlQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACrcweTTg31fo905TZ44IOaD3YY6Q6vHIsXJ/3ENJGQj1Enc9d2KCd0u2Zg9Q0jfBOyZE4qgmvNBF7A05XT8OH7R6IvTlZo8XKuTtpJjyouMj/78qj9ZrSTyIpnEQYuhZy0e1742TtANvsYWyQLyMmODZDXHXZGvoC1i6Z/uf8QLD9aNs5ubYMC9MzuhghvDVmI20Z0PLzNXg8kdFKNgTfd90FCWXxPa0F1KmlsRMsD7Tzy+jPhkwQX0kvGiTxH4D/0t2pbXMipanBf6kZH57ExQkgq0a4pJn6KgVVJffv8lUGS7a247PDLKOQnnibJtW1+tWK8maZBEPxDEzB65RvQ=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"6168cbbf3132427ebb58733b33053b39"}'} + headers: + cache-control: [no-cache] + content-length: ['1345'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:15 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApGbfdnytsfRKeeREjq76AeiqbGqIADFUagq2fit/NvTUGZNIgkTVJqz+urbf0MLmbwjzuslg19Qzh44BOvY5ulaty2LHqLkN/cFOvZDr/RB5fTGbhd0+3aA75Qn7kWuCAfvKYCyKekQ7m4kP+fhW68DSeNbgLPbFHaKcYN2mSCQThERJLYagb/22tBCSRHU4ZLcnslWbmEuQVAVOm569KYVJvb3HwH+suJRlBOMGGFkdRdnZ9TBUUhClGvQGKJ3OyJA8ZwCRczmDPBV7vrXPHSmEfRQurm+hzC5De9utGomS8HVPsiGRs1stgMjXsffAJZ8eCa0zQGeezx+Qq2unlQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACrcweTTg31fo905TZ44IOaD3YY6Q6vHIsXJ/3ENJGQj1Enc9d2KCd0u2Zg9Q0jfBOyZE4qgmvNBF7A05XT8OH7R6IvTlZo8XKuTtpJjyouMj/78qj9ZrSTyIpnEQYuhZy0e1742TtANvsYWyQLyMmODZDXHXZGvoC1i6Z/uf8QLD9aNs5ubYMC9MzuhghvDVmI20Z0PLzNXg8kdFKNgTfd90FCWXxPa0F1KmlsRMsD7Tzy+jPhkwQX0kvGiTxH4D/0t2pbXMipanBf6kZH57ExQkgq0a4pJn6KgVVJffv8lUGS7a247PDLKOQnnibJtW1+tWK8maZBEPxDEzB65RvQ=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3","request_id":"6168cbbf3132427ebb58733b33053b39"}'} + headers: + cache-control: [no-cache] + content-length: ['1265'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:25 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate0","x5t":"H7T5ljuzfmLSIIGUCCHw233CrvU","attributes":{"enabled":true,"nbf":1567638671,"exp":1630797671,"created":1567639271,"updated":1567639271},"subject":""},{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate1","x5t":"k9ypNWus2FU5yXpj2Vl0PBmyQ68","attributes":{"enabled":true,"nbf":1567638710,"exp":1630797710,"created":1567639310,"updated":1567639310},"subject":""},{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate2","x5t":"rx9IzQ79gm5lpRHOVHOEAQ8LAPE","attributes":{"enabled":true,"nbf":1567638725,"exp":1630797725,"created":1567639325,"updated":1567639325},"subject":""},{"id":"https://vault1051159997ab181bad.vault.azure.net/certificates/certificate3","x5t":"1QeKj1ZSK1-2yOG2ihL-NzDAH0s","attributes":{"enabled":true,"nbf":1567638742,"exp":1630797742,"created":1567639342,"updated":1567639342},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['979'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/certificates/certificate-name/versions?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['28'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997ab181bad.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['28'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:22:30 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_recover.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_recover.yaml new file mode 100644 index 000000000000..0f60d2314c0f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_recover.yaml @@ -0,0 +1,460 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: + cache-control: [no-cache] + content-length: ['87'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:25 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + www-authenticate: ['Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"'] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["onedrive.microsoft.com", + "xbox.microsoft.com"]}, "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['329'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvadkVDO/6FQraj8A2hr+NdA6vmH7UiG/HTSEWZnF+v5P3Tt5WVMycbtwqjUfMw1eWf/h5bkTMsQrrs9zh6TNVQj2kPI5noiVwsDcXa2cInWxrvctkr40r/YGFDD3ODeFC3NKpkGHjzvztmlefwY3QYxrPTrG/6gAho30TK/iYmwZ0udAGMVoLewEj34DqPJzhXIq0f5ynO5W6AeIgmKmTZ1JuefTCLqPcuwhve8VIF7m6TgeaTerKUjQQpN/G0zPsYhkCqt7ojY7WSZ8iMIngCcGdzdRVsu5euszVZ4SCI47zWPjBe7bps140Mz27lzJQhYgrGXe2w2PRD17UQyj8wIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADZD7k2bHrtOMn6SahY9RBBCt7ltGh6pS7rKEe1is+nYxvUmc0QviAcfkOeq8haBmWr7mvqkQOXWcSyyuiK43epJF6Zev2eb3wZCR7+W6/JTWBZEc7CpBdiApfZoysb1SDeW/xxAQmbj7pr7bs/QjPcNCGXWYb7iKqxySs+p9gBslSY2QTvUeMLSCMlnq8l4aTNlaGGFiUlOZvETomH4tp95RqnHOtqowt0p0OLLQoFV+BJCHtG1H6Y09bnuXK+LNdVEfCZaKxP/d8OJw420dNDJkBSCleJmq60+PUVauUg/TvQFDu0j5Ajjz+HNmbcIxZlhWaYjv/gIOfd6fnvqQKA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"18804d3ecd5c4a35920f2ceaf41063c5"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:26 GMT'] + expires: ['-1'] + location: ['https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=18804d3ecd5c4a35920f2ceaf41063c5'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 202, message: Accepted} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvadkVDO/6FQraj8A2hr+NdA6vmH7UiG/HTSEWZnF+v5P3Tt5WVMycbtwqjUfMw1eWf/h5bkTMsQrrs9zh6TNVQj2kPI5noiVwsDcXa2cInWxrvctkr40r/YGFDD3ODeFC3NKpkGHjzvztmlefwY3QYxrPTrG/6gAho30TK/iYmwZ0udAGMVoLewEj34DqPJzhXIq0f5ynO5W6AeIgmKmTZ1JuefTCLqPcuwhve8VIF7m6TgeaTerKUjQQpN/G0zPsYhkCqt7ojY7WSZ8iMIngCcGdzdRVsu5euszVZ4SCI47zWPjBe7bps140Mz27lzJQhYgrGXe2w2PRD17UQyj8wIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADZD7k2bHrtOMn6SahY9RBBCt7ltGh6pS7rKEe1is+nYxvUmc0QviAcfkOeq8haBmWr7mvqkQOXWcSyyuiK43epJF6Zev2eb3wZCR7+W6/JTWBZEc7CpBdiApfZoysb1SDeW/xxAQmbj7pr7bs/QjPcNCGXWYb7iKqxySs+p9gBslSY2QTvUeMLSCMlnq8l4aTNlaGGFiUlOZvETomH4tp95RqnHOtqowt0p0OLLQoFV+BJCHtG1H6Y09bnuXK+LNdVEfCZaKxP/d8OJw420dNDJkBSCleJmq60+PUVauUg/TvQFDu0j5Ajjz+HNmbcIxZlhWaYjv/gIOfd6fnvqQKA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"18804d3ecd5c4a35920f2ceaf41063c5"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:26 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvadkVDO/6FQraj8A2hr+NdA6vmH7UiG/HTSEWZnF+v5P3Tt5WVMycbtwqjUfMw1eWf/h5bkTMsQrrs9zh6TNVQj2kPI5noiVwsDcXa2cInWxrvctkr40r/YGFDD3ODeFC3NKpkGHjzvztmlefwY3QYxrPTrG/6gAho30TK/iYmwZ0udAGMVoLewEj34DqPJzhXIq0f5ynO5W6AeIgmKmTZ1JuefTCLqPcuwhve8VIF7m6TgeaTerKUjQQpN/G0zPsYhkCqt7ojY7WSZ8iMIngCcGdzdRVsu5euszVZ4SCI47zWPjBe7bps140Mz27lzJQhYgrGXe2w2PRD17UQyj8wIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADZD7k2bHrtOMn6SahY9RBBCt7ltGh6pS7rKEe1is+nYxvUmc0QviAcfkOeq8haBmWr7mvqkQOXWcSyyuiK43epJF6Zev2eb3wZCR7+W6/JTWBZEc7CpBdiApfZoysb1SDeW/xxAQmbj7pr7bs/QjPcNCGXWYb7iKqxySs+p9gBslSY2QTvUeMLSCMlnq8l4aTNlaGGFiUlOZvETomH4tp95RqnHOtqowt0p0OLLQoFV+BJCHtG1H6Y09bnuXK+LNdVEfCZaKxP/d8OJw420dNDJkBSCleJmq60+PUVauUg/TvQFDu0j5Ajjz+HNmbcIxZlhWaYjv/gIOfd6fnvqQKA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"18804d3ecd5c4a35920f2ceaf41063c5"}'} + headers: + cache-control: [no-cache] + content-length: ['1378'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:37 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIIC4zCCAcsCAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvadkVDO/6FQraj8A2hr+NdA6vmH7UiG/HTSEWZnF+v5P3Tt5WVMycbtwqjUfMw1eWf/h5bkTMsQrrs9zh6TNVQj2kPI5noiVwsDcXa2cInWxrvctkr40r/YGFDD3ODeFC3NKpkGHjzvztmlefwY3QYxrPTrG/6gAho30TK/iYmwZ0udAGMVoLewEj34DqPJzhXIq0f5ynO5W6AeIgmKmTZ1JuefTCLqPcuwhve8VIF7m6TgeaTerKUjQQpN/G0zPsYhkCqt7ojY7WSZ8iMIngCcGdzdRVsu5euszVZ4SCI47zWPjBe7bps140Mz27lzJQhYgrGXe2w2PRD17UQyj8wIDAQABoIGDMIGABgkqhkiG9w0BCQ4xczBxMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwNQYDVR0RBC4wLIIWb25lZHJpdmUubWljcm9zb2Z0LmNvbYISeGJveC5taWNyb3NvZnQuY29tMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADZD7k2bHrtOMn6SahY9RBBCt7ltGh6pS7rKEe1is+nYxvUmc0QviAcfkOeq8haBmWr7mvqkQOXWcSyyuiK43epJF6Zev2eb3wZCR7+W6/JTWBZEc7CpBdiApfZoysb1SDeW/xxAQmbj7pr7bs/QjPcNCGXWYb7iKqxySs+p9gBslSY2QTvUeMLSCMlnq8l4aTNlaGGFiUlOZvETomH4tp95RqnHOtqowt0p0OLLQoFV+BJCHtG1H6Y09bnuXK+LNdVEfCZaKxP/d8OJw420dNDJkBSCleJmq60+PUVauUg/TvQFDu0j5Ajjz+HNmbcIxZlhWaYjv/gIOfd6fnvqQKA=","cancellation_requested":false,"status":"completed","target":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name","request_id":"18804d3ecd5c4a35920f2ceaf41063c5"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:46 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639432,"scheduledPurgeDate":1575415432,"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/9c02252a238d46009dc6943be7ac38d7","kid":"https://vault1051159997d99a1844.vault.azure.net/keys/cert-name/9c02252a238d46009dc6943be7ac38d7","sid":"https://vault1051159997d99a1844.vault.azure.net/secrets/cert-name/9c02252a238d46009dc6943be7ac38d7","x5t":"PR_U7x-xOxSCp32TE5kLXY3I-Ac","cer":"MIIDczCCAlugAwIBAgIQYTmUg0kxSyKZvniqUaf7HzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzM4WhcNMjEwOTA0MjMyMzM4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9p2RUM7/oVCtqPwDaGv410Dq+YftSIb8dNIRZmcX6/k/dO3lZUzJxu3CqNR8zDV5Z/+HluRMyxCuuz3OHpM1VCPaQ8jmeiJXCwNxdrZwidbGu9y2SvjSv9gYUMPc4N4ULc0qmQYePO/O2aV5/BjdBjGs9Osb/qACGjfRMr+JibBnS50AYxWgt7ASPfgOo8nOFcirR/nKc7lboB4iCYqZNnUm559MIuo9y7CG97xUgXubpOB5pN6spSNBCk38bTM+xiGQKq3uiNjtZJnyIwieAJwZ3N1FWy7l66zNVnhIIjjvNY+MF7tumzXjQzPbuXMlCFiCsZd7bDY9EPXtRDKPzAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRBlRMz7GQ/C0sepJyWz2KWCM/HYzAdBgNVHQ4EFgQUQZUTM+xkPwtLHqScls9ilgjPx2MwDQYJKoZIhvcNAQELBQADggEBAEX/DeDQlVXzpgXvzFyGv8e7UKwLtuiVqsSSjAfvC32MiuKGWorg2zZOh/AcOjyFJE9UVezJbMxTy2KNBN1sDpFfTo6ORJrM3bP3694y/u2qOzwMNlg48JaMxU8ZwKuahb+71a6iYM0HABK9Ayhu2Mm0dAEL+s4yd+efuiHHgQ3QsxlaRXh8cTeGSCZBUSaoRmNXQ3nqZyHMw6H0HvzVGoh5sLiT/QNNj/F7vbozH2VnZ05Unb5zvsNITl3gb2clrcHvV/RSagc7dHq1JMfAeZ2Xam61Daeq/hrqMYAoLmj+47UOipMTT9e9FU7ueAs4VG4mZsVslABhodhYishKqHQ=","attributes":{"enabled":true,"nbf":1567638818,"exp":1630797818,"created":1567639418,"updated":1567639418,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639406,"updated":1567639406}},"pending":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2637'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:51 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:51 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:55 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:23:58 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:01 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:04 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:07 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: + cache-control: [no-cache] + content-length: ['93'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:10 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 404, message: Not Found} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639432,"scheduledPurgeDate":1575415432,"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/9c02252a238d46009dc6943be7ac38d7","kid":"https://vault1051159997d99a1844.vault.azure.net/keys/cert-name/9c02252a238d46009dc6943be7ac38d7","sid":"https://vault1051159997d99a1844.vault.azure.net/secrets/cert-name/9c02252a238d46009dc6943be7ac38d7","x5t":"PR_U7x-xOxSCp32TE5kLXY3I-Ac","cer":"MIIDczCCAlugAwIBAgIQYTmUg0kxSyKZvniqUaf7HzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzM4WhcNMjEwOTA0MjMyMzM4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9p2RUM7/oVCtqPwDaGv410Dq+YftSIb8dNIRZmcX6/k/dO3lZUzJxu3CqNR8zDV5Z/+HluRMyxCuuz3OHpM1VCPaQ8jmeiJXCwNxdrZwidbGu9y2SvjSv9gYUMPc4N4ULc0qmQYePO/O2aV5/BjdBjGs9Osb/qACGjfRMr+JibBnS50AYxWgt7ASPfgOo8nOFcirR/nKc7lboB4iCYqZNnUm559MIuo9y7CG97xUgXubpOB5pN6spSNBCk38bTM+xiGQKq3uiNjtZJnyIwieAJwZ3N1FWy7l66zNVnhIIjjvNY+MF7tumzXjQzPbuXMlCFiCsZd7bDY9EPXtRDKPzAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRBlRMz7GQ/C0sepJyWz2KWCM/HYzAdBgNVHQ4EFgQUQZUTM+xkPwtLHqScls9ilgjPx2MwDQYJKoZIhvcNAQELBQADggEBAEX/DeDQlVXzpgXvzFyGv8e7UKwLtuiVqsSSjAfvC32MiuKGWorg2zZOh/AcOjyFJE9UVezJbMxTy2KNBN1sDpFfTo6ORJrM3bP3694y/u2qOzwMNlg48JaMxU8ZwKuahb+71a6iYM0HABK9Ayhu2Mm0dAEL+s4yd+efuiHHgQ3QsxlaRXh8cTeGSCZBUSaoRmNXQ3nqZyHMw6H0HvzVGoh5sLiT/QNNj/F7vbozH2VnZ05Unb5zvsNITl3gb2clrcHvV/RSagc7dHq1JMfAeZ2Xam61Daeq/hrqMYAoLmj+47UOipMTT9e9FU7ueAs4VG4mZsVslABhodhYishKqHQ=","attributes":{"enabled":true,"nbf":1567638818,"exp":1630797818,"created":1567639418,"updated":1567639418,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639406,"updated":1567639406}},"pending":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2637'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:13 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639432,"scheduledPurgeDate":1575415432,"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/9c02252a238d46009dc6943be7ac38d7","kid":"https://vault1051159997d99a1844.vault.azure.net/keys/cert-name/9c02252a238d46009dc6943be7ac38d7","sid":"https://vault1051159997d99a1844.vault.azure.net/secrets/cert-name/9c02252a238d46009dc6943be7ac38d7","x5t":"PR_U7x-xOxSCp32TE5kLXY3I-Ac","cer":"MIIDczCCAlugAwIBAgIQYTmUg0kxSyKZvniqUaf7HzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzM4WhcNMjEwOTA0MjMyMzM4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9p2RUM7/oVCtqPwDaGv410Dq+YftSIb8dNIRZmcX6/k/dO3lZUzJxu3CqNR8zDV5Z/+HluRMyxCuuz3OHpM1VCPaQ8jmeiJXCwNxdrZwidbGu9y2SvjSv9gYUMPc4N4ULc0qmQYePO/O2aV5/BjdBjGs9Osb/qACGjfRMr+JibBnS50AYxWgt7ASPfgOo8nOFcirR/nKc7lboB4iCYqZNnUm559MIuo9y7CG97xUgXubpOB5pN6spSNBCk38bTM+xiGQKq3uiNjtZJnyIwieAJwZ3N1FWy7l66zNVnhIIjjvNY+MF7tumzXjQzPbuXMlCFiCsZd7bDY9EPXtRDKPzAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRBlRMz7GQ/C0sepJyWz2KWCM/HYzAdBgNVHQ4EFgQUQZUTM+xkPwtLHqScls9ilgjPx2MwDQYJKoZIhvcNAQELBQADggEBAEX/DeDQlVXzpgXvzFyGv8e7UKwLtuiVqsSSjAfvC32MiuKGWorg2zZOh/AcOjyFJE9UVezJbMxTy2KNBN1sDpFfTo6ORJrM3bP3694y/u2qOzwMNlg48JaMxU8ZwKuahb+71a6iYM0HABK9Ayhu2Mm0dAEL+s4yd+efuiHHgQ3QsxlaRXh8cTeGSCZBUSaoRmNXQ3nqZyHMw6H0HvzVGoh5sLiT/QNNj/F7vbozH2VnZ05Unb5zvsNITl3gb2clrcHvV/RSagc7dHq1JMfAeZ2Xam61Daeq/hrqMYAoLmj+47UOipMTT9e9FU7ueAs4VG4mZsVslABhodhYishKqHQ=","attributes":{"enabled":true,"nbf":1567638818,"exp":1630797818,"created":1567639418,"updated":1567639418,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639406,"updated":1567639406}},"pending":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2637'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:13 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['0'] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault1051159997d99a1844.vault.azure.net/deletedcertificates/cert-name/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/9c02252a238d46009dc6943be7ac38d7","kid":"https://vault1051159997d99a1844.vault.azure.net/keys/cert-name/9c02252a238d46009dc6943be7ac38d7","sid":"https://vault1051159997d99a1844.vault.azure.net/secrets/cert-name/9c02252a238d46009dc6943be7ac38d7","x5t":"PR_U7x-xOxSCp32TE5kLXY3I-Ac","cer":"MIIDczCCAlugAwIBAgIQYTmUg0kxSyKZvniqUaf7HzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMzM4WhcNMjEwOTA0MjMyMzM4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9p2RUM7/oVCtqPwDaGv410Dq+YftSIb8dNIRZmcX6/k/dO3lZUzJxu3CqNR8zDV5Z/+HluRMyxCuuz3OHpM1VCPaQ8jmeiJXCwNxdrZwidbGu9y2SvjSv9gYUMPc4N4ULc0qmQYePO/O2aV5/BjdBjGs9Osb/qACGjfRMr+JibBnS50AYxWgt7ASPfgOo8nOFcirR/nKc7lboB4iCYqZNnUm559MIuo9y7CG97xUgXubpOB5pN6spSNBCk38bTM+xiGQKq3uiNjtZJnyIwieAJwZ3N1FWy7l66zNVnhIIjjvNY+MF7tumzXjQzPbuXMlCFiCsZd7bDY9EPXtRDKPzAgMBAAGjgbQwgbEwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDUGA1UdEQQuMCyCFm9uZWRyaXZlLm1pY3Jvc29mdC5jb22CEnhib3gubWljcm9zb2Z0LmNvbTAfBgNVHSMEGDAWgBRBlRMz7GQ/C0sepJyWz2KWCM/HYzAdBgNVHQ4EFgQUQZUTM+xkPwtLHqScls9ilgjPx2MwDQYJKoZIhvcNAQELBQADggEBAEX/DeDQlVXzpgXvzFyGv8e7UKwLtuiVqsSSjAfvC32MiuKGWorg2zZOh/AcOjyFJE9UVezJbMxTy2KNBN1sDpFfTo6ORJrM3bP3694y/u2qOzwMNlg48JaMxU8ZwKuahb+71a6iYM0HABK9Ayhu2Mm0dAEL+s4yd+efuiHHgQ3QsxlaRXh8cTeGSCZBUSaoRmNXQ3nqZyHMw6H0HvzVGoh5sLiT/QNNj/F7vbozH2VnZ05Unb5zvsNITl3gb2clrcHvV/RSagc7dHq1JMfAeZ2Xam61Daeq/hrqMYAoLmj+47UOipMTT9e9FU7ueAs4VG4mZsVslABhodhYishKqHQ=","attributes":{"enabled":true,"nbf":1567638818,"exp":1630797818,"created":1567639418,"updated":1567639418,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["onedrive.microsoft.com","xbox.microsoft.com"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639406,"updated":1567639406}},"pending":{"id":"https://vault1051159997d99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2487'] + content-type: [application/json; charset=utf-8] + date: ['Wed, 04 Sep 2019 23:24:13 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.160.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.876] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_backup_restore.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_backup_restore.yaml new file mode 100644 index 000000000000..a4b0a7c0806e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_backup_restore.yaml @@ -0,0 +1,189 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:45 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc+HM2yq9alqg+o8j1biz+QJ9j5dCtiZFTrirVIyD5+nAiwxwCxDofmBJAJixGqRugVo8IA0osiFUIrN96oXDI9c1K2t6KYDv3JkshXz2oiaXSF5UHdaCXQFSXmPvSqmBg4dqJGAlSIYjOIShqFIDq3Asil337I5s7pMB8GiZYjJ5WY4JHJIRo3OkBJc30N9J9XBzJy25gtGy2Wbwz5ZlK0k1S/dfAS6kuRHdl2V2ldlsvRKScK9DxsRWdubVUpzkvrzGcpAxMT7edQMckrHgUcUsD8jdYgcTftAgJK6DQGbItSMVtQZKSmDW+XKz2jSjohFfHlARCSZbjcNsMhbwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKSWrAS1xz4TbN5zK4szar5NkplIyePaZOMJHvQgYhJGoJUbocH25K4CQNQDbbXRm1YxrxMST/OYZrg650yHv0czHlrhjKaSz+0m6nXtZCn2uajEcxL0g27lvrRnh0cJT5x+gEb2+Ojq6dFXYDu5CAKBBe5anIlnLR+Pnl7UWCSxPg8/NyXzeAEtOP4HZV2vau8C+Pl3O8Xl4O/hyqhWas+x8xgimSiEXyHIgSp1Bn4IosGNYwYGmMV97HR6FRqV5arOD8Y3y87WcfJYj0jlUetA76cQV7hv3obSULXBA1/6UbpdhLloCT19G7BIj49DE51gVoYOp7IhdkhqquXZpH0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d31f5baa920742408706b6b20d45eefb"}'} + headers: + cache-control: no-cache + content-length: '1342' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:21:46 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '3', b, '4', b, '1', d, a, '4', ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, '-', n, a, m, e, /, p, e, n, d, i, n, g, '?', a, p, i, '-', v, e, + r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, '=', d, + '3', '1', f, '5', b, a, a, '9', '2', '0', '7', '4', '2', '4', '0', '8', '7', + '0', '6', b, '6', b, '2', '0', d, '4', '5', e, e, f, b] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc+HM2yq9alqg+o8j1biz+QJ9j5dCtiZFTrirVIyD5+nAiwxwCxDofmBJAJixGqRugVo8IA0osiFUIrN96oXDI9c1K2t6KYDv3JkshXz2oiaXSF5UHdaCXQFSXmPvSqmBg4dqJGAlSIYjOIShqFIDq3Asil337I5s7pMB8GiZYjJ5WY4JHJIRo3OkBJc30N9J9XBzJy25gtGy2Wbwz5ZlK0k1S/dfAS6kuRHdl2V2ldlsvRKScK9DxsRWdubVUpzkvrzGcpAxMT7edQMckrHgUcUsD8jdYgcTftAgJK6DQGbItSMVtQZKSmDW+XKz2jSjohFfHlARCSZbjcNsMhbwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKSWrAS1xz4TbN5zK4szar5NkplIyePaZOMJHvQgYhJGoJUbocH25K4CQNQDbbXRm1YxrxMST/OYZrg650yHv0czHlrhjKaSz+0m6nXtZCn2uajEcxL0g27lvrRnh0cJT5x+gEb2+Ojq6dFXYDu5CAKBBe5anIlnLR+Pnl7UWCSxPg8/NyXzeAEtOP4HZV2vau8C+Pl3O8Xl4O/hyqhWas+x8xgimSiEXyHIgSp1Bn4IosGNYwYGmMV97HR6FRqV5arOD8Y3y87WcfJYj0jlUetA76cQV7hv3obSULXBA1/6UbpdhLloCT19G7BIj49DE51gVoYOp7IhdkhqquXZpH0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d31f5baa920742408706b6b20d45eefb"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:46 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc+HM2yq9alqg+o8j1biz+QJ9j5dCtiZFTrirVIyD5+nAiwxwCxDofmBJAJixGqRugVo8IA0osiFUIrN96oXDI9c1K2t6KYDv3JkshXz2oiaXSF5UHdaCXQFSXmPvSqmBg4dqJGAlSIYjOIShqFIDq3Asil337I5s7pMB8GiZYjJ5WY4JHJIRo3OkBJc30N9J9XBzJy25gtGy2Wbwz5ZlK0k1S/dfAS6kuRHdl2V2ldlsvRKScK9DxsRWdubVUpzkvrzGcpAxMT7edQMckrHgUcUsD8jdYgcTftAgJK6DQGbItSMVtQZKSmDW+XKz2jSjohFfHlARCSZbjcNsMhbwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKSWrAS1xz4TbN5zK4szar5NkplIyePaZOMJHvQgYhJGoJUbocH25K4CQNQDbbXRm1YxrxMST/OYZrg650yHv0czHlrhjKaSz+0m6nXtZCn2uajEcxL0g27lvrRnh0cJT5x+gEb2+Ojq6dFXYDu5CAKBBe5anIlnLR+Pnl7UWCSxPg8/NyXzeAEtOP4HZV2vau8C+Pl3O8Xl4O/hyqhWas+x8xgimSiEXyHIgSp1Bn4IosGNYwYGmMV97HR6FRqV5arOD8Y3y87WcfJYj0jlUetA76cQV7hv3obSULXBA1/6UbpdhLloCT19G7BIj49DE51gVoYOp7IhdkhqquXZpH0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"d31f5baa920742408706b6b20d45eefb"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:57 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc+HM2yq9alqg+o8j1biz+QJ9j5dCtiZFTrirVIyD5+nAiwxwCxDofmBJAJixGqRugVo8IA0osiFUIrN96oXDI9c1K2t6KYDv3JkshXz2oiaXSF5UHdaCXQFSXmPvSqmBg4dqJGAlSIYjOIShqFIDq3Asil337I5s7pMB8GiZYjJ5WY4JHJIRo3OkBJc30N9J9XBzJy25gtGy2Wbwz5ZlK0k1S/dfAS6kuRHdl2V2ldlsvRKScK9DxsRWdubVUpzkvrzGcpAxMT7edQMckrHgUcUsD8jdYgcTftAgJK6DQGbItSMVtQZKSmDW+XKz2jSjohFfHlARCSZbjcNsMhbwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKSWrAS1xz4TbN5zK4szar5NkplIyePaZOMJHvQgYhJGoJUbocH25K4CQNQDbbXRm1YxrxMST/OYZrg650yHv0czHlrhjKaSz+0m6nXtZCn2uajEcxL0g27lvrRnh0cJT5x+gEb2+Ojq6dFXYDu5CAKBBe5anIlnLR+Pnl7UWCSxPg8/NyXzeAEtOP4HZV2vau8C+Pl3O8Xl4O/hyqhWas+x8xgimSiEXyHIgSp1Bn4IosGNYwYGmMV97HR6FRqV5arOD8Y3y87WcfJYj0jlUetA76cQV7hv3obSULXBA1/6UbpdhLloCT19G7BIj49DE51gVoYOp7IhdkhqquXZpH0=","cancellation_requested":false,"status":"completed","target":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name","request_id":"d31f5baa920742408706b6b20d45eefb"}'} + headers: {cache-control: no-cache, content-length: '1259', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:07 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnBaNmd5aXp6MGtjZ2ZrZHd1eXQwRElJYlMxMXotWnUwWWhTZ2ZKYkVSRWhDTExLeEkxYmNZZGltalVaV1BtNWZjMm1QX2htZzBMQjVHVm1jQVJFT3JvdkdQR2dYVWMxLVF2TzBrMUZxRW41Z3h6V0RVQ1ZkR0tTR0ZLVHJOYkQ3R1RiZUJZUVVTNWdSNTlhYl83R3psSnc0dml0eVQybVVzbFJwamN2TmRFYzN2dkVuc1RFcTZDQllINmZQVWp3a1pDRnpiRzBRYlp1VDMzM3ZGUndjQm5JMUFIUFRpbzFhU01wa0pwUGZEbE5lOEp3eWNDN2VybVp0LVh2bTRVWHRrNS12N1lvbWdrVFZfVGlBUk1CaUtnTEo5eWdoY2hYUUU0YVR3MXNzUzZiMW12WThLVjlZdUlSaWNEMFJRQ1BQU1lOYWlhX0dNM2FsaE90cXdnX0cyZy4zT3pvWDQxeU1RMVA1TXY0UVNlSWhRLkpLQVF2eklWeUVJc2NsXzRvMGF2Y05UV0hJOUNnRUJyeng0Zld1cG1PT0FaLU8tc0hDUXBWR0VzZUh3MUZWUU44Q2JLZHpNNG05aHB0NzdwZTNOMC1Xd2hNMFh4Qi1DVnBScmNKVm0ySnVvWm9JS1JsZ1N0LWpPa1RQSldBZ0JaOGtNM212dmcxbjZhYXY1RHMxOTNEdTBpUzZjNVpCTHgzRWs3NEpSS0N5cVF4ZWZVUzlEREc1R1gyUFVnODN3ajBPM1V3YnJONUlvQXMyRi1xTVFjWFRFLTZISFVmSUo3d1AtWGNWWWd0OEx2OHYxUlY2S3ZvNnR3cjdSaXhuYnlELThtSkNyYWVLTHU2QWxEOGRVMXI0NTBCMVRndWRXT3Y4QXFadm9ha21iNks1QWs4SU5oa1pTZ1ZCSTFnbUJmdjA3Zm1rVmNzcEdMYnBodGNjTlNLMVBjbUlmLWxMSUhSWTRqT01mWGtKQ1RqcDFqVXlmY1JSRjNqdVpPNDVIemZrUHF4STV3cVFLTVhuTTl0S0o0Z2FXMEZQOE13M01DZjlVQ1hLd1NiZ01CXzZsWHR4ZGRkb0ptUi1FSmVYREI0OFFIRHh1YzdCcDA4WUpEY3gyQlU1X2YybW9VUjJHdExkckQySVNZV05la0RfazN6NlVjYmlJUzVlcWlJYWtBRFlXaHc0WUxOSGdRTWl4bDVNSHJ0Q1dtR2VpdU9zQ2NOc3BrREJXeDg2LVBDYlBySm82dWtXcHN0SHFjTTcyeVVLMEsxWklUTHhWQ3Vvd1luVVgtQjhlSmlHRFB5dE13Zk9NTjBsbHJNcExYOGFDdlpKUkhtZllHTGNRdE9VX0hQMGVzVVlhbFp5MWV0bWdYVm5UTUg5a2d1dmN3QWs1N0JzaGVsQkVkaGN6N3pxMmw4eTBGY2RhZGo0UzRRbmdDOHRhWG42cnM4QnFNTDZHNHZlVnlNOUpJVmJLTDRTc3dDZXZweHR2dzl2bXRUZ3NyQl90ck54TmJuMGp3blJ5NXpoOFNGODBWdGNfbVNDSWxySE5GSkNUMk9HRTRiZ0k3Tldfa3FVT0ZBSjZWeTNkNkFROFpJeXRfRmFNbHJnb3hmUENVYzFRdEdna2hUOG5aUGZjU3E0aXh2aGxpWEs3SlUwV3l4S213WWVjZDFkNFBnMkxVY0wwR0pVQkVoZHNsR2F2NmFpd1pJVHVTWkUydUJvTjROTWtTNmV2QnYyWHNqS3pxSnJrM3ZOdWEwZ09meWNqS0tacm5LWHlRZFdkbkRNMEwzT1NxNlJ0TG80Vi0wTDBQdDNQczU4NWNGdnlwbno2aGtiV043RDFDX1lrUVNDM21hOG1HYzlpU0txUkd6Q3FKYXV0d0FDRURLMWl4Q0Noc01aQWdKN0JONUdzMXpISno5V0RKX0JZYi1sWUVBOVluYy1XWm0xTDE2ckFDQmVxaG1qbUU4LTkydm5ZZ1BGYlBxcGs4bkhnQ2ozQjlrU0ZCNVV2ZERjWmxzYURMdXpwdEVqUmliZFdFcFRWNm80NEtCTEN5X2VpR09vMy1zbWNHalB4RzZjWkdaeUgxTVo4cjhoZVNqYkNoU2o1UDBBbHcxUVhxRWg5N3NQdTdDSTUzVE1QYmtmb1Rab0JMMER1a3hDbUdvODdaM1pyVGo5aG5pM1ZWeGhDOXRWLTZEMzVMUll1ZzFDUThwUVBndkh4Z3ZiQTNBd0kyZmdxZnRKUlNGY3BjWlpvTlB6ckVnLVlwT1dFd0VIRGxrUnhwQ09MVkxsNlU5MWtUXzhmX1MzY3paNEZUUThhc1hocHE2ZFpOSVZzUTB3S1Y5Tm42aG4yeFZ2empvbXVkMUtYYk9uUlFoOW1zMGpjZDlhd216RzV6TERxSm44Z1JZTHUwQlMwTVpyTnh5SlJLNVg0N2VYSFROZW1sNmJ1YW1tSC1hV0FpNDVpSkxLVk02ckpYaEFMUmVjQzBfNmhBSmJGdjhpSUZaNUIyNTVrYnNLV2JvQUdEU3BXZF9lR3RBNUt6cS1sQmtUblRPSkVmOEVBazJhLU1JdnpxMFVQMjREcHdlVzBTMnNXSGhfY2VkREZWdW5nQkYxcUJtQ3ZtbkJnYUFPb0ZBX0UzaHoteDZOTGJhbjBPMExQMjlCQ0E5MU92UG9DeHphRnhlYUF4SzZNazBxRDJ4NnlYUDVPX1FYYUZoVUlpRHNCVDByS04yS1FGc3NsWFJ4bGVMN1pJLUtVbnpXWHExTzJVWXJkelc3VUpJLVdmNFR2aTVTOFhiZUJkV3MxOGVINUZoS3gxU3ltZDVzUzRMbjBWS2tZa3gwVXhEMkVFWjhRU2hyNmN4NjRpUmFmMEVlYVpUTXFHUVhpMlRqbTFoZHRjZmY3ZFNmM0UxWDh6bXp3a0E2ZzlUTXEzbXdHZWJGSDdDckxzbWFwTUxNcnh5YzdVVG5MWFBCUnpxQk11dF9aMko0dWRyTVpNRnFETjl2VnVnUWttQm5EeDZqV3oxNldyX25CM1hFSUx6WWtfdXFrU2hPQ0VpQm5wcEtyanREbWo4bklhSklUbEJKeFhSUUpIMHhLZG50RWFsczdVRDRjWW1FeUNldEJqVnhpNzFjT1lMclprWHhaWmk2VnNBbVhmdlN4WmNvS2N6T2ROZUtUVW9Yc1F4d1BKVEs2b2dsN0w4bzV5Rl9CMVRUU0lMS01CQy1ONEEtYi1DQXdZdEd4aEpjeFBKeXZ1bFRsRnhqTndDVC02c0plX3pheW41U1VhNm5RMjU4TDdaX0lTcVlTeFBuZjFNeFBsZWs1ZlJSNTUxVml4bV9OeFpJdWdTdXpLVl9mX3RMN2FnR0NOZk9hM19iYk5FM0VDLTdORGQxWmhSTktkZ1g2aEl2QWRhN0ZCcjl2blJJWnc3YmVuREN0ZE1IbkMwMHpua2lRY3g3MW4xUWVwR29vQU8zRmI2SFhjSFhCUXc5U3VnZzAtME5OOWtTalFHQXN0M2xwbUhtd2gxZ05qWURtekIzMlVURGQ5RWdVNFJZelZjbFRncEJFRTZqX21sV3VPem0wd1JMMndObURWN2hSSkVqRnJuTnI2Sy16ZnREamVaWlZCcXc5QTFqUk43bXBJTTNVaktPMU9zcV9MejBMdEYwQmllbHRONW9wQS1jZC1ZcmFGOXhidWlzV2NtLWNISWJndkhuV0VTM3lxZ2pkVVpYb0pqNWVTa3VPdFJDR1dFSGM0ME9UVzBvQnVtOEc1YVRtM2lIemUtTXlPRmliMnFKTXl5cDJCWHlNNElBczVtc0dEbTFqOUhOT0h0T0dCMGkxbEpuQ3JPQ3lzNXpweUtnOXpXb2dVMmVVMk9IWVcwRHdUbXZqWnZnRXEwc1BOaEh1c0c0bVY2YVVXUFhXdXNLU2JGZmRoTEF2YjBJWjJDcDdPcHNsQ1NhZmNQajBCNVAtN01RT1llcHVWZU1mZnVaZmhkbEtlanc1cmt2NHM5UTJRbVhFZm5XSm9oQjlaczhSaVNqcW5jSmwwSWowYjBMV2NLN1ZKQlRVb3hIMFNiQzFhN3o0dEtFdC15VjBYR190MmhGRVhCajZhV2RjUllDOTBsd3pSRThHVkxCeml6d2pQVXIzUDNrQk5aVFI4eHU0ZEp0amJjMDBfbGx6aGR0STBCRmF1ZXhIcHVRSEJqaWwtdi1sclBpQm1sZGloWHUtWUFwM1pBTzRuQklZbHVDRzg3NF9yaDdsZzhMUG1MZml5d2xMc2RFeTY0NWVBSDRIblZ2TzF6ajEwTmNFeVU3LW9XUUhtNUZIajhSbkQ1YmdUUy1MTk1DdWlLMzhyTU1fckN6QVR2amVucWt4cEZDaU5SMm1NNzlZVFgtR1dkMHA1S1pkZ1F2eUtoWVQ1UDluczdKZlBIT0VLa2xvN1AtWnNzS2EzWWVJSFJDd3F3eWVrcFp1MmMyb1JCYXZEVTFMS0RRQ2VlNkcySFhERFlaMlJQS3kzN2hJbHdrdEdLTVQ4enJ1cTctck9CWjYzQ2lGM1Q0X0w3a2NESFN0SkZ5NjBCNHM0V2NTeWowdG1sdWJjQXhHTFRTRm0xSGFYNms4Ym45NWJNcGI1QWFCTFBRamlPU1NobmU5MVZsVV9WdW13b1V6eXEzRjRlYmlFbElDM0RxZ1NRYkx0WHdqS2xKdU5md011eTBzc3d3cjA4aHdXa1c2Zl9LSU9RT3lwXzJvdUlCdkhNVk9URU9DUEZCVWFGSTdYbEdRV1FJS01qWnBGeUZHUDBBRXRSamkyNl9SenpYU2xnWnAtMHJpSlJpRlVENEtpRms5eVd5cWo4Vmp4a2dzb1h3VHlkOXE1eV9UUGxPb3JHX0xDRXpZQ0Q1bS1OaWZ0cTJjTGlhWG9kaExObzlpUXdFSV9OX3VwU0hwRDZaS2xkaHFWUGJDVGF6bFJwOGZCeUF2SVNFY3ZWc3V5ME9mTWE0bkQxMFpoOGhrakdZQ1Y0eTBha2NJbk4yeXM2MzRuU0hmajVpRVE5U2k4RVlkclpwVmNEQVlGX3BjUDRsa0J6Y19xTmNUSWMwQlZRVjE5YWpWbHRtN2F6WEIzLWJFbS1FZEI4MV91aVZVLVJsc01sRTJzOEFmOHY0eWZ3WEJqeGRJVXNjS1haWTJEQnd3U2FNUXNENXNnLTIyVkFUeEowcVR2UnBEVTF3N29IZVdrb2dETGNlYUg1OW1iUEZYdnY2SFQ3X3NreG5sVl9xRk90WHpvM0UxdXl6SWFJWlJtTm91aTVxR01YQ1ZQQXNaNkppcC1nb1JzSHJXX2VxbjMwQ3poMUdTVTZwem1OYUZRX2FrZ1BmLWt0MVJINnZEWEpQTmtnVEZFMmRsX010QXk2bGZlX3RrVk1FT0tpd0J5RHBIbWdweFpxRDZlOWh2YUg5TjJBS0xJQjhzTEJlSmRfSnY3cWtEU0lvQWlVQzg4S1JIZktjVVZKdkluSVFzVE1Ud0R5SUM1WEFIaXJLTXNxd3I1SG5MVmxaTUlYTU1KT0t0TUIwV1RBQUllYXlPWnJ2WUwzaGg5a19qRGF6VDBKMjNRem9ZN1cyekgzWW9QUkE4ZVZNQVRkQndEVnRnbU12ZkQ2RUZ6YkM0aTJWeTd5R2JqNk9SUnlIYlloV3huZ3FFSkNiT3V0bHZLWVVXQWVEWXYtYnBLelVxeXpSNGxGeDNzei1QNXY0eGgyeXVadmZFd3o2aTVVTy1hVnBXSy1ONGx0YlIzV1N3SEk1SXNOUFRycTRWYVByZm52QmQ4THpmY3BzaXo3c09VcExVSWRDYzJhdURCMVFNSExDQlVkWjZsWkVQdGZUeC15QXRyeUJhR3FDTkhUdGdZUmNfbkpRNkl0Wmw2V3N4WVlzNnFHRVVqS1FXaFVEOVFYaFRJUVg4YlBSTVpMX3lwZk15TjdVcm5sLVlKdEZWQS1DajR0ZV80VHF4OE5TM2JkZlNMd0pnaG9FalR4cmZHVTNfa0RLQU10UUJsQUNHbnlrRDB5empQWHU3ZlVHcUFJOU00eUFkVjVveG5fQ2s4clpzZk1HcXlSYnN2emczVjNhZmI2ZzEzVFQ4ZS12VnFwVEU3UVZaLWk0Q1NaYUF0UjlEcVItVkpNMlk5QkZGTzVJeERmMG5WTUJZUG1yWUtpMVF1aWxHbENyYnlUeDJqQmFaY19kVkxKTzZEdnhMWmVxN3JCSTRCWjh3NVFBNXNwcmdnMnV1UzhXYkRseHpBYVZ6bEgxUnhYOElGeGV2aWU1dGtHYlZNYkRiVmRHWnMtVG1xeWhDeHQ1QTFCX2hCb0ltX2lXYmNiZ2Ftbkc1SXJDbUZFWkFOT0dCUTQwOEhSaVl4Rm45MENxRFZNdEdkMDdKdmR3SEtCbER5UXl4TFEzTHhGU3FJVWwtcTFxSFVJbWVxVHJ5VzZ0b09neFBTMlJIT1J6TzlJY3VSX3pTdEFRZTRyYU0xelFRcUJ2Z01GWWxBalR6aE4yOHhVNUpaY1YtUVdvZi1OdV9GdGdxeFVVUmJnV19sQ3FINkVmUkRYRXVCTFdKNG12WlZ2NU5XZUlSbmZHLVh3Q29VWGczUGQ1eVVMc0tlcGs3RkxVNlhvSDFhLXJ0VEtPSzJJSGhkUU8weWluanV3YkVmeG5kQjE0V1NseHJvTkNwMmVBTk90bDNJUmIxVS0zR25QTXVGNUQwcE1yZDJBVU16MEFUYm4yVGlBWXFFeWhfTWZUT19FNEc3WjdCX0tVa0VzTkwzOHFEMEgxM0xuQzVDaEFkcVkwZHA5d0ZNTXdZNkl5c0JXbERRWlFCdjFKaXM4Rl8tdG81ZFJPV0o2VFBLb3V5S1NPMll1VGJkSVhrTmtNNEFHanRUQXhDVGNTUGtUSWVlTWNuT3AxcUhpRFNISUhfSFVuRDFsODlrZ2tENERCM0JZVDdQRElWdEVRVXo5d0hmR3EzQS10TlJ2YnFMNHZSaWF6YXpkUUd4akItYzVLdWVLMUtFWDRkUWFaSWFzckhMVFF0VDh4Z3FVVXdJZjhnd0FQdV9yaC10Y2JhYTVGTFJBWndWS1RzTzdXVVNROS16ZEJMVVg5MjJJeV9SelBuWW5DTVpEXy1halFaVEYzN0NZN0VpMTFCLXFqbW5uWllsNHJsZXlPQ2phU2R3Uk93NUpNRWdUc0xNOTl1T0pzRHFQV2IxeFhVY2h0U3lfUWNQMVA0ZEtxVGY5OWdrZjJJaU40bENZT0JqRlA3d3pVQmw3TmZ4N3llbmhJZld3MkhjdmRqZVNkS2VkVU5wU3VVVmk2WUh4WDZyN0pTcjhjS0lJajdDS3BuNy1aVnk3WHkyM3E1d3JXc05OeVZESjZhSDV3QVhLLWVDeHp4d2VHb0hyRzh1MTl2SUJPSVZrOUxtTmIxVFpPbnhGQkNvdGhraFhqSGcyTVBaeVZzRVpEemsyTDhCci1RMXhJSEx0eW9yRVBMWXFYdTRnMXg2TWJjZzlyLXlaSFZtUkJ3c1pmcWRTbGJfbTZXUUozcnB4dlUzY2VOLXB2a21Ib1NiOGg1azhEM0hNV3dfbHRkaDdvdWppc1owa21nay1meHJWUEc1UHgtWFBCYV9leEY5RHFISTJTT3FlZDJfWS1BXzIwd0xtRmxlT082SXI1Y2p6T0RZaHJVbHNPU29MZ0ViUjNKdEtRcHFaRlUtUFlrdTRKYXVqcDZlZHQ2bmk3LTdGY1RYbkpxTHdaQmdYSDhhZ3JEYTB4c3Zlc2FsaDhMWmY4SUt4N19fWFdKX2Z4S21NOXpLNU5zZm5PanhSNWlVejFkMlZRSXBoSUpRVGNuZGNnUkphWjg5U3lLcTMtb2NzWDBxR0w0MU1Nem9Sb2RPYXpyY0lNaUZvTFFfOUQ5UUJsTnR6eUN2cmltWVpTLXZsU3R3T1pxRnZ1RGVHb2xBR29wSjR4ZDhtUmQ4b1NZUWFrLUpUX1M0VHE3bm1UQ3dvLTNSVGpUdUg4cTR2VTM4cm9rQ3JvR0trdkdXbTd3eDkyQTQ3X2xKdG9rSlVqQUs0OE5IMUhtUE01bkpRMklicHpLSlVuZzRyT25sc1RMNVVZa1ZYbC01S2hzcWVWb1VUaEZDQlFaUTVhU0ttSnEwbjR1VHhtcC1BLVlxSXhFejRfWC1mS1pwWUtyNFNBb0VYamcwbGlMVnhWcHczMWswNEFrZk5xM3ptQllBMzdwMnpUY3M4Y1h0LS1TcENYWGozQ1VLWVVwV3RPV0VKbXFCUHlYLTJHRXN6M0dRaEJCYWJWdFNTMVJIb3ZNUXEwYlpxN3hJOTFuNGNXcnh1bjBqODN1SXc3TkVQbkJnZUViQzR2VUxrMDJtcVFHR0hCMWZLbFpSaEV1ZWNENXFuNW1tUGVjTnM0azZXWm0xUGVPQ3JBNmgzN1BlamtGVHlkeXdYTWV5c2hPUGlXV29WN2xEalZTNW82bEQtSExTU2x3eUhPdWljaG9RVTFwVzhUeHlMa3ptWkFaSnJiZExIZno5UGhueEFCb2hwYkltOUdodnZCRVpnMi1aemQydFhCWmwxSV9wa05JeWlYeE03YjJkOHNab0diZ0Y2MjBWVnM3cnVUNGhjSHNjNEhCNWdEbE01T3dwNWdvOUhkbWE1bkxMUk84LTM5bFJCWnJITm1OV195d1k1R3FOSk1kd3FFZURsT0IxSUM3S2lZN0NJdnIyU0dST1AtSk1ZSmFpeGRFLUJVUkk3dWdsRFpZLXNCX0VlcVdjZkNDNlk3LXdpUEthX3BPVTNBU2ZheUxqQnJMSWo0NlJSLUZvWEVJRi0tWVVweFoyd3RKOWdGejVUenlXYlNmN3dmWG1ENjNjSXhWcnlvQTctSFFlZE40VVZldTZLaUxuQTZPMkV6WUNlaU9ObVlLaS1UT00zM3lXeHlNeGEtbDRKU2RYa21Sb0xZSTBENmc4aEtWM1VjbFpiWlV0MzhPNzJtbXdYM1Vodm5kNTVYUFZld0Z6UjVhT3I5bjFUMHVxN2pjWmdhaklvVnJMWGQ4S21mT2ktM2Vhb2FBM2pzMlJlWXFOdXhHS0szcmR1V1B3VGZMM3ZDLWl5VnFTejNTMll0N2FHaGhsbWtoUF9EdEJEd09ic2JobWlxb0N6blFnRG5zNTBDMFNVbnZfZHFaM2NJY29XdEtoRjM0cTVLSGZ0YkhkRkRBeGFoZEhFWlNtZ1owUGg4STA5MkZydURPNGd4aDBnWi12dnRrUjBmZ21GS3VpU1RoYlhEWUlNbkprMm1YTVNIRmI5elUxWGRBX29LdGk5cGRrd0F3b0Q5LTY0N202Z0xBRXR2aFRXVGliYzZPMUZ0dlczZEZvWDNPNHBRYWhNMTltelUwLTgxdjUxTGFBMWRyWjdvcHpXc19ianhUYmlHRl9Eb0FRS3R6REtPQUFqUFZ4QXVGbGtFVFpJdlFtMnZyUzBXbDJCLVduMVBFR1hVdFY1eHlNRkVMNzBNNUFLR0lIZzNnT2lFWC1ZNG1vdDN2NlBBYkE1VjNxZ3lBenhEMTJRUG50MGVWcTZBczM4SzFsVldjWFhSaU5RbUpFTWk3SENzUUtfRFZpMTRwamNJWkRXek5ndHBTd1lQNjZHMFpoRmlFcVhLQldVX3phZ3hwem9GTVZwNXV1dU5Ta2hDUFdKZGJKWDJRVldqNVdWRERUbkcwa3JCVEdoRkhxbGhBWXZpR0xTNDR5b00tMzVLcHc3ZWMxd2hDRDV2ekVudVpLc3ZhSkEtbGRCbDJaZE53R2tCLVFMa3R6WmYyZW83UGxMVEpqeTNkS1BSTWEzVzhXYnR0MTJZSjVoaGNDNlpmZDk2VjBxUnQ0dTl4MkdGSFJUajg2dzZUUFY3ZkltNkhrOEVEc1Jzb3M1VEFsbFRmX0NWMlNCMUZWT1Z1WTEyNGVGVE1TMkpJczktVnBqd1JkUmd3NHJVWkctWWQyaHhwaF9tX0hTUUYyUTJwMWRHNkNzYkJJWVBrWVdtYVlFN190aF9GVkFUQ1o4MUpTdU1SVUVDLUtyS1IxeVBDaFI4a3hYLWEyem1LWGtPbXZCLUNwYk1zM2FfVjhma0I4LWhNblF5YTlTQ0I3NGE2S3NqX1hvU2I3VzVjSnhIWnk2WlVQVG9GLV9SamRKeUhVZ0t3QmtiV090dGVEb0lZajEtb3ZwUGxmQkI2ajF1QTd4Tkd4NEkyWV8wcjJTQ0M4QUxNS3NNeDJCVUxBOVdpVmprWWs4WHJYYkNETDBkNF95M2hCVElSOWh3T2dMd0M0REl1OWNyWlpyXzVpTkdOUkVMQ1RUMlpWSWJJUGNFTDd1ZkdGR0gtWDIyeFdicGlMTm9lckJXQm51bEZ4WkhLZTJDdnUtbWJ0SWFJeHRmODNqaWJ1YXFoS01GUUVBOTE0eGdQN0Nla0FvZ1dKRmJ1TnZOSDRfVm5OWVdTQi1VelhXWWR2YVhPaGR0YklFSzllTDJDUy1rcVhLczExQ0lGRG5Mc09VNnk0LU0yYWFhODhSTENHRXJwdGJBZ2g3dzNMU3dxMTdRSURrZ0tNa3lIaDN4V05EUmZCZDJHRWFjb1BSekJnMjlBUXp1aVF5MW9IUVcyRlozTDgyRzFYem1ZQjZ1RTZ1Z1JqMWJaY1Q0bllzU3RRQmpnYkdiOFN2SlpmdjRKZjdRd3BLbWdlMlhYSG9nazc2aVdPbkVRSGZTUmR4aXdfcVdEZ1lZWHJ3ZzlBUmZpMXVFcmpIbG9tVEpMTW4zUlpKTkI4M2xoc09kNkFzSmloMXlqTmZ1VXhLbkxsY04wRUt0VU1VUWdETmREME04eVBUUDY1WHg1VXpxOGpiQ2p2T3BPdFFKQzNIQ3NlRDZfN2VfMnU4MExZRV9uSWJaWi1CdEVmOE40SEJXVmZHTU0xc3dSY1M4R01JQi1lLWxTakJ1bl9naTVQdl9RSWQwSDJ3blNOaFhlcG01SkdZWUlxRUpZOFBuMWx2NFBlOWtNY21aNkwxYjBzY09kMnktaFhqZDVYNzNlT1F2TUZ3bHBjd1l4dFRfcnB4UnE4MXRsR0JYYkc1eHZJZWxfejQtMmFwSTZqV21LNm1wNzVXblluTnJPalU3TzZVMlZqSkUtS0NraFA5Y0Y3YWZ4QnQwdUlVOWpOaXFDbmdtX0NvSzM2UWxiZThtNEJGYlJWanZ1VGR5SEhZSFJHVmNvLTRlVHpkY0NtcWRkNkxpcmRVSTZyNXhleTFwRndLSzY1RU5hYnlVOW9pakM4Zm95dlQ0UkJ3azVqcUtHZWJwQnhyemUza3RGWDZ3RjVWQURoRWlrTHpWTEN6azNFbjlYbHpmZHE2anBtUEVLcGRXanVsNGdWemVDdnJMYkg4cGFpUEdRMHl4UTk0NDB3ZGFRNm50RGlOT1pVUGZQQWdiTmRtZE5QQmpZVzFVS3U1ZFJFWmZRQkJGcFlEc3FrN3RkSUJGNGQtd0lPRU9LOUJHejdNREMxQm9uMEtESkYwdEk2ZzdPQUtlTkNaMnQ0dGNKb1ZIVm5ack5pVWJENGVFR2F4RUJ0cFZteDkxLXp3YXdJQ2dxSXFBaXZZWGJkcnNuS2QycEZqTHNtc0JrSEZCVGhxM2FTWkgtc2lVT21BYjBxcG1ndTJrZmN6TVh0blh1MHBGcE9BQ0lUdTlaN3c0eEVnWnUySDdZN19SbGV6WVB6bWFuekYwZ09yVGxaVjlOVUlaVG5tUjdsLXc5cmptM2xERE5tYWNILVMwT1QwODlxR1RzTzhGRnA5LU9IVWItX2dsY0dEX2tJd3ZfMWl6aHB3MzJ2VEIwU1BCU25PY05GQWRia0xzU01jbDZjc1l4amNLdXZ1M1JxWHVFU2ZPbkJOQXA0WWJFbXR2RUR4M2FGOGp3R1VUbkRkSUNPUGdDMXdZOVdRRXhnNDVWdEJQTlEyWXFaaDdZMm5tWUJwT19UMWUwNUk1N3NabzdTQkZpYTIxaEhQZjdSYnJnZmY0bnFHVDladndRNEhiSUhLN1pfMEd3Y2xnRHdMZklJTVh2Y3lYbm9sV1NJUEpwOHRGWUFoM2dVMWxqYUo5X1BJcU04Z2RMZ29ZSGVqOXlKckFuRlFWZ0xnS3hFRW11Wm1PUGtfU215el9zdXVHRUFuQTNsdUtCUDNNRm1qU0NIcmdqenJOcVloWEh0TWRTQlRMLVdRbkQwSjdRVWdhM2drcklKVm5oV1doaXE0Zi1DcWdUVmlZYTRJMFB6Z2QyMEtHOUYxRkVyUVVtNnZrSzBlcjQwcW93VUZlaWY5Y3NmaUI4aktvY09oQ2NoTU0zNFd5U1gxQnNWd3lvV0pkTWpNa05rbE9KRzdTVGs2WEtwZ2JBSHl6ZVlXRVhyYUZXdlRhby1zSjVmdkRJdG1NVVpTYU9VTHM1MjlPNElfQXhhcHhISmJNdk1iLVJ3WDNsR1N2TjlzM0xXOXVoRXF2UkFjakdRSnVHLTM2WWZUMXVQazRnVmlLQUwtNjY5WWF2VEVSMVZkTGp3UWdDd0w3dWNVSkVFeVdlNWtPa0tkQlB2UGItX2ktQkR5WE8zQmctNndwLU5hRW9lRnpnSXRuVXlrc19rOHFUYjV0ZElGdlZ2SEQ0SjA2aS1ZSzhXdmtBb2R5cWJvMGd6aDZCMVZOUU5RMVVLRFk2U1M4Zk5ZQmpQdklmR3RKQTE2ZmVrUFZLZTJONlBKSlphN2V6bXN3UVBFOGl2Z2QybmU2VW5PZUx2YTQzMjNuckhCdDdQLXNIaUZIUWdwY0YwazZXdDNKVGtoQVR1RExEYnNGZWZwVlBHWE13NnlESTJnOTRFUThiRkZRbmpzakFIenR5OTZqRkI3Sk00aDRPdklFSHJvR2Frc2dCam44MzdMX0s0MGs0VVU5bnJpZmtyaTA5ZDYyUDhHaFlTMDYxaE1zejdyeG9zQldoTDFSdEpwUDY1RGlYSTBZX1AwUzAzWUJZU0Y5SmZlSVlwUVpOSmFtcjlHdE1WMGZyZVJ5LUhBMG50d3VFT205X0h4T1VRaUJGUjg2bkVxTlhjbHRNRlNoQW1OS0g3UnJuV3dNLTdCSW1ad3k4dlRTYmJzYWgwRGJoZFNKSGMzcnplTXl5QjhiTEN1TkpMeXMydWRfaTBWY1pjM0xrN1FBc2lhWnVTNG1rZVB4emxzTUlrSjN5QjFMMGlaanN2TWdadm4wZ0pna2RlVTBFeVVMd21TM0RZMHVNS0UtcUFZNmlrNnZrdU41bXd4N0lvbVdwZnBCTEpMaW04eTVHSGxhc2YzNDNEcWdtV2pVVzE4cUlfSUZMZUc1MUJza29yOHc2Q2JQOEViOVBoTjVwV0kxWlpZeXNmNkZqeVlyZXhCVHpabzhtT2hmX25LUnF5aE9jZWdlSG9YSTk2VFphWUdqSzJfR1hLRlhaNkZnNlUzMERpM05VbEZ0VnRqZVY1ZFh0SmxScmpoUHM5YW9zcTJ4bVBmVHRtQTQ2TzFsUjM0ZTEzM3AxV3RxSC1UQzRrSm45MGRxM1VRajN1XzRZZUU2S2ZBLUV0aXJZYTdZSVVpTkFVcFdTSjNjOE45NER6SHFQbTQzTzZsa3dlWFRKM0pxMHRoWlhjWkNxNmdpMDh0RFFjdDVZblZCRlNYTDQzTkh4cFg3dkU2eXo3OWNfamtzREZPX2J3NllwRjhWRHZ6MzR3ak5Vd2ZfTzVNbWF4UEJucWZoLWpUdHhtVW1zZllZS3Rpb3JEa2F2d3B6TzlmWi1pSTBvX3oySzVYUHlUNXZfVU5XaUwzbkJ6OTU4M2RsLUF4T3U2TXRyaFBKUUE3ZUxXOTQyVEx2X0g4UUhyRnZ5bW0wRmtpa1BJd3dmU2J6VHZBNnltVE03dXZ2S3NuNGxyb3IxRUtZT3Y1MHFCcHY2U2ktNUxsakZUMDc2WUZ6NEhUWnVGRkdYVDQwRU1fX0pRcDNmSkE0cXE0OUFUbTFnZW9EVC1CRGNucGFUVEtvNDJ5aVdhZEZBR1pycldKM3NsVHRzVkJzaklwbUo2dU1XNnJxV2hTcUMyOWdoclpmdTZTalBKRUEwdC1HVlZoRWFMaXZqTDNfYl83d1Awcm1UZTZJM3BHWkxlcHF1cjdrRmFfeFlRZVdPWlF4TlgtZXVwRzZDeGlkcHBZeUNtbk5UMkI3QjJKQlVWc29oNThOS3FQTzVpQ3hwaHFvVzRickxWSlBtQXN4RWZfRm9OQlZfT0gzaGZzMXlKMXlLb2g4SWdBRktsdm5aV2RGRk5ValhaWk5VSDczQVBaYXBLak1hekdlQzMwYkVTM0RiWUxBZmF1SE9QX2hKN3pGRTliYmpDUWZhSXRqZGhiMm83blVJVnZVRENUVG82QklidzBtYkFUZGV3NUJoTmRfelI0ekVLeTZZMFR0b04wTUFsQjNXT3NObUctZzVGaXVoMXk4eGhiT3gxR3czcFlYRllrVHB6YTlFVndpWGsya3o4ZU1sVjl3Z1ViNDNFUzh5RWItNTM4dnhhd3d1bGdHclpxYjlFMThHMmhrQjlXb0hrUjhoREVQY3U3RjNvbGdGSnZsaloxUjlGOEVOREZXdWIzWUJLUHJCYUREMncxUlEzM2ptak1CSEFCSE82V3lvSHVzXzA2cTVfd3BjU3FwT0xOVjNCLXdyWU9rZWpyZkM0N0pPUFpLdkM4U1JLTTBXVTJvci1OelUxa0tvcWtvQi1JRUpXZXpyQkU4U0c5NDZwTzhSX3FmVnlYZ3ZJOHUwLWVyZ1oyaUF2cS1CN1dGZDdxMmJWY3ZDclRFRHUyMzJ0azlkOUdOSjdFTTBiQ2x1NVNLVVEwUnJkM3hBSjIxSXhSU1o2RU9TY09TaDQ5MEYzWG9FcWt4ak9VVXJSdDVoMFFUcHRCUnkwaU1ZSlpCYzJpbld0bVF0VVlrOXRveFpwTFRkLUZMeXpvSzFKTTgtbWxUNFJJTkRPNndsZTEwaXJxYnZhMDR0Y3B3SjEyTGJyaUtoN2RKRmJFTVB4N1lZT1RsOXdwakhjZzdsWVNVblpKQW9TdFhheXZjQUdaZHQ0WncycnVhRGdyYkdOZjhfdVZGcy1WbmczYVNhMFprYzJqMkh5N29pQzFJeV84M3dUMXF4Vk9BSXhSeThsc2lFbkdQNFEwZzdxeTdNWmtKTGJmelZzWVRDVDRTN0Z1WVlzX1lWaENHM2ExWjdQZ2VTMmlaYXpzVC0wNWN2SjUwYnVVUXk2WGx4S2l1SGpMSzNXdUZmYlhXVlc0OGNwaXFIWTFmU1RIVUVZRlMyU1Zvb09SSWkwMmtuRElHTEFqeHpINWNDRXo3UFVuVjZFdXM4bTBjTHhtay01eGtQRHBXSWEwVXd1RHVQZlBrU1pJQXpDSEkwNTN4RjA2aW5vN2FCdy10ek5sY1BVd290WW5wdzN4WnNDUi1odFNaZ1JQRnJxd2dNcEhydmg1eGZmSUN4ZEZ1RlBES3c0UVFkTGtCbVp6eUMwR0lSa295NW45SnBKYzR6ZFc3bmxHVmVMeC1XZnJBWGVGaHFMQUg0c0xqejlVeUJIeXdPQ1B6ZGlQQkhSOV9sUlpZSzlVdXYxZ3ZMaWJqOWl6dWthSVk0cDZlR29wWDhqSWN5Mmk2anFZZFM4MHhJV3dkLW1BNlphc3EwQk1kSkVna3BGZVpIaGswNy1aM3dacXRnd2V4NnhMQU9oVkg5MnhWZWVJeXIyQTJ0ZnI3T3dkOTEtdU9IWFgydVpUdDZIRnJWLXkteldnRjdiZ3JfTHlYd1lSakkzNnNhLWtheXBkVkl0WnM1SXZCcjRLUkR2ZVVza0Zlb3pQQ0V4OWdrVHRRUzNUMlVTUTJBUlBRclF3TDFPS0lxOXlaRWJJazRIRy1uOFd0WXUzOEU1YXpVelU5bm9kdWhfblBqRzQyNDBYRlNIZXJyU1dfTENSVERRaU83SVhUR2tRNVdidUttSWo5NEhDcE9ZZWVfX19sNGloem5FeWRqbm9UcUstWktWS1JvWmVKLWFUYUZPdnhlU3o1NVY4YTlaUDRhVjExbDNDaGJCZWFoRzQ3cnl0eUFIT2ZIc0Y0NjFNeEVTM0tzcmVfY0FhaWlzdXMzYUVmZmVCRm54Y0Y4MnJWZ2xqaWt2eVRNTHBXcGtlTlZIUDI3MGx3M1Nuak9ZVGJOQm5OUFh4NkU3STV2ZDVpdVZZMG5WYzVLazZPTlZiWmhNSnI4R010dmk3ZGgwdVowcmtvV2NsZjVmeVNyWFVubHFDdDBkZ01iYk05Zno5ZnVmM0EyMW1vRU9XWTN3R0dTeXJObVQ5R0FEQXhaSGQ0b0RxVVZsbnhMNHNnQTRmSVBmYTV2V3RlNVhtX0JtM2NRRW1naTVyRlA2M20wTERrVXFzN2wwUmtNajAyMW1zQ2QwTTBDZzI0OE10TldzU2NNYU9TejFXdnRFdmFhZngyQ1B1ZmFaRWFHejgyNnIzaVhOMkpwa1poNHpFaDc5aXoycW90UlRpYTF6VVI2OG56WmxkMHhLTmhIWjdxaDdmT3lqNXF6X2Vpc1N0QzZTMHJXMndCd2NIZU5ZYmNvRVAtVklzYWd0NkFrTjZoMGVUZHRjWDZUNWxVdmVNRGpzTThGeXBHR2pUZ2kyWVNWMUpiWUNSUTNrQTY1Z2F4UzBVOFVNaWVWR3lYLWFjYUV6Q05LYnZEUjh2dlJURFAtNXU0SGhlR0NiODA5QjR0eVRDN2MxcjFJM29KdTlEeWViRUtZMlI4TzdSWk1kVHNzNEZrS0x0eU9wYVZGaHhvdVhTa0RVYWNUTjBtZldVUEJrbWtpNWpiRS0tZGVpTTNlM0tGVUoyM21GaW1QajJBOC1TdGlndVZVaURPWWtVZlJkcmxJWTBzVkF3V0NsbV92cE45a2N3V1NyTmlrX1RmZ1BTVFp5NmZKZW1WbERQWklBM0VqWkh6VkFJQnprR0RISjdsUnlQMXY2eW9uWXZwUVplcUFRcGRxU2ozcU1VRFJkYXdlNVJyb2ZHT01CT0J3T0dobkd0Skp3S2ZmcXRKZ2dOU0lJQlhNTWVaR2JaZDVLYVEwRkk4em5PRlcydUVPUENVX2Vjdm9sa2NBeGNSYWxhcFIteTFhbmhzMHdVYlFONm9XQzBLYlVvUDBsMUNhd2NwQUNJZloyMWlna01sMmFEUWg5MllGV1ZPVUR3aVQ4VktHX083QXIwSHVaMWZCLXVKQUpMcmpuc3VTazE0cXZ1RGRqS2hzdlBROEdVNnc0dnhMMFhPVmtweS05UzVXV0gxU3hMZkxRSkcxWHFabUZUMTVrb1NUS3I3MDJLbl9jWmN1ZnpGSldTSmFmUUVrLTNVdmM4MnBscUxfd0l1ejlzSmhUNVlSNGI5bXFSVTNmR2tSeHE4QW9hOXF0NVhjbVZWUVpqaDMxUFlKdDZib0ZJUXY5OVUtLTBrZVFHa0lBQlJZX01iN04wb3Q2dGNPZ2dBYUJQZGtoQTQ1d18xQnNzWk1IQmlxbDliM285OVlaeXFEeVFLczZxNXBRNEl4WG83TGVNMktMRlZYdXVsWUx5dTdPd1Q5dGFXQ3VzUnBXOXJPLURlWWV3UnVxQnpUX3hSRTdpN0RhU3VyelBiYWw3a0RoeHc4RFU0MVZzZ1BZSDVycjl3ang1Zm5nSkRFZXluMWtLNk9hZHBuWlE2UlRSZFp1ejh2Z0tHZmZibUoteHBNUTJaNjFHdUZWU2FmQUZiM2g2Q0g2OUtCMkVqemNXc0hickgtTW9QSEFUdllpVGlDeUhwZHllZkR6dnJCN01QQmZfQXRlYjEwNHBZTTRBYTd6TVl2eXBzakJTdWhjRkItOG91TTZXckRDdlBXMkItSGtKbGtacGxMZThzcFBsLV82OW9UUC1ua2RhNFVtUXFER2RHODFNODF0c0llSXBNZlVrS1NEclF3OEpVRkFKc3c5UWpqVEpZYnJMMFBhQWlmSTV5WHFiY3hwSHltQmZfVDNQcU15eklkU2NwREVrNWh0V3RtOHVjU0dDZjk5Q1FMV1NldVFULVc4Z2NhaEhYRWRWNjhyYlpTQnhDMkJYaUc3bVhSNFhLLUNIb3p6WFcybE83cVRmU1UzTElFZS1kSXZGY193MlhDY1NIX3JsM2JLM3IzLTA4MXhzZGZhR0cwOWZKcmZvckpEYWQ0blhOWEVGei0zRTBoUVJTNUplRnhxVnFYUk1kY1dzSXhsOTBPN002YjRBWDNDSl9QSXZZMlNUX1Z6bGo4MXZpT3FfSVEyZ1pxMlhzdGFlR2NHX0QyYmJFbVZ0MW9mNUcyNGEyME95OVhmVkpHaUpIaUVQTDJMMG45dUdqeHB0bFhZa29LVTc3XzZqT3h6M3ROWmJCcS1yTm9ubXQ3NEhoSUNfcTRsZXJCT1k4WXRCWFVzQTlMTnJJaTNkV1pCZTQxWmpHZ0dNWEhEa3Jzcy1DaTh0TWIxLTZlVGJUVkxaRU9BUGFoQmNDOEd6aUNsVlFfOHk1WXNNWndMdnZYNTNjc2Nsdno4a2ROZjUwMDNybmhfWEEzbmZzTlRPbGl1M0pWeE1PcW94WEZrZHdWSjNDT2pmVFIxLTRuLS1Ua1d6YkZEVmNGZ09ReVNjY1Y2M3Z4N25uLWJ2VGk4cFBtM3NJY2t5ejlhNUJlbXN3cHh6cXJOOWZhNXNVRUgySWRxZ2d0UzNYWGpJbks2RVZJbnRLRU9GTFhMNHRTSjhYeU0ySU8yTTJJeEJIVGRVa1NXcmZIWlAtaVhPbWU0QzRfUkVlZ1lfc210T0NySmEtak9ja0ZPSUVCek9CSmMxaWRBd1N6SHVkaFR6YW45OG9qTXlmdVpVOXdtVkJFMG9TdVlxbUF5Qm4tdzFDY1RRLWpvbWJWVGxRejM3VU8xZzRITlVIZmtKei11em5jejV3TFV6aGF6OG91ZnRjN1VVbFAyOFRNOTNHdnI5MWVMVmZMTTNOblFYNVhtWGh0Rk5nQjFseDFuUFdvbVhYMVJMbkZXX0FISjd3ZlJFV0JPVW9OUWdYYWRLdFFuUVBKRnF3RjdNYUtWREtDNVJtSXdDMjB0cF9Wa3BaZ2VPQ3NpcUlBLUV6aHNjdmV6V3BsbzMxOUhkSkRlSzM2NTFpUW44TGo1ZG9SWlIybWJLUkp3Sk1YaEZndG1zRm03bV8wMTVYTEQzV2F6YUFXSjh2M19uUzdXeFlyRWJ4TFNWNmFsYXBydWRHbHJhUmZoc0EzMlJGMDBLSEpUQ202TmFscm5JbThJb2tRdDRlOFUwTkhoS1ZFQ2VxaTFRRjRkbnd0M3B1aVlQV1hnbzFtcjhUcXlPQUNhVldUUTN6a1FQdTB2NjJ0M3JNa3pIMHlVXy1WSVlvM1VMbHVvdURjdWJEQzFjaU9ZN3FZc3oyMGRYaUdiUTlTcHZGNXh3eHlqcllKVFNpWWgzbThKUHg0UEVKTjJKdjFzVXBqaWtHVl9veU9sSl9xTE1DY3BFT3ZscFAtMTY0SWRLSGI4MHo1OVpmYm1SUUVOdUZEYTlvdUkwMFFqazRLODVQT3phZV9jN25WeGN3VFZVVUtQVC10OHcta01wblVGeTNCX3pZdHktSUQxX2J6aGRwUm1LcUdudTY5bGxkdzJBRlpEeGhRYlJSam5zeV9COUhaaHp0T2JlODB2dEdQZjhCVnNyaWxnZzRXZEplSkRTYTNuVDRJVHNRX0lxLWxtcTAteEZGX2pWNWYza1UtRGdkNFRySF8tOTE4MlRqUXFnS05pandqdGJmQVU2cm9kUXd0cm11b0hxaHdrNTlQdHRRWHpaZlA1dzVaQWNqS2FRNFZuZmxmcS1zcTYxSldKRzNUR3VaVS1wUU1fVzF5Q0hpNTBsM0dEdWFkNDlhVWR1N1V3dG91dXBtRTVJa21RT3c1aHBXOG9EcFpORWNUT21BNFdYYUZvOUNTVm1aZHpneU9DaVgxWEtnZ09sWE5KX0VKVkVZQ0pCX0o3U3lrSmVtem5BajVlZG1uRTNOZG54ZGVueWJ5VXktZnZPdHNtUG02Ymt5QUQ1cU9TOTJ6bFZYRHEyX0lHOXJ6dkc5U2pzWVdBZHktV3RvdDlHR20xYkxwTGJ5WG9ic1EzN0RwRHF1bjhwWkJ3eUlDSEhtSXhjTDdZLWJiLVJjaGxGVkYwUzg5bGpZMGpXRjg0WGpCZWd3Z1pqaG9IWDloTlU1RlV1blRtNmxxTVpnRklzWlkxQlFFekVHUHU5TV93WEJqWW51a3c1ekE5czczalhrZmdWX181Tld6MXF3dEwwaF9Eak94UDZRU3hmU1RxT2UtTTktaDNwWWlpeERSQXRqN0t3b2h3Q0xvR2ZidEF5X2twZkc5M1FrQTE5N1BvbGk5YTNfbWRaOU85NllFaGg3ZUJ2NHdqS08tX3ZRUHRwbTVMcnZPOE51dUdzY1NOekk1NzNjWlpZUVBFVW0teG5PVlJWLUUtU3FGdTd6aFV1MjVnQkdObE1zVVdDQVpnQk5icXNsYUt2R3duZXNacERiaW5SRUVkSU5OVWxoUUlEb0NKa0M4Vk9zU1VQSGFwM3hMZ2ZaMFMtbWp2R2V3UXFGUURUbXF1YXdlT2VTUmw4eEdiSVFHLXhVa3RYbkNMcGlSQ2kyc0hscGxYQmVvSmRIS1ByazN4bUoyVU1OTG5HVnROMzJXYUdmZUJOYm1GbVY1S0JJVGx3Uzcyc0pXRUYyYjRKazI0aDRoZ24xZWVWa254YmRCXzBkOVdvNkY2LWRGaUZKaDFVdjMwaFBaTU9yVmVib3lJZWpHZ3ZRdFFMRlg4TUYwUFVEazJ5VTFHZ2RSTFVJWFNfRXBaYU5iaWFLSE44YTRkUWtDM3FIYXpkSU1DcE4wTlhlVmExZUtDWDhtbG1rbWdkbElVck5XeTZLSXdkSU01ZUJLWUZ3T1lkNG5WZWRrOEl1Qmt5X0NMUXNwYTdURC1fT1JtOERxTElMRDZNLWdNenVKWjhEX1REcEd6YWZ4VUhVd3o2TkEyaVVXR2lsZWNQMkNLenJLTmdFMDV0Tko2QXF2cEVfMEF5WDNRc0VPc0Y5ejRQXzgzY1E5dXhiVXNqZVE2MHpfc3JYYnB3UDJNSlBIQ3dtQUxvd0RtYmItYTVJMEFyZnQyWXYwSjc0ZC00eVRXWXZLUk9nNDZhcDZTUnNGZzBJOVpsWkMxTDQyajJDMEpJZXE5a3U3cmNxZVNnXzR5dktXdzVuRXdhUnE0WHJELXcyZWhaT2dtSFRwNmpsaVZGRGZRejBHVmJRN3RxX244VzAxbTg4a0t4eGFXRkJfNmVackc0eThlUUNXYktJbEx6OGFUV3c2SG9FTjhkYUdabDhPYWxRRmZiRGJvMEJNNHMybWd1WFJBeG10SDRxNHRQZTlMNDlVLWJBUFlBelFIaW5qUmR6a2lpVG9yVGpPd1M4ZW9GNlpxV0ZGbm15YkNya19vdW40WmFtX215eGxnY1ZEbVBKVWhJMGdkeUlIeFg0cWN4R0NPbHFRQnBLVUc3MkpBa3VjcDBjUnp0UzhmU1Ffa1kzR2hYMUpKQ0tsTENaOWVkbjhVU0FzYUQ1NzJCS1NSU0doR095MjJYUnZFTUU3cGJCVUxRM0dvRE5CNlRaWFVQVDZ2NWNFSXp4WmVGUDlGR3JJMUpONlZvcGoyZXllVnJ1Sk1rUXExLVBSWS1wMFNPVkU0ZmRBUXJ4UzVCR1cxUl9LS0NmS2g5dUxoVERpZEpLQ0d2ZmdPU3NfeUQ2Z24xUXVmdllHQS1tNGJSekxQc2w4WktXOFNNV1pXQklKNkh1UjhrUFlDQ3JCdkh1R1U5Sno3cDN0TUhwZVVhX3ZOd2JvWEFDZlNUNjBsWHJnQTBBdlJzSm9nU0p0YTQxY0tMZmV4cGhOM0RSZUFabUFJMWxmWjFWMDJ0THkwVEZ6Z1JuMUQ0TTYzRHp1Sl92bFBTWGFmcFRFU1ZYTXNZa1Q3UTBSdm5WUzhfWDNNanBQeU1QbU5UVThfYTRQMDltTzRJbEVoWEc2R0tYTDNaSUdpTTd4YWREVExXSUpHMUpvUGdJZDl1Q1ZUaFBROTdRWG9EUXJzOG9VdXNURGtHZE9fTlBaMFVJU1RKNG45ZHZtNjlFa1g2ck9CM0J1V1QySlo1UlhZdUhneTM3WTZsWEp6cE9QVWdJbngtUmY4WEV1TWF4ajh2Z2NzczN3RGVYTGwwMlUzQ0UxRkMzOFg0WmxOSnZfRFBNYTladlZ5YzVwbElveTNGS0M0akRXQnppMkVnal9oUFpZcWI4b3VWdUc0NW80QzdNaWRNaGN3OTV4a0dOYTA1dWhBODliOFpjVnVSaUN0bGVnVzRpUjNReGxEQ24tUFlTa3BfY01TUTJrWUxwUkt0MlU3eVVBSDBpRmNGcjAxWG5POEtXRXJJelZ6emROaXV1TWpoMWNfT3p1QmdBRFpTSVZEaVVQSkcyU1pKR2pveU1hT3dNMG44Tk56bGdJR004VVUtVGU5OEk5X3NqZnBkSXBkRDNXdzJWa2tZRVhSVzR4YllSUnhxRElDMmgxR1lyVkdMYmZ3aGV1cWVITXNCMUZoWTcwM0EyY0xOUjh6X0Z6NTBPV1FQd2l6X0VtbnB5Ymd0bFdURFFUX2o4RFcxTmdjNURsX0V4WWFIOUxvMHhlMEh0Z2J1M0JiVkpjZldNTjgydjJ6SkEyTG9jc0xKRl9BbmJvYmhoanA4c21ENkxSd0NQN0h1dVZRME01M3JyU0JPVWVXQlFtTGhTTXlOblFCVFhma3dJU0Zic0padWF0ZDBHZ3M2bjJoMzg4Mjc4eVp3cDJwVmJvbWJHc1NmSnBqTzJtZDdTRE1aRTZHVGJUQ2tPVnB1TDNxSkE4WGk3VW90bkk3ZlpRUkN2clhmMVBGNWhsQy1GZmtOWXRNc0h3WDJTMnA3clREOVVmNFBfekNhVDRtbWtGbXp3ZDkwYjduRFltTjFPdWU2eldmd1VFdkJJRkYySFk5YXVqNWVXbWFEMWhRVlpkN1lkdlFtZGstRy1SQ3pHTWFndF83LXpuNFNCdXhOYVR1ak5abG5ZMnVUMnVTakZlRjg1OUU2TGN5MXVFZU9GOG5XTnZmaWgxb2h4dVRnOWJXNk5kaXVXXzNLSW5aU0FzUERrQWFGMy0yY3pvTGY3TGZ6RVh3M2lYX1diTmtfcVlyS25Mc2ZWT0xEY3JZOE1IYnlBeFhLWVVfYjJ1WG9PTnJWTHB6UmtjWUpTTTNSODE1b0VnRlFSQXJia1pqNEFpRjFJbFdidFR5NG5Od0dSeTNmV3E1UGRkQkZVckVGM1g1NUhJVjIwTktfZlZWOWtGWmo5OEFkSVpHenh3cUlqY2ZzVC16aHAtU2p5bjYzWXdWelNqZF9rZUJHaVR2aE0xWXdCSVJRWHZvUlFhRndwbUZ2MXBwdGhQNk1kUEwyTlIwelc4aEo4Q0RCZndRakZZc3NsWUdoZWJBVjlESGl4aHlUMGxURmQ4UXFMSkNCblU5R1V0WGpWOGNta1Vna0s4eFNnTkIwMWhsUHl3QkZYZHJnTHdOUkV3aFFhM3Y4dzA4YUhoLXFLeHBUNXdKSlEwajJMRWxTRW9MRzBRU3NDbkMwQXlDTnpiNDR5ODlMMFRHcTc5bTVqUXg5WEt6V1JOVW9BbUliV3F3ZzRmaW15ejNKbV9QUWV1X1puNjhvbDZObE55T29zVHJzQXAxTFNoV2Q5SGNQVmd1RWg3eXRPRDRsb01nTEJKck1QZlozbldybWxnODdPUnZVRi1MVzlNcXlXTDJJVlU0RTV1djJwWTQ4VzZvdE5tdG96QWRqOWU4dlY3NjVIcHgzQ1YzMFlJYnZRcVFXcnNNSG9ic3lfZGVkSXRLcmlLUDh6SDJsUVU5VWdNenFHQy1UUFVXV2dRQnBkYnhPd2VrS3BuNHpTYTg1REpIaHZwc1ZJd3lOOG5CeTZTbXJoeF81RVNmZUNyOEk3VGZPYkxVODc0aGY2czFQcVJpWU5OQXVUXzl1TWh0RzlIYUQ1MnEtVlZDaVo2bGotMWFkdW5TWGRoeElPWHZjWXpNYURxc3BKZkJyOEp6aUE1QjJUZl9vZlNzNlRTVjdxU2o1czd5NENBTlZncXBleEdGS3loZXF1b0l3TEpMalgtQWNNdVZxOXU1ek8xRGN2UTg5WFFlQUE4a1psd2gweGc2eko3Wi1od3hTU3RmMklLbUFfZGJteVJaQnVzeFpNczlhbWh1UVJuRGY3RHhZeFpzZWpPMnRqWnEtLWx3cVQtai0yRHZjdW1iV25odU1KRDRwRXFVSTRVSlhSSmVQd241cjNJMnlzdWRsS2N4UUpGbmdzNFZ6cGlacTRHem5mUjctMWdMUmRTMVRXSGwtQXg4Nm5DSjFCdzVoU1BfYkE2R3lJU2wwMUM5TGl4bVpjN2E4ZnQ5RXpQVVc3aGdxNGxsb1dGVjZKTzhBaTRQNkhBMTNDOWJxbTZOWUxwOW02MHJDVElwYTU3MXZWd0tSYUJyREJuNURuUmlWYTFncTRoSVdZM2VEX3dkN2hEdVlmaklyT1o2SlBlMWxEeURNZ2lhY3B2bXoySlRQbXFfLWVrdzBYd0VaR1QtZUlnLVpudDJBd001V3NmbGJQSEV4WVlQaHNGOXNOSUJhRElqRWhYMkZoZDZHOHRjMkFiQ3FsSFBRY1VERFBpQV9xSzQ5aVZ1a3BJUTBhc3JlUTVvME4zMkY1QVVFdTducEsxMjEycjhnLV9HLXZkRGttOWc3VjJucllmTEMyMnIyc3lsajhGQmNmb0xsR2p4aDNySlZDNnpPX3JmWFZkUG9fLUluYXFETmctTVdXNk0ya1d3U0NFQnc0YnZXT0M1RlNLUnNvSFhxMGJnb2dzd3JQS2xvdHVkQXNjbmUzSUhKZUszRGktRmFRWmpLeEtBdGJ0Q19fd0NnM1M0TG05NjhZb1NFRjhWdVdSLU1GVGZfS1VZNWFhNkpKR25vTzRnUjZxcEtaWHR6cXJwTkZNbUVtOHVKbTJmVXhYTThwVGVyUnBGdnItN0ZsbjdGeVl6Y3ZQWndlWi1fVHlHank1OXBzMVBrc05CcUp6dVVFcWl0S0xmeHN5T2dudkpiWnJDYlhmY05IM2RyLUNnRWVpU3VyazlDVGo2em15OW5Sa1JOVDlpTkxZQzlteGgwUmd4ejg4UXZNb2NVVFhzd2R0ZkNpTEtvaXcwNXUzM2ltT0tIS3B3TVhiU2pzb1VIeWlJZE5mWFZoVFIzM2xnOWpaSkxjZmU3N0d1X1pfM055eFc1cnV2aktHUnpOcW5MQXVnSHVHWG5EMWFBdGZJaGpqRENWNkd2SzFaZHFuQ1RyazhOcGZ2bU9lMm1KRGRFSjR3UzNSRTdldHNZa1VxLXJmTVpYY0hqZC1WMDZCM3c3d2tNQmdRR1pDd2Zad0RmdHpBNUpUaGRxZDZqaHhHNThMRUJXLS0yQzl0NDYwZFhqVHRLZDFWLVphaUxyV181dGI5cElVdFM3RDNET28xbUR6cElQdUdqZzZhVW50V0RtN0t0TEFoNGNzZnl4X2YwVmRiQkI2ZEp3blB0SkJWVWtlb2RYNl9fQ084QTk5a3k5SHNtR2VLOWZ2STFGRjVrNGdIMkZuSlhrM0huX091bmU1RHhtM1hYYXkzSHZtX0ZEdkVQMWJjYWhOSmtsT25DaG53NlQ0MVFtbVdHOUM2TVBOcHVSVTBFMG5Ea1IxejlvRl9MQVJwa1U2R1ZpWDZ3OG5DeGlZNkM3N3VmaHdsU2lVUE1LRGlaR1U1N09zd2lIZS0tZE9IbkJUSUNxYl85TUthRnlndmw4dmUycXpXUHN6Y0dONi0wVExhbUpndUVuOVZYTmc2dWtKRG1ZVGFiZzlJZGw2R2FJVV92MWVsc0hMT25NX1k2NzU4MVlIRWpRNWpxb1RYMzYtVWtVRjRFQ1VNTXk4SUlsVUxOVU5MXzl2Ym5kWUVNalNKbkJuUnJGQlBuNzAwSk1Gd3JnaEFMdnNmblhNcWN3SlVJc3dhbHpfQWxaUGE4RTNuMG9mT2tZa2Y4LVhEaTcweDBteUl3ZnBPTmtIaHRSaXY4QThnajJtSDR3QTMydjRLTkExbzQ3MGViRmNUXy15UXM3Ukt3OVlRREU5eXhJY2JMTExzUmhhd3QtTjE1SW5ZTm5HOUhlYnRTNngybTZhUld3OS1tcHV6OUwxY2xRYzFtVXoyQ0xJcEVkYmlDVkgwYlhCaVhJWEFCeThNN3VJRzhLMDZiTU9Nd2NTajA5NlBULXYyU2l2R0V1aDNFNHI2YTFIbWRoVXUtNEV5OGt5MTNkOUVZTmFieG5JeFB6RFVWcWI2NnlrNWlFeFM3UTlUSVdqc0c0d2JrNmN3UXo2V2VSeUVBSDZ1SF9hYjZrUUw3dmwtYnhLNGJHUGp4RThIY09pSGxSejMwMm43NjY1cGJSVC0yV0xGR1NzQU5TcVo1WGxOS3ZsOGR4Ny0wUHhQdkFRT09hcWxtUURUTjV3TTZuTWlyVmp0Z0hmaTJFSEtfOFI3UkNCVzlRZVVyRWZaTjZIaXpFOG93VkRMemdReG9HOHlSQlBUVWVPY0tqaWNSVjFyZkZ5bDBDamVlS3pDUVpXR3JfWVVSdnhuZDVPT3ZwelJvRWRSdlVyZ1lFTFBfRGNSWXJGR1RtOFB1ZE12VlhXVGNhUENrZmlKSkpHQ2dpZDRZQ2VwTEVKejdhTnVGMXdZWVZpUXVGblotMGdJWkg1akt0b19kai1qVkdDbm1OdnNnbEJPdkxxb2pHS2QzMFdrdVI2M0FQTzA1WmtkZTlRWlF6NlFNdkU5Mmk3ZGtEWTlPZjNBYmxmV1o2WkUxRHFRNTc0czJqOEJHT2RaZFJYVzNjcWpua25uQXVTbzExUzBxeDl3elZRQUNnSjh5ZkRCcUtIN0hNOEFrODFLZVQ1azRhbVpwYTBseXhKaVdJNGlGWkg3TUxzTWpYZ0tvQ2wzZHA2cjI5ZXlOalI5U3VfUjVLU0JQSUpka0NSNm5STnMxdld1TzhkaXNoMDh2V1d0dHp6MHVnbVNmZHpSQzJ2WFl3VUZweGVNWGJKUTVxM255TVBwWDdlSkNlbV9jdGJMRUh1YWtHU3A0V1A3TGwwb1ZpYmdTbzk1T3BvX0JDVTZ6MWtQSTdzbmE3ZUVqT0FPSlVQOWQ5WXhGaUlNVVFHMDc5enMxQkpwN01nazVfcHdSTFJ4R1Y2ek9LM2x0VEJBNjl6OFRVNDZjTEdWRnFDNU9jT0JCXy1tYUdtQkNDT3RsTDZrQXZOYTUzRHRZZzdwOEdyU1E0MmJXdWtSSHlYNE8taVVkYldlTEVIOWV2S3VjcnhfbUhBalU2YVNXNEtJUVVVd3p6WkhJUm02U3JOSWVVRUZxZXlhcmNVTWNkZUI0TGw2aVpobS1KTWVZTTZHOHRaZm1wNE5GdDZjdnpjSVlwR0xxa0JRNmFEeHpYS21JcWVUeklDSU9kUkRzdGZ4VzhENTI3c3MtUndSX2plTXlhMGVIU2EzZGVPTE5nbEdDb04xTnRyUDVka3FZUHBZMEtYQklnVzBnd2dZN1ptaWNxMkt2bHUzUnkzblFNWjZPZFZpb25oR29nSW5GYjNkdWtlS19YcGpmd2tKX2tjYk1PVGhMRG5Fa3lON1VHT2JPTExSWmlPY2lWNFlnZmFxTUlDRUpiUE94eWZ1NnVoTWdCbHhzWEtQRXA3elkwV1ZXb0JvVGNZWkZqMi15SmtLLV9uLU5jMkQyWHk1bTF3eEp5aDI0TDNiNUlEQTQ3QWp1d3hUaldyd3lZcG9uT3BpbzJsV3ZZeTIzMVJLN05MOXJIT2c4ODRqcjMxZmxnSE5xdTZ4SHdJOF9iNkhzelRRU0xjUkE3N013S0VmamY1MXg2Q09NRDZsb3pJV0ltdmRJbWdxdmt3aFlfdXFseXZjRWFfeGNLSWhiT0tKM0hFanVEYnllNWFjNFFuN2thdWdpTnVKTThEVE1KcHVuN1lMS1dvUjVHQTcxZVA3azRQM0Y5WUs1ZDNNenQ2VFVWWUZYMDhIUEVVQldQOUFtTHlJQVFVMTF3SkRrS0pWUXRoQ2dia2FQQnZCTXpxeVkxR0xXNjUwTk9ha3d6SXRWenRveTJLRXVlWTdSTFJ2TXRGcWtqOUFwaGJ6d2FwczljWWRBRXY1bnhsN1lLQ2FfR2lQUWRRRjREeTNxdy1kTFlVbFV4RWp0XzNIUGhPWXNJejFrOTg0S1ZQUFF2MHJ2d1poNnFuTGt5NmQxM3NCdjVZNGJlR2FlNnFQWnhUdURiUVJiLUhybm9JUEtuRXlrRExidzdzTU4wd1ZJNTNIcTZJRTlmTkJxX0NuVVM2Q3NzcHUtdEJ1UFZyVmt1aTJ2MGpwb0ZBOGhEVDlqRjJFeW8wRDhSVEtPbjQ3YlVGM2RISURPbDJZb1pIWlBkdmtXNG05RjVwZU5DUlc1YTlnTmk0bnpEWEY0VU01LWVZV3JFTFFiQTcwSzROaTRvX1I5QWdkaF9kaG9MVUJwMk9yUV96eTVIc25jbXFod2JXWGpUOVlKS3ZVdjNQUGZpUU1KaktscmR2WXRyWEt5YTlNX212VVNIc1ZfWm81dE9Ga0VVQ0RpWmVXLVRJdEoyVHQ5OEZRWXcybVBjWXE4em9MeGpOcHgwazROUkNid0RWcmliOFJlUmoxbXhac1BObXI0TVBXSnM5SklFeDUxck5oMGFjZ2tjOWRWeU5wV2lTSTRXM1ZjajlFcmFTa1NGdjlnVUZURlhxNDdjMzUxT3lMUi1GYUZJZ2RsNlBkdXNmSU1FWW1MbGJ3QlRrLWx3bVFaMHNCQ044SnR2dVpjY2FQRzlnQXNZUUEtZ3d6LUFWYWFVbUhxSmVrUTdNOXBCdDlveGkzbHZfQUI2UFd6WFd0MS1qOU40c3BaZFNqUTczNjFtWEdzWlJDTVl6eHpGa3pCMHRCU09Hczg3SldhRnlTNXhyQzdLNnp3ZlZ3RzdwZm5MdHlhVE5Lel9hS1ZubjhCTjhOQkRwd3M3VEdxUFBPNU1xVjlVSGE4bjVBbXRSYTdKMFhzYzdVMVAxWTlJMFBwcWRzSldia3lNbXhvQXZHWklER09tNUx6TWxoMXFPejdNQmpKZkR4ak9hY1dLaWVQbHNaenNzMlpfNmhwbmNJVW5QeXNkR3VnblAyQktoZkVYbXNYSWFLNEUtNjZIOUUtTm9OMmllS1otUGxRSHM3VXN4eEowc3A3cnh4M0lISk1TckJWYXpJVmxrVDFhWldvclJXVTBvc0tBdUNob1U5YmlCcEp3VDFZM3lZaWR3XzVwdnppX045T1VMYUdGUm1PejJ2N1ppcmJ5UUVHSFZVajd4eTZVVnZlSnJ1YS0tTXFIOV9LbEh1Ym9kWDd0eDNNX3NDTmwtT1J0a1E3RzlDY1EtakF4bEpxV0FmeDlCNWpyMVpPZU02Y2FiTVJtTkJlaF8tamhMS0hKOG1hMkxsWHlYTnIwblB0U3dkWEMwM1lkMmI2R2h2ak9nWmdTaGU2OHFGZHNJeWhPc21XdEFnOTJYdDkzZHNoaGprSVNESzU3cnVDQ2JGT2xoajBMZ1lRcC1IQlU4Yl9aY3BLUDdiREVLUHZyaldNVUdPd3ZQN0pLNmFZWDVfQkVDRjI3ZEpVME05eWhVTlRXekRzSDliVFNkaXkwb0psekI4djJnemFxQkJUQlE2aUpRMk9DMkRhZzhjV0JielFqZGlOeUQzVmJGQUV1Q3hhNmhWa1ZkWGxvcnZubkhCTlp4LVZySE1aUzhxTFZzeGZkeFFwMVJiN0dqbXRBNDFMMk5tdkFDeDBGSWlMRWp0OGMzLW55MTVOTUl3cTFZbjNCanc2cVRoTk9OUEJXdmxDNUZhRzl5bzBKeVI0bDFTR1FwSF9kZHVKLTZaLVNCZTNLM2dwbjhJYUNtYnY4ZzUyWVdKelR5a1NXNU5KeDBFMEFxOFQ0cjI3VE0xMzV4Vjl4bUtOTkFGOFh2OHk3S1hEcUd0aU9xcmk2bmhRdnNKU2hudFdrX3RPdG9iV01JXzJJLVNPQWZrUFRsYTVUdzRUQWJFUkthOGJQTVV5c0U1cktRZDdpbWFUMnhxSHdjbmxmbGptdEF1bUVacVpBUHZsM2ZiUjNGei15R0x6NC1nWm9BTTR3NGhFNklTb0x0aXc1am1DSV9XbEwxc04xOUsyN0pBeF9aYkhla2dFQTAwWEdfUzFqZ3ZBOTNYZ2UzMUVSb0otU1Q0QXppVkpuUTc1My1rN0tPUFF6RERmLWZxUUZMYkl6UEVtOURzWm81NHFOU05QZjNnQ3BnSlpMR1hQOXVjbV9UcUs4V0pOSlVXUVBhb3dLel9SOFk5NFE1bkR2NjhLdVc3dEtjMFV2OF9RV2owM2szM0tfcTNRTGhrZU5JMlZ2MnROa2Z1Y1k4Y0h6Qk1pMU4yaWJRUnVQXy1qRnZRYndwclNPaTVncWpPbzRzcWtXQ043ZzR0RUd1V01DVHJaUmF3VzAxbkxQM3hVZ212OTJkSDJ4aWQ1aVBxY0VrZWRHN0FiN0JTeDdGLTZ2VHE2ZWE0Q2kzVjRpRlNhUFUyeGVvbWdfQjRjRW4wMjdNa0FjeWhsTkRqTFQ3VEJaOUl0X1ZJc3o1VkcyMWJDd250bmxrY21hUnd3WWxwMVpNR1dYb21Cc2VnaUphU3J3TGk3QzdzWVluOVZ4bHlUOWkxdXctcHBUOUNiMXQwbnV3cVB3ODVHeVBSWGN1OUlXYUhGWUFqaURxcDVLVE1rcDFxckNJdG9vZ0JaSWJwZnJrS3RTRG9PdHcwbHhWc2h4Wk42SlZ3bEVJRTNwVVhuWjhtYkpvaDlnU2VMS1dyMVZULWFINU9iM1VlRTRmQ0NoM1FxcWhiOTBHTUJhWnAtVXR2dEZTbFFxLXlYOTBCdkg2d1REdzJCMHJPQm1KejJEZTM4MklBdjJOYjNBX1F2N3JLWTBHZmptZlQyaENOb3h0Ql9Nd0ozTHVSQjNXM0l6WlZnMW9fc0N4MFV1MVB0bFBsTTBtZnNkcTlyUExjU2U3Zmg4UkV0Z0tjWHEwdFh6aTBhck1qaG8zcEQtUlhwX3JoejB5QzQwekRQVGJULTk3ZFlNcHpDc2xKeWsyeVdrams5VlllNkZQWlVkLTczUi1oZjNkcUlCc0VWSmtuWExUSE5ZWEs4LWx3OVZNZDNlbnBvNVlBcVN0bEdDUzQtU3kyWkM4SlcydzlkcXkwYU5XMVBrcElqbUJNV2FLVnM5RDdWbW1SUUtTa0w2X1dDQl9iUGFCb2kySjFoMVJqa2hLSGVzeEJodzc0YUlCSGpFNVByTDdjZmlpMUFCWXFYXzN0d0hKQ3VKS3BqZlhFdDdsSWVwSEtoem1mZXdFRVJvMEdiRWdmSVN5UC12Wl9wQkNZb2JZcHFpWllSZ0FlTUdpWU5LdEJwRGE4cXJmcWRiY1N1SkdCLTJjUzMyVnZnTVBQXzU1NHNlRXR5elNsN3NTd2JhUk51cGQ3d1NLNTZSc2tRZFphR2tPTDhiSEtxazJhNWE4SWhrVG5XNGEwUEVOWmgzUXpXR2FmRFlJd3RVY1phd1V2Mk9Pb0FxOUxSTkpqaHFkX1d3cmJlc2ZTVEY3VllIWVRxcm5zeDluZ1VfODgtdnhKdkVoeHI1eER5bWFEM2t2N2tBNVJnN2ZFQ2xERWdKTDNMSE13d3pQMTRSWjFYZzdER3BndEVmRFkyUFh3ODBpYlNMT1Z0eDl0UENLMkd3X1RyanFaczZEUF9NWVhEc3RvZzBidFJQSG1QMjAxdU5nZ2pkWTF3aC15LVpZWmFNTXhRNHZZQW9FS25uUXFZOXhZcmthMUMwTUVhbUZ6dC14eHNlOV9BX3RZLW9YaThYWTFNYllNUG9YdEp0TXRxS3hQeGJydHgyU2hSRTFsVlMwY0FkY0k0eC1VbUU0b1M4aDJhZHZOOVNWWUpVNzBSUk9rc1dVQ0lqZFkxUXFTLVFyY0Q3OEtQRjYtZFRsSnEyVnNWVHFxVFFEd3BIZmhsY1JJc0J5SllLMVpmZVhZa3VSTmJvc1hVSE9WS0t0aExzSUhpak9EZkxDUWJlWlAyS2ppUERxNjJFYjdCcDJNcXBaaTQyQW9seG5yQUJlZjFxdFJLMlpGVHRMXy1xY2NEUEZUNnpTX3hWa1pocVh2ZW9tQVZyd1p0TWxCZ0lCemlPOEV5bkkwVlZRcmpKbmViRFYzeF9zenB2MC14Y3ExazdJdEJ0cHRieEs2QzR4UENLVFdsV3JzZmlKdFIzOHhmRTF6VFN0WEdoVHNDTWp1NzQwdkxqOUtkdDFfTXJoM3RGV252VFo2Rm8xcVRuUmRELVhZOTJBbXRwcnA1aTdMcFB0aVlMcVY5Q1Jkb05Cb0ZYNWxYMnpwekM3MUY2akpWX3pUd1pYX1NwTGhSLUFPUTBNOXhTMG1pZnV0cGJ2WENBcEVtbDJUdEhuMHdoTGtmbkU0S3NFS1U5YnVTbURRU1dVZm5tLUNKaGM4UVAwOElqT0xPTDgtVUdEdXpXZkNMQkhRM1l4Yl9xc2tQTmFOX0tKaklFeFA1cDQ1djRaNnNhcGNielhrRmM1WktJZkpRZThNckt1R09Uc1U5WmVCRDZvUE1lbHVmLTNTVS1DaUw5V2RRUHpiRVRhUXNCMGp6S3ZrRXdzbzluQjdxRk9oT045SENFR2VxdGp6cEI5eUhNU05ET01ZazJ1aFFwMm1jVVNfdEthR0ZqdXktTE1ybkFORHJkVWk3Qnc3MVktQWhOZU1RZDMwRlVIQWFXb01GUTNkWG5iX21Jd1Z5Y2g4YmYtV2RfQl9kdXRPNjF6NTdSeE5YNjFzYzF0LXJiMFFNZ01OTWdDLWFoQTJBMDRWTXlUYVl0QWZqX1VEQ3o4aE9iQm1WMFhDSjVfMUFtQjNqY1VuUkpuRXJtUzFxMXdDczRpc0tkc3J4U1FibkJ0djluODk2RWQ2bDl2RFVjQUJTRUMwbXJRXzNWNV9WS05vQm5JeTlERGNKRTRFNjlnRndSQ29CV0M0SlBRdFFhTlRkSmt0M0RWc09waEVTM1lJdFFyVHpmWjRkSXlpNUZaUm1iSmhRNXVuQXJDbm9xdHAwaF9QVGI4OXZQTzI3NEc3Qzd1SkhQTW5YRTEySklDYmhTY1RZTmw4MnprWFczNUlDbFZUbkRMUHhnTlAwMDZUbTBBdDNnYVZoR2ExTFNfbDdKclFyOEZ1TGdqejNoemJoeGstZEEtbHhMbUFjX1RDbkVCb3pmVHpkd0h1QzJ1QzdZVW45VzBmX0xseklCQml5VGxyWldnWFRkUUhHVmlVYzd1V1FRWUhTdkR5VGhPSXVoU01FM2pITDJQSGdzalVKZTNENEdYVmJCb2RicU5LZWxKeGMyWDV3Z09DRmpQUTAtTm9nX3hIUnp4aHVmMUd5U2twNV90cFlHWUZtNEFuYm5nY3RLVU9GQi1ZZElkeEZzcjJDOXZRM0NseXpqdDg4ZkZtYVlWeVJyaF85WGc4SG1fM1Bxd0xRaTVQMFJfU1ZUNldOYV9fa1pwU2NFdDlQTHVnQ3JRQk02RzQ5YjE2T0lsYV9idkw0Q01HODRla3NqeUlCSVpOODlvdEdBc1VQY2VMUzFWS0NXRWo2Ulg2dDB1WTREdkZxSWRwZmJUUkFNRXhRWklyU2hSRFNaV3FkdlAwNC1wUFQ5RmxiLXFMemNCT1MzVkhUWnNuMjREdjVKLTlGczVuRkxmcVpsV3F4OWVnalVsVlpIREZ1MHVlWlZaSHpiVG4xblpUel9sTmgxZEpWR3ZyQkxDdy1ZcnlaX1kwNjJRYVlmWG5KMGFiQ25vQ0xEeEdmdjdSc1p0OUs2ZUdhbFVWT010MHVTd1lYN2Q4ZFBFNlBTY0htVUpKOTN1eURHLVhPWnNHZllzcjdLYll3UmEydThTcjFvTTBUMVpJbzJxcU52bEtMR19LRUdPazM2N1dyVW5rQUtfdTl1ckhzMnZRZHgwWkxMWFk3d0lfRlBSOEFuSjVRaHhSWTNxM3Bvb2VuWGh4VVljMEFTanMzdU4tOFhyMEtoeUZPVTI1aWlJdmViUHpzMVNpcnprSmtGNU5OSDFDYnZjUkFzTEhxZ1daUzlpbUprYlc4VFlyNWNUaWh6emxoYmRuUWRRVGpURG4wSzFyb2FCd3RQUVByaDNmUlVjc1VIaEtSZnZ1UUZqRm5LeDlLTDB3aWNmd3paNEZZSWN1Vk9zODV1bU5YRlNqM1JxaFhhZDdYSzRoZ2ZHUmY2RW9pdWNZUExXTnY0XzJQZlhvR3piYWpUcjVXVkh6ZURYbjFTc1RCdjYxVFEtRl9CeFVTYnZlU3o2WDczd2pfckEwUWwzODVqY2ZiRFJldF9lVmlBeGlLaHBDRFdRNVh0VmI4YllvSy13Z1Z2OG9ZMGdUVmQ1SkdURlZWMHdOWnVGbWg2UzQ3LW40VU5yRkxwaGF1anZueDdkZnNYX1ZaSmFXT21tMkZCTFFDZUlYNTlMb1lfNlZTcTBmZXJTNjhfN192T2FJeEkxQTlHazFKYTBuc2UtTVpDOUxSU1lJQW84cFZhY25Wd0ozLXRIVktuUktESGdLcEhwd1FYNEdlM3NENVo0VTRxdUhvMjFiR1hsb1hqbG5McFAyOHVzN1I3QjRLRmtqc0hKSEp6YlpWa1hkcWdHQmJhSXRkazdpbUd4Z1JSNjg5TFEtT1QtelctaHhhUTZBbW9qRzExaWxLRUU1LUgySnBiWXRiWVFCZDgtenBmaXBkXzZHV2ZicHRFZ25OSzJEN0FtbkFlYUw1UG5nek03RUstUFFIZ0UtTDdqQlB3eFlJQWMtLW9IOTBMRURoTm5JdGFHU2Q2Y3R4ZXA2ekhMZ0s5Ulc2T3RsbEowcng4bG0yZ2ZWcGs3MzZjM0QxcElndUV5bWZvRFhrdWo2Y2Fvd000QklHZVYyNXI1QjRCa2dYWUM4S2QxU3R5N0Y0NzB5azNOcTZNb1BZcEV2bnd6RlpZeDlGenphVXItN00td0lSSzNZTTViSGVPNjRxQUJUaDBvb0Q4ZGxvMk5tSWc4VW95OFM2djAyai1HZkQtdG44azN3OEM3Qkd5b215OXlfeHVwSVVURklGeUdISGJFOG50aFdLTmM1TnFBVGNfU0padzUybmJ2QXlFN2pWT1QzdVNiYWxidDV6MEJwbFZMeGFDaDllYTFrRzJFY3IyeW9WbFFvMmNaWXlnMjEwLU52cDZmQlN4VHhVQXZfN1Zqalo5SVVkMWV6RkhwclVoQnlNYkpqZXN2SnlZaVhuNnA3XzhUZFhQMFFrS1FJNWdoX2xzaXZfZTRPUnV1MndtS3BpOF8xVFNlRWczVmRkcUppeWU2d0dGeWhjUDZoMTV1UlNNd2xvOEp2cTBHOWhCaTBMM2FfTXpYMVZLbUpaWGZQQTBIaWY2c2FHSUdUWjNMeXF0NXpSWGc5R0xlbU1nR2N0LWsxVXBHTU5Ra2NrOGtDQVU3d2VWT1B2YXRfUUlBYjZzQUYzMTR0N3VJb251aGtkY0JZcGduUzhzUDB3S2lmc2R0TnlSdnQ3cVI2VjJDTVBwbWx6Sl85ZXhEc1JFYWlTRlRRSE5oUEptZXRDUFZZM2VLX0N6cGpTWE1aVFBqNzlXazBLM3lmYldjemdzRHFfTGJ3ejJFWV84N0ZJY2p4MTFUOXdOcGpnb1VxTjRzRTI1eU1SQ25BdE5KMlhseGJTb29wZHY5MEExREpkR3E1NjJ6Sk1sYUdMWmJlSVE5cWNSOWdaUXJHQk5CcU1FanBRdy0yWm9oUTJERUs3WGJrWmt2Qk9ZNm1xd05UTXFoT1Q5ZkdlWnZyOFVabTI5NlNrXzg5bWV4U0NPZUdOS2JuOUdKSUllajhQeW1IUGZfMXV2bnFLa3RnWkxKSkVsY1lPdzZCaXhOdmtJcy1oY2FoNDJBRndOU01UQlA0RTJhS25yS09iVUJ6anV0dTJYcTNQbmtqR0JSTEdpZjhQR1NUMUQ5SW1YQWVFM3BEUnZTMXJSWmpoRzdCUThmcGo5emw2S2RhYXVKbUNvWDB0ZVZMTGk0YzZ6RnRYVTh2UERfMjFVVl96OHowZXBJRzA3VGU0bHFlNVEtMDJfSmswVkxyTWh3X2Z1VWxxRWRNWWlFbEJ0TTdFUDgtbFFqTGdBQzRmUU5Ccnl5WUtVQVZzNWx4YzdIeGU2aDA2RUpRSkU4STBETWN0TUs4ODNUSHV2NzFabUpRaUJ1YzhvUjlmME9XRUpZWkY4bDZwRElQYnZ5YnIyeUdkN0p3Z1Y3SENoeVFhendfYmU3OS00ejNIOEtzUFRfV1lpOTlvTUF2REZjVjRWRS1fekdHMWdQVDFMNHFsODB4ampzNWtPb3RsUUREME83cXMtbGV3X09zaTJmSWFHVGcxOGMwVlZ2Y3E5clRjemdGMVRmTFR1QmQ5ZV9jUWtVaGN1RzlxcUJuYklhRUVxYTQ3VVE2QmdQYjJWUnZzcDhpMVhteUxjNGN4VFUwaDc1UU8xbEQ2YTdtOGtyUk11ZnphS1pLbXJqUDZCVU5qOGQzZWN3eTAwOFNHQnV5WkpIeDZKNUVDaFVudmwzcVBXRXpQZ3NEQTVIZFhzNW9BZi1jVHpRZjYzNFBLdFF0MjBVQ0RQUHg0Zms3X3pmMTRHdWxhYTF1Zk9aRUdLcXhaMVB4a0tuWmtoeXVvM0JBeTQ3a3RZaGxoRUZlTHZvZkxkbHVKSm04Q29VWmtES0xPUUJtd0I2OGUwbVBpcTNVbWhIYnZQY3liZWljUG1TdGNycjdSdTJaQndnRm1UT2Y5Ynhrai1qS0s4Q1VWNV9HZHp1Wk1XVGhkenFzc0JHRGJwaEtYMElMdTIxcndEN3NDQzZ6OVJDb0pDSWw4ZGpEbGxoVnZiLUhrV1VpdTR4ZmhzOGl0M3dsYzJBYzNSTFlhSkhNdm9wbGR3THMxUUp1QTk3VWJjTGZqc2JlVjN3Wk40VF90NGpyRjMyY0hYM28xdUdWeDQxZm1xZk56RlAtMkF3TlZ0dWRzRTg0eVotZUIyLXdydmZMOHpxR0RVQm9hSXloaEF1NWNRUkdneXNjcVNMUlo4SVMxU1dQUDZWMTlxNDRRVFpRc2l4TUI4cTdqVjhvcTRXc1hhZElqQ05jQWhaMGh3Y0ZvbFEtZlNxVXFfZWNoOC1pTzlpUkxNODdaR1hqZUhjYzBSWTR0ZGpvUjM5a3Nvd0RQM0FDNXh4bUx5N3BaLUhrMXgzbVowTDI5eW03cmR6RFlhOXMwbEdnWmZNRTlSOFJERDVRUmVtMDJUMUhyU2tpQTFkQzNtUUpEZC1CUFNWSzBvLWRGWnJsRkI5ZTAxbGI3dDlrbE0wWWpFejNrSjYteXdQRi1zT2tOVlVzdmE3bk1zMzhyRV9KV0o4eHdPcDYwM09qc3I1MFFpXzdvM1g4cXBPekRhU3FBdEkwb2pwN1dHTTNCamZjYll5TEJkSUdKaFY3VmdWZElIUkpVbXJ5THFMQnFJQlUwTWhLbTd0R21WQkhQdkU4NmVGZGVyRnBmMFloMUF6YTl2bEhrRUJSUVpOZXFPWEpWQjhQYmhOQWJ2RXlGcW1YZ1p4cUstX2dkVzQ4WDNwTUIycHlYWW5YSlpWQk5rLUpMd1djRzV1anh4R3pyeE5sTUVBNWlibGdtY0dTUlIzbkk2WjhvcW95WXBIOXJBblBKOV9IOEhaS0JwYVNzQnQ0UDVpWnJGMU1kYjJtNlJsLTBwME9rZGk5RzE4dm42T3FyZXQ0a1ZMZTB3cFpPY3dWZ19GcXdNZ0V5QnJGM3IyT3NCMnpwdkZMYzhLUjlQblVkYnRFRXp0WmFaM2xpQXMtckd4NV85VEhPdGNkNm9tRVEtcnN0d0x2UXk4UlY1dWRjcjExZlRVZmYtZmF4Tm41RXZVMktpRk1ZRVJ6TklqM2x4MUpKczhpLUo3S05LU0pkVnM4Tk04M0JGR0ZRX0hzWkVSNGZBekRYeVRSYjFXTF9lOTZDUlFyWWwyWnU0b3daS2labVpYemVCN0llQ0o0TTRDX0hOQ2NTbmx0ZVFWWFVFRElHWndFaG9tWmZiVnV6aUxmMEZwemtDTTBiV3RoUU9rakhRc2duekQwdE82aGE4SDhRYUMteU14RmE1V0FmZTRSaWRyenhhb01WNEFWcTdOanFUYmNfZXBPS1BieElUREFoaV85QnRnWVdfTzM0bHg1X1N6ZWQxaTZaLXY5eVc4OGNheldxTWJyZjdPZTk2QnM4YUtBRmd6bl9tM2hrRXAyTHVveFY4cWswYnZQWXlyMkpBZDdrU3pzTzVsZ3VWV1lZUGVHeHZHTFJnQmxfUVdwRHA1LTc2aHp2YUtVbWpGaC1GeXRjdV81RTVxbGk0R1VwMUQtWEtCTklCMThrb0Y2S1BBdW9VbDB3S3MxVVhlS2pza0VfaUZWVThSVVd2aXFGTkRGRUFLN3JEN2NkVEJUMnlBMkZabWJJWjhOaWJzc0R4Q2RBUUdLT3RHcE5JOEhqVUdrOE8wRlZiY1J1Qm9tVFN6RU04RU85WGp3TjhRQ1NtM2stcVdPT1BhclVWRXlIQ2htblY2Zkt0OTNZSk9FYWUwLS1LUjAyeHYzRXBxV2xHTEVCYWZpOVlnLW5pQ1VrYUZiSjB3YmtCVWhZVy1qVDQwc3pURHNBZ0JXN3pWOWtKSXlrenhqdzJFN0M1dHRhNnd4NjU2YWtaeF9yNVVmMnNpM3ZDVkY4Y3BEWm1EWjlQWi14d3BXV19SM2JqLXlpYmZPNlpxOERBN3YxV1NfT3pDU09QSkFzQUppMXhjMDhzUGU1UkFIaGpQdXV6bm53NmRGWjhJNG1xY3BkU2xHcm5hYmlhZ2xoZVFUQ0RzcFNMMXFsTTFIVElLSzdUY1VZOHdaRmsxeWNfblFEUmJHbWtyT3A0djQtSFFLTTAtOElpcUpDSW5CNU5lT3k1NDMyRHNaZW13VTBCNnQ5dkIzNklQelZqbHZYaERaNEcwekoxYm9VeC1ZUnV1RDl6cnFTcFJJYlIwR0V3Q3k0OXFyTXpHb1pnNlZBQXpOQVJOSkZVZHNhTDhONmk3SExXZ19ZZG1NcldDWnl1d0xiV2hzaXpMVWwxeW13R1hQYTh6ZV9TemtvZ2JSWWtqUENGbllIb1IwajRSVEJPaEJ4aTdBa1E3VlFlZ0xGS2JxanVGNV90VEtmNTZXTjY2WlQ5RVNDX1hpaG9mOEkzUmhNRW42SUk3dXFUdkYxWk4yRElBeXJrV2dlYjEybHdud3h2SWxDQjJaeHZwTUZaQUJEazZ1VEQtZ1VDUndYRU1feDh6TUdRSG1hdmV3aXlSRjM3SHktd1o2ZVFvLXNIYVgwY2E2UlRmdDdVOHNMaWFOdFNjdHVBNEtBU3dyYzJLaW1LWXhzSWZQY3BnaVQxZjh4NXlEa01peFVzUkdoWmNBc0Rmamh1YkJyWkRXdTFYNzVldUNXUlVvZHN1cEVMU0pXaGVhUEZIRW5GZHJtempUQzdqYURYMGV1OGhJdVB1ZGU5em53R1VQNXRBUEd2dUl4SmRVRHhkUWhPMV9FQm5wWU1mcldsMDJHdlQxZWM0aHFnbkV2QzE5Q2dvdHlMX3FiNUFTMUNHZG1lU1lNUjZFZ3Q4ZlJWamRmZHhjRWllZXBBNjVhZmxHTUJWUHlmd0hrZVJPOVJKT0YzVUlScVNrWmh4anZWYmNuYlc1ZjBWTzNyWEIwaEIzdW5mOE9oNVdJdXdJa3NnYU1DRDNaUVRzc0xXSlNzNUhFaXdpakVLNjNrZXF6b2dYRmhSMVVrdXNZcHk5RDlDcTFsSFhfSkZTemV3MC1WU25xVE11TVNmYUd6cnV3YURTRHM0V3pTcnlSaXEtYzI0N1dGR25UVWRNRmtYaUtnMVVPcFFsd0RvbXF1allkaVJ3ZFFnMENXLWpqMldiZ3YyaTVWY3ZJUXlFNXZqMjFtVzhNYXl4czJCdGhyT0N4QnRMSXBlSFJaOFR3Q3JrLXNqeG5FWGJVNUlXa0dMMXJIOGZUc2Vqb2lRazRNX1dDbkRnb0p0M1Zxd3VKRU5KWk8tZHdjaTdwZmxwSVQzMnlWVFFybkxhTUo3RWxpamdEMEtCWGNHVkJ0Vl8xblppNlJhNUNqTTNuek01TFZNUWJMQ2VRbGRoV0V4dGxTZnpKSHliMFAzNXFXblV4WW82M3g3Vm1yVUdZY1VzdjlsLUF3QnhibFdhN19CaDZfRGplRGstTFJkU2M4MVFXY25hMjF3NlBvYXd3cUNhQkxZajJrZmRBWEM1Wm9XWkNaT3V6a2UweHA3YU4wS2Nra0EyVmJ2NHNXVGc0eUtWOUdSQzAxY2xhQ0tnNHdDLUdHUzI5SUVRUmJITDR3dlhIdFpnUHVzSVo3eDJpTGFkYmlmajBiaXZMS1BMSkJZNUw5dmUzclNZNEJ6LXZtNHN6d0RuVmt6czBHQjRCOXhNRlVhblJlcFdtQ2NJVm1LUXZTNVhyZ2M0c1BPRmtMZ2p0eGNsQ3NpSHlxdDNLX0NUVnNQVUN2eTluM19PdkRHZklnWVVTLWxaYXdZaWFYaGkxSHVReUNyLWFyNl9Nc01RZzhXQm5RVG5OTzBuamo0VjduaGVidWZxd1NWQXRfNHpidUdnUWx1eUZGdXVjUUdFQjBhVVhVX1dlOTZDZkJPNmtvRjdtVFZRcnFta2pJS0V6UW1HSDE0cDdoYXRiYmU3Q3c2cnVXS1RfME0tM1EyUWVFNHl2aURaTEtwNUN2RXZVUUZ2Sl9GaU9YN0ktWnFMZXhKRkpZR2pHbEFkb1lrS1VldnBKZTlNR0c1VU1BUDBEN0t1VkxLNFdYNmtlQ28xMWlWQjcxQXlQcmdVTGxhOGxxSTRlZXJQNVpIWExlZnNHU2VPWEU2N0VZUEhNY0VaWE9vaEhTSGRmVTMxaWk1QUNURHMtM3F0c01KWG5qdWxQS3RuUEFXb3BIR2hkRTgyZ1ZnTlp2LUpocC0wY25BMTFiV2pQeFZOWmptcnYzcUpfSm5zUGFQamRXRW44aTVScG50Tkd3QTVQODg2ME53V2JGWUl3MUpxMTVFdl8xeTJoTzdRTGgtSzU3WHFwZzVoblY4Wm9YaG5KTlhKeTlBMVZvZnZ1QS1aSDR6S0lucF8tTWpVSEhxVDdxTnl3dktRczNiN0lUVzRNb2FhU2VKWFFYUW5XREtmQ01xLWwta1FiRnhXSTFYLTZab3VVM3dLSjZWWGtRbVhDNk1MbUw5QllpYk9HZGxqbkN2dUp2eDFIemJWMUpUM0lja3U1NW1IWjlZREJ4SE9BTjMzQ0FHSW1PT3pMaTBsVlZTcm9zRnd3U0JJTlNBV1l5a2hPOVdPZ0htVHNhNFY2eTN5Wl90VEJxb0FBdnRydjdMVmxMYkxsVnZEQ29ReFVVTXRVOTRlNzRiWXpJNUtQMFRram5BaEh1RmlUckxxT3UySm9ueVhFTFJva0E0aUdjT2hXdG5KUGhtWXlZUmJDTzRPajZJcUxQSUJKazh6bzd3NkwwTmV3Qk1jN1ViSWpua3JSUDNjc1RYVnY3bW55Y1F4MFljVTAydWN1UDBFbjJYX0diLUJ2RklUTktyR0RxTEZnTEhFZFBIRzVxdEdReGpDd1RSeTZnUmVFbmVMZHJXbW1pbWU3MmJqUlZUUHlWQTJDUmxJb3RzRmozRnplRVF6bDdiWU5ZUmhkUWR1QnRldFllMlozVVRETFAxY0NSNVZFOE1wVTB2OE5LdmV5VjdnV3dvSVNTb21xdjFGblFnMUZ6bXAzMjQtLXpldjVxQXNVVVNleVVVT2YzVzR2YkZLV1hyZXRaNTZHcG51NklRRGZBdDZVNEhfdXAtLW5XYjlOV2N6MjlQYXp3QjJ0V0o4WjRGTUdPczNWbF84VkNWbWNfUE9Qa01rdFZrRW5ldUdaSFdKVXY0YjNWbzBUbWZqQ3hXdlIxaEltM3ZTU2c4czBZMGNKRzJhMkRXMkxFY21fR2JwQS1wOFo5SkR1dmMxRlBWOWlWU3NsTktHUlg2VXdNQ1JUZmR3Z0VPOVNIMHQ1UkZDWjVKWk11Z2xBNDVQYldTdU81QXJ1d3FwaExPVUxlTm5GM0x1MnRkNmFTRnY4a2FXQ1ZjNTZEaHR4ZFo3bWZvd2pzLU5KQzlfcEJrc3lsUkpWZFhJUlROSHBPZDlabHdKS1kyTzdEaVFoZTMwV2ZaWGRXQ0RBZjctSmhlZXVqUGJ6WjFwbzFqbzRKVDFJbW1GVWRRc0lZNmdOX0JMN2FqWkNtZG5uT3NBNHM5WG1BQ29VM3BQOFJOaW9UZmdyb3dlZU4xTnZWeFlrdFFKemFERDdRa2VESENVUl9xc0JnVWM0TUtZQmQ5VXpuSWZ1WVQ1Y0JoT0YzZVF5dWxyX0xGY3FGaVBMVjlnWmVNdW9JejVDMnUwR1A1aVRHczVpQWZicTFUNXJyLXhlLUhXdWNqZmRHOGxjVlczcndpN1JpalpnX2J5Wl81bmRNa1VtazNnOWttME04ZHRPM3g1TGxidG9mLWZnQUtoSFhaT2o0bVVxLXNLNHVLRV9tSjZvd0xGVDBsamNpUFhzNE15R25PcHRlcXhJRXFySWwtM2JXT2gya2k2bElqcDl2SU05NXptWTFKeDY1U29VMkFjd2RIM21ocmgzV0w4NWtWbHJ5UXcxczJjMkRkMlpNUGthSFhrUWdza0RFSU1IZlc1aXluRUcyTEZpUm5SY2d5MnBBbjZDck53OXpMYnY1eDlmV1VvTlFOYXdiSUFsN3FqYUJ2cnk4WllNYU9iNlhCRTdrblVidU1aUEtuc0dkMW5lYkRpNHFPN0hkSjUwakpfek1yYUFIOVhuRWhJXzN0SUh1Yy1oMV92RV9NUm0zOHU1b1MtYWFqWW1oZ2tSbEZ4ZUQ1Tm9QR1ROTXFDLkJOWlpXWVRCQU1UTTBDVGNBQnBSS0E"}'} + headers: {cache-control: no-cache, content-length: '43147', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:12 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name/backup, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/3d33352494c14db39d79f293db4d4cfe","kid":"https://vault10511599973b4b1da4.vault.azure.net/keys/cert-name/3d33352494c14db39d79f293db4d4cfe","sid":"https://vault10511599973b4b1da4.vault.azure.net/secrets/cert-name/3d33352494c14db39d79f293db4d4cfe","x5t":"P58y5M_Ly32q8xqMyWxJXIbDmH8","cer":"MIIDWjCCAkKgAwIBAgIQWgfyRsGoRoerT7xQuXcz+TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMjA1WhcNMjEwOTA0MjMyMjA1WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1z4czbKr1qWqD6jyPVuLP5An2Pl0K2JkVOuKtUjIPn6cCLDHALEOh+YEkAmLEapG6BWjwgDSiyIVQis33qhcMj1zUra3opgO/cmSyFfPaiJpdIXlQd1oJdAVJeY+9KqYGDh2okYCVIhiM4hKGoUgOrcCyKXffsjmzukwHwaJliMnlZjgkckhGjc6QElzfQ30n1cHMnLbmC0bLZZvDPlmUrSTVL918BLqS5Ed2XZXaV2Wy9EpJwr0PGxFZ25tVSnOS+vMZykDExPt51AxySseBRxSwPyN1iBxN+0CAkroNAZsi1IxW1BkpKYNb5crPaNKOiEV8eUBEJJluNw2wyFvDAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDSH7zp/QHmmwFCkWRNdwhlp8gOjMB0GA1UdDgQWBBQ0h+86f0B5psBQpFkTXcIZafIDozANBgkqhkiG9w0BAQsFAAOCAQEAWjgjbmuZoQ9f7La6xPHvgGMm36pa+qkexe8lKRiB1mOxipmQuisiYnPmmipYEP1qsry9lzOMqYl7F6G4MXavMfFKWOXnFz5NJZ1r0a/N0r4GFZI2l1YaD0tqYH6cKaTMpamKSmtqXMQ8tlYbdIfvAw6RxGZ9a+btUg6p5rlI5tbCjOlhlnl5tSlqBg6Ib8J09Rqlerisg3q1RFDiSzoHZTrfQu0Az9VK8rVh8xMfC404h4wmPtLfIPHIddeBxeBI09dg8eArRZy/lQfiLoJ4BQQLxMZ+3faMP3YTT9/yNBP6dcvLodySV9mzh4Ig6I8h0p9RhU3VA7JAzG/wzXd7Nw==","attributes":{"enabled":true,"nbf":1567638725,"exp":1630797725,"created":1567639325,"updated":1567639325,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639307,"updated":1567639307}},"pending":{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2417', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:12 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/cert-name, api-version=7.0, ''] +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnBaNmd5aXp6MGtjZ2ZrZHd1eXQwRElJYlMxMXotWnUwWWhTZ2ZKYkVSRWhDTExLeEkxYmNZZGltalVaV1BtNWZjMm1QX2htZzBMQjVHVm1jQVJFT3JvdkdQR2dYVWMxLVF2TzBrMUZxRW41Z3h6V0RVQ1ZkR0tTR0ZLVHJOYkQ3R1RiZUJZUVVTNWdSNTlhYl83R3psSnc0dml0eVQybVVzbFJwamN2TmRFYzN2dkVuc1RFcTZDQllINmZQVWp3a1pDRnpiRzBRYlp1VDMzM3ZGUndjQm5JMUFIUFRpbzFhU01wa0pwUGZEbE5lOEp3eWNDN2VybVp0LVh2bTRVWHRrNS12N1lvbWdrVFZfVGlBUk1CaUtnTEo5eWdoY2hYUUU0YVR3MXNzUzZiMW12WThLVjlZdUlSaWNEMFJRQ1BQU1lOYWlhX0dNM2FsaE90cXdnX0cyZy4zT3pvWDQxeU1RMVA1TXY0UVNlSWhRLkpLQVF2eklWeUVJc2NsXzRvMGF2Y05UV0hJOUNnRUJyeng0Zld1cG1PT0FaLU8tc0hDUXBWR0VzZUh3MUZWUU44Q2JLZHpNNG05aHB0NzdwZTNOMC1Xd2hNMFh4Qi1DVnBScmNKVm0ySnVvWm9JS1JsZ1N0LWpPa1RQSldBZ0JaOGtNM212dmcxbjZhYXY1RHMxOTNEdTBpUzZjNVpCTHgzRWs3NEpSS0N5cVF4ZWZVUzlEREc1R1gyUFVnODN3ajBPM1V3YnJONUlvQXMyRi1xTVFjWFRFLTZISFVmSUo3d1AtWGNWWWd0OEx2OHYxUlY2S3ZvNnR3cjdSaXhuYnlELThtSkNyYWVLTHU2QWxEOGRVMXI0NTBCMVRndWRXT3Y4QXFadm9ha21iNks1QWs4SU5oa1pTZ1ZCSTFnbUJmdjA3Zm1rVmNzcEdMYnBodGNjTlNLMVBjbUlmLWxMSUhSWTRqT01mWGtKQ1RqcDFqVXlmY1JSRjNqdVpPNDVIemZrUHF4STV3cVFLTVhuTTl0S0o0Z2FXMEZQOE13M01DZjlVQ1hLd1NiZ01CXzZsWHR4ZGRkb0ptUi1FSmVYREI0OFFIRHh1YzdCcDA4WUpEY3gyQlU1X2YybW9VUjJHdExkckQySVNZV05la0RfazN6NlVjYmlJUzVlcWlJYWtBRFlXaHc0WUxOSGdRTWl4bDVNSHJ0Q1dtR2VpdU9zQ2NOc3BrREJXeDg2LVBDYlBySm82dWtXcHN0SHFjTTcyeVVLMEsxWklUTHhWQ3Vvd1luVVgtQjhlSmlHRFB5dE13Zk9NTjBsbHJNcExYOGFDdlpKUkhtZllHTGNRdE9VX0hQMGVzVVlhbFp5MWV0bWdYVm5UTUg5a2d1dmN3QWs1N0JzaGVsQkVkaGN6N3pxMmw4eTBGY2RhZGo0UzRRbmdDOHRhWG42cnM4QnFNTDZHNHZlVnlNOUpJVmJLTDRTc3dDZXZweHR2dzl2bXRUZ3NyQl90ck54TmJuMGp3blJ5NXpoOFNGODBWdGNfbVNDSWxySE5GSkNUMk9HRTRiZ0k3Tldfa3FVT0ZBSjZWeTNkNkFROFpJeXRfRmFNbHJnb3hmUENVYzFRdEdna2hUOG5aUGZjU3E0aXh2aGxpWEs3SlUwV3l4S213WWVjZDFkNFBnMkxVY0wwR0pVQkVoZHNsR2F2NmFpd1pJVHVTWkUydUJvTjROTWtTNmV2QnYyWHNqS3pxSnJrM3ZOdWEwZ09meWNqS0tacm5LWHlRZFdkbkRNMEwzT1NxNlJ0TG80Vi0wTDBQdDNQczU4NWNGdnlwbno2aGtiV043RDFDX1lrUVNDM21hOG1HYzlpU0txUkd6Q3FKYXV0d0FDRURLMWl4Q0Noc01aQWdKN0JONUdzMXpISno5V0RKX0JZYi1sWUVBOVluYy1XWm0xTDE2ckFDQmVxaG1qbUU4LTkydm5ZZ1BGYlBxcGs4bkhnQ2ozQjlrU0ZCNVV2ZERjWmxzYURMdXpwdEVqUmliZFdFcFRWNm80NEtCTEN5X2VpR09vMy1zbWNHalB4RzZjWkdaeUgxTVo4cjhoZVNqYkNoU2o1UDBBbHcxUVhxRWg5N3NQdTdDSTUzVE1QYmtmb1Rab0JMMER1a3hDbUdvODdaM1pyVGo5aG5pM1ZWeGhDOXRWLTZEMzVMUll1ZzFDUThwUVBndkh4Z3ZiQTNBd0kyZmdxZnRKUlNGY3BjWlpvTlB6ckVnLVlwT1dFd0VIRGxrUnhwQ09MVkxsNlU5MWtUXzhmX1MzY3paNEZUUThhc1hocHE2ZFpOSVZzUTB3S1Y5Tm42aG4yeFZ2empvbXVkMUtYYk9uUlFoOW1zMGpjZDlhd216RzV6TERxSm44Z1JZTHUwQlMwTVpyTnh5SlJLNVg0N2VYSFROZW1sNmJ1YW1tSC1hV0FpNDVpSkxLVk02ckpYaEFMUmVjQzBfNmhBSmJGdjhpSUZaNUIyNTVrYnNLV2JvQUdEU3BXZF9lR3RBNUt6cS1sQmtUblRPSkVmOEVBazJhLU1JdnpxMFVQMjREcHdlVzBTMnNXSGhfY2VkREZWdW5nQkYxcUJtQ3ZtbkJnYUFPb0ZBX0UzaHoteDZOTGJhbjBPMExQMjlCQ0E5MU92UG9DeHphRnhlYUF4SzZNazBxRDJ4NnlYUDVPX1FYYUZoVUlpRHNCVDByS04yS1FGc3NsWFJ4bGVMN1pJLUtVbnpXWHExTzJVWXJkelc3VUpJLVdmNFR2aTVTOFhiZUJkV3MxOGVINUZoS3gxU3ltZDVzUzRMbjBWS2tZa3gwVXhEMkVFWjhRU2hyNmN4NjRpUmFmMEVlYVpUTXFHUVhpMlRqbTFoZHRjZmY3ZFNmM0UxWDh6bXp3a0E2ZzlUTXEzbXdHZWJGSDdDckxzbWFwTUxNcnh5YzdVVG5MWFBCUnpxQk11dF9aMko0dWRyTVpNRnFETjl2VnVnUWttQm5EeDZqV3oxNldyX25CM1hFSUx6WWtfdXFrU2hPQ0VpQm5wcEtyanREbWo4bklhSklUbEJKeFhSUUpIMHhLZG50RWFsczdVRDRjWW1FeUNldEJqVnhpNzFjT1lMclprWHhaWmk2VnNBbVhmdlN4WmNvS2N6T2ROZUtUVW9Yc1F4d1BKVEs2b2dsN0w4bzV5Rl9CMVRUU0lMS01CQy1ONEEtYi1DQXdZdEd4aEpjeFBKeXZ1bFRsRnhqTndDVC02c0plX3pheW41U1VhNm5RMjU4TDdaX0lTcVlTeFBuZjFNeFBsZWs1ZlJSNTUxVml4bV9OeFpJdWdTdXpLVl9mX3RMN2FnR0NOZk9hM19iYk5FM0VDLTdORGQxWmhSTktkZ1g2aEl2QWRhN0ZCcjl2blJJWnc3YmVuREN0ZE1IbkMwMHpua2lRY3g3MW4xUWVwR29vQU8zRmI2SFhjSFhCUXc5U3VnZzAtME5OOWtTalFHQXN0M2xwbUhtd2gxZ05qWURtekIzMlVURGQ5RWdVNFJZelZjbFRncEJFRTZqX21sV3VPem0wd1JMMndObURWN2hSSkVqRnJuTnI2Sy16ZnREamVaWlZCcXc5QTFqUk43bXBJTTNVaktPMU9zcV9MejBMdEYwQmllbHRONW9wQS1jZC1ZcmFGOXhidWlzV2NtLWNISWJndkhuV0VTM3lxZ2pkVVpYb0pqNWVTa3VPdFJDR1dFSGM0ME9UVzBvQnVtOEc1YVRtM2lIemUtTXlPRmliMnFKTXl5cDJCWHlNNElBczVtc0dEbTFqOUhOT0h0T0dCMGkxbEpuQ3JPQ3lzNXpweUtnOXpXb2dVMmVVMk9IWVcwRHdUbXZqWnZnRXEwc1BOaEh1c0c0bVY2YVVXUFhXdXNLU2JGZmRoTEF2YjBJWjJDcDdPcHNsQ1NhZmNQajBCNVAtN01RT1llcHVWZU1mZnVaZmhkbEtlanc1cmt2NHM5UTJRbVhFZm5XSm9oQjlaczhSaVNqcW5jSmwwSWowYjBMV2NLN1ZKQlRVb3hIMFNiQzFhN3o0dEtFdC15VjBYR190MmhGRVhCajZhV2RjUllDOTBsd3pSRThHVkxCeml6d2pQVXIzUDNrQk5aVFI4eHU0ZEp0amJjMDBfbGx6aGR0STBCRmF1ZXhIcHVRSEJqaWwtdi1sclBpQm1sZGloWHUtWUFwM1pBTzRuQklZbHVDRzg3NF9yaDdsZzhMUG1MZml5d2xMc2RFeTY0NWVBSDRIblZ2TzF6ajEwTmNFeVU3LW9XUUhtNUZIajhSbkQ1YmdUUy1MTk1DdWlLMzhyTU1fckN6QVR2amVucWt4cEZDaU5SMm1NNzlZVFgtR1dkMHA1S1pkZ1F2eUtoWVQ1UDluczdKZlBIT0VLa2xvN1AtWnNzS2EzWWVJSFJDd3F3eWVrcFp1MmMyb1JCYXZEVTFMS0RRQ2VlNkcySFhERFlaMlJQS3kzN2hJbHdrdEdLTVQ4enJ1cTctck9CWjYzQ2lGM1Q0X0w3a2NESFN0SkZ5NjBCNHM0V2NTeWowdG1sdWJjQXhHTFRTRm0xSGFYNms4Ym45NWJNcGI1QWFCTFBRamlPU1NobmU5MVZsVV9WdW13b1V6eXEzRjRlYmlFbElDM0RxZ1NRYkx0WHdqS2xKdU5md011eTBzc3d3cjA4aHdXa1c2Zl9LSU9RT3lwXzJvdUlCdkhNVk9URU9DUEZCVWFGSTdYbEdRV1FJS01qWnBGeUZHUDBBRXRSamkyNl9SenpYU2xnWnAtMHJpSlJpRlVENEtpRms5eVd5cWo4Vmp4a2dzb1h3VHlkOXE1eV9UUGxPb3JHX0xDRXpZQ0Q1bS1OaWZ0cTJjTGlhWG9kaExObzlpUXdFSV9OX3VwU0hwRDZaS2xkaHFWUGJDVGF6bFJwOGZCeUF2SVNFY3ZWc3V5ME9mTWE0bkQxMFpoOGhrakdZQ1Y0eTBha2NJbk4yeXM2MzRuU0hmajVpRVE5U2k4RVlkclpwVmNEQVlGX3BjUDRsa0J6Y19xTmNUSWMwQlZRVjE5YWpWbHRtN2F6WEIzLWJFbS1FZEI4MV91aVZVLVJsc01sRTJzOEFmOHY0eWZ3WEJqeGRJVXNjS1haWTJEQnd3U2FNUXNENXNnLTIyVkFUeEowcVR2UnBEVTF3N29IZVdrb2dETGNlYUg1OW1iUEZYdnY2SFQ3X3NreG5sVl9xRk90WHpvM0UxdXl6SWFJWlJtTm91aTVxR01YQ1ZQQXNaNkppcC1nb1JzSHJXX2VxbjMwQ3poMUdTVTZwem1OYUZRX2FrZ1BmLWt0MVJINnZEWEpQTmtnVEZFMmRsX010QXk2bGZlX3RrVk1FT0tpd0J5RHBIbWdweFpxRDZlOWh2YUg5TjJBS0xJQjhzTEJlSmRfSnY3cWtEU0lvQWlVQzg4S1JIZktjVVZKdkluSVFzVE1Ud0R5SUM1WEFIaXJLTXNxd3I1SG5MVmxaTUlYTU1KT0t0TUIwV1RBQUllYXlPWnJ2WUwzaGg5a19qRGF6VDBKMjNRem9ZN1cyekgzWW9QUkE4ZVZNQVRkQndEVnRnbU12ZkQ2RUZ6YkM0aTJWeTd5R2JqNk9SUnlIYlloV3huZ3FFSkNiT3V0bHZLWVVXQWVEWXYtYnBLelVxeXpSNGxGeDNzei1QNXY0eGgyeXVadmZFd3o2aTVVTy1hVnBXSy1ONGx0YlIzV1N3SEk1SXNOUFRycTRWYVByZm52QmQ4THpmY3BzaXo3c09VcExVSWRDYzJhdURCMVFNSExDQlVkWjZsWkVQdGZUeC15QXRyeUJhR3FDTkhUdGdZUmNfbkpRNkl0Wmw2V3N4WVlzNnFHRVVqS1FXaFVEOVFYaFRJUVg4YlBSTVpMX3lwZk15TjdVcm5sLVlKdEZWQS1DajR0ZV80VHF4OE5TM2JkZlNMd0pnaG9FalR4cmZHVTNfa0RLQU10UUJsQUNHbnlrRDB5empQWHU3ZlVHcUFJOU00eUFkVjVveG5fQ2s4clpzZk1HcXlSYnN2emczVjNhZmI2ZzEzVFQ4ZS12VnFwVEU3UVZaLWk0Q1NaYUF0UjlEcVItVkpNMlk5QkZGTzVJeERmMG5WTUJZUG1yWUtpMVF1aWxHbENyYnlUeDJqQmFaY19kVkxKTzZEdnhMWmVxN3JCSTRCWjh3NVFBNXNwcmdnMnV1UzhXYkRseHpBYVZ6bEgxUnhYOElGeGV2aWU1dGtHYlZNYkRiVmRHWnMtVG1xeWhDeHQ1QTFCX2hCb0ltX2lXYmNiZ2Ftbkc1SXJDbUZFWkFOT0dCUTQwOEhSaVl4Rm45MENxRFZNdEdkMDdKdmR3SEtCbER5UXl4TFEzTHhGU3FJVWwtcTFxSFVJbWVxVHJ5VzZ0b09neFBTMlJIT1J6TzlJY3VSX3pTdEFRZTRyYU0xelFRcUJ2Z01GWWxBalR6aE4yOHhVNUpaY1YtUVdvZi1OdV9GdGdxeFVVUmJnV19sQ3FINkVmUkRYRXVCTFdKNG12WlZ2NU5XZUlSbmZHLVh3Q29VWGczUGQ1eVVMc0tlcGs3RkxVNlhvSDFhLXJ0VEtPSzJJSGhkUU8weWluanV3YkVmeG5kQjE0V1NseHJvTkNwMmVBTk90bDNJUmIxVS0zR25QTXVGNUQwcE1yZDJBVU16MEFUYm4yVGlBWXFFeWhfTWZUT19FNEc3WjdCX0tVa0VzTkwzOHFEMEgxM0xuQzVDaEFkcVkwZHA5d0ZNTXdZNkl5c0JXbERRWlFCdjFKaXM4Rl8tdG81ZFJPV0o2VFBLb3V5S1NPMll1VGJkSVhrTmtNNEFHanRUQXhDVGNTUGtUSWVlTWNuT3AxcUhpRFNISUhfSFVuRDFsODlrZ2tENERCM0JZVDdQRElWdEVRVXo5d0hmR3EzQS10TlJ2YnFMNHZSaWF6YXpkUUd4akItYzVLdWVLMUtFWDRkUWFaSWFzckhMVFF0VDh4Z3FVVXdJZjhnd0FQdV9yaC10Y2JhYTVGTFJBWndWS1RzTzdXVVNROS16ZEJMVVg5MjJJeV9SelBuWW5DTVpEXy1halFaVEYzN0NZN0VpMTFCLXFqbW5uWllsNHJsZXlPQ2phU2R3Uk93NUpNRWdUc0xNOTl1T0pzRHFQV2IxeFhVY2h0U3lfUWNQMVA0ZEtxVGY5OWdrZjJJaU40bENZT0JqRlA3d3pVQmw3TmZ4N3llbmhJZld3MkhjdmRqZVNkS2VkVU5wU3VVVmk2WUh4WDZyN0pTcjhjS0lJajdDS3BuNy1aVnk3WHkyM3E1d3JXc05OeVZESjZhSDV3QVhLLWVDeHp4d2VHb0hyRzh1MTl2SUJPSVZrOUxtTmIxVFpPbnhGQkNvdGhraFhqSGcyTVBaeVZzRVpEemsyTDhCci1RMXhJSEx0eW9yRVBMWXFYdTRnMXg2TWJjZzlyLXlaSFZtUkJ3c1pmcWRTbGJfbTZXUUozcnB4dlUzY2VOLXB2a21Ib1NiOGg1azhEM0hNV3dfbHRkaDdvdWppc1owa21nay1meHJWUEc1UHgtWFBCYV9leEY5RHFISTJTT3FlZDJfWS1BXzIwd0xtRmxlT082SXI1Y2p6T0RZaHJVbHNPU29MZ0ViUjNKdEtRcHFaRlUtUFlrdTRKYXVqcDZlZHQ2bmk3LTdGY1RYbkpxTHdaQmdYSDhhZ3JEYTB4c3Zlc2FsaDhMWmY4SUt4N19fWFdKX2Z4S21NOXpLNU5zZm5PanhSNWlVejFkMlZRSXBoSUpRVGNuZGNnUkphWjg5U3lLcTMtb2NzWDBxR0w0MU1Nem9Sb2RPYXpyY0lNaUZvTFFfOUQ5UUJsTnR6eUN2cmltWVpTLXZsU3R3T1pxRnZ1RGVHb2xBR29wSjR4ZDhtUmQ4b1NZUWFrLUpUX1M0VHE3bm1UQ3dvLTNSVGpUdUg4cTR2VTM4cm9rQ3JvR0trdkdXbTd3eDkyQTQ3X2xKdG9rSlVqQUs0OE5IMUhtUE01bkpRMklicHpLSlVuZzRyT25sc1RMNVVZa1ZYbC01S2hzcWVWb1VUaEZDQlFaUTVhU0ttSnEwbjR1VHhtcC1BLVlxSXhFejRfWC1mS1pwWUtyNFNBb0VYamcwbGlMVnhWcHczMWswNEFrZk5xM3ptQllBMzdwMnpUY3M4Y1h0LS1TcENYWGozQ1VLWVVwV3RPV0VKbXFCUHlYLTJHRXN6M0dRaEJCYWJWdFNTMVJIb3ZNUXEwYlpxN3hJOTFuNGNXcnh1bjBqODN1SXc3TkVQbkJnZUViQzR2VUxrMDJtcVFHR0hCMWZLbFpSaEV1ZWNENXFuNW1tUGVjTnM0azZXWm0xUGVPQ3JBNmgzN1BlamtGVHlkeXdYTWV5c2hPUGlXV29WN2xEalZTNW82bEQtSExTU2x3eUhPdWljaG9RVTFwVzhUeHlMa3ptWkFaSnJiZExIZno5UGhueEFCb2hwYkltOUdodnZCRVpnMi1aemQydFhCWmwxSV9wa05JeWlYeE03YjJkOHNab0diZ0Y2MjBWVnM3cnVUNGhjSHNjNEhCNWdEbE01T3dwNWdvOUhkbWE1bkxMUk84LTM5bFJCWnJITm1OV195d1k1R3FOSk1kd3FFZURsT0IxSUM3S2lZN0NJdnIyU0dST1AtSk1ZSmFpeGRFLUJVUkk3dWdsRFpZLXNCX0VlcVdjZkNDNlk3LXdpUEthX3BPVTNBU2ZheUxqQnJMSWo0NlJSLUZvWEVJRi0tWVVweFoyd3RKOWdGejVUenlXYlNmN3dmWG1ENjNjSXhWcnlvQTctSFFlZE40VVZldTZLaUxuQTZPMkV6WUNlaU9ObVlLaS1UT00zM3lXeHlNeGEtbDRKU2RYa21Sb0xZSTBENmc4aEtWM1VjbFpiWlV0MzhPNzJtbXdYM1Vodm5kNTVYUFZld0Z6UjVhT3I5bjFUMHVxN2pjWmdhaklvVnJMWGQ4S21mT2ktM2Vhb2FBM2pzMlJlWXFOdXhHS0szcmR1V1B3VGZMM3ZDLWl5VnFTejNTMll0N2FHaGhsbWtoUF9EdEJEd09ic2JobWlxb0N6blFnRG5zNTBDMFNVbnZfZHFaM2NJY29XdEtoRjM0cTVLSGZ0YkhkRkRBeGFoZEhFWlNtZ1owUGg4STA5MkZydURPNGd4aDBnWi12dnRrUjBmZ21GS3VpU1RoYlhEWUlNbkprMm1YTVNIRmI5elUxWGRBX29LdGk5cGRrd0F3b0Q5LTY0N202Z0xBRXR2aFRXVGliYzZPMUZ0dlczZEZvWDNPNHBRYWhNMTltelUwLTgxdjUxTGFBMWRyWjdvcHpXc19ianhUYmlHRl9Eb0FRS3R6REtPQUFqUFZ4QXVGbGtFVFpJdlFtMnZyUzBXbDJCLVduMVBFR1hVdFY1eHlNRkVMNzBNNUFLR0lIZzNnT2lFWC1ZNG1vdDN2NlBBYkE1VjNxZ3lBenhEMTJRUG50MGVWcTZBczM4SzFsVldjWFhSaU5RbUpFTWk3SENzUUtfRFZpMTRwamNJWkRXek5ndHBTd1lQNjZHMFpoRmlFcVhLQldVX3phZ3hwem9GTVZwNXV1dU5Ta2hDUFdKZGJKWDJRVldqNVdWRERUbkcwa3JCVEdoRkhxbGhBWXZpR0xTNDR5b00tMzVLcHc3ZWMxd2hDRDV2ekVudVpLc3ZhSkEtbGRCbDJaZE53R2tCLVFMa3R6WmYyZW83UGxMVEpqeTNkS1BSTWEzVzhXYnR0MTJZSjVoaGNDNlpmZDk2VjBxUnQ0dTl4MkdGSFJUajg2dzZUUFY3ZkltNkhrOEVEc1Jzb3M1VEFsbFRmX0NWMlNCMUZWT1Z1WTEyNGVGVE1TMkpJczktVnBqd1JkUmd3NHJVWkctWWQyaHhwaF9tX0hTUUYyUTJwMWRHNkNzYkJJWVBrWVdtYVlFN190aF9GVkFUQ1o4MUpTdU1SVUVDLUtyS1IxeVBDaFI4a3hYLWEyem1LWGtPbXZCLUNwYk1zM2FfVjhma0I4LWhNblF5YTlTQ0I3NGE2S3NqX1hvU2I3VzVjSnhIWnk2WlVQVG9GLV9SamRKeUhVZ0t3QmtiV090dGVEb0lZajEtb3ZwUGxmQkI2ajF1QTd4Tkd4NEkyWV8wcjJTQ0M4QUxNS3NNeDJCVUxBOVdpVmprWWs4WHJYYkNETDBkNF95M2hCVElSOWh3T2dMd0M0REl1OWNyWlpyXzVpTkdOUkVMQ1RUMlpWSWJJUGNFTDd1ZkdGR0gtWDIyeFdicGlMTm9lckJXQm51bEZ4WkhLZTJDdnUtbWJ0SWFJeHRmODNqaWJ1YXFoS01GUUVBOTE0eGdQN0Nla0FvZ1dKRmJ1TnZOSDRfVm5OWVdTQi1VelhXWWR2YVhPaGR0YklFSzllTDJDUy1rcVhLczExQ0lGRG5Mc09VNnk0LU0yYWFhODhSTENHRXJwdGJBZ2g3dzNMU3dxMTdRSURrZ0tNa3lIaDN4V05EUmZCZDJHRWFjb1BSekJnMjlBUXp1aVF5MW9IUVcyRlozTDgyRzFYem1ZQjZ1RTZ1Z1JqMWJaY1Q0bllzU3RRQmpnYkdiOFN2SlpmdjRKZjdRd3BLbWdlMlhYSG9nazc2aVdPbkVRSGZTUmR4aXdfcVdEZ1lZWHJ3ZzlBUmZpMXVFcmpIbG9tVEpMTW4zUlpKTkI4M2xoc09kNkFzSmloMXlqTmZ1VXhLbkxsY04wRUt0VU1VUWdETmREME04eVBUUDY1WHg1VXpxOGpiQ2p2T3BPdFFKQzNIQ3NlRDZfN2VfMnU4MExZRV9uSWJaWi1CdEVmOE40SEJXVmZHTU0xc3dSY1M4R01JQi1lLWxTakJ1bl9naTVQdl9RSWQwSDJ3blNOaFhlcG01SkdZWUlxRUpZOFBuMWx2NFBlOWtNY21aNkwxYjBzY09kMnktaFhqZDVYNzNlT1F2TUZ3bHBjd1l4dFRfcnB4UnE4MXRsR0JYYkc1eHZJZWxfejQtMmFwSTZqV21LNm1wNzVXblluTnJPalU3TzZVMlZqSkUtS0NraFA5Y0Y3YWZ4QnQwdUlVOWpOaXFDbmdtX0NvSzM2UWxiZThtNEJGYlJWanZ1VGR5SEhZSFJHVmNvLTRlVHpkY0NtcWRkNkxpcmRVSTZyNXhleTFwRndLSzY1RU5hYnlVOW9pakM4Zm95dlQ0UkJ3azVqcUtHZWJwQnhyemUza3RGWDZ3RjVWQURoRWlrTHpWTEN6azNFbjlYbHpmZHE2anBtUEVLcGRXanVsNGdWemVDdnJMYkg4cGFpUEdRMHl4UTk0NDB3ZGFRNm50RGlOT1pVUGZQQWdiTmRtZE5QQmpZVzFVS3U1ZFJFWmZRQkJGcFlEc3FrN3RkSUJGNGQtd0lPRU9LOUJHejdNREMxQm9uMEtESkYwdEk2ZzdPQUtlTkNaMnQ0dGNKb1ZIVm5ack5pVWJENGVFR2F4RUJ0cFZteDkxLXp3YXdJQ2dxSXFBaXZZWGJkcnNuS2QycEZqTHNtc0JrSEZCVGhxM2FTWkgtc2lVT21BYjBxcG1ndTJrZmN6TVh0blh1MHBGcE9BQ0lUdTlaN3c0eEVnWnUySDdZN19SbGV6WVB6bWFuekYwZ09yVGxaVjlOVUlaVG5tUjdsLXc5cmptM2xERE5tYWNILVMwT1QwODlxR1RzTzhGRnA5LU9IVWItX2dsY0dEX2tJd3ZfMWl6aHB3MzJ2VEIwU1BCU25PY05GQWRia0xzU01jbDZjc1l4amNLdXZ1M1JxWHVFU2ZPbkJOQXA0WWJFbXR2RUR4M2FGOGp3R1VUbkRkSUNPUGdDMXdZOVdRRXhnNDVWdEJQTlEyWXFaaDdZMm5tWUJwT19UMWUwNUk1N3NabzdTQkZpYTIxaEhQZjdSYnJnZmY0bnFHVDladndRNEhiSUhLN1pfMEd3Y2xnRHdMZklJTVh2Y3lYbm9sV1NJUEpwOHRGWUFoM2dVMWxqYUo5X1BJcU04Z2RMZ29ZSGVqOXlKckFuRlFWZ0xnS3hFRW11Wm1PUGtfU215el9zdXVHRUFuQTNsdUtCUDNNRm1qU0NIcmdqenJOcVloWEh0TWRTQlRMLVdRbkQwSjdRVWdhM2drcklKVm5oV1doaXE0Zi1DcWdUVmlZYTRJMFB6Z2QyMEtHOUYxRkVyUVVtNnZrSzBlcjQwcW93VUZlaWY5Y3NmaUI4aktvY09oQ2NoTU0zNFd5U1gxQnNWd3lvV0pkTWpNa05rbE9KRzdTVGs2WEtwZ2JBSHl6ZVlXRVhyYUZXdlRhby1zSjVmdkRJdG1NVVpTYU9VTHM1MjlPNElfQXhhcHhISmJNdk1iLVJ3WDNsR1N2TjlzM0xXOXVoRXF2UkFjakdRSnVHLTM2WWZUMXVQazRnVmlLQUwtNjY5WWF2VEVSMVZkTGp3UWdDd0w3dWNVSkVFeVdlNWtPa0tkQlB2UGItX2ktQkR5WE8zQmctNndwLU5hRW9lRnpnSXRuVXlrc19rOHFUYjV0ZElGdlZ2SEQ0SjA2aS1ZSzhXdmtBb2R5cWJvMGd6aDZCMVZOUU5RMVVLRFk2U1M4Zk5ZQmpQdklmR3RKQTE2ZmVrUFZLZTJONlBKSlphN2V6bXN3UVBFOGl2Z2QybmU2VW5PZUx2YTQzMjNuckhCdDdQLXNIaUZIUWdwY0YwazZXdDNKVGtoQVR1RExEYnNGZWZwVlBHWE13NnlESTJnOTRFUThiRkZRbmpzakFIenR5OTZqRkI3Sk00aDRPdklFSHJvR2Frc2dCam44MzdMX0s0MGs0VVU5bnJpZmtyaTA5ZDYyUDhHaFlTMDYxaE1zejdyeG9zQldoTDFSdEpwUDY1RGlYSTBZX1AwUzAzWUJZU0Y5SmZlSVlwUVpOSmFtcjlHdE1WMGZyZVJ5LUhBMG50d3VFT205X0h4T1VRaUJGUjg2bkVxTlhjbHRNRlNoQW1OS0g3UnJuV3dNLTdCSW1ad3k4dlRTYmJzYWgwRGJoZFNKSGMzcnplTXl5QjhiTEN1TkpMeXMydWRfaTBWY1pjM0xrN1FBc2lhWnVTNG1rZVB4emxzTUlrSjN5QjFMMGlaanN2TWdadm4wZ0pna2RlVTBFeVVMd21TM0RZMHVNS0UtcUFZNmlrNnZrdU41bXd4N0lvbVdwZnBCTEpMaW04eTVHSGxhc2YzNDNEcWdtV2pVVzE4cUlfSUZMZUc1MUJza29yOHc2Q2JQOEViOVBoTjVwV0kxWlpZeXNmNkZqeVlyZXhCVHpabzhtT2hmX25LUnF5aE9jZWdlSG9YSTk2VFphWUdqSzJfR1hLRlhaNkZnNlUzMERpM05VbEZ0VnRqZVY1ZFh0SmxScmpoUHM5YW9zcTJ4bVBmVHRtQTQ2TzFsUjM0ZTEzM3AxV3RxSC1UQzRrSm45MGRxM1VRajN1XzRZZUU2S2ZBLUV0aXJZYTdZSVVpTkFVcFdTSjNjOE45NER6SHFQbTQzTzZsa3dlWFRKM0pxMHRoWlhjWkNxNmdpMDh0RFFjdDVZblZCRlNYTDQzTkh4cFg3dkU2eXo3OWNfamtzREZPX2J3NllwRjhWRHZ6MzR3ak5Vd2ZfTzVNbWF4UEJucWZoLWpUdHhtVW1zZllZS3Rpb3JEa2F2d3B6TzlmWi1pSTBvX3oySzVYUHlUNXZfVU5XaUwzbkJ6OTU4M2RsLUF4T3U2TXRyaFBKUUE3ZUxXOTQyVEx2X0g4UUhyRnZ5bW0wRmtpa1BJd3dmU2J6VHZBNnltVE03dXZ2S3NuNGxyb3IxRUtZT3Y1MHFCcHY2U2ktNUxsakZUMDc2WUZ6NEhUWnVGRkdYVDQwRU1fX0pRcDNmSkE0cXE0OUFUbTFnZW9EVC1CRGNucGFUVEtvNDJ5aVdhZEZBR1pycldKM3NsVHRzVkJzaklwbUo2dU1XNnJxV2hTcUMyOWdoclpmdTZTalBKRUEwdC1HVlZoRWFMaXZqTDNfYl83d1Awcm1UZTZJM3BHWkxlcHF1cjdrRmFfeFlRZVdPWlF4TlgtZXVwRzZDeGlkcHBZeUNtbk5UMkI3QjJKQlVWc29oNThOS3FQTzVpQ3hwaHFvVzRickxWSlBtQXN4RWZfRm9OQlZfT0gzaGZzMXlKMXlLb2g4SWdBRktsdm5aV2RGRk5ValhaWk5VSDczQVBaYXBLak1hekdlQzMwYkVTM0RiWUxBZmF1SE9QX2hKN3pGRTliYmpDUWZhSXRqZGhiMm83blVJVnZVRENUVG82QklidzBtYkFUZGV3NUJoTmRfelI0ekVLeTZZMFR0b04wTUFsQjNXT3NObUctZzVGaXVoMXk4eGhiT3gxR3czcFlYRllrVHB6YTlFVndpWGsya3o4ZU1sVjl3Z1ViNDNFUzh5RWItNTM4dnhhd3d1bGdHclpxYjlFMThHMmhrQjlXb0hrUjhoREVQY3U3RjNvbGdGSnZsaloxUjlGOEVOREZXdWIzWUJLUHJCYUREMncxUlEzM2ptak1CSEFCSE82V3lvSHVzXzA2cTVfd3BjU3FwT0xOVjNCLXdyWU9rZWpyZkM0N0pPUFpLdkM4U1JLTTBXVTJvci1OelUxa0tvcWtvQi1JRUpXZXpyQkU4U0c5NDZwTzhSX3FmVnlYZ3ZJOHUwLWVyZ1oyaUF2cS1CN1dGZDdxMmJWY3ZDclRFRHUyMzJ0azlkOUdOSjdFTTBiQ2x1NVNLVVEwUnJkM3hBSjIxSXhSU1o2RU9TY09TaDQ5MEYzWG9FcWt4ak9VVXJSdDVoMFFUcHRCUnkwaU1ZSlpCYzJpbld0bVF0VVlrOXRveFpwTFRkLUZMeXpvSzFKTTgtbWxUNFJJTkRPNndsZTEwaXJxYnZhMDR0Y3B3SjEyTGJyaUtoN2RKRmJFTVB4N1lZT1RsOXdwakhjZzdsWVNVblpKQW9TdFhheXZjQUdaZHQ0WncycnVhRGdyYkdOZjhfdVZGcy1WbmczYVNhMFprYzJqMkh5N29pQzFJeV84M3dUMXF4Vk9BSXhSeThsc2lFbkdQNFEwZzdxeTdNWmtKTGJmelZzWVRDVDRTN0Z1WVlzX1lWaENHM2ExWjdQZ2VTMmlaYXpzVC0wNWN2SjUwYnVVUXk2WGx4S2l1SGpMSzNXdUZmYlhXVlc0OGNwaXFIWTFmU1RIVUVZRlMyU1Zvb09SSWkwMmtuRElHTEFqeHpINWNDRXo3UFVuVjZFdXM4bTBjTHhtay01eGtQRHBXSWEwVXd1RHVQZlBrU1pJQXpDSEkwNTN4RjA2aW5vN2FCdy10ek5sY1BVd290WW5wdzN4WnNDUi1odFNaZ1JQRnJxd2dNcEhydmg1eGZmSUN4ZEZ1RlBES3c0UVFkTGtCbVp6eUMwR0lSa295NW45SnBKYzR6ZFc3bmxHVmVMeC1XZnJBWGVGaHFMQUg0c0xqejlVeUJIeXdPQ1B6ZGlQQkhSOV9sUlpZSzlVdXYxZ3ZMaWJqOWl6dWthSVk0cDZlR29wWDhqSWN5Mmk2anFZZFM4MHhJV3dkLW1BNlphc3EwQk1kSkVna3BGZVpIaGswNy1aM3dacXRnd2V4NnhMQU9oVkg5MnhWZWVJeXIyQTJ0ZnI3T3dkOTEtdU9IWFgydVpUdDZIRnJWLXkteldnRjdiZ3JfTHlYd1lSakkzNnNhLWtheXBkVkl0WnM1SXZCcjRLUkR2ZVVza0Zlb3pQQ0V4OWdrVHRRUzNUMlVTUTJBUlBRclF3TDFPS0lxOXlaRWJJazRIRy1uOFd0WXUzOEU1YXpVelU5bm9kdWhfblBqRzQyNDBYRlNIZXJyU1dfTENSVERRaU83SVhUR2tRNVdidUttSWo5NEhDcE9ZZWVfX19sNGloem5FeWRqbm9UcUstWktWS1JvWmVKLWFUYUZPdnhlU3o1NVY4YTlaUDRhVjExbDNDaGJCZWFoRzQ3cnl0eUFIT2ZIc0Y0NjFNeEVTM0tzcmVfY0FhaWlzdXMzYUVmZmVCRm54Y0Y4MnJWZ2xqaWt2eVRNTHBXcGtlTlZIUDI3MGx3M1Nuak9ZVGJOQm5OUFh4NkU3STV2ZDVpdVZZMG5WYzVLazZPTlZiWmhNSnI4R010dmk3ZGgwdVowcmtvV2NsZjVmeVNyWFVubHFDdDBkZ01iYk05Zno5ZnVmM0EyMW1vRU9XWTN3R0dTeXJObVQ5R0FEQXhaSGQ0b0RxVVZsbnhMNHNnQTRmSVBmYTV2V3RlNVhtX0JtM2NRRW1naTVyRlA2M20wTERrVXFzN2wwUmtNajAyMW1zQ2QwTTBDZzI0OE10TldzU2NNYU9TejFXdnRFdmFhZngyQ1B1ZmFaRWFHejgyNnIzaVhOMkpwa1poNHpFaDc5aXoycW90UlRpYTF6VVI2OG56WmxkMHhLTmhIWjdxaDdmT3lqNXF6X2Vpc1N0QzZTMHJXMndCd2NIZU5ZYmNvRVAtVklzYWd0NkFrTjZoMGVUZHRjWDZUNWxVdmVNRGpzTThGeXBHR2pUZ2kyWVNWMUpiWUNSUTNrQTY1Z2F4UzBVOFVNaWVWR3lYLWFjYUV6Q05LYnZEUjh2dlJURFAtNXU0SGhlR0NiODA5QjR0eVRDN2MxcjFJM29KdTlEeWViRUtZMlI4TzdSWk1kVHNzNEZrS0x0eU9wYVZGaHhvdVhTa0RVYWNUTjBtZldVUEJrbWtpNWpiRS0tZGVpTTNlM0tGVUoyM21GaW1QajJBOC1TdGlndVZVaURPWWtVZlJkcmxJWTBzVkF3V0NsbV92cE45a2N3V1NyTmlrX1RmZ1BTVFp5NmZKZW1WbERQWklBM0VqWkh6VkFJQnprR0RISjdsUnlQMXY2eW9uWXZwUVplcUFRcGRxU2ozcU1VRFJkYXdlNVJyb2ZHT01CT0J3T0dobkd0Skp3S2ZmcXRKZ2dOU0lJQlhNTWVaR2JaZDVLYVEwRkk4em5PRlcydUVPUENVX2Vjdm9sa2NBeGNSYWxhcFIteTFhbmhzMHdVYlFONm9XQzBLYlVvUDBsMUNhd2NwQUNJZloyMWlna01sMmFEUWg5MllGV1ZPVUR3aVQ4VktHX083QXIwSHVaMWZCLXVKQUpMcmpuc3VTazE0cXZ1RGRqS2hzdlBROEdVNnc0dnhMMFhPVmtweS05UzVXV0gxU3hMZkxRSkcxWHFabUZUMTVrb1NUS3I3MDJLbl9jWmN1ZnpGSldTSmFmUUVrLTNVdmM4MnBscUxfd0l1ejlzSmhUNVlSNGI5bXFSVTNmR2tSeHE4QW9hOXF0NVhjbVZWUVpqaDMxUFlKdDZib0ZJUXY5OVUtLTBrZVFHa0lBQlJZX01iN04wb3Q2dGNPZ2dBYUJQZGtoQTQ1d18xQnNzWk1IQmlxbDliM285OVlaeXFEeVFLczZxNXBRNEl4WG83TGVNMktMRlZYdXVsWUx5dTdPd1Q5dGFXQ3VzUnBXOXJPLURlWWV3UnVxQnpUX3hSRTdpN0RhU3VyelBiYWw3a0RoeHc4RFU0MVZzZ1BZSDVycjl3ang1Zm5nSkRFZXluMWtLNk9hZHBuWlE2UlRSZFp1ejh2Z0tHZmZibUoteHBNUTJaNjFHdUZWU2FmQUZiM2g2Q0g2OUtCMkVqemNXc0hickgtTW9QSEFUdllpVGlDeUhwZHllZkR6dnJCN01QQmZfQXRlYjEwNHBZTTRBYTd6TVl2eXBzakJTdWhjRkItOG91TTZXckRDdlBXMkItSGtKbGtacGxMZThzcFBsLV82OW9UUC1ua2RhNFVtUXFER2RHODFNODF0c0llSXBNZlVrS1NEclF3OEpVRkFKc3c5UWpqVEpZYnJMMFBhQWlmSTV5WHFiY3hwSHltQmZfVDNQcU15eklkU2NwREVrNWh0V3RtOHVjU0dDZjk5Q1FMV1NldVFULVc4Z2NhaEhYRWRWNjhyYlpTQnhDMkJYaUc3bVhSNFhLLUNIb3p6WFcybE83cVRmU1UzTElFZS1kSXZGY193MlhDY1NIX3JsM2JLM3IzLTA4MXhzZGZhR0cwOWZKcmZvckpEYWQ0blhOWEVGei0zRTBoUVJTNUplRnhxVnFYUk1kY1dzSXhsOTBPN002YjRBWDNDSl9QSXZZMlNUX1Z6bGo4MXZpT3FfSVEyZ1pxMlhzdGFlR2NHX0QyYmJFbVZ0MW9mNUcyNGEyME95OVhmVkpHaUpIaUVQTDJMMG45dUdqeHB0bFhZa29LVTc3XzZqT3h6M3ROWmJCcS1yTm9ubXQ3NEhoSUNfcTRsZXJCT1k4WXRCWFVzQTlMTnJJaTNkV1pCZTQxWmpHZ0dNWEhEa3Jzcy1DaTh0TWIxLTZlVGJUVkxaRU9BUGFoQmNDOEd6aUNsVlFfOHk1WXNNWndMdnZYNTNjc2Nsdno4a2ROZjUwMDNybmhfWEEzbmZzTlRPbGl1M0pWeE1PcW94WEZrZHdWSjNDT2pmVFIxLTRuLS1Ua1d6YkZEVmNGZ09ReVNjY1Y2M3Z4N25uLWJ2VGk4cFBtM3NJY2t5ejlhNUJlbXN3cHh6cXJOOWZhNXNVRUgySWRxZ2d0UzNYWGpJbks2RVZJbnRLRU9GTFhMNHRTSjhYeU0ySU8yTTJJeEJIVGRVa1NXcmZIWlAtaVhPbWU0QzRfUkVlZ1lfc210T0NySmEtak9ja0ZPSUVCek9CSmMxaWRBd1N6SHVkaFR6YW45OG9qTXlmdVpVOXdtVkJFMG9TdVlxbUF5Qm4tdzFDY1RRLWpvbWJWVGxRejM3VU8xZzRITlVIZmtKei11em5jejV3TFV6aGF6OG91ZnRjN1VVbFAyOFRNOTNHdnI5MWVMVmZMTTNOblFYNVhtWGh0Rk5nQjFseDFuUFdvbVhYMVJMbkZXX0FISjd3ZlJFV0JPVW9OUWdYYWRLdFFuUVBKRnF3RjdNYUtWREtDNVJtSXdDMjB0cF9Wa3BaZ2VPQ3NpcUlBLUV6aHNjdmV6V3BsbzMxOUhkSkRlSzM2NTFpUW44TGo1ZG9SWlIybWJLUkp3Sk1YaEZndG1zRm03bV8wMTVYTEQzV2F6YUFXSjh2M19uUzdXeFlyRWJ4TFNWNmFsYXBydWRHbHJhUmZoc0EzMlJGMDBLSEpUQ202TmFscm5JbThJb2tRdDRlOFUwTkhoS1ZFQ2VxaTFRRjRkbnd0M3B1aVlQV1hnbzFtcjhUcXlPQUNhVldUUTN6a1FQdTB2NjJ0M3JNa3pIMHlVXy1WSVlvM1VMbHVvdURjdWJEQzFjaU9ZN3FZc3oyMGRYaUdiUTlTcHZGNXh3eHlqcllKVFNpWWgzbThKUHg0UEVKTjJKdjFzVXBqaWtHVl9veU9sSl9xTE1DY3BFT3ZscFAtMTY0SWRLSGI4MHo1OVpmYm1SUUVOdUZEYTlvdUkwMFFqazRLODVQT3phZV9jN25WeGN3VFZVVUtQVC10OHcta01wblVGeTNCX3pZdHktSUQxX2J6aGRwUm1LcUdudTY5bGxkdzJBRlpEeGhRYlJSam5zeV9COUhaaHp0T2JlODB2dEdQZjhCVnNyaWxnZzRXZEplSkRTYTNuVDRJVHNRX0lxLWxtcTAteEZGX2pWNWYza1UtRGdkNFRySF8tOTE4MlRqUXFnS05pandqdGJmQVU2cm9kUXd0cm11b0hxaHdrNTlQdHRRWHpaZlA1dzVaQWNqS2FRNFZuZmxmcS1zcTYxSldKRzNUR3VaVS1wUU1fVzF5Q0hpNTBsM0dEdWFkNDlhVWR1N1V3dG91dXBtRTVJa21RT3c1aHBXOG9EcFpORWNUT21BNFdYYUZvOUNTVm1aZHpneU9DaVgxWEtnZ09sWE5KX0VKVkVZQ0pCX0o3U3lrSmVtem5BajVlZG1uRTNOZG54ZGVueWJ5VXktZnZPdHNtUG02Ymt5QUQ1cU9TOTJ6bFZYRHEyX0lHOXJ6dkc5U2pzWVdBZHktV3RvdDlHR20xYkxwTGJ5WG9ic1EzN0RwRHF1bjhwWkJ3eUlDSEhtSXhjTDdZLWJiLVJjaGxGVkYwUzg5bGpZMGpXRjg0WGpCZWd3Z1pqaG9IWDloTlU1RlV1blRtNmxxTVpnRklzWlkxQlFFekVHUHU5TV93WEJqWW51a3c1ekE5czczalhrZmdWX181Tld6MXF3dEwwaF9Eak94UDZRU3hmU1RxT2UtTTktaDNwWWlpeERSQXRqN0t3b2h3Q0xvR2ZidEF5X2twZkc5M1FrQTE5N1BvbGk5YTNfbWRaOU85NllFaGg3ZUJ2NHdqS08tX3ZRUHRwbTVMcnZPOE51dUdzY1NOekk1NzNjWlpZUVBFVW0teG5PVlJWLUUtU3FGdTd6aFV1MjVnQkdObE1zVVdDQVpnQk5icXNsYUt2R3duZXNacERiaW5SRUVkSU5OVWxoUUlEb0NKa0M4Vk9zU1VQSGFwM3hMZ2ZaMFMtbWp2R2V3UXFGUURUbXF1YXdlT2VTUmw4eEdiSVFHLXhVa3RYbkNMcGlSQ2kyc0hscGxYQmVvSmRIS1ByazN4bUoyVU1OTG5HVnROMzJXYUdmZUJOYm1GbVY1S0JJVGx3Uzcyc0pXRUYyYjRKazI0aDRoZ24xZWVWa254YmRCXzBkOVdvNkY2LWRGaUZKaDFVdjMwaFBaTU9yVmVib3lJZWpHZ3ZRdFFMRlg4TUYwUFVEazJ5VTFHZ2RSTFVJWFNfRXBaYU5iaWFLSE44YTRkUWtDM3FIYXpkSU1DcE4wTlhlVmExZUtDWDhtbG1rbWdkbElVck5XeTZLSXdkSU01ZUJLWUZ3T1lkNG5WZWRrOEl1Qmt5X0NMUXNwYTdURC1fT1JtOERxTElMRDZNLWdNenVKWjhEX1REcEd6YWZ4VUhVd3o2TkEyaVVXR2lsZWNQMkNLenJLTmdFMDV0Tko2QXF2cEVfMEF5WDNRc0VPc0Y5ejRQXzgzY1E5dXhiVXNqZVE2MHpfc3JYYnB3UDJNSlBIQ3dtQUxvd0RtYmItYTVJMEFyZnQyWXYwSjc0ZC00eVRXWXZLUk9nNDZhcDZTUnNGZzBJOVpsWkMxTDQyajJDMEpJZXE5a3U3cmNxZVNnXzR5dktXdzVuRXdhUnE0WHJELXcyZWhaT2dtSFRwNmpsaVZGRGZRejBHVmJRN3RxX244VzAxbTg4a0t4eGFXRkJfNmVackc0eThlUUNXYktJbEx6OGFUV3c2SG9FTjhkYUdabDhPYWxRRmZiRGJvMEJNNHMybWd1WFJBeG10SDRxNHRQZTlMNDlVLWJBUFlBelFIaW5qUmR6a2lpVG9yVGpPd1M4ZW9GNlpxV0ZGbm15YkNya19vdW40WmFtX215eGxnY1ZEbVBKVWhJMGdkeUlIeFg0cWN4R0NPbHFRQnBLVUc3MkpBa3VjcDBjUnp0UzhmU1Ffa1kzR2hYMUpKQ0tsTENaOWVkbjhVU0FzYUQ1NzJCS1NSU0doR095MjJYUnZFTUU3cGJCVUxRM0dvRE5CNlRaWFVQVDZ2NWNFSXp4WmVGUDlGR3JJMUpONlZvcGoyZXllVnJ1Sk1rUXExLVBSWS1wMFNPVkU0ZmRBUXJ4UzVCR1cxUl9LS0NmS2g5dUxoVERpZEpLQ0d2ZmdPU3NfeUQ2Z24xUXVmdllHQS1tNGJSekxQc2w4WktXOFNNV1pXQklKNkh1UjhrUFlDQ3JCdkh1R1U5Sno3cDN0TUhwZVVhX3ZOd2JvWEFDZlNUNjBsWHJnQTBBdlJzSm9nU0p0YTQxY0tMZmV4cGhOM0RSZUFabUFJMWxmWjFWMDJ0THkwVEZ6Z1JuMUQ0TTYzRHp1Sl92bFBTWGFmcFRFU1ZYTXNZa1Q3UTBSdm5WUzhfWDNNanBQeU1QbU5UVThfYTRQMDltTzRJbEVoWEc2R0tYTDNaSUdpTTd4YWREVExXSUpHMUpvUGdJZDl1Q1ZUaFBROTdRWG9EUXJzOG9VdXNURGtHZE9fTlBaMFVJU1RKNG45ZHZtNjlFa1g2ck9CM0J1V1QySlo1UlhZdUhneTM3WTZsWEp6cE9QVWdJbngtUmY4WEV1TWF4ajh2Z2NzczN3RGVYTGwwMlUzQ0UxRkMzOFg0WmxOSnZfRFBNYTladlZ5YzVwbElveTNGS0M0akRXQnppMkVnal9oUFpZcWI4b3VWdUc0NW80QzdNaWRNaGN3OTV4a0dOYTA1dWhBODliOFpjVnVSaUN0bGVnVzRpUjNReGxEQ24tUFlTa3BfY01TUTJrWUxwUkt0MlU3eVVBSDBpRmNGcjAxWG5POEtXRXJJelZ6emROaXV1TWpoMWNfT3p1QmdBRFpTSVZEaVVQSkcyU1pKR2pveU1hT3dNMG44Tk56bGdJR004VVUtVGU5OEk5X3NqZnBkSXBkRDNXdzJWa2tZRVhSVzR4YllSUnhxRElDMmgxR1lyVkdMYmZ3aGV1cWVITXNCMUZoWTcwM0EyY0xOUjh6X0Z6NTBPV1FQd2l6X0VtbnB5Ymd0bFdURFFUX2o4RFcxTmdjNURsX0V4WWFIOUxvMHhlMEh0Z2J1M0JiVkpjZldNTjgydjJ6SkEyTG9jc0xKRl9BbmJvYmhoanA4c21ENkxSd0NQN0h1dVZRME01M3JyU0JPVWVXQlFtTGhTTXlOblFCVFhma3dJU0Zic0padWF0ZDBHZ3M2bjJoMzg4Mjc4eVp3cDJwVmJvbWJHc1NmSnBqTzJtZDdTRE1aRTZHVGJUQ2tPVnB1TDNxSkE4WGk3VW90bkk3ZlpRUkN2clhmMVBGNWhsQy1GZmtOWXRNc0h3WDJTMnA3clREOVVmNFBfekNhVDRtbWtGbXp3ZDkwYjduRFltTjFPdWU2eldmd1VFdkJJRkYySFk5YXVqNWVXbWFEMWhRVlpkN1lkdlFtZGstRy1SQ3pHTWFndF83LXpuNFNCdXhOYVR1ak5abG5ZMnVUMnVTakZlRjg1OUU2TGN5MXVFZU9GOG5XTnZmaWgxb2h4dVRnOWJXNk5kaXVXXzNLSW5aU0FzUERrQWFGMy0yY3pvTGY3TGZ6RVh3M2lYX1diTmtfcVlyS25Mc2ZWT0xEY3JZOE1IYnlBeFhLWVVfYjJ1WG9PTnJWTHB6UmtjWUpTTTNSODE1b0VnRlFSQXJia1pqNEFpRjFJbFdidFR5NG5Od0dSeTNmV3E1UGRkQkZVckVGM1g1NUhJVjIwTktfZlZWOWtGWmo5OEFkSVpHenh3cUlqY2ZzVC16aHAtU2p5bjYzWXdWelNqZF9rZUJHaVR2aE0xWXdCSVJRWHZvUlFhRndwbUZ2MXBwdGhQNk1kUEwyTlIwelc4aEo4Q0RCZndRakZZc3NsWUdoZWJBVjlESGl4aHlUMGxURmQ4UXFMSkNCblU5R1V0WGpWOGNta1Vna0s4eFNnTkIwMWhsUHl3QkZYZHJnTHdOUkV3aFFhM3Y4dzA4YUhoLXFLeHBUNXdKSlEwajJMRWxTRW9MRzBRU3NDbkMwQXlDTnpiNDR5ODlMMFRHcTc5bTVqUXg5WEt6V1JOVW9BbUliV3F3ZzRmaW15ejNKbV9QUWV1X1puNjhvbDZObE55T29zVHJzQXAxTFNoV2Q5SGNQVmd1RWg3eXRPRDRsb01nTEJKck1QZlozbldybWxnODdPUnZVRi1MVzlNcXlXTDJJVlU0RTV1djJwWTQ4VzZvdE5tdG96QWRqOWU4dlY3NjVIcHgzQ1YzMFlJYnZRcVFXcnNNSG9ic3lfZGVkSXRLcmlLUDh6SDJsUVU5VWdNenFHQy1UUFVXV2dRQnBkYnhPd2VrS3BuNHpTYTg1REpIaHZwc1ZJd3lOOG5CeTZTbXJoeF81RVNmZUNyOEk3VGZPYkxVODc0aGY2czFQcVJpWU5OQXVUXzl1TWh0RzlIYUQ1MnEtVlZDaVo2bGotMWFkdW5TWGRoeElPWHZjWXpNYURxc3BKZkJyOEp6aUE1QjJUZl9vZlNzNlRTVjdxU2o1czd5NENBTlZncXBleEdGS3loZXF1b0l3TEpMalgtQWNNdVZxOXU1ek8xRGN2UTg5WFFlQUE4a1psd2gweGc2eko3Wi1od3hTU3RmMklLbUFfZGJteVJaQnVzeFpNczlhbWh1UVJuRGY3RHhZeFpzZWpPMnRqWnEtLWx3cVQtai0yRHZjdW1iV25odU1KRDRwRXFVSTRVSlhSSmVQd241cjNJMnlzdWRsS2N4UUpGbmdzNFZ6cGlacTRHem5mUjctMWdMUmRTMVRXSGwtQXg4Nm5DSjFCdzVoU1BfYkE2R3lJU2wwMUM5TGl4bVpjN2E4ZnQ5RXpQVVc3aGdxNGxsb1dGVjZKTzhBaTRQNkhBMTNDOWJxbTZOWUxwOW02MHJDVElwYTU3MXZWd0tSYUJyREJuNURuUmlWYTFncTRoSVdZM2VEX3dkN2hEdVlmaklyT1o2SlBlMWxEeURNZ2lhY3B2bXoySlRQbXFfLWVrdzBYd0VaR1QtZUlnLVpudDJBd001V3NmbGJQSEV4WVlQaHNGOXNOSUJhRElqRWhYMkZoZDZHOHRjMkFiQ3FsSFBRY1VERFBpQV9xSzQ5aVZ1a3BJUTBhc3JlUTVvME4zMkY1QVVFdTducEsxMjEycjhnLV9HLXZkRGttOWc3VjJucllmTEMyMnIyc3lsajhGQmNmb0xsR2p4aDNySlZDNnpPX3JmWFZkUG9fLUluYXFETmctTVdXNk0ya1d3U0NFQnc0YnZXT0M1RlNLUnNvSFhxMGJnb2dzd3JQS2xvdHVkQXNjbmUzSUhKZUszRGktRmFRWmpLeEtBdGJ0Q19fd0NnM1M0TG05NjhZb1NFRjhWdVdSLU1GVGZfS1VZNWFhNkpKR25vTzRnUjZxcEtaWHR6cXJwTkZNbUVtOHVKbTJmVXhYTThwVGVyUnBGdnItN0ZsbjdGeVl6Y3ZQWndlWi1fVHlHank1OXBzMVBrc05CcUp6dVVFcWl0S0xmeHN5T2dudkpiWnJDYlhmY05IM2RyLUNnRWVpU3VyazlDVGo2em15OW5Sa1JOVDlpTkxZQzlteGgwUmd4ejg4UXZNb2NVVFhzd2R0ZkNpTEtvaXcwNXUzM2ltT0tIS3B3TVhiU2pzb1VIeWlJZE5mWFZoVFIzM2xnOWpaSkxjZmU3N0d1X1pfM055eFc1cnV2aktHUnpOcW5MQXVnSHVHWG5EMWFBdGZJaGpqRENWNkd2SzFaZHFuQ1RyazhOcGZ2bU9lMm1KRGRFSjR3UzNSRTdldHNZa1VxLXJmTVpYY0hqZC1WMDZCM3c3d2tNQmdRR1pDd2Zad0RmdHpBNUpUaGRxZDZqaHhHNThMRUJXLS0yQzl0NDYwZFhqVHRLZDFWLVphaUxyV181dGI5cElVdFM3RDNET28xbUR6cElQdUdqZzZhVW50V0RtN0t0TEFoNGNzZnl4X2YwVmRiQkI2ZEp3blB0SkJWVWtlb2RYNl9fQ084QTk5a3k5SHNtR2VLOWZ2STFGRjVrNGdIMkZuSlhrM0huX091bmU1RHhtM1hYYXkzSHZtX0ZEdkVQMWJjYWhOSmtsT25DaG53NlQ0MVFtbVdHOUM2TVBOcHVSVTBFMG5Ea1IxejlvRl9MQVJwa1U2R1ZpWDZ3OG5DeGlZNkM3N3VmaHdsU2lVUE1LRGlaR1U1N09zd2lIZS0tZE9IbkJUSUNxYl85TUthRnlndmw4dmUycXpXUHN6Y0dONi0wVExhbUpndUVuOVZYTmc2dWtKRG1ZVGFiZzlJZGw2R2FJVV92MWVsc0hMT25NX1k2NzU4MVlIRWpRNWpxb1RYMzYtVWtVRjRFQ1VNTXk4SUlsVUxOVU5MXzl2Ym5kWUVNalNKbkJuUnJGQlBuNzAwSk1Gd3JnaEFMdnNmblhNcWN3SlVJc3dhbHpfQWxaUGE4RTNuMG9mT2tZa2Y4LVhEaTcweDBteUl3ZnBPTmtIaHRSaXY4QThnajJtSDR3QTMydjRLTkExbzQ3MGViRmNUXy15UXM3Ukt3OVlRREU5eXhJY2JMTExzUmhhd3QtTjE1SW5ZTm5HOUhlYnRTNngybTZhUld3OS1tcHV6OUwxY2xRYzFtVXoyQ0xJcEVkYmlDVkgwYlhCaVhJWEFCeThNN3VJRzhLMDZiTU9Nd2NTajA5NlBULXYyU2l2R0V1aDNFNHI2YTFIbWRoVXUtNEV5OGt5MTNkOUVZTmFieG5JeFB6RFVWcWI2NnlrNWlFeFM3UTlUSVdqc0c0d2JrNmN3UXo2V2VSeUVBSDZ1SF9hYjZrUUw3dmwtYnhLNGJHUGp4RThIY09pSGxSejMwMm43NjY1cGJSVC0yV0xGR1NzQU5TcVo1WGxOS3ZsOGR4Ny0wUHhQdkFRT09hcWxtUURUTjV3TTZuTWlyVmp0Z0hmaTJFSEtfOFI3UkNCVzlRZVVyRWZaTjZIaXpFOG93VkRMemdReG9HOHlSQlBUVWVPY0tqaWNSVjFyZkZ5bDBDamVlS3pDUVpXR3JfWVVSdnhuZDVPT3ZwelJvRWRSdlVyZ1lFTFBfRGNSWXJGR1RtOFB1ZE12VlhXVGNhUENrZmlKSkpHQ2dpZDRZQ2VwTEVKejdhTnVGMXdZWVZpUXVGblotMGdJWkg1akt0b19kai1qVkdDbm1OdnNnbEJPdkxxb2pHS2QzMFdrdVI2M0FQTzA1WmtkZTlRWlF6NlFNdkU5Mmk3ZGtEWTlPZjNBYmxmV1o2WkUxRHFRNTc0czJqOEJHT2RaZFJYVzNjcWpua25uQXVTbzExUzBxeDl3elZRQUNnSjh5ZkRCcUtIN0hNOEFrODFLZVQ1azRhbVpwYTBseXhKaVdJNGlGWkg3TUxzTWpYZ0tvQ2wzZHA2cjI5ZXlOalI5U3VfUjVLU0JQSUpka0NSNm5STnMxdld1TzhkaXNoMDh2V1d0dHp6MHVnbVNmZHpSQzJ2WFl3VUZweGVNWGJKUTVxM255TVBwWDdlSkNlbV9jdGJMRUh1YWtHU3A0V1A3TGwwb1ZpYmdTbzk1T3BvX0JDVTZ6MWtQSTdzbmE3ZUVqT0FPSlVQOWQ5WXhGaUlNVVFHMDc5enMxQkpwN01nazVfcHdSTFJ4R1Y2ek9LM2x0VEJBNjl6OFRVNDZjTEdWRnFDNU9jT0JCXy1tYUdtQkNDT3RsTDZrQXZOYTUzRHRZZzdwOEdyU1E0MmJXdWtSSHlYNE8taVVkYldlTEVIOWV2S3VjcnhfbUhBalU2YVNXNEtJUVVVd3p6WkhJUm02U3JOSWVVRUZxZXlhcmNVTWNkZUI0TGw2aVpobS1KTWVZTTZHOHRaZm1wNE5GdDZjdnpjSVlwR0xxa0JRNmFEeHpYS21JcWVUeklDSU9kUkRzdGZ4VzhENTI3c3MtUndSX2plTXlhMGVIU2EzZGVPTE5nbEdDb04xTnRyUDVka3FZUHBZMEtYQklnVzBnd2dZN1ptaWNxMkt2bHUzUnkzblFNWjZPZFZpb25oR29nSW5GYjNkdWtlS19YcGpmd2tKX2tjYk1PVGhMRG5Fa3lON1VHT2JPTExSWmlPY2lWNFlnZmFxTUlDRUpiUE94eWZ1NnVoTWdCbHhzWEtQRXA3elkwV1ZXb0JvVGNZWkZqMi15SmtLLV9uLU5jMkQyWHk1bTF3eEp5aDI0TDNiNUlEQTQ3QWp1d3hUaldyd3lZcG9uT3BpbzJsV3ZZeTIzMVJLN05MOXJIT2c4ODRqcjMxZmxnSE5xdTZ4SHdJOF9iNkhzelRRU0xjUkE3N013S0VmamY1MXg2Q09NRDZsb3pJV0ltdmRJbWdxdmt3aFlfdXFseXZjRWFfeGNLSWhiT0tKM0hFanVEYnllNWFjNFFuN2thdWdpTnVKTThEVE1KcHVuN1lMS1dvUjVHQTcxZVA3azRQM0Y5WUs1ZDNNenQ2VFVWWUZYMDhIUEVVQldQOUFtTHlJQVFVMTF3SkRrS0pWUXRoQ2dia2FQQnZCTXpxeVkxR0xXNjUwTk9ha3d6SXRWenRveTJLRXVlWTdSTFJ2TXRGcWtqOUFwaGJ6d2FwczljWWRBRXY1bnhsN1lLQ2FfR2lQUWRRRjREeTNxdy1kTFlVbFV4RWp0XzNIUGhPWXNJejFrOTg0S1ZQUFF2MHJ2d1poNnFuTGt5NmQxM3NCdjVZNGJlR2FlNnFQWnhUdURiUVJiLUhybm9JUEtuRXlrRExidzdzTU4wd1ZJNTNIcTZJRTlmTkJxX0NuVVM2Q3NzcHUtdEJ1UFZyVmt1aTJ2MGpwb0ZBOGhEVDlqRjJFeW8wRDhSVEtPbjQ3YlVGM2RISURPbDJZb1pIWlBkdmtXNG05RjVwZU5DUlc1YTlnTmk0bnpEWEY0VU01LWVZV3JFTFFiQTcwSzROaTRvX1I5QWdkaF9kaG9MVUJwMk9yUV96eTVIc25jbXFod2JXWGpUOVlKS3ZVdjNQUGZpUU1KaktscmR2WXRyWEt5YTlNX212VVNIc1ZfWm81dE9Ga0VVQ0RpWmVXLVRJdEoyVHQ5OEZRWXcybVBjWXE4em9MeGpOcHgwazROUkNid0RWcmliOFJlUmoxbXhac1BObXI0TVBXSnM5SklFeDUxck5oMGFjZ2tjOWRWeU5wV2lTSTRXM1ZjajlFcmFTa1NGdjlnVUZURlhxNDdjMzUxT3lMUi1GYUZJZ2RsNlBkdXNmSU1FWW1MbGJ3QlRrLWx3bVFaMHNCQ044SnR2dVpjY2FQRzlnQXNZUUEtZ3d6LUFWYWFVbUhxSmVrUTdNOXBCdDlveGkzbHZfQUI2UFd6WFd0MS1qOU40c3BaZFNqUTczNjFtWEdzWlJDTVl6eHpGa3pCMHRCU09Hczg3SldhRnlTNXhyQzdLNnp3ZlZ3RzdwZm5MdHlhVE5Lel9hS1ZubjhCTjhOQkRwd3M3VEdxUFBPNU1xVjlVSGE4bjVBbXRSYTdKMFhzYzdVMVAxWTlJMFBwcWRzSldia3lNbXhvQXZHWklER09tNUx6TWxoMXFPejdNQmpKZkR4ak9hY1dLaWVQbHNaenNzMlpfNmhwbmNJVW5QeXNkR3VnblAyQktoZkVYbXNYSWFLNEUtNjZIOUUtTm9OMmllS1otUGxRSHM3VXN4eEowc3A3cnh4M0lISk1TckJWYXpJVmxrVDFhWldvclJXVTBvc0tBdUNob1U5YmlCcEp3VDFZM3lZaWR3XzVwdnppX045T1VMYUdGUm1PejJ2N1ppcmJ5UUVHSFZVajd4eTZVVnZlSnJ1YS0tTXFIOV9LbEh1Ym9kWDd0eDNNX3NDTmwtT1J0a1E3RzlDY1EtakF4bEpxV0FmeDlCNWpyMVpPZU02Y2FiTVJtTkJlaF8tamhMS0hKOG1hMkxsWHlYTnIwblB0U3dkWEMwM1lkMmI2R2h2ak9nWmdTaGU2OHFGZHNJeWhPc21XdEFnOTJYdDkzZHNoaGprSVNESzU3cnVDQ2JGT2xoajBMZ1lRcC1IQlU4Yl9aY3BLUDdiREVLUHZyaldNVUdPd3ZQN0pLNmFZWDVfQkVDRjI3ZEpVME05eWhVTlRXekRzSDliVFNkaXkwb0psekI4djJnemFxQkJUQlE2aUpRMk9DMkRhZzhjV0JielFqZGlOeUQzVmJGQUV1Q3hhNmhWa1ZkWGxvcnZubkhCTlp4LVZySE1aUzhxTFZzeGZkeFFwMVJiN0dqbXRBNDFMMk5tdkFDeDBGSWlMRWp0OGMzLW55MTVOTUl3cTFZbjNCanc2cVRoTk9OUEJXdmxDNUZhRzl5bzBKeVI0bDFTR1FwSF9kZHVKLTZaLVNCZTNLM2dwbjhJYUNtYnY4ZzUyWVdKelR5a1NXNU5KeDBFMEFxOFQ0cjI3VE0xMzV4Vjl4bUtOTkFGOFh2OHk3S1hEcUd0aU9xcmk2bmhRdnNKU2hudFdrX3RPdG9iV01JXzJJLVNPQWZrUFRsYTVUdzRUQWJFUkthOGJQTVV5c0U1cktRZDdpbWFUMnhxSHdjbmxmbGptdEF1bUVacVpBUHZsM2ZiUjNGei15R0x6NC1nWm9BTTR3NGhFNklTb0x0aXc1am1DSV9XbEwxc04xOUsyN0pBeF9aYkhla2dFQTAwWEdfUzFqZ3ZBOTNYZ2UzMUVSb0otU1Q0QXppVkpuUTc1My1rN0tPUFF6RERmLWZxUUZMYkl6UEVtOURzWm81NHFOU05QZjNnQ3BnSlpMR1hQOXVjbV9UcUs4V0pOSlVXUVBhb3dLel9SOFk5NFE1bkR2NjhLdVc3dEtjMFV2OF9RV2owM2szM0tfcTNRTGhrZU5JMlZ2MnROa2Z1Y1k4Y0h6Qk1pMU4yaWJRUnVQXy1qRnZRYndwclNPaTVncWpPbzRzcWtXQ043ZzR0RUd1V01DVHJaUmF3VzAxbkxQM3hVZ212OTJkSDJ4aWQ1aVBxY0VrZWRHN0FiN0JTeDdGLTZ2VHE2ZWE0Q2kzVjRpRlNhUFUyeGVvbWdfQjRjRW4wMjdNa0FjeWhsTkRqTFQ3VEJaOUl0X1ZJc3o1VkcyMWJDd250bmxrY21hUnd3WWxwMVpNR1dYb21Cc2VnaUphU3J3TGk3QzdzWVluOVZ4bHlUOWkxdXctcHBUOUNiMXQwbnV3cVB3ODVHeVBSWGN1OUlXYUhGWUFqaURxcDVLVE1rcDFxckNJdG9vZ0JaSWJwZnJrS3RTRG9PdHcwbHhWc2h4Wk42SlZ3bEVJRTNwVVhuWjhtYkpvaDlnU2VMS1dyMVZULWFINU9iM1VlRTRmQ0NoM1FxcWhiOTBHTUJhWnAtVXR2dEZTbFFxLXlYOTBCdkg2d1REdzJCMHJPQm1KejJEZTM4MklBdjJOYjNBX1F2N3JLWTBHZmptZlQyaENOb3h0Ql9Nd0ozTHVSQjNXM0l6WlZnMW9fc0N4MFV1MVB0bFBsTTBtZnNkcTlyUExjU2U3Zmg4UkV0Z0tjWHEwdFh6aTBhck1qaG8zcEQtUlhwX3JoejB5QzQwekRQVGJULTk3ZFlNcHpDc2xKeWsyeVdrams5VlllNkZQWlVkLTczUi1oZjNkcUlCc0VWSmtuWExUSE5ZWEs4LWx3OVZNZDNlbnBvNVlBcVN0bEdDUzQtU3kyWkM4SlcydzlkcXkwYU5XMVBrcElqbUJNV2FLVnM5RDdWbW1SUUtTa0w2X1dDQl9iUGFCb2kySjFoMVJqa2hLSGVzeEJodzc0YUlCSGpFNVByTDdjZmlpMUFCWXFYXzN0d0hKQ3VKS3BqZlhFdDdsSWVwSEtoem1mZXdFRVJvMEdiRWdmSVN5UC12Wl9wQkNZb2JZcHFpWllSZ0FlTUdpWU5LdEJwRGE4cXJmcWRiY1N1SkdCLTJjUzMyVnZnTVBQXzU1NHNlRXR5elNsN3NTd2JhUk51cGQ3d1NLNTZSc2tRZFphR2tPTDhiSEtxazJhNWE4SWhrVG5XNGEwUEVOWmgzUXpXR2FmRFlJd3RVY1phd1V2Mk9Pb0FxOUxSTkpqaHFkX1d3cmJlc2ZTVEY3VllIWVRxcm5zeDluZ1VfODgtdnhKdkVoeHI1eER5bWFEM2t2N2tBNVJnN2ZFQ2xERWdKTDNMSE13d3pQMTRSWjFYZzdER3BndEVmRFkyUFh3ODBpYlNMT1Z0eDl0UENLMkd3X1RyanFaczZEUF9NWVhEc3RvZzBidFJQSG1QMjAxdU5nZ2pkWTF3aC15LVpZWmFNTXhRNHZZQW9FS25uUXFZOXhZcmthMUMwTUVhbUZ6dC14eHNlOV9BX3RZLW9YaThYWTFNYllNUG9YdEp0TXRxS3hQeGJydHgyU2hSRTFsVlMwY0FkY0k0eC1VbUU0b1M4aDJhZHZOOVNWWUpVNzBSUk9rc1dVQ0lqZFkxUXFTLVFyY0Q3OEtQRjYtZFRsSnEyVnNWVHFxVFFEd3BIZmhsY1JJc0J5SllLMVpmZVhZa3VSTmJvc1hVSE9WS0t0aExzSUhpak9EZkxDUWJlWlAyS2ppUERxNjJFYjdCcDJNcXBaaTQyQW9seG5yQUJlZjFxdFJLMlpGVHRMXy1xY2NEUEZUNnpTX3hWa1pocVh2ZW9tQVZyd1p0TWxCZ0lCemlPOEV5bkkwVlZRcmpKbmViRFYzeF9zenB2MC14Y3ExazdJdEJ0cHRieEs2QzR4UENLVFdsV3JzZmlKdFIzOHhmRTF6VFN0WEdoVHNDTWp1NzQwdkxqOUtkdDFfTXJoM3RGV252VFo2Rm8xcVRuUmRELVhZOTJBbXRwcnA1aTdMcFB0aVlMcVY5Q1Jkb05Cb0ZYNWxYMnpwekM3MUY2akpWX3pUd1pYX1NwTGhSLUFPUTBNOXhTMG1pZnV0cGJ2WENBcEVtbDJUdEhuMHdoTGtmbkU0S3NFS1U5YnVTbURRU1dVZm5tLUNKaGM4UVAwOElqT0xPTDgtVUdEdXpXZkNMQkhRM1l4Yl9xc2tQTmFOX0tKaklFeFA1cDQ1djRaNnNhcGNielhrRmM1WktJZkpRZThNckt1R09Uc1U5WmVCRDZvUE1lbHVmLTNTVS1DaUw5V2RRUHpiRVRhUXNCMGp6S3ZrRXdzbzluQjdxRk9oT045SENFR2VxdGp6cEI5eUhNU05ET01ZazJ1aFFwMm1jVVNfdEthR0ZqdXktTE1ybkFORHJkVWk3Qnc3MVktQWhOZU1RZDMwRlVIQWFXb01GUTNkWG5iX21Jd1Z5Y2g4YmYtV2RfQl9kdXRPNjF6NTdSeE5YNjFzYzF0LXJiMFFNZ01OTWdDLWFoQTJBMDRWTXlUYVl0QWZqX1VEQ3o4aE9iQm1WMFhDSjVfMUFtQjNqY1VuUkpuRXJtUzFxMXdDczRpc0tkc3J4U1FibkJ0djluODk2RWQ2bDl2RFVjQUJTRUMwbXJRXzNWNV9WS05vQm5JeTlERGNKRTRFNjlnRndSQ29CV0M0SlBRdFFhTlRkSmt0M0RWc09waEVTM1lJdFFyVHpmWjRkSXlpNUZaUm1iSmhRNXVuQXJDbm9xdHAwaF9QVGI4OXZQTzI3NEc3Qzd1SkhQTW5YRTEySklDYmhTY1RZTmw4MnprWFczNUlDbFZUbkRMUHhnTlAwMDZUbTBBdDNnYVZoR2ExTFNfbDdKclFyOEZ1TGdqejNoemJoeGstZEEtbHhMbUFjX1RDbkVCb3pmVHpkd0h1QzJ1QzdZVW45VzBmX0xseklCQml5VGxyWldnWFRkUUhHVmlVYzd1V1FRWUhTdkR5VGhPSXVoU01FM2pITDJQSGdzalVKZTNENEdYVmJCb2RicU5LZWxKeGMyWDV3Z09DRmpQUTAtTm9nX3hIUnp4aHVmMUd5U2twNV90cFlHWUZtNEFuYm5nY3RLVU9GQi1ZZElkeEZzcjJDOXZRM0NseXpqdDg4ZkZtYVlWeVJyaF85WGc4SG1fM1Bxd0xRaTVQMFJfU1ZUNldOYV9fa1pwU2NFdDlQTHVnQ3JRQk02RzQ5YjE2T0lsYV9idkw0Q01HODRla3NqeUlCSVpOODlvdEdBc1VQY2VMUzFWS0NXRWo2Ulg2dDB1WTREdkZxSWRwZmJUUkFNRXhRWklyU2hSRFNaV3FkdlAwNC1wUFQ5RmxiLXFMemNCT1MzVkhUWnNuMjREdjVKLTlGczVuRkxmcVpsV3F4OWVnalVsVlpIREZ1MHVlWlZaSHpiVG4xblpUel9sTmgxZEpWR3ZyQkxDdy1ZcnlaX1kwNjJRYVlmWG5KMGFiQ25vQ0xEeEdmdjdSc1p0OUs2ZUdhbFVWT010MHVTd1lYN2Q4ZFBFNlBTY0htVUpKOTN1eURHLVhPWnNHZllzcjdLYll3UmEydThTcjFvTTBUMVpJbzJxcU52bEtMR19LRUdPazM2N1dyVW5rQUtfdTl1ckhzMnZRZHgwWkxMWFk3d0lfRlBSOEFuSjVRaHhSWTNxM3Bvb2VuWGh4VVljMEFTanMzdU4tOFhyMEtoeUZPVTI1aWlJdmViUHpzMVNpcnprSmtGNU5OSDFDYnZjUkFzTEhxZ1daUzlpbUprYlc4VFlyNWNUaWh6emxoYmRuUWRRVGpURG4wSzFyb2FCd3RQUVByaDNmUlVjc1VIaEtSZnZ1UUZqRm5LeDlLTDB3aWNmd3paNEZZSWN1Vk9zODV1bU5YRlNqM1JxaFhhZDdYSzRoZ2ZHUmY2RW9pdWNZUExXTnY0XzJQZlhvR3piYWpUcjVXVkh6ZURYbjFTc1RCdjYxVFEtRl9CeFVTYnZlU3o2WDczd2pfckEwUWwzODVqY2ZiRFJldF9lVmlBeGlLaHBDRFdRNVh0VmI4YllvSy13Z1Z2OG9ZMGdUVmQ1SkdURlZWMHdOWnVGbWg2UzQ3LW40VU5yRkxwaGF1anZueDdkZnNYX1ZaSmFXT21tMkZCTFFDZUlYNTlMb1lfNlZTcTBmZXJTNjhfN192T2FJeEkxQTlHazFKYTBuc2UtTVpDOUxSU1lJQW84cFZhY25Wd0ozLXRIVktuUktESGdLcEhwd1FYNEdlM3NENVo0VTRxdUhvMjFiR1hsb1hqbG5McFAyOHVzN1I3QjRLRmtqc0hKSEp6YlpWa1hkcWdHQmJhSXRkazdpbUd4Z1JSNjg5TFEtT1QtelctaHhhUTZBbW9qRzExaWxLRUU1LUgySnBiWXRiWVFCZDgtenBmaXBkXzZHV2ZicHRFZ25OSzJEN0FtbkFlYUw1UG5nek03RUstUFFIZ0UtTDdqQlB3eFlJQWMtLW9IOTBMRURoTm5JdGFHU2Q2Y3R4ZXA2ekhMZ0s5Ulc2T3RsbEowcng4bG0yZ2ZWcGs3MzZjM0QxcElndUV5bWZvRFhrdWo2Y2Fvd000QklHZVYyNXI1QjRCa2dYWUM4S2QxU3R5N0Y0NzB5azNOcTZNb1BZcEV2bnd6RlpZeDlGenphVXItN00td0lSSzNZTTViSGVPNjRxQUJUaDBvb0Q4ZGxvMk5tSWc4VW95OFM2djAyai1HZkQtdG44azN3OEM3Qkd5b215OXlfeHVwSVVURklGeUdISGJFOG50aFdLTmM1TnFBVGNfU0padzUybmJ2QXlFN2pWT1QzdVNiYWxidDV6MEJwbFZMeGFDaDllYTFrRzJFY3IyeW9WbFFvMmNaWXlnMjEwLU52cDZmQlN4VHhVQXZfN1Zqalo5SVVkMWV6RkhwclVoQnlNYkpqZXN2SnlZaVhuNnA3XzhUZFhQMFFrS1FJNWdoX2xzaXZfZTRPUnV1MndtS3BpOF8xVFNlRWczVmRkcUppeWU2d0dGeWhjUDZoMTV1UlNNd2xvOEp2cTBHOWhCaTBMM2FfTXpYMVZLbUpaWGZQQTBIaWY2c2FHSUdUWjNMeXF0NXpSWGc5R0xlbU1nR2N0LWsxVXBHTU5Ra2NrOGtDQVU3d2VWT1B2YXRfUUlBYjZzQUYzMTR0N3VJb251aGtkY0JZcGduUzhzUDB3S2lmc2R0TnlSdnQ3cVI2VjJDTVBwbWx6Sl85ZXhEc1JFYWlTRlRRSE5oUEptZXRDUFZZM2VLX0N6cGpTWE1aVFBqNzlXazBLM3lmYldjemdzRHFfTGJ3ejJFWV84N0ZJY2p4MTFUOXdOcGpnb1VxTjRzRTI1eU1SQ25BdE5KMlhseGJTb29wZHY5MEExREpkR3E1NjJ6Sk1sYUdMWmJlSVE5cWNSOWdaUXJHQk5CcU1FanBRdy0yWm9oUTJERUs3WGJrWmt2Qk9ZNm1xd05UTXFoT1Q5ZkdlWnZyOFVabTI5NlNrXzg5bWV4U0NPZUdOS2JuOUdKSUllajhQeW1IUGZfMXV2bnFLa3RnWkxKSkVsY1lPdzZCaXhOdmtJcy1oY2FoNDJBRndOU01UQlA0RTJhS25yS09iVUJ6anV0dTJYcTNQbmtqR0JSTEdpZjhQR1NUMUQ5SW1YQWVFM3BEUnZTMXJSWmpoRzdCUThmcGo5emw2S2RhYXVKbUNvWDB0ZVZMTGk0YzZ6RnRYVTh2UERfMjFVVl96OHowZXBJRzA3VGU0bHFlNVEtMDJfSmswVkxyTWh3X2Z1VWxxRWRNWWlFbEJ0TTdFUDgtbFFqTGdBQzRmUU5Ccnl5WUtVQVZzNWx4YzdIeGU2aDA2RUpRSkU4STBETWN0TUs4ODNUSHV2NzFabUpRaUJ1YzhvUjlmME9XRUpZWkY4bDZwRElQYnZ5YnIyeUdkN0p3Z1Y3SENoeVFhendfYmU3OS00ejNIOEtzUFRfV1lpOTlvTUF2REZjVjRWRS1fekdHMWdQVDFMNHFsODB4ampzNWtPb3RsUUREME83cXMtbGV3X09zaTJmSWFHVGcxOGMwVlZ2Y3E5clRjemdGMVRmTFR1QmQ5ZV9jUWtVaGN1RzlxcUJuYklhRUVxYTQ3VVE2QmdQYjJWUnZzcDhpMVhteUxjNGN4VFUwaDc1UU8xbEQ2YTdtOGtyUk11ZnphS1pLbXJqUDZCVU5qOGQzZWN3eTAwOFNHQnV5WkpIeDZKNUVDaFVudmwzcVBXRXpQZ3NEQTVIZFhzNW9BZi1jVHpRZjYzNFBLdFF0MjBVQ0RQUHg0Zms3X3pmMTRHdWxhYTF1Zk9aRUdLcXhaMVB4a0tuWmtoeXVvM0JBeTQ3a3RZaGxoRUZlTHZvZkxkbHVKSm04Q29VWmtES0xPUUJtd0I2OGUwbVBpcTNVbWhIYnZQY3liZWljUG1TdGNycjdSdTJaQndnRm1UT2Y5Ynhrai1qS0s4Q1VWNV9HZHp1Wk1XVGhkenFzc0JHRGJwaEtYMElMdTIxcndEN3NDQzZ6OVJDb0pDSWw4ZGpEbGxoVnZiLUhrV1VpdTR4ZmhzOGl0M3dsYzJBYzNSTFlhSkhNdm9wbGR3THMxUUp1QTk3VWJjTGZqc2JlVjN3Wk40VF90NGpyRjMyY0hYM28xdUdWeDQxZm1xZk56RlAtMkF3TlZ0dWRzRTg0eVotZUIyLXdydmZMOHpxR0RVQm9hSXloaEF1NWNRUkdneXNjcVNMUlo4SVMxU1dQUDZWMTlxNDRRVFpRc2l4TUI4cTdqVjhvcTRXc1hhZElqQ05jQWhaMGh3Y0ZvbFEtZlNxVXFfZWNoOC1pTzlpUkxNODdaR1hqZUhjYzBSWTR0ZGpvUjM5a3Nvd0RQM0FDNXh4bUx5N3BaLUhrMXgzbVowTDI5eW03cmR6RFlhOXMwbEdnWmZNRTlSOFJERDVRUmVtMDJUMUhyU2tpQTFkQzNtUUpEZC1CUFNWSzBvLWRGWnJsRkI5ZTAxbGI3dDlrbE0wWWpFejNrSjYteXdQRi1zT2tOVlVzdmE3bk1zMzhyRV9KV0o4eHdPcDYwM09qc3I1MFFpXzdvM1g4cXBPekRhU3FBdEkwb2pwN1dHTTNCamZjYll5TEJkSUdKaFY3VmdWZElIUkpVbXJ5THFMQnFJQlUwTWhLbTd0R21WQkhQdkU4NmVGZGVyRnBmMFloMUF6YTl2bEhrRUJSUVpOZXFPWEpWQjhQYmhOQWJ2RXlGcW1YZ1p4cUstX2dkVzQ4WDNwTUIycHlYWW5YSlpWQk5rLUpMd1djRzV1anh4R3pyeE5sTUVBNWlibGdtY0dTUlIzbkk2WjhvcW95WXBIOXJBblBKOV9IOEhaS0JwYVNzQnQ0UDVpWnJGMU1kYjJtNlJsLTBwME9rZGk5RzE4dm42T3FyZXQ0a1ZMZTB3cFpPY3dWZ19GcXdNZ0V5QnJGM3IyT3NCMnpwdkZMYzhLUjlQblVkYnRFRXp0WmFaM2xpQXMtckd4NV85VEhPdGNkNm9tRVEtcnN0d0x2UXk4UlY1dWRjcjExZlRVZmYtZmF4Tm41RXZVMktpRk1ZRVJ6TklqM2x4MUpKczhpLUo3S05LU0pkVnM4Tk04M0JGR0ZRX0hzWkVSNGZBekRYeVRSYjFXTF9lOTZDUlFyWWwyWnU0b3daS2labVpYemVCN0llQ0o0TTRDX0hOQ2NTbmx0ZVFWWFVFRElHWndFaG9tWmZiVnV6aUxmMEZwemtDTTBiV3RoUU9rakhRc2duekQwdE82aGE4SDhRYUMteU14RmE1V0FmZTRSaWRyenhhb01WNEFWcTdOanFUYmNfZXBPS1BieElUREFoaV85QnRnWVdfTzM0bHg1X1N6ZWQxaTZaLXY5eVc4OGNheldxTWJyZjdPZTk2QnM4YUtBRmd6bl9tM2hrRXAyTHVveFY4cWswYnZQWXlyMkpBZDdrU3pzTzVsZ3VWV1lZUGVHeHZHTFJnQmxfUVdwRHA1LTc2aHp2YUtVbWpGaC1GeXRjdV81RTVxbGk0R1VwMUQtWEtCTklCMThrb0Y2S1BBdW9VbDB3S3MxVVhlS2pza0VfaUZWVThSVVd2aXFGTkRGRUFLN3JEN2NkVEJUMnlBMkZabWJJWjhOaWJzc0R4Q2RBUUdLT3RHcE5JOEhqVUdrOE8wRlZiY1J1Qm9tVFN6RU04RU85WGp3TjhRQ1NtM2stcVdPT1BhclVWRXlIQ2htblY2Zkt0OTNZSk9FYWUwLS1LUjAyeHYzRXBxV2xHTEVCYWZpOVlnLW5pQ1VrYUZiSjB3YmtCVWhZVy1qVDQwc3pURHNBZ0JXN3pWOWtKSXlrenhqdzJFN0M1dHRhNnd4NjU2YWtaeF9yNVVmMnNpM3ZDVkY4Y3BEWm1EWjlQWi14d3BXV19SM2JqLXlpYmZPNlpxOERBN3YxV1NfT3pDU09QSkFzQUppMXhjMDhzUGU1UkFIaGpQdXV6bm53NmRGWjhJNG1xY3BkU2xHcm5hYmlhZ2xoZVFUQ0RzcFNMMXFsTTFIVElLSzdUY1VZOHdaRmsxeWNfblFEUmJHbWtyT3A0djQtSFFLTTAtOElpcUpDSW5CNU5lT3k1NDMyRHNaZW13VTBCNnQ5dkIzNklQelZqbHZYaERaNEcwekoxYm9VeC1ZUnV1RDl6cnFTcFJJYlIwR0V3Q3k0OXFyTXpHb1pnNlZBQXpOQVJOSkZVZHNhTDhONmk3SExXZ19ZZG1NcldDWnl1d0xiV2hzaXpMVWwxeW13R1hQYTh6ZV9TemtvZ2JSWWtqUENGbllIb1IwajRSVEJPaEJ4aTdBa1E3VlFlZ0xGS2JxanVGNV90VEtmNTZXTjY2WlQ5RVNDX1hpaG9mOEkzUmhNRW42SUk3dXFUdkYxWk4yRElBeXJrV2dlYjEybHdud3h2SWxDQjJaeHZwTUZaQUJEazZ1VEQtZ1VDUndYRU1feDh6TUdRSG1hdmV3aXlSRjM3SHktd1o2ZVFvLXNIYVgwY2E2UlRmdDdVOHNMaWFOdFNjdHVBNEtBU3dyYzJLaW1LWXhzSWZQY3BnaVQxZjh4NXlEa01peFVzUkdoWmNBc0Rmamh1YkJyWkRXdTFYNzVldUNXUlVvZHN1cEVMU0pXaGVhUEZIRW5GZHJtempUQzdqYURYMGV1OGhJdVB1ZGU5em53R1VQNXRBUEd2dUl4SmRVRHhkUWhPMV9FQm5wWU1mcldsMDJHdlQxZWM0aHFnbkV2QzE5Q2dvdHlMX3FiNUFTMUNHZG1lU1lNUjZFZ3Q4ZlJWamRmZHhjRWllZXBBNjVhZmxHTUJWUHlmd0hrZVJPOVJKT0YzVUlScVNrWmh4anZWYmNuYlc1ZjBWTzNyWEIwaEIzdW5mOE9oNVdJdXdJa3NnYU1DRDNaUVRzc0xXSlNzNUhFaXdpakVLNjNrZXF6b2dYRmhSMVVrdXNZcHk5RDlDcTFsSFhfSkZTemV3MC1WU25xVE11TVNmYUd6cnV3YURTRHM0V3pTcnlSaXEtYzI0N1dGR25UVWRNRmtYaUtnMVVPcFFsd0RvbXF1allkaVJ3ZFFnMENXLWpqMldiZ3YyaTVWY3ZJUXlFNXZqMjFtVzhNYXl4czJCdGhyT0N4QnRMSXBlSFJaOFR3Q3JrLXNqeG5FWGJVNUlXa0dMMXJIOGZUc2Vqb2lRazRNX1dDbkRnb0p0M1Zxd3VKRU5KWk8tZHdjaTdwZmxwSVQzMnlWVFFybkxhTUo3RWxpamdEMEtCWGNHVkJ0Vl8xblppNlJhNUNqTTNuek01TFZNUWJMQ2VRbGRoV0V4dGxTZnpKSHliMFAzNXFXblV4WW82M3g3Vm1yVUdZY1VzdjlsLUF3QnhibFdhN19CaDZfRGplRGstTFJkU2M4MVFXY25hMjF3NlBvYXd3cUNhQkxZajJrZmRBWEM1Wm9XWkNaT3V6a2UweHA3YU4wS2Nra0EyVmJ2NHNXVGc0eUtWOUdSQzAxY2xhQ0tnNHdDLUdHUzI5SUVRUmJITDR3dlhIdFpnUHVzSVo3eDJpTGFkYmlmajBiaXZMS1BMSkJZNUw5dmUzclNZNEJ6LXZtNHN6d0RuVmt6czBHQjRCOXhNRlVhblJlcFdtQ2NJVm1LUXZTNVhyZ2M0c1BPRmtMZ2p0eGNsQ3NpSHlxdDNLX0NUVnNQVUN2eTluM19PdkRHZklnWVVTLWxaYXdZaWFYaGkxSHVReUNyLWFyNl9Nc01RZzhXQm5RVG5OTzBuamo0VjduaGVidWZxd1NWQXRfNHpidUdnUWx1eUZGdXVjUUdFQjBhVVhVX1dlOTZDZkJPNmtvRjdtVFZRcnFta2pJS0V6UW1HSDE0cDdoYXRiYmU3Q3c2cnVXS1RfME0tM1EyUWVFNHl2aURaTEtwNUN2RXZVUUZ2Sl9GaU9YN0ktWnFMZXhKRkpZR2pHbEFkb1lrS1VldnBKZTlNR0c1VU1BUDBEN0t1VkxLNFdYNmtlQ28xMWlWQjcxQXlQcmdVTGxhOGxxSTRlZXJQNVpIWExlZnNHU2VPWEU2N0VZUEhNY0VaWE9vaEhTSGRmVTMxaWk1QUNURHMtM3F0c01KWG5qdWxQS3RuUEFXb3BIR2hkRTgyZ1ZnTlp2LUpocC0wY25BMTFiV2pQeFZOWmptcnYzcUpfSm5zUGFQamRXRW44aTVScG50Tkd3QTVQODg2ME53V2JGWUl3MUpxMTVFdl8xeTJoTzdRTGgtSzU3WHFwZzVoblY4Wm9YaG5KTlhKeTlBMVZvZnZ1QS1aSDR6S0lucF8tTWpVSEhxVDdxTnl3dktRczNiN0lUVzRNb2FhU2VKWFFYUW5XREtmQ01xLWwta1FiRnhXSTFYLTZab3VVM3dLSjZWWGtRbVhDNk1MbUw5QllpYk9HZGxqbkN2dUp2eDFIemJWMUpUM0lja3U1NW1IWjlZREJ4SE9BTjMzQ0FHSW1PT3pMaTBsVlZTcm9zRnd3U0JJTlNBV1l5a2hPOVdPZ0htVHNhNFY2eTN5Wl90VEJxb0FBdnRydjdMVmxMYkxsVnZEQ29ReFVVTXRVOTRlNzRiWXpJNUtQMFRram5BaEh1RmlUckxxT3UySm9ueVhFTFJva0E0aUdjT2hXdG5KUGhtWXlZUmJDTzRPajZJcUxQSUJKazh6bzd3NkwwTmV3Qk1jN1ViSWpua3JSUDNjc1RYVnY3bW55Y1F4MFljVTAydWN1UDBFbjJYX0diLUJ2RklUTktyR0RxTEZnTEhFZFBIRzVxdEdReGpDd1RSeTZnUmVFbmVMZHJXbW1pbWU3MmJqUlZUUHlWQTJDUmxJb3RzRmozRnplRVF6bDdiWU5ZUmhkUWR1QnRldFllMlozVVRETFAxY0NSNVZFOE1wVTB2OE5LdmV5VjdnV3dvSVNTb21xdjFGblFnMUZ6bXAzMjQtLXpldjVxQXNVVVNleVVVT2YzVzR2YkZLV1hyZXRaNTZHcG51NklRRGZBdDZVNEhfdXAtLW5XYjlOV2N6MjlQYXp3QjJ0V0o4WjRGTUdPczNWbF84VkNWbWNfUE9Qa01rdFZrRW5ldUdaSFdKVXY0YjNWbzBUbWZqQ3hXdlIxaEltM3ZTU2c4czBZMGNKRzJhMkRXMkxFY21fR2JwQS1wOFo5SkR1dmMxRlBWOWlWU3NsTktHUlg2VXdNQ1JUZmR3Z0VPOVNIMHQ1UkZDWjVKWk11Z2xBNDVQYldTdU81QXJ1d3FwaExPVUxlTm5GM0x1MnRkNmFTRnY4a2FXQ1ZjNTZEaHR4ZFo3bWZvd2pzLU5KQzlfcEJrc3lsUkpWZFhJUlROSHBPZDlabHdKS1kyTzdEaVFoZTMwV2ZaWGRXQ0RBZjctSmhlZXVqUGJ6WjFwbzFqbzRKVDFJbW1GVWRRc0lZNmdOX0JMN2FqWkNtZG5uT3NBNHM5WG1BQ29VM3BQOFJOaW9UZmdyb3dlZU4xTnZWeFlrdFFKemFERDdRa2VESENVUl9xc0JnVWM0TUtZQmQ5VXpuSWZ1WVQ1Y0JoT0YzZVF5dWxyX0xGY3FGaVBMVjlnWmVNdW9JejVDMnUwR1A1aVRHczVpQWZicTFUNXJyLXhlLUhXdWNqZmRHOGxjVlczcndpN1JpalpnX2J5Wl81bmRNa1VtazNnOWttME04ZHRPM3g1TGxidG9mLWZnQUtoSFhaT2o0bVVxLXNLNHVLRV9tSjZvd0xGVDBsamNpUFhzNE15R25PcHRlcXhJRXFySWwtM2JXT2gya2k2bElqcDl2SU05NXptWTFKeDY1U29VMkFjd2RIM21ocmgzV0w4NWtWbHJ5UXcxczJjMkRkMlpNUGthSFhrUWdza0RFSU1IZlc1aXluRUcyTEZpUm5SY2d5MnBBbjZDck53OXpMYnY1eDlmV1VvTlFOYXdiSUFsN3FqYUJ2cnk4WllNYU9iNlhCRTdrblVidU1aUEtuc0dkMW5lYkRpNHFPN0hkSjUwakpfek1yYUFIOVhuRWhJXzN0SUh1Yy1oMV92RV9NUm0zOHU1b1MtYWFqWW1oZ2tSbEZ4ZUQ1Tm9QR1ROTXFDLkJOWlpXWVRCQU1UTTBDVGNBQnBSS0E"}' + headers: + Accept: [application/json] + Content-Length: ['43148'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599973b4b1da4.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/3d33352494c14db39d79f293db4d4cfe","kid":"https://vault10511599973b4b1da4.vault.azure.net/keys/cert-name/3d33352494c14db39d79f293db4d4cfe","sid":"https://vault10511599973b4b1da4.vault.azure.net/secrets/cert-name/3d33352494c14db39d79f293db4d4cfe","x5t":"P58y5M_Ly32q8xqMyWxJXIbDmH8","cer":"MIIDWjCCAkKgAwIBAgIQWgfyRsGoRoerT7xQuXcz+TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMjA1WhcNMjEwOTA0MjMyMjA1WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1z4czbKr1qWqD6jyPVuLP5An2Pl0K2JkVOuKtUjIPn6cCLDHALEOh+YEkAmLEapG6BWjwgDSiyIVQis33qhcMj1zUra3opgO/cmSyFfPaiJpdIXlQd1oJdAVJeY+9KqYGDh2okYCVIhiM4hKGoUgOrcCyKXffsjmzukwHwaJliMnlZjgkckhGjc6QElzfQ30n1cHMnLbmC0bLZZvDPlmUrSTVL918BLqS5Ed2XZXaV2Wy9EpJwr0PGxFZ25tVSnOS+vMZykDExPt51AxySseBRxSwPyN1iBxN+0CAkroNAZsi1IxW1BkpKYNb5crPaNKOiEV8eUBEJJluNw2wyFvDAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDSH7zp/QHmmwFCkWRNdwhlp8gOjMB0GA1UdDgQWBBQ0h+86f0B5psBQpFkTXcIZafIDozANBgkqhkiG9w0BAQsFAAOCAQEAWjgjbmuZoQ9f7La6xPHvgGMm36pa+qkexe8lKRiB1mOxipmQuisiYnPmmipYEP1qsry9lzOMqYl7F6G4MXavMfFKWOXnFz5NJZ1r0a/N0r4GFZI2l1YaD0tqYH6cKaTMpamKSmtqXMQ8tlYbdIfvAw6RxGZ9a+btUg6p5rlI5tbCjOlhlnl5tSlqBg6Ib8J09Rqlerisg3q1RFDiSzoHZTrfQu0Az9VK8rVh8xMfC404h4wmPtLfIPHIddeBxeBI09dg8eArRZy/lQfiLoJ4BQQLxMZ+3faMP3YTT9/yNBP6dcvLodySV9mzh4Ig6I8h0p9RhU3VA7JAzG/wzXd7Nw==","attributes":{"enabled":true,"nbf":1567638725,"exp":1630797725,"created":1567639325,"updated":1567639325,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault10511599973b4b1da4.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639307,"updated":1567639307}}}'} + headers: {cache-control: no-cache, content-length: '2276', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:13 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599973b4b1da4.vault.azure.net, + /certificates/restore, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_crud_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_crud_operations.yaml new file mode 100644 index 000000000000..3d09887c3e76 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_crud_operations.yaml @@ -0,0 +1,191 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:05 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/e/nuSFt9HIql8LUb0824yhDb/wnvGPGRGudLv46QIrRcCfmrwmzBsV604PtVZd0TQY4Xx6CoHHms1upgVpZVabZfaqyCbxtgUFQyiuWbvgkwCWJy0ek6i0mr47a2kk0L49Jb0IS+2OGwGwJ3MerD0nS+KG716ldhwzNKH2JthOL/b6exfn6gS6TVN5movF9yXrRGD7JXQ6HplnyE+LWpZvBatqFH9YITlQs8fwxbS2GabrHrYEUyNvcMMRYDfiq7VbpQqGHpSDZyVDIt7HzTZcC51zSPFucWjWfR1oa7/bae2X1ZQeWqVQkGwwmrm/kBm75lkHFmbojoN2+aewBwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAF7vyF+qA6/0lOD6lMYom8mZb7TIpH0WNK5zvDcbQAYlKFU39+IRjBPgizOCjlBqX2/a9lmNQaazZtE8UzURzc65uEbks6nYwFv0ri8zohbfZ+aSI80/5cArhPUdixgwc4K2Jsz5y8GEdDR0CszrIqDZ8+G6zJiCHX/Ll+jyYVzUtdv4jBHzpe69U1kkvhmbPAnm1SDG5Rz3hCQVw3kwPvPsiOwvO/kUK/CBQ8ZwKviOmtrTWiQjlrnJckoIGiFmMThMg4XNjfoMot3fIt2tZ2kqr+a6jzL5HfWG+nLnEQKCeag8e4xdM4mKfCZGumhWqlFivbkGY/l/Vz720KDxEv0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"ea606c577fa446748ab76a6d5a4ee90f"}'} + headers: + cache-control: no-cache + content-length: '1342' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:21:06 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '5', a, '0', a, '1', e, '1', c, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, '-', n, a, m, e, /, p, e, n, d, i, n, g, '?', a, p, i, '-', v, e, + r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, '=', e, + a, '6', '0', '6', c, '5', '7', '7', f, a, '4', '4', '6', '7', '4', '8', a, + b, '7', '6', a, '6', d, '5', a, '4', e, e, '9', '0', f] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/e/nuSFt9HIql8LUb0824yhDb/wnvGPGRGudLv46QIrRcCfmrwmzBsV604PtVZd0TQY4Xx6CoHHms1upgVpZVabZfaqyCbxtgUFQyiuWbvgkwCWJy0ek6i0mr47a2kk0L49Jb0IS+2OGwGwJ3MerD0nS+KG716ldhwzNKH2JthOL/b6exfn6gS6TVN5movF9yXrRGD7JXQ6HplnyE+LWpZvBatqFH9YITlQs8fwxbS2GabrHrYEUyNvcMMRYDfiq7VbpQqGHpSDZyVDIt7HzTZcC51zSPFucWjWfR1oa7/bae2X1ZQeWqVQkGwwmrm/kBm75lkHFmbojoN2+aewBwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAF7vyF+qA6/0lOD6lMYom8mZb7TIpH0WNK5zvDcbQAYlKFU39+IRjBPgizOCjlBqX2/a9lmNQaazZtE8UzURzc65uEbks6nYwFv0ri8zohbfZ+aSI80/5cArhPUdixgwc4K2Jsz5y8GEdDR0CszrIqDZ8+G6zJiCHX/Ll+jyYVzUtdv4jBHzpe69U1kkvhmbPAnm1SDG5Rz3hCQVw3kwPvPsiOwvO/kUK/CBQ8ZwKviOmtrTWiQjlrnJckoIGiFmMThMg4XNjfoMot3fIt2tZ2kqr+a6jzL5HfWG+nLnEQKCeag8e4xdM4mKfCZGumhWqlFivbkGY/l/Vz720KDxEv0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"ea606c577fa446748ab76a6d5a4ee90f"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/e/nuSFt9HIql8LUb0824yhDb/wnvGPGRGudLv46QIrRcCfmrwmzBsV604PtVZd0TQY4Xx6CoHHms1upgVpZVabZfaqyCbxtgUFQyiuWbvgkwCWJy0ek6i0mr47a2kk0L49Jb0IS+2OGwGwJ3MerD0nS+KG716ldhwzNKH2JthOL/b6exfn6gS6TVN5movF9yXrRGD7JXQ6HplnyE+LWpZvBatqFH9YITlQs8fwxbS2GabrHrYEUyNvcMMRYDfiq7VbpQqGHpSDZyVDIt7HzTZcC51zSPFucWjWfR1oa7/bae2X1ZQeWqVQkGwwmrm/kBm75lkHFmbojoN2+aewBwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAF7vyF+qA6/0lOD6lMYom8mZb7TIpH0WNK5zvDcbQAYlKFU39+IRjBPgizOCjlBqX2/a9lmNQaazZtE8UzURzc65uEbks6nYwFv0ri8zohbfZ+aSI80/5cArhPUdixgwc4K2Jsz5y8GEdDR0CszrIqDZ8+G6zJiCHX/Ll+jyYVzUtdv4jBHzpe69U1kkvhmbPAnm1SDG5Rz3hCQVw3kwPvPsiOwvO/kUK/CBQ8ZwKviOmtrTWiQjlrnJckoIGiFmMThMg4XNjfoMot3fIt2tZ2kqr+a6jzL5HfWG+nLnEQKCeag8e4xdM4mKfCZGumhWqlFivbkGY/l/Vz720KDxEv0=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"ea606c577fa446748ab76a6d5a4ee90f"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:16 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx/e/nuSFt9HIql8LUb0824yhDb/wnvGPGRGudLv46QIrRcCfmrwmzBsV604PtVZd0TQY4Xx6CoHHms1upgVpZVabZfaqyCbxtgUFQyiuWbvgkwCWJy0ek6i0mr47a2kk0L49Jb0IS+2OGwGwJ3MerD0nS+KG716ldhwzNKH2JthOL/b6exfn6gS6TVN5movF9yXrRGD7JXQ6HplnyE+LWpZvBatqFH9YITlQs8fwxbS2GabrHrYEUyNvcMMRYDfiq7VbpQqGHpSDZyVDIt7HzTZcC51zSPFucWjWfR1oa7/bae2X1ZQeWqVQkGwwmrm/kBm75lkHFmbojoN2+aewBwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAF7vyF+qA6/0lOD6lMYom8mZb7TIpH0WNK5zvDcbQAYlKFU39+IRjBPgizOCjlBqX2/a9lmNQaazZtE8UzURzc65uEbks6nYwFv0ri8zohbfZ+aSI80/5cArhPUdixgwc4K2Jsz5y8GEdDR0CszrIqDZ8+G6zJiCHX/Ll+jyYVzUtdv4jBHzpe69U1kkvhmbPAnm1SDG5Rz3hCQVw3kwPvPsiOwvO/kUK/CBQ8ZwKviOmtrTWiQjlrnJckoIGiFmMThMg4XNjfoMot3fIt2tZ2kqr+a6jzL5HfWG+nLnEQKCeag8e4xdM4mKfCZGumhWqlFivbkGY/l/Vz720KDxEv0=","cancellation_requested":false,"status":"completed","target":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name","request_id":"ea606c577fa446748ab76a6d5a4ee90f"}'} + headers: {cache-control: no-cache, content-length: '1259', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:26 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/cfc0483e12114ff19838613309c668a0","kid":"https://vault10511599975a0a1e1c.vault.azure.net/keys/cert-name/cfc0483e12114ff19838613309c668a0","sid":"https://vault10511599975a0a1e1c.vault.azure.net/secrets/cert-name/cfc0483e12114ff19838613309c668a0","x5t":"BFtHG9Xw3t61jFTWaO4ZQOGpitM","cer":"MIIDWjCCAkKgAwIBAgIQeqcT/5KhQb6RRzD/d0IM3TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI2WhcNMjEwOTA0MjMyMTI2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDH97+e5IW30ciqXwtRvTzbjKENv/Ce8Y8ZEa50u/jpAitFwJ+avCbMGxXrTg+1Vl3RNBjhfHoKgceazW6mBWllVptl9qrIJvG2BQVDKK5Zu+CTAJYnLR6TqLSavjtraSTQvj0lvQhL7Y4bAbAncx6sPSdL4obvXqV2HDM0ofYm2E4v9vp7F+fqBLpNU3mai8X3JetEYPsldDoemWfIT4talm8Fq2oUf1ghOVCzx/DFtLYZpusetgRTI29wwxFgN+KrtVulCoYelINnJUMi3sfNNlwLnXNI8W5xaNZ9HWhrv9tp7ZfVlB5apVCQbDCaub+QGbvmWQcWZuiOg3b5p7AHAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFBpl3LxoYs4CLVeiebPX/jkg0VpRMB0GA1UdDgQWBBQaZdy8aGLOAi1Xonmz1/45INFaUTANBgkqhkiG9w0BAQsFAAOCAQEAt/B7XYOOQcKvMaAI/rSrHB3sq4ce1zniUoyAPyUqRW2JaxwEpmW2X9XOM0usMwUKiBbJ5cSqgIAI0bYoQmydW3vKGdpvOYIFSxQ2Xs2uq4Czhf4hRwVmW/+f7esU9QoFE6LPbXzO/3hXmj1kQ5lUYfFCk0ZSYEu2Ip6DmQ3UuDAXQ7eMZORSompdgV5QH8FF+T1fitiD9sdyNph41SydaSTTlOa0H7JGmkCBxJnmtcWMpue0QDa1EQKJzI9EqrGs8Km7ohr4o6zo5WWV4mJEj2j2PAJnX2KVDjNu3s5mTa0nj+Wn9wNcLraHqLhYtiP3YxARc/fXZaVAQmKteDsszg==","attributes":{"enabled":true,"nbf":1567638686,"exp":1630797686,"created":1567639286,"updated":1567639286,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}},"pending":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2429', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/, api-version=7.0, ''] +- request: + body: '{"tags": {"foo": "updated tag"}}' + headers: + Accept: [application/json] + Content-Length: ['32'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: PATCH + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/cfc0483e12114ff19838613309c668a0","kid":"https://vault10511599975a0a1e1c.vault.azure.net/keys/cert-name/cfc0483e12114ff19838613309c668a0","sid":"https://vault10511599975a0a1e1c.vault.azure.net/secrets/cert-name/cfc0483e12114ff19838613309c668a0","x5t":"BFtHG9Xw3t61jFTWaO4ZQOGpitM","cer":"MIIDWjCCAkKgAwIBAgIQeqcT/5KhQb6RRzD/d0IM3TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI2WhcNMjEwOTA0MjMyMTI2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDH97+e5IW30ciqXwtRvTzbjKENv/Ce8Y8ZEa50u/jpAitFwJ+avCbMGxXrTg+1Vl3RNBjhfHoKgceazW6mBWllVptl9qrIJvG2BQVDKK5Zu+CTAJYnLR6TqLSavjtraSTQvj0lvQhL7Y4bAbAncx6sPSdL4obvXqV2HDM0ofYm2E4v9vp7F+fqBLpNU3mai8X3JetEYPsldDoemWfIT4talm8Fq2oUf1ghOVCzx/DFtLYZpusetgRTI29wwxFgN+KrtVulCoYelINnJUMi3sfNNlwLnXNI8W5xaNZ9HWhrv9tp7ZfVlB5apVCQbDCaub+QGbvmWQcWZuiOg3b5p7AHAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFBpl3LxoYs4CLVeiebPX/jkg0VpRMB0GA1UdDgQWBBQaZdy8aGLOAi1Xonmz1/45INFaUTANBgkqhkiG9w0BAQsFAAOCAQEAt/B7XYOOQcKvMaAI/rSrHB3sq4ce1zniUoyAPyUqRW2JaxwEpmW2X9XOM0usMwUKiBbJ5cSqgIAI0bYoQmydW3vKGdpvOYIFSxQ2Xs2uq4Czhf4hRwVmW/+f7esU9QoFE6LPbXzO/3hXmj1kQ5lUYfFCk0ZSYEu2Ip6DmQ3UuDAXQ7eMZORSompdgV5QH8FF+T1fitiD9sdyNph41SydaSTTlOa0H7JGmkCBxJnmtcWMpue0QDa1EQKJzI9EqrGs8Km7ohr4o6zo5WWV4mJEj2j2PAJnX2KVDjNu3s5mTa0nj+Wn9wNcLraHqLhYtiP3YxARc/fXZaVAQmKteDsszg==","attributes":{"enabled":true,"nbf":1567638686,"exp":1630797686,"created":1567639286,"updated":1567639292,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}},"pending":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2458', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name/, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault10511599975a0a1e1c.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639292,"scheduledPurgeDate":1575415292,"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/cfc0483e12114ff19838613309c668a0","kid":"https://vault10511599975a0a1e1c.vault.azure.net/keys/cert-name/cfc0483e12114ff19838613309c668a0","sid":"https://vault10511599975a0a1e1c.vault.azure.net/secrets/cert-name/cfc0483e12114ff19838613309c668a0","x5t":"BFtHG9Xw3t61jFTWaO4ZQOGpitM","cer":"MIIDWjCCAkKgAwIBAgIQeqcT/5KhQb6RRzD/d0IM3TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI2WhcNMjEwOTA0MjMyMTI2WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDH97+e5IW30ciqXwtRvTzbjKENv/Ce8Y8ZEa50u/jpAitFwJ+avCbMGxXrTg+1Vl3RNBjhfHoKgceazW6mBWllVptl9qrIJvG2BQVDKK5Zu+CTAJYnLR6TqLSavjtraSTQvj0lvQhL7Y4bAbAncx6sPSdL4obvXqV2HDM0ofYm2E4v9vp7F+fqBLpNU3mai8X3JetEYPsldDoemWfIT4talm8Fq2oUf1ghOVCzx/DFtLYZpusetgRTI29wwxFgN+KrtVulCoYelINnJUMi3sfNNlwLnXNI8W5xaNZ9HWhrv9tp7ZfVlB5apVCQbDCaub+QGbvmWQcWZuiOg3b5p7AHAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFBpl3LxoYs4CLVeiebPX/jkg0VpRMB0GA1UdDgQWBBQaZdy8aGLOAi1Xonmz1/45INFaUTANBgkqhkiG9w0BAQsFAAOCAQEAt/B7XYOOQcKvMaAI/rSrHB3sq4ce1zniUoyAPyUqRW2JaxwEpmW2X9XOM0usMwUKiBbJ5cSqgIAI0bYoQmydW3vKGdpvOYIFSxQ2Xs2uq4Czhf4hRwVmW/+f7esU9QoFE6LPbXzO/3hXmj1kQ5lUYfFCk0ZSYEu2Ip6DmQ3UuDAXQ7eMZORSompdgV5QH8FF+T1fitiD9sdyNph41SydaSTTlOa0H7JGmkCBxJnmtcWMpue0QDa1EQKJzI9EqrGs8Km7ohr4o6zo5WWV4mJEj2j2PAJnX2KVDjNu3s5mTa0nj+Wn9wNcLraHqLhYtiP3YxARc/fXZaVAQmKteDsszg==","attributes":{"enabled":true,"nbf":1567638686,"exp":1630797686,"created":1567639286,"updated":1567639292,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639266,"updated":1567639266}},"pending":{"id":"https://vault10511599975a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2608', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975a0a1e1c.vault.azure.net, + /certificates/cert-name, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_list_operations.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_list_operations.yaml new file mode 100644 index 000000000000..20f090aa8879 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_list_operations.yaml @@ -0,0 +1,352 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:32 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate0/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjlnj6kcq4yHLg5Y4KsVfVL7D45CzO7LCAIyVnk12InJHldMKb4h1vEOcXdpW365FdkKs11FujxsPD3afQCWtwHvd8i5fsfwQuz/hSEtuhz3G9XLCDh5n14GtMryAh7TubcTaeljsrZ9CPXuBWSxm8DCdFgRro6QlhCBnrRBus6tlCnbSYk6ddVJ5YH5PxzkVr6sawmkXIrRiVRoWAdOgcDMcOY/1QzcWXRI4BTNvhlXggWrCwrj3phiEuuLM4DOiAtOkqmcMR7B90myOwl+q+RY7U70kPxyQRNAOC9WIYUd0dlq5AeseoZavHbBw9NHSPIZjvD5eYTLxxFlwQHeRGQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIN6jkBL4TIU4BFcI0C/QxeeS2me7eviQDf4T0IHI8Fq4OKlgt75lL6n18UoTRps691fKBdRVx69s86A1b0hNEZyQV01ZHdFlGJovhK6uD8q2b32U7AsFeFkN3RjJaRJOoP/9Sw+35XnrzjGS5cXvBivkvf1kE/hvllwm3iYeSWwXK3c1X636fnypfzjS2/DAC7eGlnoiz7BG4ZYN4yJQvnLSBsng+wCpsrf/CbpREa4JI9K1Ao33U3Ur001j0yfna0ttsSEK6qJcwZ/4VoOwJdcf9O3qIElYni104yLqDSD33zvWChCE1YB3lnuPLEqn+CGeDPshNVn7UJlCRVaVdg=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"06137c75ccd840e0b5c30cd251fef482"}'} + headers: + cache-control: no-cache + content-length: '1345' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:22:33 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '5', a, b, '9', '1', e, '2', a, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, i, f, i, c, a, t, e, '0', /, p, e, n, d, i, n, g, '?', a, p, i, '-', + v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, + '=', '0', '6', '1', '3', '7', c, '7', '5', c, c, d, '8', '4', '0', e, '0', + b, '5', c, '3', '0', c, d, '2', '5', '1', f, e, f, '4', '8', '2'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate0/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSBWklS8qkSGUTSoqyYHL+3i8wHzqbO26Xc0nNnajtHxu9kfBXCWQdUAHCTUD29xR4u9X5HflA8nz877u5sAXVb+IV4qI8G1Wzv2A6FdZuGQ8oqGOltcySO0ZDuyPvHvsrid4J9MgnPnRTW5w7H2/x37BU6DKXBDu5UqqAKPaNa8FLHhsPlOw7FSPxLRjof1LKwgHCFAZaTp/+wg7xSSXH7gr39kMOn/w0Dg735e3wIezSRq3rsQVNuk7p8Skp6eQzqpJ4HIqHD6Uh0CqMz+aeUh9Nb91NKfAit/5Kc4Z5lsLQm6Tea3Vk+bxtSUWoObYNkhnFnTWetmPwOl5arKWQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADEbk4Vv46dHI8CvALsr6G9McIVNGB7FNLuingEHQUU8iepEU+X6aIW9htbgOswP34cio1D14y2bw00nMu/a6kgXrb2AX5V68akpnP0n9TZQGR6icRu2QXyrNIIJ2YkO7riraw0MMTkwVpEFcTKjm5GSUpBQ45AVH8CJVECVcjq1+VHZbv7F2Kb5x4g4F8WtymryHZmo+SZL5zt19IG+90JtmdoRv5FYFTOcOx9EtAaON7apUaFAx7aY8gRIEVD4pH6HicKydFA7n17MnkItzzg5+Wpnxi2RXCg8Sv0JS5jw3nr3dftBSONVRYQ3okKZlc9VtY2D2yqlfYqbYFYt4U8=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"a6df80136d8e4fe79c3f7f0cf749bf43"}'} + headers: + cache-control: no-cache + content-length: '1345' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:22:34 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '5', a, b, '9', '1', e, '2', a, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, i, f, i, c, a, t, e, '1', /, p, e, n, d, i, n, g, '?', a, p, i, '-', + v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, + '=', a, '6', d, f, '8', '0', '1', '3', '6', d, '8', e, '4', f, e, '7', '9', + c, '3', f, '7', f, '0', c, f, '7', '4', '9', b, f, '4', '3'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate1/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnO22tRfMNgdrWp09PDDV+kJI3XOW6N0tKCUzQeUVseo0LrCiKIwXMysdFo8R+kG2I/w1LeU4XCeg2R6DmSk1+FStnGJ6VLye+3ImPqP8YQXPrNeTYW5f4JJ4hoxpSKXONqfgXNErQTK3SvFn7qSO2L9UgiqvWYPpJ90lZdnotzfENXgkTSoV6N3JjbdQtp1V0yPbj6kDBsi/IgbcYpRS/Cvy3cjK31R6RPDNbYFIjqx4tudV0TI4cMctvEl5i/VetERRj3UzoFVQVDOFwgPCeXH9ZttAE+fvnGCmGyyfTfrPzsLhw9ABkNE5+mR5dtak3NTDAZGTlSMXwr4YJw3lQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGfO8cHXxhSMrpAFCyTIDU7jcu05PYPF4upWamX2n4E80nbghZk+UkIg+Klwf1gL/Cw4XfFwIw5l3T/hUAwzM2FPl4lYr6ePMaLcxLXgDbIG6LZ9+xUAD6Biu8Hr2+w2oZ94diZ5TOgdl0zNiZfImha/973DIY1jv1Aj5ijbeWa0N/4/HZURHoi/rbjscspp0P2zCdYzB2jkjJjRUmT/scFWsFPlbPGlw/pl8hdRtilENJa5+nfNEiMihF7Gvc0xH3QgaMMxcj45UAgKQ0q58NrrPdOXDUvSsMYEwY6qF1lP4NnFAQbhvXg86J/3suGaX2Y0m8gwbbdkRykIlcJI1TU=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"4429b8a0cc8547c3a59d54e3731ab8f4"}'} + headers: + cache-control: no-cache + content-length: '1345' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:22:34 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '5', a, b, '9', '1', e, '2', a, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, i, f, i, c, a, t, e, '2', /, p, e, n, d, i, n, g, '?', a, p, i, '-', + v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, + '=', '4', '4', '2', '9', b, '8', a, '0', c, c, '8', '5', '4', '7', c, '3', + a, '5', '9', d, '5', '4', e, '3', '7', '3', '1', a, b, '8', f, '4'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate2/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjydERQrmeiib3FN74SyfvLaq+MoLKNQhRdRq/fM2rszxiXpz2TzXiO3EtsEbckf2WEL99Isd/5mAa09k9rAarhhMp/4Ih2l29YBd8bucS9wsJ/47g+EPR8CSel5kEWmxbwdMeMT5MtVipflsdDz1OgNhLzvXw15ah0uVBRnQ0DOtaJXOjBDAR94hWkBpTbQ64QTUO+PcXTU8mZxgEu+llx/E85Eq5Oj/KLWsJHd8DlFHENKJyHe8K2N6kb1bNKn+FwlQqr67WFV2diWWVasfXzmGgZMVE3PvxkYYbCg6QIjp92ZR0BYPz3xo0n30Ihvr1aPvWPS9SK73BjjUAo5g7wIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIuah6OsGTt7MCkJvprSiTSXkvtP00+WQo1/UXmTZ3BJaHaavimJT76Se7TT2kZHRWlj9in+jzqyNoxEFYAeiUQ4+y5ngC2Cmf2i+SpyCHoDHfMbczcNz4LY70lHl/yhw2jIlOmWOtu7sNp6IH6cj/ON0fRPmXWvJicRMGxQpfdSCFqRHIF84cctLNIp9NRTA/XoD39Ljyqb1rTMf4/F9zJb45jYdC7u1MmrV240vNEsuqLmwRuqouBh4GErfFixCWzF/elL5wC2YuvKtR2mWZPuJ9t2xb96k04yyN/77nr7UIE49xS1LM0C/U/wEeJGcCvs5Ej+hK/3reCcGP482Bw=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"92aded50e1274d889173596d0669434b"}'} + headers: + cache-control: no-cache + content-length: '1345' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:22:35 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '5', a, b, '9', '1', e, '2', a, ., v, a, u, l, t, + ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, c, + e, r, t, i, f, i, c, a, t, e, '3', /, p, e, n, d, i, n, g, '?', a, p, i, '-', + v, e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, + '=', '9', '2', a, d, e, d, '5', '0', e, '1', '2', '7', '4', d, '8', '8', '9', + '1', '7', '3', '5', '9', '6', d, '0', '6', '6', '9', '4', '3', '4', b] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate3/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjlnj6kcq4yHLg5Y4KsVfVL7D45CzO7LCAIyVnk12InJHldMKb4h1vEOcXdpW365FdkKs11FujxsPD3afQCWtwHvd8i5fsfwQuz/hSEtuhz3G9XLCDh5n14GtMryAh7TubcTaeljsrZ9CPXuBWSxm8DCdFgRro6QlhCBnrRBus6tlCnbSYk6ddVJ5YH5PxzkVr6sawmkXIrRiVRoWAdOgcDMcOY/1QzcWXRI4BTNvhlXggWrCwrj3phiEuuLM4DOiAtOkqmcMR7B90myOwl+q+RY7U70kPxyQRNAOC9WIYUd0dlq5AeseoZavHbBw9NHSPIZjvD5eYTLxxFlwQHeRGQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIN6jkBL4TIU4BFcI0C/QxeeS2me7eviQDf4T0IHI8Fq4OKlgt75lL6n18UoTRps691fKBdRVx69s86A1b0hNEZyQV01ZHdFlGJovhK6uD8q2b32U7AsFeFkN3RjJaRJOoP/9Sw+35XnrzjGS5cXvBivkvf1kE/hvllwm3iYeSWwXK3c1X636fnypfzjS2/DAC7eGlnoiz7BG4ZYN4yJQvnLSBsng+wCpsrf/CbpREa4JI9K1Ao33U3Ur001j0yfna0ttsSEK6qJcwZ/4VoOwJdcf9O3qIElYni104yLqDSD33zvWChCE1YB3lnuPLEqn+CGeDPshNVn7UJlCRVaVdg=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"06137c75ccd840e0b5c30cd251fef482"}'} + headers: {cache-control: no-cache, content-length: '1345', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:35 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate0/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjlnj6kcq4yHLg5Y4KsVfVL7D45CzO7LCAIyVnk12InJHldMKb4h1vEOcXdpW365FdkKs11FujxsPD3afQCWtwHvd8i5fsfwQuz/hSEtuhz3G9XLCDh5n14GtMryAh7TubcTaeljsrZ9CPXuBWSxm8DCdFgRro6QlhCBnrRBus6tlCnbSYk6ddVJ5YH5PxzkVr6sawmkXIrRiVRoWAdOgcDMcOY/1QzcWXRI4BTNvhlXggWrCwrj3phiEuuLM4DOiAtOkqmcMR7B90myOwl+q+RY7U70kPxyQRNAOC9WIYUd0dlq5AeseoZavHbBw9NHSPIZjvD5eYTLxxFlwQHeRGQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIN6jkBL4TIU4BFcI0C/QxeeS2me7eviQDf4T0IHI8Fq4OKlgt75lL6n18UoTRps691fKBdRVx69s86A1b0hNEZyQV01ZHdFlGJovhK6uD8q2b32U7AsFeFkN3RjJaRJOoP/9Sw+35XnrzjGS5cXvBivkvf1kE/hvllwm3iYeSWwXK3c1X636fnypfzjS2/DAC7eGlnoiz7BG4ZYN4yJQvnLSBsng+wCpsrf/CbpREa4JI9K1Ao33U3Ur001j0yfna0ttsSEK6qJcwZ/4VoOwJdcf9O3qIElYni104yLqDSD33zvWChCE1YB3lnuPLEqn+CGeDPshNVn7UJlCRVaVdg=","cancellation_requested":false,"status":"completed","target":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0","request_id":"06137c75ccd840e0b5c30cd251fef482"}'} + headers: {cache-control: no-cache, content-length: '1265', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:45 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate0/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSBWklS8qkSGUTSoqyYHL+3i8wHzqbO26Xc0nNnajtHxu9kfBXCWQdUAHCTUD29xR4u9X5HflA8nz877u5sAXVb+IV4qI8G1Wzv2A6FdZuGQ8oqGOltcySO0ZDuyPvHvsrid4J9MgnPnRTW5w7H2/x37BU6DKXBDu5UqqAKPaNa8FLHhsPlOw7FSPxLRjof1LKwgHCFAZaTp/+wg7xSSXH7gr39kMOn/w0Dg735e3wIezSRq3rsQVNuk7p8Skp6eQzqpJ4HIqHD6Uh0CqMz+aeUh9Nb91NKfAit/5Kc4Z5lsLQm6Tea3Vk+bxtSUWoObYNkhnFnTWetmPwOl5arKWQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBADEbk4Vv46dHI8CvALsr6G9McIVNGB7FNLuingEHQUU8iepEU+X6aIW9htbgOswP34cio1D14y2bw00nMu/a6kgXrb2AX5V68akpnP0n9TZQGR6icRu2QXyrNIIJ2YkO7riraw0MMTkwVpEFcTKjm5GSUpBQ45AVH8CJVECVcjq1+VHZbv7F2Kb5x4g4F8WtymryHZmo+SZL5zt19IG+90JtmdoRv5FYFTOcOx9EtAaON7apUaFAx7aY8gRIEVD4pH6HicKydFA7n17MnkItzzg5+Wpnxi2RXCg8Sv0JS5jw3nr3dftBSONVRYQ3okKZlc9VtY2D2yqlfYqbYFYt4U8=","cancellation_requested":false,"status":"completed","target":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1","request_id":"a6df80136d8e4fe79c3f7f0cf749bf43"}'} + headers: {cache-control: no-cache, content-length: '1265', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:50 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate1/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnO22tRfMNgdrWp09PDDV+kJI3XOW6N0tKCUzQeUVseo0LrCiKIwXMysdFo8R+kG2I/w1LeU4XCeg2R6DmSk1+FStnGJ6VLye+3ImPqP8YQXPrNeTYW5f4JJ4hoxpSKXONqfgXNErQTK3SvFn7qSO2L9UgiqvWYPpJ90lZdnotzfENXgkTSoV6N3JjbdQtp1V0yPbj6kDBsi/IgbcYpRS/Cvy3cjK31R6RPDNbYFIjqx4tudV0TI4cMctvEl5i/VetERRj3UzoFVQVDOFwgPCeXH9ZttAE+fvnGCmGyyfTfrPzsLhw9ABkNE5+mR5dtak3NTDAZGTlSMXwr4YJw3lQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGfO8cHXxhSMrpAFCyTIDU7jcu05PYPF4upWamX2n4E80nbghZk+UkIg+Klwf1gL/Cw4XfFwIw5l3T/hUAwzM2FPl4lYr6ePMaLcxLXgDbIG6LZ9+xUAD6Biu8Hr2+w2oZ94diZ5TOgdl0zNiZfImha/973DIY1jv1Aj5ijbeWa0N/4/HZURHoi/rbjscspp0P2zCdYzB2jkjJjRUmT/scFWsFPlbPGlw/pl8hdRtilENJa5+nfNEiMihF7Gvc0xH3QgaMMxcj45UAgKQ0q58NrrPdOXDUvSsMYEwY6qF1lP4NnFAQbhvXg86J/3suGaX2Y0m8gwbbdkRykIlcJI1TU=","cancellation_requested":false,"status":"completed","target":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2","request_id":"4429b8a0cc8547c3a59d54e3731ab8f4"}'} + headers: {cache-control: no-cache, content-length: '1265', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:22:56 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate2/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjydERQrmeiib3FN74SyfvLaq+MoLKNQhRdRq/fM2rszxiXpz2TzXiO3EtsEbckf2WEL99Isd/5mAa09k9rAarhhMp/4Ih2l29YBd8bucS9wsJ/47g+EPR8CSel5kEWmxbwdMeMT5MtVipflsdDz1OgNhLzvXw15ah0uVBRnQ0DOtaJXOjBDAR94hWkBpTbQ64QTUO+PcXTU8mZxgEu+llx/E85Eq5Oj/KLWsJHd8DlFHENKJyHe8K2N6kb1bNKn+FwlQqr67WFV2diWWVasfXzmGgZMVE3PvxkYYbCg6QIjp92ZR0BYPz3xo0n30Ihvr1aPvWPS9SK73BjjUAo5g7wIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIuah6OsGTt7MCkJvprSiTSXkvtP00+WQo1/UXmTZ3BJaHaavimJT76Se7TT2kZHRWlj9in+jzqyNoxEFYAeiUQ4+y5ngC2Cmf2i+SpyCHoDHfMbczcNz4LY70lHl/yhw2jIlOmWOtu7sNp6IH6cj/ON0fRPmXWvJicRMGxQpfdSCFqRHIF84cctLNIp9NRTA/XoD39Ljyqb1rTMf4/F9zJb45jYdC7u1MmrV240vNEsuqLmwRuqouBh4GErfFixCWzF/elL5wC2YuvKtR2mWZPuJ9t2xb96k04yyN/77nr7UIE49xS1LM0C/U/wEeJGcCvs5Ej+hK/3reCcGP482Bw=","cancellation_requested":false,"status":"completed","target":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3","request_id":"92aded50e1274d889173596d0669434b"}'} + headers: {cache-control: no-cache, content-length: '1265', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:23:00 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/certificate3/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate0","x5t":"_uLpSQSBBACR7D_F4nXiDdgUrZA","attributes":{"enabled":true,"nbf":1567638762,"exp":1630797762,"created":1567639362,"updated":1567639362},"subject":""},{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate1","x5t":"BztUSITf59KUotl37Vd03_EaqiI","attributes":{"enabled":true,"nbf":1567638762,"exp":1630797762,"created":1567639362,"updated":1567639362},"subject":""},{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate2","x5t":"8KR8c4FVCRM-7xVqXN6IRFdesbw","attributes":{"enabled":true,"nbf":1567638762,"exp":1630797762,"created":1567639362,"updated":1567639362},"subject":""},{"id":"https://vault10511599975ab91e2a.vault.azure.net/certificates/certificate3","x5t":"uNwkc7X07ZIsQn0sWuNQFykvtzw","attributes":{"enabled":true,"nbf":1567638762,"exp":1630797762,"created":1567639362,"updated":1567639362},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '979', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:23:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/certificates/cert-name/versions?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '28', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:23:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /certificates/cert-name/versions, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault10511599975ab91e2a.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '28', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:23:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault10511599975ab91e2a.vault.azure.net, + /deletedcertificates, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_recover.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_recover.yaml new file mode 100644 index 000000000000..50e570ff41d2 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_recover.yaml @@ -0,0 +1,326 @@ +interactions: +- request: + body: null + headers: + Accept: [application/json] + Content-Length: ['0'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"error":{"code":"Unauthorized","message":"Request is missing + a Bearer or PoP token."}}'} + headers: {cache-control: no-cache, content-length: '87', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:06 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + www-authenticate: 'Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net"', x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 401, message: Unauthorized} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: '{"policy": {"key_props": {"exportable": true, "kty": "RSA", "key_size": + 2048, "reuse_key": false}, "secret_props": {"contentType": "application/x-pkcs12"}, + "x509_props": {"subject": "CN=*.microsoft.com", "sans": {"dns_names": ["sdk.azure-int.net"]}, + "validity_months": 24}, "issuer": {"name": "Self"}}}' + headers: + Accept: [application/json] + Content-Length: ['302'] + Content-Type: [application/json; charset=utf-8] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsPumBxp+j2TWQF48pIrmtOWIvsjF4ijDTThFOBqWPitBVRXmvoBp2T2Afg+EmKxxWpOb8qTAsd+uwb+FGmjSISrMfjtja7jg/WLJQ+ZAcBPE7OzFW5i6M4ANzZwIkw1h+giZ5YEwaiNy/cHaYmD3YL8rwAH5dM763BoIOiCPqq6uZf+fU6AW3ujm2iQE4h22JRrz0B5YtlIdiJoyAjeT+0h1fBQte8RNObPJLnu/4GAU/Kbo/u29c3gRDLd42dx4wAdDaUx+c8T75/6VrEe0QcBn2jYCVxQWpodCQHrwT31LL0VOgGBEPrJBlUcbA2dauGOnzlb8MjXJ1b+6+cdQ/QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAedSv6w1KD2LMPOnhJAgAJm7x7gmt8DGlb+667pvbLe7RNQgI4GXI2GWxijja34+j5P6f4zo0vMjIfeWzCeqZUTuuawX5FK86HdFbgh8dZp50BAo48wBwZq5XeEhOpnUGXyGp4RFFyRaonRsaR7G/iXxk+skiZsjOsavH++nFTMeHWy0gvObuPAR0buTuid76JvZNOF2spJkPVy1PZ8rxGpeOr5mWYM/iJ1rvxSe2WXuT0imjMoq5OZ8zWHuGSJ+05J21J5pKjXRuoGyhEQkZPTgpO4zYUfuY/rfLQMZbZaesxC+wPuv+5SlS9ToNDD47Igl4bbuNCho6ujctysBJ4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"47fabc333e9c40329057e013361f455f"}'} + headers: + cache-control: no-cache + content-length: '1342' + content-type: application/json; charset=utf-8 + date: Wed, 04 Sep 2019 23:21:07 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '1', '0', '5', '1', '1', + '5', '9', '9', '9', '7', '7', '5', '5', '3', '1', a, c, '1', ., v, a, u, l, + t, ., a, z, u, r, e, ., n, e, t, /, c, e, r, t, i, f, i, c, a, t, e, s, /, + c, e, r, t, '-', n, a, m, e, /, p, e, n, d, i, n, g, '?', a, p, i, '-', v, + e, r, s, i, o, n, '=', '7', ., '0', '&', r, e, q, u, e, s, t, _, i, d, '=', + '4', '7', f, a, b, c, '3', '3', '3', e, '9', c, '4', '0', '3', '2', '9', '0', + '5', '7', e, '0', '1', '3', '3', '6', '1', f, '4', '5', '5', f] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.876 + x-powered-by: ASP.NET + status: {code: 202, message: Accepted} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name/create, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsPumBxp+j2TWQF48pIrmtOWIvsjF4ijDTThFOBqWPitBVRXmvoBp2T2Afg+EmKxxWpOb8qTAsd+uwb+FGmjSISrMfjtja7jg/WLJQ+ZAcBPE7OzFW5i6M4ANzZwIkw1h+giZ5YEwaiNy/cHaYmD3YL8rwAH5dM763BoIOiCPqq6uZf+fU6AW3ujm2iQE4h22JRrz0B5YtlIdiJoyAjeT+0h1fBQte8RNObPJLnu/4GAU/Kbo/u29c3gRDLd42dx4wAdDaUx+c8T75/6VrEe0QcBn2jYCVxQWpodCQHrwT31LL0VOgGBEPrJBlUcbA2dauGOnzlb8MjXJ1b+6+cdQ/QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAedSv6w1KD2LMPOnhJAgAJm7x7gmt8DGlb+667pvbLe7RNQgI4GXI2GWxijja34+j5P6f4zo0vMjIfeWzCeqZUTuuawX5FK86HdFbgh8dZp50BAo48wBwZq5XeEhOpnUGXyGp4RFFyRaonRsaR7G/iXxk+skiZsjOsavH++nFTMeHWy0gvObuPAR0buTuid76JvZNOF2spJkPVy1PZ8rxGpeOr5mWYM/iJ1rvxSe2WXuT0imjMoq5OZ8zWHuGSJ+05J21J5pKjXRuoGyhEQkZPTgpO4zYUfuY/rfLQMZbZaesxC+wPuv+5SlS9ToNDD47Igl4bbuNCho6ujctysBJ4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"47fabc333e9c40329057e013361f455f"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:07 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsPumBxp+j2TWQF48pIrmtOWIvsjF4ijDTThFOBqWPitBVRXmvoBp2T2Afg+EmKxxWpOb8qTAsd+uwb+FGmjSISrMfjtja7jg/WLJQ+ZAcBPE7OzFW5i6M4ANzZwIkw1h+giZ5YEwaiNy/cHaYmD3YL8rwAH5dM763BoIOiCPqq6uZf+fU6AW3ujm2iQE4h22JRrz0B5YtlIdiJoyAjeT+0h1fBQte8RNObPJLnu/4GAU/Kbo/u29c3gRDLd42dx4wAdDaUx+c8T75/6VrEe0QcBn2jYCVxQWpodCQHrwT31LL0VOgGBEPrJBlUcbA2dauGOnzlb8MjXJ1b+6+cdQ/QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAedSv6w1KD2LMPOnhJAgAJm7x7gmt8DGlb+667pvbLe7RNQgI4GXI2GWxijja34+j5P6f4zo0vMjIfeWzCeqZUTuuawX5FK86HdFbgh8dZp50BAo48wBwZq5XeEhOpnUGXyGp4RFFyRaonRsaR7G/iXxk+skiZsjOsavH++nFTMeHWy0gvObuPAR0buTuid76JvZNOF2spJkPVy1PZ8rxGpeOr5mWYM/iJ1rvxSe2WXuT0imjMoq5OZ8zWHuGSJ+05J21J5pKjXRuoGyhEQkZPTgpO4zYUfuY/rfLQMZbZaesxC+wPuv+5SlS9ToNDD47Igl4bbuNCho6ujctysBJ4=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Certificate request is in progress. This may take some + time based on the issuer provider. Please check again later.","request_id":"47fabc333e9c40329057e013361f455f"}'} + headers: {cache-control: no-cache, content-length: '1342', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:18 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsPumBxp+j2TWQF48pIrmtOWIvsjF4ijDTThFOBqWPitBVRXmvoBp2T2Afg+EmKxxWpOb8qTAsd+uwb+FGmjSISrMfjtja7jg/WLJQ+ZAcBPE7OzFW5i6M4ANzZwIkw1h+giZ5YEwaiNy/cHaYmD3YL8rwAH5dM763BoIOiCPqq6uZf+fU6AW3ujm2iQE4h22JRrz0B5YtlIdiJoyAjeT+0h1fBQte8RNObPJLnu/4GAU/Kbo/u29c3gRDLd42dx4wAdDaUx+c8T75/6VrEe0QcBn2jYCVxQWpodCQHrwT31LL0VOgGBEPrJBlUcbA2dauGOnzlb8MjXJ1b+6+cdQ/QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAedSv6w1KD2LMPOnhJAgAJm7x7gmt8DGlb+667pvbLe7RNQgI4GXI2GWxijja34+j5P6f4zo0vMjIfeWzCeqZUTuuawX5FK86HdFbgh8dZp50BAo48wBwZq5XeEhOpnUGXyGp4RFFyRaonRsaR7G/iXxk+skiZsjOsavH++nFTMeHWy0gvObuPAR0buTuid76JvZNOF2spJkPVy1PZ8rxGpeOr5mWYM/iJ1rvxSe2WXuT0imjMoq5OZ8zWHuGSJ+05J21J5pKjXRuoGyhEQkZPTgpO4zYUfuY/rfLQMZbZaesxC+wPuv+5SlS9ToNDD47Igl4bbuNCho6ujctysBJ4=","cancellation_requested":false,"status":"completed","target":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name","request_id":"47fabc333e9c40329057e013361f455f"}'} + headers: {cache-control: no-cache, content-length: '1259', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:28 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name/pending, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: DELETE + uri: https://vault105115999775531ac1.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639293,"scheduledPurgeDate":1575415293,"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/e06bec0e992a41c3b88a15ef2f644e77","kid":"https://vault105115999775531ac1.vault.azure.net/keys/cert-name/e06bec0e992a41c3b88a15ef2f644e77","sid":"https://vault105115999775531ac1.vault.azure.net/secrets/cert-name/e06bec0e992a41c3b88a15ef2f644e77","x5t":"MsOUQGgynGh9brScHMqWswJzo74","cer":"MIIDWjCCAkKgAwIBAgIQcsXLrVqiQlewHiJIid3U+zANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw+6YHGn6PZNZAXjykiua05Yi+yMXiKMNNOEU4GpY+K0FVFea+gGnZPYB+D4SYrHFak5vypMCx367Bv4UaaNIhKsx+O2NruOD9YslD5kBwE8Ts7MVbmLozgA3NnAiTDWH6CJnlgTBqI3L9wdpiYPdgvyvAAfl0zvrcGgg6II+qrq5l/59ToBbe6ObaJATiHbYlGvPQHli2Uh2ImjICN5P7SHV8FC17xE05s8kue7/gYBT8puj+7b1zeBEMt3jZ3HjAB0NpTH5zxPvn/pWsR7RBwGfaNgJXFBamh0JAevBPfUsvRU6AYEQ+skGVRxsDZ1q4Y6fOVvwyNcnVv7r5x1D9AgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDntum5TCGG9XLumnJ+B5SoIE7PHMB0GA1UdDgQWBBQ57bpuUwhhvVy7ppyfgeUqCBOzxzANBgkqhkiG9w0BAQsFAAOCAQEAsK+N5RY2hZNRt19TP0WbsGhfcdAxSMHJNIrxwLzA8ummwpRiHQ5KHgP3xC1I4B75PaTREBsWXZKJE8j8KpSRyfVQO218fDsSstpBGv5Ux/c33BnBsELdj5UyIgsOhljudBFuempRVNYkPpAN3w9XQna7P1vwLeX9TGSktEUxYtSZ8LH4q1NI7ggmNK11UkEOfM4WH7vIUQbNHbJYSKxj8+Rq/uaWuKkRG06UD3QpGOA28V4FTmcgyUOW7avuDVoHoGCK4A2T1WAvkxTcOl5f9qDECVNrYBFWrDMxpkDNsATDtBfoJ/4HOaA1PQ02nvvQLRvXpwdQQJDdNDTfScfuDw==","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639268,"updated":1567639268}},"pending":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2579', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:33 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /certificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:33 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:36 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:39 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:43 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:46 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Deleted Certificate + not found: cert-name"}}'} + headers: {cache-control: no-cache, content-length: '93', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:49 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 404, message: Not Found} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639293,"scheduledPurgeDate":1575415293,"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/e06bec0e992a41c3b88a15ef2f644e77","kid":"https://vault105115999775531ac1.vault.azure.net/keys/cert-name/e06bec0e992a41c3b88a15ef2f644e77","sid":"https://vault105115999775531ac1.vault.azure.net/secrets/cert-name/e06bec0e992a41c3b88a15ef2f644e77","x5t":"MsOUQGgynGh9brScHMqWswJzo74","cer":"MIIDWjCCAkKgAwIBAgIQcsXLrVqiQlewHiJIid3U+zANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw+6YHGn6PZNZAXjykiua05Yi+yMXiKMNNOEU4GpY+K0FVFea+gGnZPYB+D4SYrHFak5vypMCx367Bv4UaaNIhKsx+O2NruOD9YslD5kBwE8Ts7MVbmLozgA3NnAiTDWH6CJnlgTBqI3L9wdpiYPdgvyvAAfl0zvrcGgg6II+qrq5l/59ToBbe6ObaJATiHbYlGvPQHli2Uh2ImjICN5P7SHV8FC17xE05s8kue7/gYBT8puj+7b1zeBEMt3jZ3HjAB0NpTH5zxPvn/pWsR7RBwGfaNgJXFBamh0JAevBPfUsvRU6AYEQ+skGVRxsDZ1q4Y6fOVvwyNcnVv7r5x1D9AgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDntum5TCGG9XLumnJ+B5SoIE7PHMB0GA1UdDgQWBBQ57bpuUwhhvVy7ppyfgeUqCBOzxzANBgkqhkiG9w0BAQsFAAOCAQEAsK+N5RY2hZNRt19TP0WbsGhfcdAxSMHJNIrxwLzA8ummwpRiHQ5KHgP3xC1I4B75PaTREBsWXZKJE8j8KpSRyfVQO218fDsSstpBGv5Ux/c33BnBsELdj5UyIgsOhljudBFuempRVNYkPpAN3w9XQna7P1vwLeX9TGSktEUxYtSZ8LH4q1NI7ggmNK11UkEOfM4WH7vIUQbNHbJYSKxj8+Rq/uaWuKkRG06UD3QpGOA28V4FTmcgyUOW7avuDVoHoGCK4A2T1WAvkxTcOl5f9qDECVNrYBFWrDMxpkDNsATDtBfoJ/4HOaA1PQ02nvvQLRvXpwdQQJDdNDTfScfuDw==","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639268,"updated":1567639268}},"pending":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2579', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:52 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: GET + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567639293,"scheduledPurgeDate":1575415293,"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/e06bec0e992a41c3b88a15ef2f644e77","kid":"https://vault105115999775531ac1.vault.azure.net/keys/cert-name/e06bec0e992a41c3b88a15ef2f644e77","sid":"https://vault105115999775531ac1.vault.azure.net/secrets/cert-name/e06bec0e992a41c3b88a15ef2f644e77","x5t":"MsOUQGgynGh9brScHMqWswJzo74","cer":"MIIDWjCCAkKgAwIBAgIQcsXLrVqiQlewHiJIid3U+zANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw+6YHGn6PZNZAXjykiua05Yi+yMXiKMNNOEU4GpY+K0FVFea+gGnZPYB+D4SYrHFak5vypMCx367Bv4UaaNIhKsx+O2NruOD9YslD5kBwE8Ts7MVbmLozgA3NnAiTDWH6CJnlgTBqI3L9wdpiYPdgvyvAAfl0zvrcGgg6II+qrq5l/59ToBbe6ObaJATiHbYlGvPQHli2Uh2ImjICN5P7SHV8FC17xE05s8kue7/gYBT8puj+7b1zeBEMt3jZ3HjAB0NpTH5zxPvn/pWsR7RBwGfaNgJXFBamh0JAevBPfUsvRU6AYEQ+skGVRxsDZ1q4Y6fOVvwyNcnVv7r5x1D9AgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDntum5TCGG9XLumnJ+B5SoIE7PHMB0GA1UdDgQWBBQ57bpuUwhhvVy7ppyfgeUqCBOzxzANBgkqhkiG9w0BAQsFAAOCAQEAsK+N5RY2hZNRt19TP0WbsGhfcdAxSMHJNIrxwLzA8ummwpRiHQ5KHgP3xC1I4B75PaTREBsWXZKJE8j8KpSRyfVQO218fDsSstpBGv5Ux/c33BnBsELdj5UyIgsOhljudBFuempRVNYkPpAN3w9XQna7P1vwLeX9TGSktEUxYtSZ8LH4q1NI7ggmNK11UkEOfM4WH7vIUQbNHbJYSKxj8+Rq/uaWuKkRG06UD3QpGOA28V4FTmcgyUOW7avuDVoHoGCK4A2T1WAvkxTcOl5f9qDECVNrYBFWrDMxpkDNsATDtBfoJ/4HOaA1PQ02nvvQLRvXpwdQQJDdNDTfScfuDw==","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639268,"updated":1567639268}},"pending":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2579', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:52 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name, api-version=7.0, ''] +- request: + body: null + headers: + Accept: [application/json] + User-Agent: [azsdk-python-keyvault-certificates/4.0.0b1 Python/3.6.6 (Windows-10-10.0.18362-SP0)] + method: POST + uri: https://vault105115999775531ac1.vault.azure.net/deletedcertificates/cert-name/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/e06bec0e992a41c3b88a15ef2f644e77","kid":"https://vault105115999775531ac1.vault.azure.net/keys/cert-name/e06bec0e992a41c3b88a15ef2f644e77","sid":"https://vault105115999775531ac1.vault.azure.net/secrets/cert-name/e06bec0e992a41c3b88a15ef2f644e77","x5t":"MsOUQGgynGh9brScHMqWswJzo74","cer":"MIIDWjCCAkKgAwIBAgIQcsXLrVqiQlewHiJIid3U+zANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA0MjMxMTI3WhcNMjEwOTA0MjMyMTI3WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw+6YHGn6PZNZAXjykiua05Yi+yMXiKMNNOEU4GpY+K0FVFea+gGnZPYB+D4SYrHFak5vypMCx367Bv4UaaNIhKsx+O2NruOD9YslD5kBwE8Ts7MVbmLozgA3NnAiTDWH6CJnlgTBqI3L9wdpiYPdgvyvAAfl0zvrcGgg6II+qrq5l/59ToBbe6ObaJATiHbYlGvPQHli2Uh2ImjICN5P7SHV8FC17xE05s8kue7/gYBT8puj+7b1zeBEMt3jZ3HjAB0NpTH5zxPvn/pWsR7RBwGfaNgJXFBamh0JAevBPfUsvRU6AYEQ+skGVRxsDZ1q4Y6fOVvwyNcnVv7r5x1D9AgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDntum5TCGG9XLumnJ+B5SoIE7PHMB0GA1UdDgQWBBQ57bpuUwhhvVy7ppyfgeUqCBOzxzANBgkqhkiG9w0BAQsFAAOCAQEAsK+N5RY2hZNRt19TP0WbsGhfcdAxSMHJNIrxwLzA8ummwpRiHQ5KHgP3xC1I4B75PaTREBsWXZKJE8j8KpSRyfVQO218fDsSstpBGv5Ux/c33BnBsELdj5UyIgsOhljudBFuempRVNYkPpAN3w9XQna7P1vwLeX9TGSktEUxYtSZ8LH4q1NI7ggmNK11UkEOfM4WH7vIUQbNHbJYSKxj8+Rq/uaWuKkRG06UD3QpGOA28V4FTmcgyUOW7avuDVoHoGCK4A2T1WAvkxTcOl5f9qDECVNrYBFWrDMxpkDNsATDtBfoJ/4HOaA1PQ02nvvQLRvXpwdQQJDdNDTfScfuDw==","attributes":{"enabled":true,"nbf":1567638687,"exp":1630797687,"created":1567639287,"updated":1567639287,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=*.microsoft.com","sans":{"dns_names":["sdk.azure-int.net"]},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":24,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1567639268,"updated":1567639268}},"pending":{"id":"https://vault105115999775531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2429', content-type: application/json; + charset=utf-8, date: 'Wed, 04 Sep 2019 23:21:52 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.160.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.876, x-powered-by: ASP.NET} + status: {code: 200, message: OK} + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult [https, vault105115999775531ac1.vault.azure.net, + /deletedcertificates/cert-name/recover, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/seed.txt b/sdk/keyvault/azure-keyvault-certificates/tests/seed.txt new file mode 100644 index 000000000000..799fcfa589bf --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/seed.txt @@ -0,0 +1 @@ +iscai-msft \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py new file mode 100644 index 000000000000..0f090ba59f1d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py @@ -0,0 +1,708 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import itertools +import time + +from azure_devtools.scenario_tests import RecordingProcessor, RequestUrlNormalizer + +from azure.keyvault.certificates import AdministratorDetails, Contact, CertificatePolicy, KeyProperties +from azure.keyvault.certificates._shared import parse_vault_id +from devtools_testutils import ResourceGroupPreparer +from certificates_preparer import VaultClientPreparer +from certificates_test_case import KeyVaultTestCase +from azure.keyvault.certificates._shared._generated.v7_0.models import CertificatePolicy as CertificatePolicyGenerated +from azure.keyvault.certificates._shared._generated.v7_0.models import ( + SecretProperties, IssuerParameters, X509CertificateProperties, + SubjectAlternativeNames, LifetimeAction, Trigger, Action, ActionType, IssuerAttributes) +from azure.keyvault.certificates.models import Issuer, IssuerBase + +class RetryAfterReplacer(RecordingProcessor): + """Replace the retry after wait time in the replay process to 0.""" + + def process_response(self, response): + if 'retry-after' in response['headers']: + response['headers']['retry-after'] = '0' + return response + + +class CertificateClientTests(KeyVaultTestCase): + FILTER_HEADERS = [ + 'authorization', + 'client-request-id', + 'x-ms-client-request-id', + 'x-ms-correlation-request-id', + 'x-ms-ratelimit-remaining-subscription-reads', + 'x-ms-request-id', + 'x-ms-routing-request-id', + 'x-ms-gateway-service-instanceid', + 'x-ms-ratelimit-remaining-tenant-reads', + 'x-ms-served-by', + 'x-ms-authorization-auxiliary' + ] + def __init__(self, *args, **kwargs): + super(CertificateClientTests, self).__init__(*args, replay_processors=[RetryAfterReplacer(), RequestUrlNormalizer()], **kwargs) + + def _import_common_certificate(self, client, cert_name): + cert_content = b'0\x82\t;\x02\x01\x030\x82\x08\xf7\x06\t*\x86H\x86\xf7\r\x01\x07\x01\xa0\x82\x08\xe8\x04\x82\x08\xe40\x82\x08\xe00\x82\x06\t\x06\t*\x86H\x86\xf7\r\x01\x07\x01\xa0\x82\x05\xfa\x04\x82\x05\xf60\x82\x05\xf20\x82\x05\xee\x06\x0b*\x86H\x86\xf7\r\x01\x0c\n\x01\x02\xa0\x82\x04\xfe0\x82\x04\xfa0\x1c\x06\n*\x86H\x86\xf7\r\x01\x0c\x01\x030\x0e\x04\x08\xf5\xe5\x81\xfd\xa4\xe19\xf0\x02\x02\x07\xd0\x04\x82\x04\xd8.\xb2>H\n\xee\xd9\xd0YE\x04e%\x8e\xd7Cr\xde.F\xa1\xd8W\x11Gw@L;!ght \r\xa8\x06\xb9\x10!\xdb\x0b\xc8\x00\x16g}\xaaa\x1dj\x91lK\x1e\x7f@\xa9x.\xdb\xb0\x04l\xe97\xe7\xeaHM\x96\xa2\xcb\xad\xd8`\x19$\xa5\x1f\xa9\r\xd9\xe0f\xdd}gC\xd6\xacl\x07\x12\xaes\xe8\x11\xd2\xd8b\xf2\xc8\xdf\x12H\xe0\x9bw0\xb3\xed\xb9c\xdf\xee\xc8e\x8a\x0c\x8f\x85\x8e>\x03\xa6\xfe\xd4:S\x8e\x12\x15g\xa4\xe3\xa407l\xde\x03\x88\xbd\xee\xfe\xdf\xb4\xd3g\xb3n\xe6\xb3\x9d\xa3\xa9\xf8N\xbd0=s\xfc2}\x92\x80c\x86\x8a%\xf6\x18Rl\x9c*9\xe7F]5\xdaWR\xdaS\xa4\x01!m\xfa[\xb8@&\xbb\xd8\x86:x\xfbQ\xb9\xd3\xc2\xbel\xd1\xbfjd-\x84\xba\xcfw\x08\xee\x89\x93\xf2q\xcf\xdc<\xa64\xea\x8blZ\xab\xe4\xed\x8c\xd5\x96\x1a,.\xb7C|m\xdd\xe5om\xc3\xe1\xdc\xdd<\x0fXG\x92\x1c\xff(4\xef\x91\x10\x10\xa6\xfa\xd6\xf0\x84\x8a\x9a\x00\xdd\x9b3y\xe4\xf7\xb9\xe7\x11\xdfIa\x81\xee\x03\xf0\xf2\xc6^k\x9e\xc8\xc4\\\xd6\x1d2\xb6\xca\xf4\xec\x96\x8a\x16\xa2\x8b&\x1b\x16\xa7a\x8d\x88\x1b\xf9\xe8\xdcF\xcf9`\xca\x8c\xf6x\x8aV\t{\x92I\xda)\xa6\x97\x13\xf3\xfbg\xb6\x10\xe0\x8a\xa42>\xed\xfc\xd0q\x1c\xf7=7w\x04\xaf\x9b\xb9\xd6|iu\xfcio\xe5:\x02\x92\xf1i\xb1f\x82\xa78\x90MY\xe4\xcdY\x01n\x82i-]\xf7O\x1c\x07q2\x18\xd4^\xa7\x86A\xdf0N\xf6x\x134\r5\xa7\xe8\xbf\t\x08\xec\x85\x7fe\x8a\x1a\xfb\xe4F\xa1\xf5Q\xdd\x96\xd1J M\x17\xa4\xc3\x8f\xfa\x97\x16\xdd07\xf0\x90\x9e\xc1\x80\x99\x00\x066#~\x0f\x89\x98\xee-\xb9v\xd4\xee\xfc\x97;;\x12\xdd\x84\x05\x05\xa4|\x89\xa7*\xd8X\xb7\xef:$\xb9Y\x80^\x101\xe4\x88\xf5\x1a\xff\xc7\x99H\xf071u\x99GTb\xb8;\xee6\xa3#r\xddRK\x07W\x004\xed\x17\xaf%\xfdD\xb5\x92\xc5:\xe7\xbf\x97H/\xba\x97-@\xfe\xeas\xf9~\xf5\xf8.\x07\xa3\xa5\xb4\xef\x9dc\xe5\x93\x13\xeb\x12\xa3\x1a\x1eiy\xee\xccV\xe7n\xc4\x8c\xd7\x8db2\xdd\x84\x9d\xd1\xf2\x13\xddM\x00\xe4\xd2\xc4\xbc\x9fk~Lz&!\xe3D\xbczW[j\xb2\xbbS\xe8\x1b\x06\xb6`\x90GU\x02$\xf2\xea\xb0\xa5C\xbc\x02\r\xc7w\x0f\x03\xf0\x86\xaa\xbeN_`FfP"\x84i\x8d\xea~\xe0\xbf\xcc8;I4,\xf4\xc0{\x96\x1e~\x05\xcd\xdeoi\x13\xce\xbb7}F\xb4uYh\x9f\xd4V\x00\xcda-\xa3\xba\xc7\x9d\xe2\xbc;\xe9\x95\x8d\xe3V\xa4\xc7d\r\xd0\x94\x9e0\x9a\x87^\xa5s\xe8\x02\x9f\xcf\xc2\x02K\xf7E\x9cA\xb2\x04\xdaW\x88\xc4q\xad\x8f\xd0<\xa8\xbf\xc0\xe3p\xaa\xc6\xc3\xc5\x15\xbb\xbd\x94U*\xce\xfc\xa4\x19\x04\xd2K\x1aJ\x19Y\x93\x91\xa4y\xac\x83X/\xfb\x1e/\xcd\xa9Am"Z\n\xf5pw\xa5\xa2\xf1\xa3P\xc6\xbb\x9a\xaah]\xf8\x8d\x97d\xb79\x17\xa7K\x99\xaa\x9a~\x15\xf2\x99j*/2;|\x17\xbc\x87\x08\xf9>-\x8aQ\xb1M\x82\xc9\xcfCV\x80\xc0\xea\xb2 \x7f\xeb\x84?\x88\xe9\xa6\x07\xa1\xb3\x1c\x93\xd2RGk\x1d\xad\xf3\xafQ\xda6\x1d\xb1|\x18Qx\xe0\xc0r\x15\xd2\xfa#\xed\xb2X[7\x91\xfdE\xd1r\xf0o\xd6\xdb\x7fm\x8c;\xb59\x88\xc1\x0f\'b\x06\xac\xc1\x9f\xc1\xc6\xd44\xa3\xd4\xf8\xdc\xd2G\x7f\xf3gxeM7\xd3\xc2\x85L-\xf2\x19\xc4ZwA\xa7\x10}\x0e\x8bx\x84\'\xd1\xdb\xae%\x1b}S\x1b\\\xd1\xce\x17\xe3$\xb5h\x83V\xac\xe7tc\n\x9a\xe2Ru\xf4\xc1*\xf1\x85\xbd\xe8\xc0YS\xb9\x13\x89\xa0.\xfa\x1a2f\xdc\x85\xcd\xc1;\xbb\x0bz\xb6\x87\x9c\x93y\x86\xf3\x01h\xb7\x10#\x7f\r\xf3\xa9\x94}4|\x00\xfe\x80\'\xd76\x93\x9dx)\xa0\xcbrY\xb8\xcf\xa2|t\xcc\xfa\xd2u\x1e\xa3\x90\xf7`==\x1b\xa0Z\xbcQ\xf1J\xf2|0]\x0b\xbb\x9c\xce\x171\x1e<4E\x9b\xd9\x87\xf1m\r\xfe\xc1e!\xa6\x1f\x0f\xf1\x96S\xfc8\xe2d.r6\x81\x93\xdeX\xb6\xa3\x86D\x88\xf9\xf2\xd1\x83Z\xbf"Q\xd1\xf0i\x82\x86\xa9M\xb8\xccg\x91i\xefC\x84U\xcf\xcd\x9b!WVF\xb0\x14\x05E\xaa\x18\x93"\xc0\xc1\xd2V!t\xe2\xf9\xcd\xfba\xa0\xbc\x15\x14\x84\x9esfK\xbfC\xa2\xedJspo+\x81\x18(\x00\xf6+\x18\xedQ\xe6\xebW^\xf8\x80=\x10\xfb\xd6.\'A\x979;)\x06\xf0\x85w\x95S\xd9\x1c9\xcc3k\x03\xf2w\x17\x97\xcc\nN0;0\x1f0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\xb1\x82\x1d\xb1\xc8_\xbc\xf1^/\x01\xf7\xc1\x99\x95\xef\xf1H\n\xee\xd9\xd0YE\x04e%\x8e\xd7Cr\xde.F\xa1\xd8W\x11Gw@L;!ght \r\xa8\x06\xb9\x10!\xdb\x0b\xc8\x00\x16g}\xaaa\x1dj\x91lK\x1e\x7f@\xa9x.\xdb\xb0\x04l\xe97\xe7\xeaHM\x96\xa2\xcb\xad\xd8`\x19$\xa5\x1f\xa9\r\xd9\xe0f\xdd}gC\xd6\xacl\x07\x12\xaes\xe8\x11\xd2\xd8b\xf2\xc8\xdf\x12H\xe0\x9bw0\xb3\xed\xb9c\xdf\xee\xc8e\x8a\x0c\x8f\x85\x8e>\x03\xa6\xfe\xd4:S\x8e\x12\x15g\xa4\xe3\xa407l\xde\x03\x88\xbd\xee\xfe\xdf\xb4\xd3g\xb3n\xe6\xb3\x9d\xa3\xa9\xf8N\xbd0=s\xfc2}\x92\x80c\x86\x8a%\xf6\x18Rl\x9c*9\xe7F]5\xdaWR\xdaS\xa4\x01!m\xfa[\xb8@&\xbb\xd8\x86:x\xfbQ\xb9\xd3\xc2\xbel\xd1\xbfjd-\x84\xba\xcfw\x08\xee\x89\x93\xf2q\xcf\xdc<\xa64\xea\x8blZ\xab\xe4\xed\x8c\xd5\x96\x1a,.\xb7C|m\xdd\xe5om\xc3\xe1\xdc\xdd<\x0fXG\x92\x1c\xff(4\xef\x91\x10\x10\xa6\xfa\xd6\xf0\x84\x8a\x9a\x00\xdd\x9b3y\xe4\xf7\xb9\xe7\x11\xdfIa\x81\xee\x03\xf0\xf2\xc6^k\x9e\xc8\xc4\\\xd6\x1d2\xb6\xca\xf4\xec\x96\x8a\x16\xa2\x8b&\x1b\x16\xa7a\x8d\x88\x1b\xf9\xe8\xdcF\xcf9`\xca\x8c\xf6x\x8aV\t{\x92I\xda)\xa6\x97\x13\xf3\xfbg\xb6\x10\xe0\x8a\xa42>\xed\xfc\xd0q\x1c\xf7=7w\x04\xaf\x9b\xb9\xd6|iu\xfcio\xe5:\x02\x92\xf1i\xb1f\x82\xa78\x90MY\xe4\xcdY\x01n\x82i-]\xf7O\x1c\x07q2\x18\xd4^\xa7\x86A\xdf0N\xf6x\x134\r5\xa7\xe8\xbf\t\x08\xec\x85\x7fe\x8a\x1a\xfb\xe4F\xa1\xf5Q\xdd\x96\xd1J M\x17\xa4\xc3\x8f\xfa\x97\x16\xdd07\xf0\x90\x9e\xc1\x80\x99\x00\x066#~\x0f\x89\x98\xee-\xb9v\xd4\xee\xfc\x97;;\x12\xdd\x84\x05\x05\xa4|\x89\xa7*\xd8X\xb7\xef:$\xb9Y\x80^\x101\xe4\x88\xf5\x1a\xff\xc7\x99H\xf071u\x99GTb\xb8;\xee6\xa3#r\xddRK\x07W\x004\xed\x17\xaf%\xfdD\xb5\x92\xc5:\xe7\xbf\x97H/\xba\x97-@\xfe\xeas\xf9~\xf5\xf8.\x07\xa3\xa5\xb4\xef\x9dc\xe5\x93\x13\xeb\x12\xa3\x1a\x1eiy\xee\xccV\xe7n\xc4\x8c\xd7\x8db2\xdd\x84\x9d\xd1\xf2\x13\xddM\x00\xe4\xd2\xc4\xbc\x9fk~Lz&!\xe3D\xbczW[j\xb2\xbbS\xe8\x1b\x06\xb6`\x90GU\x02$\xf2\xea\xb0\xa5C\xbc\x02\r\xc7w\x0f\x03\xf0\x86\xaa\xbeN_`FfP"\x84i\x8d\xea~\xe0\xbf\xcc8;I4,\xf4\xc0{\x96\x1e~\x05\xcd\xdeoi\x13\xce\xbb7}F\xb4uYh\x9f\xd4V\x00\xcda-\xa3\xba\xc7\x9d\xe2\xbc;\xe9\x95\x8d\xe3V\xa4\xc7d\r\xd0\x94\x9e0\x9a\x87^\xa5s\xe8\x02\x9f\xcf\xc2\x02K\xf7E\x9cA\xb2\x04\xdaW\x88\xc4q\xad\x8f\xd0<\xa8\xbf\xc0\xe3p\xaa\xc6\xc3\xc5\x15\xbb\xbd\x94U*\xce\xfc\xa4\x19\x04\xd2K\x1aJ\x19Y\x93\x91\xa4y\xac\x83X/\xfb\x1e/\xcd\xa9Am"Z\n\xf5pw\xa5\xa2\xf1\xa3P\xc6\xbb\x9a\xaah]\xf8\x8d\x97d\xb79\x17\xa7K\x99\xaa\x9a~\x15\xf2\x99j*/2;|\x17\xbc\x87\x08\xf9>-\x8aQ\xb1M\x82\xc9\xcfCV\x80\xc0\xea\xb2 \x7f\xeb\x84?\x88\xe9\xa6\x07\xa1\xb3\x1c\x93\xd2RGk\x1d\xad\xf3\xafQ\xda6\x1d\xb1|\x18Qx\xe0\xc0r\x15\xd2\xfa#\xed\xb2X[7\x91\xfdE\xd1r\xf0o\xd6\xdb\x7fm\x8c;\xb59\x88\xc1\x0f\'b\x06\xac\xc1\x9f\xc1\xc6\xd44\xa3\xd4\xf8\xdc\xd2G\x7f\xf3gxeM7\xd3\xc2\x85L-\xf2\x19\xc4ZwA\xa7\x10}\x0e\x8bx\x84\'\xd1\xdb\xae%\x1b}S\x1b\\\xd1\xce\x17\xe3$\xb5h\x83V\xac\xe7tc\n\x9a\xe2Ru\xf4\xc1*\xf1\x85\xbd\xe8\xc0YS\xb9\x13\x89\xa0.\xfa\x1a2f\xdc\x85\xcd\xc1;\xbb\x0bz\xb6\x87\x9c\x93y\x86\xf3\x01h\xb7\x10#\x7f\r\xf3\xa9\x94}4|\x00\xfe\x80\'\xd76\x93\x9dx)\xa0\xcbrY\xb8\xcf\xa2|t\xcc\xfa\xd2u\x1e\xa3\x90\xf7`==\x1b\xa0Z\xbcQ\xf1J\xf2|0]\x0b\xbb\x9c\xce\x171\x1e<4E\x9b\xd9\x87\xf1m\r\xfe\xc1e!\xa6\x1f\x0f\xf1\x96S\xfc8\xe2d.r6\x81\x93\xdeX\xb6\xa3\x86D\x88\xf9\xf2\xd1\x83Z\xbf"Q\xd1\xf0i\x82\x86\xa9M\xb8\xccg\x91i\xefC\x84U\xcf\xcd\x9b!WVF\xb0\x14\x05E\xaa\x18\x93"\xc0\xc1\xd2V!t\xe2\xf9\xcd\xfba\xa0\xbc\x15\x14\x84\x9esfK\xbfC\xa2\xedJspo+\x81\x18(\x00\xf6+\x18\xedQ\xe6\xebW^\xf8\x80=\x10\xfb\xd6.\'A\x979;)\x06\xf0\x85w\x95S\xd9\x1c9\xcc3k\x03\xf2w\x17\x97\xcc\nN0;0\x1f0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14\xb1\x82\x1d\xb1\xc8_\xbc\xf1^/\x01\xf7\xc1\x99\x95\xef\xf1 respond with challenge + # 2. second request should be authorized according to the challenge -> respond with success + # 3. third request should match the second -> respond with a new challenge + # 4. fourth request should be authorized according to the new challenge -> respond with success + # 5. fifth request should match the fourth -> respond with success + transport = validating_transport( + requests=( + Request(url), + Request(url, required_headers={"Authorization": "Bearer {}".format(first_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(first_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(second_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(second_token)}), + ), + responses=( + mock_response(status_code=401, headers={"WWW-Authenticate": challenge_fmt.format(first_scope)}), + mock_response(status_code=200), + mock_response(status_code=401, headers={"WWW-Authenticate": challenge_fmt.format(second_scope)}), + mock_response(status_code=200), + mock_response(status_code=200), + ), + ) + + tokens = (t for t in [first_token] * 2 + [second_token] * 2) + credential = Mock(get_token=lambda _: AccessToken(next(tokens), 0)) + pipeline = Pipeline(policies=[ChallengeAuthPolicy(credential=credential)], transport=transport) + + # policy should complete and cache the first challenge + pipeline.run(HttpRequest("GET", url)) + + # The next request will receive a challenge. The policy should handle it and update the cache entry. + pipeline.run(HttpRequest("GET", url)) diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_challenge_auth_async.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_challenge_auth_async.py new file mode 100644 index 000000000000..2590f4f654a1 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_challenge_auth_async.py @@ -0,0 +1,116 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +""" +Tests for the HTTP challenge authentication implementation. These tests aren't parallelizable, because +the challenge cache is global to the process. +""" +import asyncio + +try: + from unittest.mock import Mock +except ImportError: # python < 3.3 + from mock import Mock + +from azure.core.credentials import AccessToken +from azure.core.pipeline import AsyncPipeline +from azure.core.pipeline.transport import HttpRequest +from azure.keyvault.certificates._shared import AsyncChallengeAuthPolicy, HttpChallenge, HttpChallengeCache +import pytest + +from certificates_helpers import async_validating_transport, mock_response, Request + + +@pytest.mark.asyncio +async def test_policy(): + # ensure the test starts with an empty cache + HttpChallengeCache.clear() + + expected_scope = "https://challenge.resource/.default" + expected_token = "expected_token" + challenge = Mock( + status_code=401, + headers={ + "WWW-Authenticate": 'Bearer authorization="https://login.authority.net/tenant", resource={}'.format( + expected_scope + ) + }, + ) + success = Mock(status_code=200) + data = {"spam": "eggs"} + + responses = (r for r in (challenge, success)) + + async def send(request): + response = next(responses) + if response is challenge: + # this is the first request + assert not request.body + assert request.headers["Content-Length"] == "0" + elif response is success: + # this is the second request + assert request.body == data + assert expected_token in request.headers["Authorization"] + return response + + async def get_token(*scopes): + print("get token") + assert len(scopes) is 1 + assert scopes[0] == expected_scope + return AccessToken(expected_token, 0) + + credential = Mock(get_token=get_token) + pipeline = AsyncPipeline(policies=[AsyncChallengeAuthPolicy(credential=credential)], transport=Mock(send=send)) + await pipeline.run(HttpRequest("POST", "https://azure.service", data=data)) + + +@pytest.mark.asyncio +async def test_policy_updates_cache(): + """ + It's possible for the challenge returned for a request to change, e.g. when a vault is moved to a new tenant. + When the policy receives a 401, it should update the cached challenge for the requested URL, if one exists. + """ + + # ensure the test starts with an empty cache + HttpChallengeCache.clear() + + url = "https://azure.service/path" + first_scope = "https://first-scope" + first_token = "first-scope-token" + second_scope = "https://second-scope" + second_token = "second-scope-token" + challenge_fmt = 'Bearer authorization="https://login.authority.net/tenant", resource={}' + + # mocking a tenant change: + # 1. first request -> respond with challenge + # 2. second request should be authorized according to the challenge -> respond with success + # 3. third request should match the second -> respond with a new challenge + # 4. fourth request should be authorized according to the new challenge -> respond with success + # 5. fifth request should match the fourth -> respond with success + transport = async_validating_transport( + requests=( + Request(url), + Request(url, required_headers={"Authorization": "Bearer {}".format(first_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(first_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(second_token)}), + Request(url, required_headers={"Authorization": "Bearer {}".format(second_token)}), + ), + responses=( + mock_response(status_code=401, headers={"WWW-Authenticate": challenge_fmt.format(first_scope)}), + mock_response(status_code=200), + mock_response(status_code=401, headers={"WWW-Authenticate": challenge_fmt.format(second_scope)}), + mock_response(status_code=200), + mock_response(status_code=200), + ), + ) + + tokens = (t for t in [first_token] * 2 + [second_token] * 2) + credential = Mock(get_token=asyncio.coroutine(lambda _: AccessToken(next(tokens), 0))) + pipeline = AsyncPipeline(policies=[AsyncChallengeAuthPolicy(credential=credential)], transport=transport) + + # policy should complete and cache the first challenge + await pipeline.run(HttpRequest("GET", url)) + + # The next request will receive a challenge. The policy should handle it and update the cache entry. + await pipeline.run(HttpRequest("GET", url)) diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates.py new file mode 100644 index 000000000000..0072552ac4db --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates.py @@ -0,0 +1,262 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from __future__ import print_function +import functools + +from azure.core.exceptions import ResourceNotFoundError +from devtools_testutils import ResourceGroupPreparer +from certificates_preparer import VaultClientPreparer +from certificates_test_case import KeyVaultTestCase + + +def print(*args): + assert all(arg is not None for arg in args) + + +def test_create_certificate_client(): + vault_url = "vault_url" + # pylint:disable=unused-variable + # [START create_certificate_client] + + from azure.identity import DefaultAzureCredential + from azure.keyvault.certificates import CertificateClient + + # Create a CertificateClient using default Azure credentials + credential = DefaultAzureCredential() + certificate_client = CertificateClient(vault_url, credential) + + # [END create_certificate_client] + + +class TestExamplesKeyVault(KeyVaultTestCase): + @ResourceGroupPreparer() + @VaultClientPreparer(enable_soft_delete=True) + def test_example_certificate_crud_operations(self, vault_client, **kwargs): + + certificate_client = vault_client.certificates + # [START create_certificate] + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['onedrive.microsoft.com', 'xbox.microsoft.com'] + ) + + cert_name = "cert-name" + # create a certificate with optional arguments, returns a long running operation poller + certificate_operation_poller = certificate_client.create_certificate(name=cert_name, policy=cert_policy) + + # Here we are waiting for the certificate creation operation to be completed + certificate_operation_poller.wait() + + # You can get the final status of the certificate operation poller using .result() + print(certificate_operation_poller.result()) + + # [END create_certificate] + + # [START get_certificate] + + # get the certificate + certificate = certificate_client.get_certificate_with_policy(name=cert_name) + + print(certificate.id) + print(certificate.name) + print(certificate.policy.key_properties.exportable) + print(certificate.policy.key_properties.key_type) + print(certificate.policy.key_properties.key_size) + print(certificate.policy.key_properties.reuse_key) + print(certificate.policy.content_type) + print(certificate.policy.issuer_name) + print(certificate.policy.subject_name) + print(certificate.policy.san_dns_names) + print(certificate.policy.validity_in_months) + + # [END get_certificate] + # [START update_certificate] + + # update attributes of an existing certificate + tags = {"foo": "updated tag"} + updated_certificate = certificate_client.update_certificate(name=certificate.name, tags=tags) + + print(updated_certificate.version) + print(updated_certificate.updated) + print(updated_certificate.tags) + + # [END update_certificate] + # [START delete_certificate] + + # delete a certificate + deleted_certificate = certificate_client.delete_certificate(name=certificate.name) + + print(deleted_certificate.name) + + # if the vault has soft-delete enabled, the certificate's deleted date, + # scheduled purge date, and recovery id are available + print(deleted_certificate.deleted_date) + print(deleted_certificate.scheduled_purge_date) + print(deleted_certificate.recovery_id) + + # [END delete_certificate] + + @ResourceGroupPreparer() + @VaultClientPreparer(enable_soft_delete=True) + def test_example_certificate_list_operations(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + + for i in range(4): + create_certificate_poller = certificate_client.create_certificate(name="certificate{}".format(i), policy=cert_policy) + create_certificate_poller.wait() + + # [START list_certificates] + + # get an iterator of certificates + certificates = certificate_client.list_certificates() + + for certificate in certificates: + print(certificate.id) + print(certificate.created) + print(certificate.name) + print(certificate.updated) + print(certificate.enabled) + + # [END list_certificates] + # [START list_certificate_versions] + + # get an iterator of a certificate's versions + certificate_versions = certificate_client.list_certificate_versions(name="certificate-name") + + for certificate in certificate_versions: + print(certificate.id) + print(certificate.updated) + print(certificate.version) + + # [END list_certificate_versions] + # [START list_deleted_certificates] + + # get an iterator of deleted certificates (requires soft-delete enabled for the vault) + deleted_certificates = certificate_client.list_deleted_certificates() + + for certificate in deleted_certificates: + print(certificate.id) + print(certificate.name) + print(certificate.deleted_date) + print(certificate.scheduled_purge_date) + print(certificate.deleted_date) + + # [END list_deleted_certificates] + + @ResourceGroupPreparer() + @VaultClientPreparer() + def test_example_certificate_backup_restore(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + import time + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['onedrive.microsoft.com', 'xbox.microsoft.com'] + ) + + cert_name = "cert-name" + create_certificate_poller = certificate_client.create_certificate(name=cert_name, policy=cert_policy) + create_certificate_poller.wait() + + # [START backup_certificate] + + # backup certificate + certificate_backup = certificate_client.backup_certificate(name=cert_name) + + # returns the raw byte sof the backed up certificate + print(certificate_backup) + + # [END backup_certificate] + + certificate_client.delete_certificate(name=cert_name) + + # [START restore_certificate] + + # restore a certificate backup + restored_certificate = certificate_client.restore_certificate(backup=certificate_backup) + + print(restored_certificate.id) + print(restored_certificate.name) + print(restored_certificate.version) + + # [END restore_certificate] + + @ResourceGroupPreparer() + @VaultClientPreparer(enable_soft_delete=True) + def test_example_certificate_recover(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['onedrive.microsoft.com', 'xbox.microsoft.com'] + ) + + cert_name = "cert-name" + create_certificate_poller = certificate_client.create_certificate(name=cert_name, policy=cert_policy) + create_certificate_poller.wait() + certificate_client.delete_certificate(name=cert_name) + self._poll_until_no_exception( + functools.partial(certificate_client.get_deleted_certificate, cert_name), + ResourceNotFoundError + ) + # [START get_deleted_certificate] + + # get a deleted certificate (requires soft-delete enabled for the vault) + deleted_certificate = certificate_client.get_deleted_certificate(name=cert_name) + print(deleted_certificate.name) + + # if the vault has soft-delete enabled, the certificate's deleted date, + # scheduled purge date, and recovery id are available + print(deleted_certificate.deleted_date) + print(deleted_certificate.scheduled_purge_date) + print(deleted_certificate.recovery_id) + + # [END get_deleted_certificate] + # [START recover_deleted_certificate] + + # recover a deleted certificate to its latest version (requires soft-delete enabled for the vault) + recovered_certificate = certificate_client.recover_deleted_certificate(name=cert_name) + + print(recovered_certificate.id) + print(recovered_certificate.name) + + # [END recover_deleted_certificate] diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates_async.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates_async.py new file mode 100644 index 000000000000..7f8e8a22844a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates_async.py @@ -0,0 +1,257 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from azure.core.exceptions import ResourceNotFoundError +from devtools_testutils import ResourceGroupPreparer +from certificates_async_preparer import AsyncVaultClientPreparer +from certificates_async_test_case import AsyncKeyVaultTestCase + + +def print(*args): + assert all(arg is not None for arg in args) + + +def test_create_certificate(): + vault_url = "vault_url" + # pylint:disable=unused-variable + # [START create_certificate_client] + + from azure.identity.aio import DefaultAzureCredential + from azure.keyvault.certificates.aio import CertificateClient + + # Create a Certificate using default Azure credentials + credential = DefaultAzureCredential() + certificate_client = CertificateClient(vault_url, credential) + + # [END create_certificate_client] + + +class TestExamplesKeyVault(AsyncKeyVaultTestCase): + @ResourceGroupPreparer() + @AsyncVaultClientPreparer(enable_soft_delete=True) + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_certificate_crud_operations(self, vault_client, **kwargs): + import asyncio + certificate_client = vault_client.certificates + # [START create_certificate] + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + cert_name = "cert-name" + # create a certificate with optional arguments, returns an async poller + create_certificate_poller = await certificate_client.create_certificate(name=cert_name, policy=cert_policy) + + # awaiting the certificate poller gives us the result of the long running operation + create_certificate_result = await create_certificate_poller + print(create_certificate_result) + + # [END create_certificate] + + # [START get_certificate] + + # get the latest version of a certificate + certificate = await certificate_client.get_certificate_with_policy(name=cert_name) + + print(certificate.id) + print(certificate.name) + print(certificate.policy.key_properties.exportable) + print(certificate.policy.key_properties.key_type) + print(certificate.policy.key_properties.key_size) + print(certificate.policy.key_properties.reuse_key) + print(certificate.policy.content_type) + print(certificate.policy.issuer_name) + print(certificate.policy.subject_name) + print(certificate.policy.san_dns_names) + print(certificate.policy.validity_in_months) + + # [END get_certificate] + # [START update_certificate] + + # update attributes of an existing certificate + tags = {"foo": "updated tag"} + updated_certificate = await certificate_client.update_certificate(certificate.name, tags=tags) + + print(updated_certificate.version) + print(updated_certificate.updated) + print(updated_certificate.tags) + + # [END update_certificate] + # [START delete_certificate] + + # delete a certificate + deleted_certificate = await certificate_client.delete_certificate(name=cert_name) + + print(deleted_certificate.name) + + # if the vault has soft-delete enabled, the certificate's + # scheduled purge date, deleted_date, and recovery id are available + print(deleted_certificate.deleted_date) + print(deleted_certificate.scheduled_purge_date) + print(deleted_certificate.recovery_id) + + # [END delete_certificate] + + @ResourceGroupPreparer() + @AsyncVaultClientPreparer(enable_soft_delete=True) + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_certificate_list_operations(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + + create_certificate_pollers = [] + for i in range(4): + create_certificate_pollers.append(await certificate_client.create_certificate(name="certificate{}".format(i), policy=cert_policy)) + + for poller in create_certificate_pollers: + await poller + + # [START list_certificates] + + # list certificates + certificates = certificate_client.list_certificates() + + async for certificate in certificates: + print(certificate.id) + print(certificate.created) + print(certificate.name) + print(certificate.updated) + print(certificate.enabled) + + # [END list_certificates] + # [START list_certificate_versions] + + # get an iterator of all versions of a certificate + certificate_versions = certificate_client.list_certificate_versions(name="cert-name") + + async for certificate in certificate_versions: + print(certificate.id) + print(certificate.updated) + print(certificate.version) + + # [END list_certificate_versions] + # [START list_deleted_certificates] + + # get an iterator of deleted certificates (requires soft-delete enabled for the vault) + deleted_certificates = certificate_client.list_deleted_certificates() + + async for certificate in deleted_certificates: + print(certificate.id) + print(certificate.name) + print(certificate.scheduled_purge_date) + print(certificate.recovery_id) + print(certificate.deleted_date) + + # [END list_deleted_certificates] + + @ResourceGroupPreparer() + @AsyncVaultClientPreparer() + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_certificate_backup_restore(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + import asyncio + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + + cert_name = "cert-name" + create_certificate_poller = await certificate_client.create_certificate(name=cert_name, policy=cert_policy) + + await create_certificate_poller + + # [START backup_certificate] + + # backup certificate + certificate_backup = await certificate_client.backup_certificate(name=cert_name) + + # returns the raw byte sof the backed up certificate + print(certificate_backup) + + # [END backup_certificate] + + await certificate_client.delete_certificate(name=cert_name) + + # [START restore_certificate] + + # restores a certificate backup + restored_certificate = await certificate_client.restore_certificate(certificate_backup) + print(restored_certificate.id) + print(restored_certificate.name) + print(restored_certificate.version) + + # [END restore_certificate] + + @ResourceGroupPreparer() + @AsyncVaultClientPreparer(enable_soft_delete=True) + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_certificate_recover(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, KeyProperties, SecretContentType + certificate_client = vault_client.certificates + + # specify the certificate policy + cert_policy = CertificatePolicy(key_properties=KeyProperties(exportable=True, + key_type='RSA', + key_size=2048, + reuse_key=False), + content_type=SecretContentType.PFX, + issuer_name='Self', + subject_name='CN=*.microsoft.com', + validity_in_months=24, + san_dns_names=['sdk.azure-int.net'] + ) + + cert_name = "cert-name" + create_certificate_poller = await certificate_client.create_certificate(name=cert_name, policy=cert_policy) + await create_certificate_poller + + await certificate_client.delete_certificate(name=cert_name) + await self._poll_until_no_exception( + certificate_client.get_deleted_certificate, cert_name, expected_exception=ResourceNotFoundError + ) + + # [START get_deleted_certificate] + + # get a deleted certificate (requires soft-delete enabled for the vault) + deleted_certificate = await certificate_client.get_deleted_certificate(name="cert-name") + print(deleted_certificate.name) + + # [END get_deleted_certificate] + # [START recover_deleted_certificate] + + # recover deleted certificate to its latest version (requires soft-delete enabled for the vault) + recovered_certificate = await certificate_client.recover_deleted_certificate(name="cert-name") + print(recovered_certificate.id) + print(recovered_certificate.name) + + # [END recover_deleted_certificate]