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..7dfa30f8d42e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/README.md @@ -0,0 +1,322 @@ +# Azure Key Vault Certificates client library for Python +Azure Key Vault helps solve the following problems: +- Certificate management (this library) - create, manage, and deploy public and private SSL/TLS certificates +- Cryptographic key management +([`azure-keyvault-keys`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-keys)) - create, store, and control access to the keys used to encrypt your data +- Secrets management +([`azure-keyvault-secrets`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-secrets)) - +securely store and control access to tokens, passwords, certificates, API keys, +and other secrets + +[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. +* A 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 + ``` + + Output: + ```json + { + "id": "...", + "location": "westus2", + "name": "", + "properties": { + "accessPolicies": [...], + "createMode": null, + "enablePurgeProtection": null, + "enableSoftDelete": null, + "enabledForDeployment": false, + "enabledForDiskEncryption": null, + "enabledForTemplateDeployment": null, + "networkAcls": null, + "provisioningState": "Succeeded", + "sku": { "name": "standard" }, + "tenantId": "...", + "vaultUri": "https://.vault.azure.net/" + }, + "resourceGroup": "", + "type": "Microsoft.KeyVault/vaults" + } + ``` + + > The `"vaultUri"` property is the `vault_url` used by `CertificateClient`. + +### Authenticate the client +In order to interact with a Key Vault's certificates, you'll need an instance of the [CertificateClient][certificate_client_docs] +class. Creating one requires a **vault url** and +**credential**. This document demonstrates using `DefaultAzureCredential` as +the credential, authenticating with a service principal's client id, secret, +and tenant id. Other authentication methods are supported. See the +[azure-identity][azure_identity] documentation for more details. + + #### Create a service principal +Use this [Azure Cloud Shell][azure_cloud_shell] snippet to create a +service principal: + + * 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": "your-application-name", + "name": "http://your-application-name", + "password": "random password", + "tenant": "tenant id" + } + ``` + +* Use the output to set **AZURE_CLIENT_ID** (appId), **AZURE_CLIENT_SECRET** +(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" + ``` + +* Authorize the service principal to perform certificate operations in your Key Vault: + ```Bash + az keyvault set-policy --name --spn $AZURE_CLIENT_ID --certificate-permissions backup create delete get import list purge recover restore update + ``` + > Possible certificate permissions: backup, create, delete, deleteissuers, get, getissuers, import, list, listissuers, managecontacts, manageissuers, purge, recover, restore, setissuers, update + +#### Create a client +After setting the **AZURE_CLIENT_ID**, **AZURE_CLIENT_SECRET** and +**AZURE_TENANT_ID** environment variables, 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 +With a `CertificateClient` you can get certificates from the vault, create new certificates and +new versions of existing certificates, update certificate metadata, and delete certificates. You +can also manage certificate issuers, contacts, and management policies of certificates. This is +illustrated in the [examples](#examples) below.. + +### 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: + +## Examples +This section contains code snippets covering common tasks: +* [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. +```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) +``` + +### Async operations +This library includes a complete async API supported on Python 3.5+. To use it, you must +first install an async transport, such as [`aiohttp`](https://pypi.org/project/aiohttp/). +See +[azure-core documentation](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/core/azure-core/README.md#transport) +for more information. + +### Asynchronously 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 an async long running operation poller. +```python +create_certificate_poller = await certificate_client.create_certificate(name="cert-name") + +create_certificate_result = await create_certificate_poller +print(create_certificate_result) +``` + +### Asynchronously list certificates +This example lists all the certificates in the client's vault: +```python +certificates = certificate_client.list_certificates() + +async for certificate in certificates: + print(certificate.name) +``` + +## Troubleshooting +### General +Key Vault clients raise exceptions defined in [`azure-core`][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 HttpResponseError +try: + certificate_client.get_certificate(name="deleted_certificate", version="deleted_certificate_version") +except HttpResponseError as e: + print(e.message) + +Output: "certificate not found:deleted_certificate" +``` +### Logging +Network trace logging is disabled by default for this library. When enabled, +HTTP requests will be logged at DEBUG level using the `logging` library. You +can configure logging to print debugging information to stdout or write it +to a file: + + ```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. +config = CertificateClient.create_config(credential=credential, logging_enable=True) +client = CertificateClient(vault_url=url, credential=credential, config=config) +``` + +Network trace logging can also be enabled for any single operation: + ```python +certificate = certificate_client.get_certificate_with_policy(name="cert-name", logging_enable=True) +``` + +## Next steps +Several samples are available in the Azure SDK for Python GitHub repository. These samples provide example code for additional Key Vault scenarios: +* [test_examples_certificates.py][test_example_certificates] and +[test_examples_certificates_async.py][test_example_certificates_async] - code snippets from +the library's documentation +* [hello_world.py][hello_world_sample] and [hello_world_async.py][hello_world_async_sample] - create/get/update/delete certificates +* [backup_restore_operations.py][backup_operations_sample] and [backup_restore_operations_async.py][backup_operations_async_sample] - backup and +recover certificates + + ### 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_examples_certificates.py +[test_example_certificates_async]: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates_async.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..a356839c8c27 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_polling.py @@ -0,0 +1,58 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import logging +import time + +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() + 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 in ('completed', 'cancelled', 'failed') + + 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..9be9b59d8c9e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/_polling_async.py @@ -0,0 +1,53 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +import asyncio +import logging +from typing import Any, Callable + +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) -> 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: Any, initial_response: Any, _: Callable) -> None: + self._command = client + self._status = initial_response + + async def run(self) -> None: + try: + while not self.finished(): + await self._update_status() + await asyncio.sleep(self.polling_interval) + except Exception as e: + logger.warning(str(e)) + raise + + def finished(self) -> bool: + if self.unknown_issuer: + return True + return self._status in ('completed', 'cancelled', 'failed') + + def resource(self) -> Any: + return self._status + + def status(self) -> 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..9425a17b82a1 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/client.py @@ -0,0 +1,1135 @@ +# ------------------------------------ +# 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.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: coroutine + :raises: ~azure.core.exceptions.HttpResponseError + + 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.PKCS12, + subject_name="CN=DefaultPolicy", + validity_in_months=12) + + create_certificate_operation = 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, + create_certificate_operation.status.lower(), + None, + create_certificate_polling + ) + + @distributed_trace_async + async def get_certificate_with_policy( + self, + name: str, + **kwargs: "**Any" + ) -> Certificate: + """Gets a certificate and returns it's management policy as well. + + + This operation requires the certificates/get permission. Does not accept the + version of the certificate as a parameter. If you wish to specify version, use + the get_certificate function and specify version. + + :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.HttpResponseError + + 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="", + **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 a certificate by version without returning it's management policy. + + 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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + """ + await self._client.purge_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + + 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, + **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 + :raises: ~azure.core.exceptions.HttpResponseError + """ + 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.HttpResponseError + """ + bundle = await self._client.get_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = await self._client.update_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START create_contacts] + :end-before: [END create_contacts] + :language: python + :caption: Create contacts + :dedent: 8 + """ + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START get_contacts] + :end-before: [END get_contacts] + :language: python + :caption: Get contacts + :dedent: 8 + """ + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START delete_contacts] + :end-before: [END delete_contacts] + :language: python + :caption: Delete contacts + :dedent: 8 + """ + 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.HttpResponseError + """ + + bundle = await self._client.get_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = await self._client.delete_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = await self._client.update_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + cancellation_requested=True, + **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.HttpResponseError + """ + error_map = kwargs.pop("error_map", None) + 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.HttpResponseError + """ + 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, + **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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START get_issuer] + :end-before: [END get_issuer] + :language: python + :caption: Get an issuer + :dedent: 8 + """ + issuer_bundle = await self._client.get_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + **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 + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START create_issuer] + :end-before: [END create_issuer] + :language: python + :caption: Create an issuer + :dedent: 8 + """ + 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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START update_issuer] + :end-before: [END update_issuer] + :language: python + :caption: Update an issuer + :dedent: 8 + """ + 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, + **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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START delete_issuer] + :end-before: [END delete_issuer] + :language: python + :caption: Delete an issuer + :dedent: 8 + """ + issuer_bundle = await self._client.delete_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + **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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates_async.py + :start-after: [START list_issuers] + :end-before: [END list_issuers] + :language: python + :caption: List issuers of a vault + :dedent: 8 + """ + 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..8d77bae79b45 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/client.py @@ -0,0 +1,1138 @@ +# ------------------------------------ +# 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.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.core.polling.LROPoller + :raises: ~azure.core.exceptions.HttpResponseError + + 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.PKCS12, + subject_name="CN=DefaultPolicy", + validity_in_months=12) + + create_certificate_operation = 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, + create_certificate_operation.status.lower(), + None, + create_certificate_polling + ) + + + @distributed_trace + def get_certificate_with_policy(self, name, **kwargs): + # type: (str, **Any) -> Certificate + """Gets a certificate and returns it's management policy as well. + + + This operation requires the certificates/get permission. Does not accept the + version of the certificate as a parameter. If you wish to specify version, use + the get_certificate function and specify version. + + :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.HttpResponseError + + 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="", + **kwargs + ) + return Certificate._from_certificate_bundle(certificate_bundle=bundle) + + @distributed_trace + def get_certificate(self, name, version, **kwargs): + # type: (str, str, **Any) -> Certificate + """Gets a certificate by version without returning it's management policy. + + 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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + """ + self._client.purge_deleted_certificate( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + + 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, + **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 + :raises: ~azure.core.exceptions.HttpResponseError + """ + 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.HttpResponseError + """ + bundle = self._client.get_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = self._client.update_certificate_policy( + vault_base_url=self.vault_url, + certificate_name=name, + certificate_policy=policy._to_certificate_policy_bundle(), + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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.HttpResponseError + + 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, + **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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START create_contacts] + :end-before: [END create_contacts] + :language: python + :caption: Create contacts + :dedent: 8 + """ + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START get_contacts] + :end-before: [END get_contacts] + :language: python + :caption: Get contacts + :dedent: 8 + """ + 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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START delete_contacts] + :end-before: [END delete_contacts] + :language: python + :caption: Delete contacts + :dedent: 8 + """ + 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.HttpResponseError + """ + + bundle = self._client.get_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = self._client.delete_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + **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.HttpResponseError + """ + bundle = self._client.update_certificate_operation( + vault_base_url=self.vault_url, + certificate_name=name, + cancellation_requested=True, + **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.HttpResponseError + """ + 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, + **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.HttpResponseError + """ + error_map = kwargs.pop("error_map", None) + 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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START get_issuer] + :end-before: [END get_issuer] + :language: python + :caption: Get an issuer + :dedent: 8 + """ + issuer_bundle = self._client.get_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + **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 + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START create_issuer] + :end-before: [END create_issuer] + :language: python + :caption: Create an issuer + :dedent: 8 + """ + 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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START update_issuer] + :end-before: [END update_issuer] + :language: python + :caption: Update an issuer + :dedent: 8 + """ + 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, + **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.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START delete_issuer] + :end-before: [END delete_issuer] + :language: python + :caption: Delete an issuer + :dedent: 8 + """ + issuer_bundle = self._client.delete_certificate_issuer( + vault_base_url=self.vault_url, + issuer_name=name, + **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] + :raises: ~azure.core.exceptions.HttpResponseError + + Example: + .. literalinclude:: ../tests/test_examples_certificates.py + :start-after: [START list_issuers] + :end-before: [END list_issuers] + :language: python + :caption: List issuers of a vault + :dedent: 8 + """ + 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..a26035d86d54 --- /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""" + + PKCS12 = '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..b518a732f66a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/models.py @@ -0,0 +1,1426 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +# 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 issuer_bundle.organization_details else None) + 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..940bfd06b844 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/conftest.py @@ -0,0 +1,11 @@ +# ------------------------------------ +# 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") 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/contacts.py b/sdk/keyvault/azure-keyvault-certificates/samples/contacts.py new file mode 100644 index 000000000000..42282c4c8978 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/contacts.py @@ -0,0 +1,79 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +from azure.identity import DefaultAzureCredential +from azure.keyvault.certificates import CertificateClient, Contact +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 basic CRUD operations for the certificate contacts for a key vault. +# +# 1. Create contacts (create_contacts) +# +# 2. Get contacts (get_contacts) +# +# 3. Delete contacts (delete_contacts) +# ---------------------------------------------------------------------------------------------------------- + +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: + # First we create a list of Contacts that we would like to make the certificate contacts for this key vault. + contact_list = [ + Contact(email='admin@contoso.com', + name='John Doe', + phone='1111111111'), + Contact(email='admin2@contoso.com', + name='John Doe2', + phone='2222222222') + ] + + # Creates and sets the certificate contacts for this key vault. + client.create_contacts(contacts=contact_list) + + # Gets the certificate contacts for this key vault. + contacts = client.get_contacts() + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # Deletes all of the certificate contacts for this key vault. + client.delete_contacts() + + 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))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/contacts_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/contacts_async.py new file mode 100644 index 000000000000..5d7677a9f406 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/contacts_async.py @@ -0,0 +1,81 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +import asyncio +from azure.identity.aio import DefaultAzureCredential +from azure.keyvault.certificates.aio import CertificateClient, Contact +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 basic CRUD operations for the certificate contacts for a key vault. +# +# 1. Create contacts (create_contacts) +# +# 2. Get contacts (get_contacts) +# +# 3. Delete contacts (delete_contacts) +# ---------------------------------------------------------------------------------------------------------- + +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: + contact_list = [ + Contact(email='admin@contoso.com', + name='John Doe', + phone='1111111111'), + Contact(email='admin2@contoso.com', + name='John Doe2', + phone='2222222222') + ] + + # Creates and sets the certificate contacts for this key vault. + await client.create_contacts(contacts=contact_list) + + # Gets the certificate contacts for this key vault. + contacts = await client.get_contacts() + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # Deletes all of the certificate contacts for this key vault. + await client.delete_contacts() + + 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..66756ccd81c7 --- /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.PKCS12, + 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..a0e329697fe5 --- /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.PKCS12, + 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/issuers.py b/sdk/keyvault/azure-keyvault-certificates/samples/issuers.py new file mode 100644 index 000000000000..950bdd085600 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/issuers.py @@ -0,0 +1,107 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +from azure.identity import DefaultAzureCredential +from azure.keyvault.certificates import AdministratorDetails, CertificateClient +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 basic CRUD operations for certificate issuers. +# +# 1. Create an issuer (create_issuer) +# +# 2. Get an issuer (get_issuer) +# +# 3. List issuers for the key vault (list_issuers) +# +# 4. Update an issuer (update_issuer) +# +# 5. Delete an issuer (delete_issuer) +# ---------------------------------------------------------------------------------------------------------- + +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: + # First we specify the AdministratorDetails for our issuers. + admin_details = [AdministratorDetails( + first_name="John", + last_name="Doe", + email="admin@microsoft.com", + phone="4255555555" + )] + + # Next we create an issuer with these administrator details + # The name field refers to the name you would like to get the issuer. There are also pre-set names, such as 'Self' and 'Unknown' + # The provider for your issuer must exist for your vault location and tenant id. + client.create_issuer( + name="issuer1", + provider="Test", + account_id="keyvaultuser", + admin_details=admin_details, + enabled=True + ) + + # Now we get this issuer by name + issuer1 = client.get_issuer(name="issuer1") + + print(issuer1.name) + print(issuer1.provider) + print(issuer1.account_id) + print(issuer1.admin_details.first_name) + print(issuer1.admin_details.last_name) + print(issuer1.admin_details.email) + print(issuer1.admin_details.phone) + + # Now we will list all of the certificate issuers for this key vault. To better demonstrate this, we will first create another issuer. + client.create_issuer( + name="issuer2", + provider="Test", + account_id="keyvaultuser", + enabled=True + ) + + issuers = client.list_issuers() + + for issuer in issuers: + print(issuer.name) + print(issuer.provider) + + # Finally, we delete our first issuer by name. + client.delete_issuer(name="issuer1") + + 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))) \ No newline at end of file diff --git a/sdk/keyvault/azure-keyvault-certificates/samples/issuers_async.py b/sdk/keyvault/azure-keyvault-certificates/samples/issuers_async.py new file mode 100644 index 000000000000..9ae0969e801e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/samples/issuers_async.py @@ -0,0 +1,109 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import os +import asyncio +from azure.identity.aio import DefaultAzureCredential +from azure.keyvault.certificates.aio import AdministratorDetails, CertificateClient +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 basic CRUD operations for certificate issuers. +# +# 1. Create an issuer (create_issuer) +# +# 2. Get an issuer (get_issuer) +# +# 3. List issuers for the key vault (list_issuers) +# +# 4. Update an issuer (update_issuer) +# +# 5. Delete an issuer (delete_issuer) +# ---------------------------------------------------------------------------------------------------------- + +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: + # First we specify the AdministratorDetails for our issuers. + admin_details = [AdministratorDetails( + first_name="John", + last_name="Doe", + email="admin@microsoft.com", + phone="4255555555" + )] + + # Next we create an issuer with these administrator details + # The name field refers to the name you would like to get the issuer. There are also pre-set names, such as 'Self' and 'Unknown' + await client.create_issuer( + name="issuer1", + provider="Sample", + account_id="keyvaultuser", + admin_details=admin_details, + enabled=True + ) + + # Now we get this issuer by name + issuer1 = await client.get_issuer(name="issuer1") + + print(issuer1.name) + print(issuer1.provider) + print(issuer1.account_id) + print(issuer1.admin_details.first_name) + print(issuer1.admin_details.last_name) + print(issuer1.admin_details.email) + print(issuer1.admin_details.phone) + + # Now we will list all of the certificate issuers for this key vault. To better demonstrate this, we will first create another issuer. + await client.create_issuer( + name="issuer2", + provider="Sample", + account_id="keyvaultuser", + enabled=True + ) + + issuers = client.list_issuers() + + async for issuer in issuers: + print(issuer.name) + print(issuer.provider) + + # Finally, we delete our first issuer by name. + await client.delete_issuer(name="issuer1") + + 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/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..5c69a25a32a7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/certificates_preparer.py @@ -0,0 +1,148 @@ +# ------------------------------------ +# 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, + ): + 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..80559ac6a99a --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client.test_async_request_cancellation_and_deletion.yaml @@ -0,0 +1,269 @@ +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://vaulte1551c58.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: ['Fri, 06 Sep 2019 18:03:31 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","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":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1347'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:32 GMT'] + expires: ['-1'] + location: ['https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0&request_id=681f5344b20640a1918a1c5ccc57d38e'] + 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","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":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1346'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","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":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1346'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:42 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","cancellation_requested":true,"status":"cancelled","request_id":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1181'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","cancellation_requested":true,"status":"cancelled","request_id":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1181'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWoP+K7LYrtqKNetSl0pvSfMMceCs3zMcXpDQfTG1+hat7msib3wn8BA0jHf7DB5rt8oIxJQIZ3Rq+y1Q+wDYpyQ8LvZaK4ZqYUOVh3Ps9cefbOQPVI+dVRgBDw0YjGcO3zhJlWgBcd/KxGwW3FjDE+acA67mD7RwdnkaSd0S7L7nvQrLxL/cC2OwwjBnSKgoTNbCtcvrQY+2FmakjqLn1GdVyLm+RePjYXkcNVeS5gYLSCj8yvxs0XazIHGuBgqZ2LR+zcdJtTu/yzuR7RphA7XAbc6CKWHeyuGFjYFBrunwC5i6KpQujJ5u7j+Fnnl2oYBfDLTG8Id04bgz1M1xQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKukrdToB4nQJowW5InpsPw3aS/DD7pxDZYMmZ3KpGYN3YOyhcFbNDCdx6SdT70oqVjt6+LgjQ80iOiwBQaVeGY/pBq2sG5uHu2ebFPBoqOnZZiFe4sg1SdHBNyeaZv1bGKKLKyqKOvS3Tu44z6sotwQsbNm8YHGfcT/3PT/QpaBAHB7TfRgnHHhANPuV6S7ky5ugD8CRqtjwRMZg6ijRgB4b2vOUeyXake2BF+RFbsAjyn4wiqk74KL5n1EVbS7QSHQy2aq/ccRYG93fCd141mXIHS2SCyTGQHk9MA4AV12o35xVJK/hNogxe9D3IBoYQl8ee+A+gJdIBP7P/iLPkg=","cancellation_requested":true,"status":"cancelled","request_id":"681f5344b20640a1918a1c5ccc57d38e"}'} + headers: + cache-control: [no-cache] + content-length: ['1181'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte1551c58.vault.azure.net/certificates/asyncCanceledDeletedCert/757d80aba28640c3b4fbffbf40625d1f","attributes":{"enabled":false,"nbf":1567792412,"exp":1630951412,"created":1567793012,"updated":1567793012,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaulte1551c58.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":1567793012,"updated":1567793012}}}'} + headers: + cache-control: [no-cache] + content-length: ['922'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..99daba149d98 --- /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://vault96da121a.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: ['Fri, 06 Sep 2019 18:03:31 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2gBi2OrCRg6qriMMj06Hq1EJBB/T15IZt8rN/+MowygUnlWumvfhOVYV7FdHJYf3poMZCHvnpYfHmZrn1nxs6CIgAXd6XrZ8IhrACMLpSQ2bSI4q/6jzh+asd9qOoa3biEDV3FbCxXqdLBiwbBVRi22+hLIqGWL7ZFawNkGfBT8ngxHon40604kJ419h0o7hU2ottftfd7Dt/IKFfiO/qew7vxEfeW+F/0H0nFHbD67Qaf9tmOr0U4VUmujqhpUhTWZ6G94uTmd/Jyv8Q3Sv1KilWWeUwNyD3H1G9EOb1RFxuNTd0Qom//cC5fzYKnHOLTbXHAC66EAk7n13PC2RwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAaPZ2m+KNxZWnjOak+L0M8fhMk9bDdtP4ay/88/4Yc2eXzXshoIR8y7XUcW2p3CqEBPRtF7g2rzsI7vQYCm63YB6Q1WLzqfnlzWY61rAOmmlB083f/5q/kKt7ZJRBnBx285FlH0ynaiomduomGbmWnjsyiREv/6TnoS4Fpc80BM29oszOJxm5gRLugEF7DCEc0xXerqXXcwYTcevFY2a1O74p210zQajeKawS+5PEHzHxcFyZQ4GupEeodmHCdsdoYUPwoJODF0g8/5CcEzuS9dNiHQYBK893Y0zHf3lW0oCzP5HvWoh9Al/JBkvFBnvtai+l6SdtisjoyyVyo81AA=","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":"76e4c71bfe14406a973491d54515abf9"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:34 GMT'] + expires: ['-1'] + location: ['https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0&request_id=76e4c71bfe14406a973491d54515abf9'] + 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2gBi2OrCRg6qriMMj06Hq1EJBB/T15IZt8rN/+MowygUnlWumvfhOVYV7FdHJYf3poMZCHvnpYfHmZrn1nxs6CIgAXd6XrZ8IhrACMLpSQ2bSI4q/6jzh+asd9qOoa3biEDV3FbCxXqdLBiwbBVRi22+hLIqGWL7ZFawNkGfBT8ngxHon40604kJ419h0o7hU2ottftfd7Dt/IKFfiO/qew7vxEfeW+F/0H0nFHbD67Qaf9tmOr0U4VUmujqhpUhTWZ6G94uTmd/Jyv8Q3Sv1KilWWeUwNyD3H1G9EOb1RFxuNTd0Qom//cC5fzYKnHOLTbXHAC66EAk7n13PC2RwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAaPZ2m+KNxZWnjOak+L0M8fhMk9bDdtP4ay/88/4Yc2eXzXshoIR8y7XUcW2p3CqEBPRtF7g2rzsI7vQYCm63YB6Q1WLzqfnlzWY61rAOmmlB083f/5q/kKt7ZJRBnBx285FlH0ynaiomduomGbmWnjsyiREv/6TnoS4Fpc80BM29oszOJxm5gRLugEF7DCEc0xXerqXXcwYTcevFY2a1O74p210zQajeKawS+5PEHzHxcFyZQ4GupEeodmHCdsdoYUPwoJODF0g8/5CcEzuS9dNiHQYBK893Y0zHf3lW0oCzP5HvWoh9Al/JBkvFBnvtai+l6SdtisjoyyVyo81AA=","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":"76e4c71bfe14406a973491d54515abf9"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:34 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2gBi2OrCRg6qriMMj06Hq1EJBB/T15IZt8rN/+MowygUnlWumvfhOVYV7FdHJYf3poMZCHvnpYfHmZrn1nxs6CIgAXd6XrZ8IhrACMLpSQ2bSI4q/6jzh+asd9qOoa3biEDV3FbCxXqdLBiwbBVRi22+hLIqGWL7ZFawNkGfBT8ngxHon40604kJ419h0o7hU2ottftfd7Dt/IKFfiO/qew7vxEfeW+F/0H0nFHbD67Qaf9tmOr0U4VUmujqhpUhTWZ6G94uTmd/Jyv8Q3Sv1KilWWeUwNyD3H1G9EOb1RFxuNTd0Qom//cC5fzYKnHOLTbXHAC66EAk7n13PC2RwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAaPZ2m+KNxZWnjOak+L0M8fhMk9bDdtP4ay/88/4Yc2eXzXshoIR8y7XUcW2p3CqEBPRtF7g2rzsI7vQYCm63YB6Q1WLzqfnlzWY61rAOmmlB083f/5q/kKt7ZJRBnBx285FlH0ynaiomduomGbmWnjsyiREv/6TnoS4Fpc80BM29oszOJxm5gRLugEF7DCEc0xXerqXXcwYTcevFY2a1O74p210zQajeKawS+5PEHzHxcFyZQ4GupEeodmHCdsdoYUPwoJODF0g8/5CcEzuS9dNiHQYBK893Y0zHf3lW0oCzP5HvWoh9Al/JBkvFBnvtai+l6SdtisjoyyVyo81AA=","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":"76e4c71bfe14406a973491d54515abf9"}'} + headers: + cache-control: [no-cache] + content-length: ['1295'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:44 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2gBi2OrCRg6qriMMj06Hq1EJBB/T15IZt8rN/+MowygUnlWumvfhOVYV7FdHJYf3poMZCHvnpYfHmZrn1nxs6CIgAXd6XrZ8IhrACMLpSQ2bSI4q/6jzh+asd9qOoa3biEDV3FbCxXqdLBiwbBVRi22+hLIqGWL7ZFawNkGfBT8ngxHon40604kJ419h0o7hU2ottftfd7Dt/IKFfiO/qew7vxEfeW+F/0H0nFHbD67Qaf9tmOr0U4VUmujqhpUhTWZ6G94uTmd/Jyv8Q3Sv1KilWWeUwNyD3H1G9EOb1RFxuNTd0Qom//cC5fzYKnHOLTbXHAC66EAk7n13PC2RwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAaPZ2m+KNxZWnjOak+L0M8fhMk9bDdtP4ay/88/4Yc2eXzXshoIR8y7XUcW2p3CqEBPRtF7g2rzsI7vQYCm63YB6Q1WLzqfnlzWY61rAOmmlB083f/5q/kKt7ZJRBnBx285FlH0ynaiomduomGbmWnjsyiREv/6TnoS4Fpc80BM29oszOJxm5gRLugEF7DCEc0xXerqXXcwYTcevFY2a1O74p210zQajeKawS+5PEHzHxcFyZQ4GupEeodmHCdsdoYUPwoJODF0g8/5CcEzuS9dNiHQYBK893Y0zHf3lW0oCzP5HvWoh9Al/JBkvFBnvtai+l6SdtisjoyyVyo81AA=","cancellation_requested":false,"status":"completed","target":"https://vault96da121a.vault.azure.net/certificates/cert96da121a","request_id":"76e4c71bfe14406a973491d54515abf9"}'} + headers: + cache-control: [no-cache] + content-length: ['1205'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnNzU05iRnNJS0F1NGVOTXJ6S3NsNFNHNmppY1JhOXI2a1llcUpGMGlCczZ1UkFBdGhQUmtIVnEyUS1PUTJnTGhIOF9YelV4TlM3ei1NZlEtRFp2cG8wRjJMTTU3Vk9YV01OU0Izd3RQN0IwNkhTTm5EM0lkOFdnUzhYeG8zY3BCbDYzWUcwZ2J4WjN3RVFCV21YLWdVcmpCaDd1Z1FNNnZkOF9MVUxZSDBueG9TanhMNXNCdVBwVVdKVzlFZzFIc2Jrek9jLTYycWtwYWF5MTdoTm0yaVBQWEljYmowbXNaRkNwTmN5NEcyNGZvb3NBRGZ1YXlSOGp1bGh3aDdHV3lEQ2hGc1UzdXNCNFRWRHdmVldXN25DY0Q2alVXRnVVeVVYMTBmR1ctc1JxUzZjMlA1YUptTndRa0xadWY2TmVBWjROUUlxOFI3aTM3V0NrWkZkbTNYZy5qOEp0RV9SQ2VRdld4S1lBUzB2N2NnLlVMeUhBTG1UMEFMUUs4RmZMX2g3dGJPMDB0d2xHQVEzTXNTQWVBcF8wNUY0dmd2UEdEZzNydFZtZWM2dmVHNFFBaUxiZzlQSV9WOGlBVVd6MVlyZkk1d29IQWpFaHBtcktlRU14cEdxUF8yckhCeElBQ3FUb3Q2Y01ZLXVJYWVrMnFHM0t2RVdRalB6cVVWNFMtb2lyS1RTeVZxb1ducVlYQUk5VTVJbFNmSlFGYTVCMVFUSlBQaXhtMENwdUJWbk03em9HemVsYU9Qby1JV1FkYWx4VGs0NkRkaHN4YUgtelpFRXp4eXV1eGFRbkdGVXNuVDlJUnVJajlmeHZwQ1RQQ1dUN1ltcXJZSmFkWTl3SVdCY2xrM0I4WmYtNE1NN09MNlp0WWJSNWF1emhscTJZVHA4alR6MXRtcDZOTFBQaUU1Y0xGc2pscFZuVC1Qa3NCWHA5MXFFQlJHTXZmWUpLZzh6WU56bzdwZTJSckI3Y1pjZzlJZ2lwZHg1Wl9Zbm1Ra1BPMGdXbU91anVBM2lpNU10V2huc0k4Z1lldzZWaXM3TGpYSl84cGpsMjNhaTJ3V21xdDRnYUZmcDBCZHl0ZTc1QkRFenJTZlNKSWlTX0hLcFRDdHAzLURyMDU5MG1zd1IzXzdpRW93SEwxc2tkVGU2cGN1Z0FMRmRpdmkzUHRBX3NPeXNKM3pzNmcxZlpnVThjNnRueVE4WkhScVZidkRiQlo0bzFESkI0dktJV09CRm14TENnRU96ZVo1OHF1OE1jZXE5WHd0aDRyaEJFbEpGSU1sRnhlQkRfWERwdEpYMWg4Q0NUSTZycWV1Z1pOc1dvbnJQRnp5ZWtkM1NaRzlxOW1TSWxKVzllMVVNT0VHYXVkcGRrcG9tdUFDM2RUTHlkNG9NYVNhYV9aU2lnT25jR3VhcGZRaUxodV94VHh1QUp5cFVTTmVmaEJBemM2V0QtemR2SkhXZFdaQzFyUjJtSWJKSW1LQnVZdjZjOExscUFZWGhveHZibWJBcEdfNkkzMEhVZldNUFNfSm5SOFhhc1prVV8yZDdOSU9zeGJySjJGLXQxeV9mM3phT1BUVHgtc2luYTZfdDNoUTUtUGVJZEtHMVZ6YjZxSlhDR0FPOThsLS1nLU5fRU5IWnpFX2Q3V0QtbXk4ckFVRUo1YkxfSm12bzdqck8tLUwxN21QUjRRbENSV05kSVQ1cHJmNENjbExBQnpPWE9NdWtlVVd2VWdRa0JxbHNrMzR5V2VwbkFfOHc0aW4zdGN6NHBFNXlWRU9YdU10aTVjYm9aaS1WLW10QUNzOXgteHlIQVg3ZkZXUzBmamRrQi00YVlrX3I1RGhtcmRWTU8xTmg4Vnk4WXpmeHRENmNBb2NnRERtREpHdXNrajNqYlNfQmhOUVRfSkZyR2VLbHBmMnd6UmZKa2d5WURRbkVEd0lpSjhneFRpZWNsU2tacWFrZ3hqRVMwUk5IcDAyNTNvY3JfSFJvanJLZ3loeDVlcWlBdWxDLWZVeEFpT216UEYteEN6TDlWX2E4QmlUSW1TaFNiRUk2clhFVlh1Y1FCZ1NkV0JLYWs3dVFkM1lTYzk2ODlwOTdJZDlrUTBrelgzc2UtVVFhcGQtYWVGZ2lZdGRrdk5wa05rLWRzOTBNeXFmRllUNjVNcFBBYkhYNWlLTzJiV2ZjbXJ1bUdkaVljRVdpdnJZVUpBQmQ2d3NlYTI5akszaEd0cnRSNjctcnJYaHRTMnQ3R1l4OGdrdzBLclNwaWF5NGd1TVhiM2k5T2t6MlZWOEVqU0owM1YwQ1ZJMWQta1lnTXRlcXNVRGRTTGpzWVZIWFNJLW4zdVNKYTFOdm4tNm82UHJjbmdZOU1PaVVoVkg1NUI2TWwtSloyNDZCc2N1c1RuLVZXSG00N3ZXWlk5N25RRmkzQlVDM29VVG5hNjZfX05KWVRpM0lCQUJkMFRobzg1cU9zbHh4SlNmMnVYOEZPZnVIbjVvUUQzbVE4eFVJUXJXbWI5c3Q1RXFmWVFJbkxBbjZYc2JRMEFxUlprQ2NpMW5aZzVaN212ZFVlam96Z3c0M2ZReV9HWHVoU2RoR245NnRFb0JkbXFEOTdBZEs4a2xLMkpLcHFPX09YbERMbnowRVdsSE9KbkxRdElOR1VvYzNkMFp1MWhjRWtmX3F2S1dTaWtBc3N0Tmd5M2R5ZlNFQXlpR1YxRzJBM1pZZnlhUzllVHZ4N25VRzUwdm1uRTVNdHhTMHQtSU1jbjIxYVQxTnVkUXRmNnhyZ1dVWUpkckU0RGktLUdJWVZVU3BkY3IxUUU0NElCUHNrVi1aQTd3d2ppUlFPZ3h4MFJScVNidzkxcEI2N21qckE5SzN2enFwbXl6RGx6UnZtY21JcS1VczJBMUxubEVUS3A5OGF4T29MbFB3MWU2by1QR051WGRBQzBGT24yQ18zTlhEVjljM0tUR2YwTlQxUWg0SG9tcVk1WUd2UEtrc01iWUZwREJDemNIc19RbEFUbERFUEhVa1NGNmtEMHpOZkN0Nk0zUERmSTliTldzM0lHcExleFk4emM5Y1RPR2dkZ1JMeHBPX0Q4WERhMzlEdVNrNFpTc2txOUgza0pYZkhwWnB5R2dDcXNqczVreVFSdzV6NExTNm5LeHA3aFB1dWtLY2k5VTdqNkR2cEFQUjk2RzFPbmQzM1RDc2F2X0xWZ2M3bkdzYnZiRDZtN0t2WWVNQUlLSXd4SmtpcjA2aUZwZ0YyYTh1emR6TlEweEFkNi1fXzRQQ1g0VDdNQ3BmU055ZEtyb1hxTm9sZXZhNFFLYWQ4M2FEMVJrMFFGZVo5VjZ3eXE1YnZ0WVZxTHlfWE05VFYzNUZWZ3NxRUhJeURrTzZJU0psSWN5a0VCNVVwTHBseG9CVmVoYVM2TDBlOFIxVjNPcXdOYXQwV1lreDFDbnhkb19IWkZUTjQ1cVBvUzMyV3JSUFVRbVZfd2pwaXFzU1dJN1FSOXE4TTc0X3RRVXlZRHdkVVFqdVFPZzlJTEFDbnBLU3Y0ZDdjaFZWRmpRbmp5YXhPQl9mdk1OTGoybnVFYzNnOEd3c3E1dEQwX3lfbmVDamhocFlGXzJvSGV0eE1ZUjJXVTF6Qjh3cDZwSjh2VFViT08yZ0FwamZxSWRGeXJjOVFMRFoyazJ2U3FwZjIzZWVxZ3F1QlQxWld2WExKQTB3UUY5R3pfblFraURBT0ZJdDJYWEtfblZvUVZWR1Q1b01ISEtKM1hhUmp5ck80MXl3VENra1Zsa1dQMGI1R1NMYnRJTktzdTN0MVBLaG1fWHZWNmlfNmxiTGxLaVV4LUR4QnFTTmpsbDBEcGJTMkVyempHVHl2eFp0Q3VpN1RKRnY2TUV2YXdKQ2RENExsNFpncUlQdWFsVnVDOGc2UWNJbDNRX3RXTHU1dXhSa2RiMVdyQWZlUk45WGFFLXhiVGxQYTRTdGxtWm55ODhPc3ZNeHllVktSbzk0RE5nOEh5b0xKLUdSMFJST1ltd3piZFJ2X3l1T0JlV2FlR3hlWXd1NU93X0kzRVBieHZtaF9FM014QW03N1V0cnEyYUdqbmJ4XzJ5Q0V4TzJJeW5qX0RjUklxdFp6UHFpUDZlV2Q4UHZwTGx0bG9ONC1wYTF3dm50V3NPSDU0OXp5Q2NOMHRXRWZQMGNmNUtKQWUyNExnWGdJWmdOY2dQMm9odFZiQ3hoMUxCMVFoc3ctNFJZNTk2T05ucGNjRkVhcGI3TEdUd2lpR25KdzN2MjNIQUhCYWtYOThjOFlPZTdCMTI4a2xWTDhzWXBMUTdSdXV2RzhyY2JXWWtlZmlOaTQ3bmQ2QklRVTV1Rm1SVHc4WWQ0X0pVRXNUazBFNWk0QWpWeWNFX21YVmR0bzVOeUZBUS1jZG16cXBBYWJkQ01UdGs2QjFLem9rTFRrRXJIcmg0U1lwc2RRSExSREcxTjJ1a05mN0h1aFZjb2dUUWhWcmhhRGdpZHVrMnRpcDhUM0lJUkw1WWtiYXpQNURBN0JLUFdxUTZrbUl1eHhoTkdxY2NkdUpUSVN3SS1VaURDTVdaMFlOX2dpcS1DbkU4bGhvbHd6NFdtVFU5dFhfbkYyczlKY2tDUWpDTmYwbzNUM3BOLTRyRHlsZ2kxUVJsa2d0QlRNQmtFUWhyazh5emR6NmhWVjIwTnBMRENfTi02b1BhaW50SEpacU9SVHBOQm42eWU5b2ZacGcxOE5xcUFvd2tKT0JxUWEtUDU5dTBlTEI2ZkpxSm5pSjdkbGhBTGRYOWRrbFcxbU5ZZ3Etd09WQVNYcTBEZHdoZVlBTVRxUHI2b25uV2MzVXFkWFVCVlhrM1RCbEQwQ0FvTF9RYm5jcHBjY0wzVkZlTWtqOXI2QmhfVTRGZXpxa3JIRW1PUkxHSkl6TmNDVzN2NEhJNTVqNktvbHQ3dl9MYzFiQ0JEdDhjRkNHQlVhUWRhcWhQRDh3dHB5b2J4YVFaOC1BUEVmTlVlUnl2aHU0cG1QT1BaOFdRaGN0VV91cXpXeTRvSG54M2F3eTN1dmstVmVtTVFSSFZ6ZlNTX216dmxBUEpZMGl1dURhVFVSWGliZGRVNGtVXzhHQVpaS0JROGtSclhVbmxZbFFBZE5HZ3pxbDJpRmVJaldldDhmWkFJaGEzQUNDZEFNSGpYTEI5Vk5WT3NjQnAySUZYVm5wN2t0bWlRRF85OTVEOGFKcWxfcHNBd04wU0pXSE1PM1RCSExDVVFBNDFvUmR0cGczQ3FNVW50NGpZdHcwUWtEZFlMbE9zV3pDbnNqUm9FWFpFME8wS1JGbkJERzRybzdOZVFhSF9zU2U1Umk2S1BKRDBzaG9lZlRPS1BGSGFzSmlnMHA3RGJzeW9XN2tqcGJmX3lGTlNacmZzMkFtRk9fem14T3QyYkxKSVNVNGd5dmhjNWNudWQ3X1o0LWhOTUFZRVBOUjF1UHpEdFpmMVZEVEc1MjF4VXBaRnRYZFVkeTJQUW53Q3J6Y3dGUHprbWlMMHNWcTczTGNvRlppbEUxckNQTmI1cnBOMUtOa1ZtZkk2cUdKSzk5OU1MVmFKdEZvWFdxYVo5OHZCclNHWUozc0Q0b1dwSllFRksxejdUUkpiUXdjUk5YZ3k4QldLUS1jN3pHeWQxVEh6Ml84RG9GV3JiMnpKemxUcnJubmVsN1BrTnJkMDh2YXpHZHFtTnFod2VZdEt0cDk2UUh6Y1ZsUGpTbkpicW5oTmhMV2JYM3IzSVp1X0F5UjFiUEVRUlJValZCcHliczItM2JuOUhYeWhjNmJVdF9Gd19fV2Y3Z2lMVVNmTWltYmNXMDJOeUFWek1IR1F1S3l1d1VtanpwbHZqcnlDSGFqekF6dVJ3aVJRVjR0clpQemdxcDhteUI2ZC0yQmVSZ09BRmUtNkpjNGFTVUhPLWdaRkJMNGNLcTllLXJFZWdMTlhTU3ZnOHVaVXI2QVdGOXhqdTQ3ZHRMUW0xWW8wNGRXMWJ4MVl2YkRwaElubW5pUldMU28tbENmRGxDUmNZYW5DWjFiNmRnMFk0TzYtTFRuSUFqcVVpMUpWajZwS1NNSnRpTUZaZWc2XzM1ajFUM3BtRGJYekppemxiaHpFTHkwNm51dVAzOGJCTmg1RExIX1ZBYUQ1VTlwS2d1TW54Qy1vQVZRRWZ6TzhJZ3NjS05Jc2xTaXk2LXFXbEt1VXFCeFFiZ3lQR2tXeC1TdUxpRFo2RmROakJnNW1RY2c4NDF5VW4zSmlKSTJ6OXdQTTJKTWRtZG9XaFhtMHFnOUZfU3dib2Y2djREVEVlamw3OTU4TjlRazRQb0FaMHRpckhPaTZZMXVRQm5TYjVnRWJvR25NaGNndFdtZHpmYXZCbVlLV0xTY0Z2WXg5VVRucUxhYWNwSDYxUl9jbVpKZ1dTS1p4UHFDbEtyV2doaWh6dTVOWXhMRkhxSDFzX2tGZFBwbjRWNHd3SVlkQXFVVENZSUVQOU5pZElGd0pDRVg4ekxxQkliYjl5Z2Z6Y3N1bjVBa2RFR0VMVGhDWEVuQjFPcmNoOXpyY0lxYXBYNW9uZ3VuYVN1elpYOEc5ZmkwYU14TWdSSHpkeDllZ3lqeWRRSXVvTlJYYTFqWXp4c2dCS1RuU0JpbHpEbXJJZkxnWWoyRG9jU3FHR3Z1X25uQVZ1SXhkanF1TjFmRkM2eS0zM0pyYlF6YlhwNjRuWGZWbjJuV1lpMVRQd1hYSEpHNmVNTUlCMXFFRU1Kd1B2Z3VSQ0dENzJrLUxTX1MwaW9lOExqdUZoSHlBZS1na2s4a0hZQmItcW1naElsaHpOQnZicEJnbl9rdVBjVnVJb2JOMk03c2tnekxRcm5vVXI4WnEyd0VPeVdoXzVYekk0ZGdXZW5DMmpGcGozU1d5dUQ1YkFqcUcwbFJNbjhMeVk2UFZLYmw0bkNtWGZaMjlpRlBSaVFjUEVmYURVODBSamhiMlJkMEJRX0Z2OVJHb0hoMWxEa3pIRjJOdWFDWUpLVjRCUVI0eXR5ZllvSkthWUhoQXhsVllwOEZHTThGMzV1WTJoejBMNEtzUWpDU05VWHlMenpoZkVFcmxJTE1sOU1PblZxcEpMNGVZTktnY2cwQ3FXRHh3NGVTdmRVM1A1RVZIOHRSTFREMFlNOVJqZ1hsdTNib3FZYnI1Sm5TMHc0a2VoNGk0YXR1M01PdE9WY2RRT0VsLXl5VXNHdFN2OC04RUU0UTBMNTRDWXg3bGRpazNvUDR1cXVWWDRPMFVYM1Jfby1Rd1h1SlFfSVlOcnlMM2w3X19oZjdvRXRyUU9WSnpMOWJFZWZhbU5tR2lseTVKZFdBNVd6dmFBa1h5UlFhZFFTVUlNYUQ4dnRIc2xZdlU3cHpQZjZ6a2oyV2FDTHcxWEVFSTBBNWZJc3lYSUgyaTc2ZVJWWkZQUm9hM1ZqQTFSMWFZX3JjUmdqZGw4QUpWMGZXZFBXOEp4dmRKV00wbDZzMmM2Qy01cW1yY2kxR3BIaW9YeTFXXzBiOUJHcExEMzFZOHRBX2dsMl8zc0VnaDJROFNqdmx6UEt3b1NBV2V2NWtFY1l2T2xZcUVkRTNoSHo5QTFCVVRGMWdkYU9TV3UyVXVsRExNVDRaRklBc1ZpakhZUEJ1em5ab2ZSMU14b3d5elZ1ek1NSzlpaGk0dnlvazhpWWw2LTNCZ195TEFuZE1IUnBQbUU2X1BsUU1VTHZsOUJEVDdUVWtnNUNsZWNsaldRYWwtM01Jdy0yRGNMakE4LW13NGREc2ZLck4zcDUwUjRxNHlOXy1mSS1Pb21fS2ZUdElxQ3VVdDdLNWFOMXV5OUxDWXlsbmpRX2kxRTk0bFNfSnFaY2ZBUjl1RXhudkRjSVRZN2N3SzlOYTFJNmZKbGpPYVBRdFNIamVvSE9tNk5JSU83a1VsQUF1akowcjB1NjRYYk9oMzFwM0dUZWxRaVEwMVJwVGJ2b1ptVkloeXFxTVIycFZJTzlkNWcwMlVYVWRVZTgyU19JRWo2a0FMa3hYVUd2R3JzY05VR0hTNGZSX1pVT2prMDEtNk9GWWcwNXVaZ202MGZUTWlvdTBpdkxoalVaSG52ZldDZ0dwTXAyQVR1ejZvWlJ5RTBWT0JieHpXWVFvVk9WOXI0eVRza1p6ZkNfX1oxeW5KUWRZenp5bVR4ckE5cDI4cXpZblo2YlpzYVNDMnZCQmNuN21leXFETjhfZkswNk5rT1RmZHMwNWViTXpVS0pOcFVXWnJVeWdFOWpjNUhpa0tqWFlRNWpWbzAwbzNSMG5QRGlPUEk4OWhxd09Ha3djUnZkVnlqdHAwVG56YlVCWWtpUW55dF9QQ09Lbm1kMDBMcTg5VndGTldRbkdlMmdwWWdpbU9tdFFEeDBFVGtmWV85MHNyVmQ3UDZoTFpGUUtmcHlXekJhOFVmck1UV3JQS0VoWkNYTlQtVU9Qel84SkVPSjFsQjV0QjhUQk81cnZuWk9DS3ZDbHRZQ1RzQTE4S2MyMzhobmdWRW14WS1XZkd3eXV0OWx5eGJlLW9ubXdxVFQyMWlLUTBoVDRhWUxvZmJ4bFdJeUQ2UVRpazdGWElIRl9QYnJwNnpzczJ1VGdyRlM0Zmgtc1Z6R0FjVDRlSFprbW1YbGhTdExYSlBVeFR5Nllna1NtdkM5dUxZakFUaEpNVDRlYmNDNHFOUmxwWFVSUV9aVXBGcU40eTV0R0c0NklST1o3NDNGdXZoMmFsczBhc25INFo1YW91aTAtVEtGWENDVzZwYmMxZDNpd0hVQWM1TUxOWlBES0NlSWVvNXE1OGxIc0NHWTNpNllpdUxqajY0em9MRzFhckprcmFIMHFkVFphZ0RqT2RIcmkzWFh5NVNxWFlHbVA2OEprR1dwemhGNUwyT3NNaHgxUkxKV0pPQTd2N3NtY08tZ2hxdmZMaVJpTDNQTVRrOHJtMkdDTC1RVlJJOHFneFBUWWtDb3R4dDkzWnkyWG5lSDJPT3lLUXR3WWktZVk2ZEpmMUE1a056Q1JmQTJoekVlVlZzMUR4YnRZblRhbktZZEdZUXFUTTJpYTdwSDZwUTF2eEc1U21DMGx4a2t3SkR1MDdmY3dwQko1NHR4UVBxQnlSYjZnYTdwTGNWS3hzNkVNWnQ0X3hDR3c0Y3p0d2Y4YXRWUnU2Z2JYY3NCRHhvZnZ4SzZlUjI5eUZGcjViTzc2LWVUakhzN0pjcWhYOVh0dWhxcG9MVzd3eFA4VG90dnNjMFNLYl9RbC1OS1AweTZxNnVBLUNycE9hZkJkeEF6cTNObWFrUnBXb3BvWkJVOTk1dGNyZjlDQ2NjVEJtbm1YaTVlNGxoN2VCV2pnaWFKcXJQOTgycV9qVkc1RnRhanlpaGZwZEFQZmMyRlZiWHhHajVnTEd6TEY4bTZWeGh3Mm12NDNPR2wwSnZTN05CN1hYeTlZS0J6c3d0SmN3ckFUQXctRjZEM01la1dTSlpSNDN0Z1ZROEZNV0tSSXpJRzNDRm5NV0syWWIxalNMTkdWazRid2wwdE53aFFTOV9yajJOYTlTV1Y1V01oMGUxdi1ZSTRRRTZSdDNTZU1vNTZaX3B5b0YxOUFoU3RaWEdWWi1CalB0eUVWOWh2OENGRzVGaU1PNHphOGl0RTUxQ05KWVJQclp5YVdFWl9hOFlXTWthQ09fWUhXNnc4bmVNOGFXUmR3QlBEOHJJN1ZNM1pWSDE2WTlLaHBOTUVxbmZ6Mm4tempib0liTkIxRzI5bGNSU0FURGdqZ2p0c1JpbHJXMVFnZDRsNk9kNGVyYlAzNXY4Qzh2ZnFqLVhvVEsyc1hYR2ZxNW84ZjVEYk5rdHEtR2s0WFFQMDFZamV2RFcwU2FRbXg3THVCVVk1N1dNbElHSVJYYkxlZDYxVEpoZncxMVdIeWljUnEtYTllMXZCUU9TUGZ6R0RWZzNWd2lhZVE0QVFkZFdVT3NBR3poUlRRSmtJdGllR1B1TFBtZnlMQlBROFlCMFNYRFkydERscjJhaWVEQ3FGNGh6SEMzSFJWdkdjTW9IRGxwSmlOTVc4Q0JpZ3JxOUZEbm9yVGJWNXdZQTB2MEZuaW9PbkVod05EOXZSZHhuN25md0d4bUFDZnJPM2xpejlMNUtzOWpRU0FBTzZIUnlwMEk1aXp4RnhLSFZXTGpRTlplT1EyY3dBdVVXNXB4LVFLWGNudDhZYlJzQ1dBRTZXTEhXWHpWRnJPTTdnZEhfeGQzTW5wa2tac3NQd2R1cldiQmpoN19pLVdYN1NobGVKMTk2ejEyamRfV0FiZHFnZkpJb1cwTFd2aW5xOVE0ZnZwNkpvUk9nTDdOb0ZuRUhLQ2hjMlRKbFVBeGdtalB5WEpTOFlQQ2EtYk0yMjVYaERSYm5vUTN4RUNOeVRmLUNZb29vUGpwUWpVcFZPVXlUQWV2clBzV0piTGV2ZUJ4MjQtMk1ESWEzeXZxUFNTMUJYWWU2M2ctRmpCVng1SEUyR29lOUJucXQwVGFmMWktdkxvS1R0MndMdzhnai1wMEhZUW0wQjliWjNDMDl4TXE4UXNZZEFFeTlsRUJWZXpjdTdQcUlLdVMxd2pydDZDWThKZVhQX1d6WVgwdGpLM1FlQTZEQ202VmUxU0lodmVFaGNjM0JzRTBXUE1MbGtvQ0hMS2xlUnJPN09kRHUwa3k4STZ3QWswRGU2endnSXdiRmMwdU9IMlZWaWRuc1hHdlhFQ1pvNUFXUFBMUGJGS2l2OHc0ZVVXTFJiSUNBZll2NFRyUW1zdHRpWG9MT3JveXdlSkZkUjdMSjR3djhLeWg4OVpGcDA1ZGNmc3lpdFZyeTNtTGROTUVLdUF6bVR5T1FjRWJ5Tm9qR2pyd2d4WWdEeHlERXFFYno5dkFMaEhvWHQ4TThkcjBnajVmWDdDRDVJalQ3VUg4WW55cmlkMzlnZV80eEFDWjRmTmRNU0tIYktGYTloVUZYanRqQ3VMc1ZudUJxVFNRR0g3WUtFSjdEZHFNQzFzMWpXclIyc0JidHhuUHdJY1ZmOTY2Ny1nbk1FWmowNkVYWlRMNi1CTU1TQVVZV1dJU1hYV1pmbzZzREZPa19FNzZ0b0tUb3RzVm5iZ01VckVGN3pHQkljRFYyOEZrNkw5dnFHbk0xZXpjWUVtYWgtZ2hFeFJsalRYREpaR0FJWnhSVU4tNFpwN0ZlLWFYdVlBNkpVOUVYcDZ5SjdwZVItMkdieXlCeVJ2X3BWOGx4bWRJR3Y1WmZ5WlVvZHJnUzJ6YUdTZHFBcFFNMHdFN05ueGNIQW5sdzMtcXNtaFVSZkZPa1BGcVVsbVRxbWFlZFF1Nlc2dC04dGhwUDM0MlFDdy16QlR6dkwyUG5OYVdZMms5SkhNdnVDcFN5d1FiTHctMHBscXduMEVQNnlyN0tLcXNpbnh6alZuVjZlVndrODJmNmpxdkpOQTNvYVlwVEZ0OUhwRVhscFZGY2tVNTZXOXZvcG5YdzRGWE84Skp6c25fWmVCUGROWWlDbHByRVJfV0tUbEFzY2Z4U19YRXEyZXNsTm9zWXZ0UHpvNGhZVFB6N3NDZWFZWS1Xbm1sZ3pTZkZYYkJuSWNwRWRYV2I4ejJTM1ctUG5sTE1QV3BjYk5WeXBHc3NmM1laTGFWRndhZC1ET1ZkWGNqeWhTbmVmVGdHZk4zUnV1aHlyUTU3RDQ4VWdwWURKNjhXcjE3dElvd3NLOVlnVlozcnlrbXEydFppVXRDSk53bEF3VG9OZXhnUi1RMUFrS3VmVU5QSEZhSW1ZYUR2SlJpSUw0SE5nd0xwd0FmeXVxc2k4Z3U5d21ZM0IwLW1temdHYkZuZ2l4V1dqdk9PMFplRlZ0UWZ5Qk9aYzlLSE56cXBMUDJKNFFIMG92WE51MWRzZU9IeV96bERvREdJZEFmd0ROVDVTdzRnWGdkTVpfVTJ3M0JUaGJVcVFRYXF4VGowZ0IzMnM3cmpveUI0TTNnWFR0V3VibURoRHBxdzU3eWVvb3RNdElNSGtRU1NDWGlLVlFKdkxobGxINkRwdl9tWTRYYUROSWMzaUNzV0kxVm1MbkZFTVo0N1QxakxaWFlYQ2traFhlclRacjg2bHM4WWxqR1NUV0pPbUhxa3RIS2RubkRkaW5aSFVuMTVzS0JHdkpmVG1JclJ4QV9falRVYTFiTzNjczR0XzBZRE1mTXhMTzAydzhUamtHeE5NdDljbXpMa05CT2JtUXZzUkJiRHFzY0V2dFZSZ2dlX25FOHZ2WFhNZ2dIRkQxTVVqelVVdU54NDZ6VTd0YVV1RWdfelJyZG1RQTUxeE85akJOd1Z0UkhNSkowTnhOaVAwU0VXWWxMOERydDc2R1pudHdtamdiNVdJS2JJTlNDUGpscGFqTGx4bmFURFNnUE1WQmc3Q2wtYXJ4LTAwYmozVm5VSmtqejF4eUlwaWZDWDlxeThrWEpwQ2NfWHA5eDFaRDlURjV6VV9XTjJpU2ZpODV1anpySVg5RDJYWTFoaE16bmFTTDc1RE12a0J1UFpfX0NCaWFjcWp2cXJWLUxHdDJKeU5sX1RRT3dDRFhLU1dZOTRmRFBLbmZOaXVFSzRLeGRxUHhxZXkzUVlkMGpYOGN5TmNER083ZXAxVEFxX1FmcHhhcm9kT0FjZXo0QU5kLS1ldnpUX2dqWnB2ZVNQY1JxU1pFYzNVLUhXTjluQ2U0R3ZRNkVMMWhaZV9kbnRDeEQ1MUdncVNCc0JJdDJpdzkwbXgtS0tpQm5obDdseldyVEVNYkF0VUk3UWlreHMxaUh6Vk5oV2tlbFM1eFRicTJtME1QRU5PaXUtWjV1VzBILVZESUQ4OFdXUE9EcG15RUtFT2VjRmFPMVZHVk5YTjhPV3lNay1fNDdESnV2NVQxbDZWTWQ3SzZxSnpiRWR4cWloWkJOME9LZEdpN1RqMnJvcUFQU2ppUG1oUzdZVWtWbGFzYU9XLU5JUTh2NTlCZ25aU3duZXZfSDZxSjhna0plV2xoRjUzUlVBTEhfQVI4UlNtMjZzdndzczdSRy0yaEdmR2ZLTFI3cGdieGpaWXkyQjZvZUNoTnlleUVSTzMwR3pBX2FNdlVfR1NvTjU2RWhUR2U4NEU5VE9TY3dhekVNY0s4MmhPTmNJdGhSM3p6SzRlUFRBbjlfNFBqVFhCRC1KTEpMVVBGcTRMUl9jdnRwb0N5VjBoYU8tMzhYNE93RFR2bGJvVno0WGdaeUFvZ1BzZG5IS3JZX1lNczZqS0FQb0RuWTRlcjBKZTNMeTJ0cnBYQVA1MFlWeWp6X3A1bVpSYzVhLUVzVWVfb2NZOFBzcXNqN3IwNFlPUGxEc3AwWktBUVJ6NUhZOVljUWFuU0I3QUNaVHdfWnFQQ0tZMkJNU1NCUnhrVC1IVlh2VU0zXzJLZE5jUFdIRjJyeGNBbXoyUDc5Vzhobi1lQnE4ajJTd2ZNMUJ0UWJIQXBIT1hkdGJOSC1IU05wOTM3Nzl4ZE9CczFHOHl5NUU3a2k4dEZvV0l5QnZZdXB1bngyQ1l3QkFzUmFFeHFnUUVIZVZfSTdlTDF5WGpvSHVWSXJZNTFTbEpCY2doSUd6cTdnNUEyNnhvN1VjQ2ZHaDBTXzRSd3czYlFhRDZjb1pNa3FxMXZteW5uZVF1M0FubzZGczU0ZDRwS29HdkNqdXVIdjRmTTJkVnkyRlJLQWw4alR2cDFSNTlKY3BkQ2tjekVrdkxETVhUdjdUZ1FySEJrZGdYQ3Z0RVBUSEtNei1xdEVWUk1TckxHdFNSODRtdV9ORGJJTC1CVDk5SXllWWNJWmtZWlluc2pVay13bWxYOGhyM29tdFZqWVUtU1M5SURUVkVWV3F0Q2NJdGxveEVsc1hrWW9CemxEVFhCRE4zZE1IMXY4b0pkNDN6Y1plNy1QcnFtdmlDZjRsUU1QbDhaekZkdjctNzJBU1dKWDRabmFaYnBza1NqZGZtcHJhV0piZkc1MHU2amZNcFZBaVdCVUM1OTQ3ZEpNMmlMV01NUTctT3hsV2RPOVh6SVpUWTlDQ3FkbndwQVBIZFp4N2Njd0R1QVZnc0dsbWd6N0xqT1pjMlMzTmNWRHdZUkM1UGZrR1N2R1lPeExsaExxQTNSMlk0d2pURlVHeTVTYmxYeklvMV9QSlphcWFFZGZrb21wdGdiX04xVDBQbU1qb01jaFFGRmNva3R1MFhxUDdMZzF3dk5YNW1QamYtSXNtMXpuMkxwYkJleWcxdVZhQ1ZnQUhvQXJvQVRGVlNXWTU2SWY5d3UxOXhwamw0ZWNzd3VNY0VuWFMzYmtTVWJlYlFKbWxDZHJEUm1KbFh3cVRxSElVUXNDLUtKUms0R05vZ1h1V2tVNnZfVE5lSFFnUmxiS3NqSWVuelFYc0VGZHEzWnIzTThuYmw1Z0Z6eF83c3l3ZUdlWDVKemhmUHBkbHp6ZVg2QU94V212S1dMWm9WMm1OczFGTE4yTkxPbHVYVF9XWVM3aktGaTZLLUlIUGU2OVQ1M1UxOTJaZEVrbWlDVnp5cGhYZmN0NmdhU3lVTU5CY1lWckQzVWJUNWdCazhIRTJER2xOQXg3U2d4QnNiOFRMdzJ3Z2N6M0kwLWZ3UUVKMllNbkZZRDd6cV9GNFliYUJvWVEweHB1SW1uazNwOU4wdkV0QWdMb0FHaE1BTjJWNEhldFNXYUpkc3BLZlFqT3ZBblBYNG1xZnBWSVpQZngwQUJBX2xXblF5UFF2aFBpVjAxVTBFamtjdFZ4ZFhjREc4cFNXQkRJemRrb0hGX1JMWnhHZDgxeWVodWJENUU2SkhqVllveEVtTjlaek9rQkpVaFVrczdJTTNicVl3VWpZWU1yUHRsWkhvUk1RXzNYMm9RY2tFMFdpTmdYQlVSeEZnN29oUWFyYURMQ2FCWVFVczFKeVpCajB5MmNPR184UmRaNzNFSXh0WDcwTjdwZGpjRU1yZG5MZ2g5Qm1MeklfUmh4b0duSDJiTWZnbFVoaEpKWVd2MmNaMGVqMG0wblYtcnJsa2hMV0hycGJDbGk0R2FwSkpTcVhYNE9PM1FfSmlxVXVXY0d5c2F2eHpuM2g4djhrbXFQVmJWS0JUVTIzX2FNcjN6dm91V2M5VFVIOFVDOXVONURqdVZRQ2U0SmtGX1d5WXk4YTBjTEhWOWR5Wkk1UkhYSGpMWVVvTW8wRWpicWkxQVViU1lNTmZ6OGdoQU5LbVlFSExkbDQ2Zk5FZW9mME1aVTFRb1ZpRUJqbnBTN09sTWh4NDgwTU1iNFFwQno2UHREYWFnMjlFY05xMWZiYTRUeHBnRTFoN3NHZEVTSEQ5Rk1CUzNrVjJMTjlkRHc1VDhReTVndGdObEpySnZhSnVxdm9xLW5DTV8zcERQb29VMGdGVzNQOUVDYWRfekhUQmFpLWFBTG9BN3hKQWdiV0pwdFk2eEt1LU84QURTZWRFRDh4dElqQXNoRDJnVUlWTF9HRWI0SklYUldlU2ZmYUZvcVRJVUpsbEd6bXB0UXZXaXppSFdsSGZub3lnSXNtQ2N0R09aT0M1RGRjTGRTbE9CRUJDMVQtQWxMQU5mNWNjNjJQVjFhYnBOZ3l4dTVhRnRwUEFoSkpwaUFYZllaR1U0dl95aUZ0aWdWQkRUOFVZREFkSFFPVmp5TEhfWS1XOTlCbFk0NzEzQXBDc19iVnJ5a2N0a1lSNUlHaEFCSDl2M3padnIya3JRby0zYk52QnVrcGxEYmk1WTJHc3dtNHZWUjlmMUR2MV9vNTl0VWxxQjVYQWhZMDgwbHZnNXFPczk0bXpwSTZOeDNNWmZpQktfaUg4bnR1UlhDRjN6QTktQXRERjFzR1VnR1JHWjRIbFZGMGVEcWh0elVDZ3NwVVNxbjZMNVhfT3licFZKTGgzRWphckJZYWZua2RJZ3R2Mk42ZHJIR3h5bEdmZ1NYaDZzUlJfX1FtNG11Z19zLW1neEdBWmRUWEhGTlV5ZU1fR1NCUnF5SmFTU21QWmZ4SXVnUmhNb2pRb3Jvc3NmWUgxajBITENDdVZjUjg3UG84OUl5UHlUWGtKLXZoeDhLcUpFTzQzbTNOOVFZN0ROdTgycXZHc0xZSl9CZ3JqUWlkRVNoWDRFa2szOF82TWFlSGtVLXYwWlJBcmE5RjJ5WHgzczF4c2tjRjlwMTdwRE5QczlTS3ctMURIZUI5UVVCMTFSeXA2N1NHYlZQd3pSUWF2T3ZtSmtzOE5JdzNfUjE5RjVnNlpEVjZwdjduRkZQNGhkV0FwQUd1S0NRZmlCQVNIaEl0MkRBV1dkQ3cyY2VtQm1jc25kQUtOaURHRk9jZWRrUC1UeHl6aEE4Y3k2WTZMaDFyU0hZTVFUdlRGSzZGU0dJZjBFUVFhVDFiYTJPMTA1TkxFaXZ2bUJRMWljSDNDcXZrOWNzbzhUVDg1dmRXdFRQNXo2UHBpU1pNbm41akdXSFE2U19fNEZFcTY1dGp2dzBPV2VqN1hiWW9WZjF3OVRWM2xlT3lod2tkUjFXLVllcWMxcXgzdWNseFRnNDI0ZFMwUjNGTnVVbGZlSVMxS1dBVTJSS2p5czZBamY4d3cxNzBYMGVyemx0ODJ5TG84SlgzX0VGM1VmUWlIMURsYlE0enpRdndFekY2aDdXc3FWMGphSnE2Q0ZBbzZDVGNiRlhCaTVYSUkzM0x6MmUwWnFsZGp5TjhtWnBIV2N1eDhmRGtaSG1rc2dLOUpnWG43QllSaHlja3Mwc0wyVGpINTYtbk0zRHhuMEJ2YWVpNVREOHFhVGdmZzRZMnkzQzg0M3QzRE82TVdFVm9lOUthN2lqS21GNVREc0JjNWVOSEpoNFFkMm5XTUNVeGNtMFJIbGFhc1EzeUFXczA2NFhGVGs3V1VEakFOd0I5ZTMtdDRBN2hGZm5abmVkRVhteUEyeUUzLWRGNWdDbWtvWjBJdXAwWnp0RDR6VnBkU1NwaG9tWnVZaElKTmtqbHZSekRQQXZFSXgzNnN4TERLX05FM05KbGdWcW5OT0NPX3hSX1FnblRrNWVYclJTMkhSREtoSmVuOUs4b2ExZl9ZaTdnSmNvci1BRWhyZ1JOOXVIRGJDVGRIOWxNMzZvVUk2NG1YeGxna3A3U1lqdUdKMjZWbXVRdXh2bjFvSkZPOGdXSWV2SEZyNWZDc0xaUlN1bHByUjFWQWxUMTFocEllYThnVmg1VDZYQWJhN1FLTzZ1WHdpUHAzUm5wSVlFSmY4U2J0cnBuUjFSUGk5Zm93ZnIwYUdVWUtyTnBKTlpXNEoyN0l5ZnJwSTFzdmRtanNWbUdLWmpTNzJ2UDhGZncydlpiNnRYQkVPMDlBcmNUenJDLUItWko2cmQwc1c3Vi1meFctdzFsM0NhWXhqbUpvSXpOR0liVWxJRXVjZ1FCTW9LdkFDUF9QZzVVRVJ0UTlJTm11NTYweTdxNEpJdWpXYW9YM3lyYm1kRmdaU3RqY3YtR2dWMk5wWFJSS0I0bDNxSUhnVVBqdFNYTmpSUGRXSmlmeUNkQzY0VHhvY196eTJrWkZDQlVaMlBLUnhhdU1RUlcxSVpUaThwLWNpenNFSGxqZDF5c2hndVlBVWNRN0RkSmdOeVNoWjJpUVlmSE14Um5sQWxHRGlVNlJiYUllLS1rZHdfQUV4ZE9TamtRYldTanlRLVliZVI3UTc1d0xlTDg2T2hNSG5QS3VBYWxxQjdSdDlBOVhCcjM3aFc3cUpEeG1mRGhaR2pKeU14ZktNaEJoek0tTzFKWWZwaE1NTUpZcUxtQV9pQmFDeVdQSnB4U0VhV0dRRS1ETThmdDFtSjdUYkZCYjVhM1JKdHZDdEFYV2psMDBGWEEwQTBmdFBPd1cyWm5jVTRPb092QWRXMHBkbHcyM0NxUkdzbnp3SkxXempEX2xFTkk4eG50Mmg1TEFqdjR3RFpnd3Z5ZUc2ZnhNQ0hMMldMWGVubTFqMndvWU1QNDloblE2bmNTcFdIcmloM2R5d095cmY1R0FBVWZvUlNfWFJUT2ZpVzRyazRHeFNBbm9FaWl1bElvOEZ4OHdJckpOQlFHdnBrUTNBOTVHZE9yaXVwbjBvdU51U3FBdXJvOUZWVXJZUEMtOVJlUU5ycDNCRzMzZ0c5d0YzbzVMODFXcEluUWdjTWk5eXQtcU1Qcy1OdlB0UXZkRFFpUEN0dTFDQ0NfNFloT0pTODAwTmdtazFoVGRqdFc5Z1BsX2NaaGhYZjdLaUl5cEFqZFI0eGdfaDN0RDBGRE91b2Fld3M1Z0Z3RHFHZFZvdWo5WG50dklrX05JWGtWaS1xeHQ3bVUtd2R6N1JfQVBIUTEtSzhvOXNHa215SklMaGNiYjdZZ0huNEZ5N2piSjNIZmJydHAwX3ZObnM0VEwwenhWcGJhVWZGOEwyV1FMVWRrN1RrLUw4a3NHVTNUZG1iVmpRd1NSMlQ1R044bHJWd1loM1RtbjRlSUxob1VUMVBFRXppSjZPRkRSYUJNMTMtcG5tTVVSeEJWNkdGNjdMX0VUSEtYUGcxZ2IwNXJHdGZiZjVrYVRYTkYwUzJQckFzdUw4eWc4N0RUc1pTOEFjWUxYNlc1czZXOWRSdXh4bDdjY1p0MmkxcElDWm9WWVZtZndQS0QyYzZiaDZZcHRuanBqWnZzb3g2UkRyTUhYSG12NU93b2xyaUdHaHg0TEVMQ241MDZIcWxEUWgxbVlKYUVDMDZ3cUNpMWstZHhubE41T0FJWE9acDVnWmlpMGhZTzZ6YmQyN1Bfdm11Y1lNYXNJcXZGdGZTZFp5Q3dMamFoNTNEekUtSVJRdGdibjIxVUpKeFd2TWVxUzBfb3FCRnp1UDFQZ0dhcXJMOUlMWldmekJEaHZ1YTBYajl4c0RheEtuSzMzdk04TXZKZlpiUmVYdlN3NlpLUkhIV2lXNlN1Q0w5bHVUbnJ4X055cGpJR3J2SVFRVTM1UU0ya29CVXdXSmxCVXM5T2pGcjRoQWtYSF9nT2ZBVEt0c2hLTFpGT0ZocVNQSURJVFI2c0N4Qkl3a0ZFWW9DYkhqUnkwSzBaS09GdE9qZGF5b3RLUHJGWkZpMVI4Tm5oMEVtdFNyMHBWNDN5bE0zZ2M1ODJjaC1lM3ZTOC1uWS1XNEVDZGdiQkFPeFRSaGw1WUd4akllZTNYS09oQXRUU0g0a0Zfa0VYTHB1WTFWZ0VKTjBIRl8weFFRR2VnbmYxZE5YQk84WC1CS0RpVWJnSk16NDI0bjJ2S3d3UzlIck1WdGRJendsWlhQVWJvQWlCTkwxNjkweldSaHoyN3RLbG5kZDZnOFpzLU1iX0VaOWtaQTRFSFV0OThsWUJaOExDT2l6akN2Q0ttLWJYRy00QlgwOEJqd3VpbFFicXYyS1N6NU1xRGYza21VY0c0VGtEcDNlbXZoSmoyemlUWHkwdjRWLW5UalI3MnJQNVU2RVd4VXR4UjlsdV9jcFVfNTFZbUZqbU1JR0RWMlZ4X1BTQXB0LVZ2X0Q5SzkzZDFRMFQ2d19MOVcyRUNYaVpwS1k2ei1TelNzX1RxTjc4c3hYWldXamt2UlJpRC1yWEYzbGhMQlpsRGNaZnhRYlBhRk9YYkJpcWQ2QjRNWk1zbGNfaE9JdjR0NzE0RnF5cHlBeHJZR0ZPSXFHbExjZm1jVUZXV2J1Z2lIOFdsMHVXU1d5Qm04cjFvM01kVHE3ZERkaHBKRUVOMEZLNTlRUVdSazg2dVNFYThESklDZURwd0s3bmdJR2pxM0x1VzJrMkZ3dlpzb0Rwb0twUTlFMkRjTGhYalEyTnBWNEUtNFJjYlNVWXo3RTdkWmxrSDRTQ2MwakZ0eVRiS1dhaGdpcjZYNFQ2SWNxOGtCQlZrTTJ2TUdCYy14RzJtWk9EdG1NT2JjVUN5dVhnVHVwZUw1d200R3AtY3NxNVNEMlUtenk5ckN2MC1wYnBHVmVvaDliQnZ0U1hKc2hydzNnakxVcy1ybmY2RW1jT0xmUE9hcU52ZHpIOXo0QTljdTZQQnhhTHEzTDFtYlJwU1lOY0x4X0dvY1pKSmc2WUpsWkJDdkowZ0lxRFl4TEhJazYyejk4OHBUSVZPbl9lZUI0QURzaFJRT1dROEQwV1hNWnlsWkZ5MXFjbE9LY1huYjZ3YkZzMVh2M0t2RTU4dHFubS1uSkp4bFBSMVRvNDY0SlBibG9qRzZRcHlwQzdVZnBzVVRZMHZLeU9jVDIzVm1GUUJNZFJzVUZvUWhlY215dkViR2lSWE9rWFMxQXpBUXV4eFgxX05aODhwaGhjSTZ4OWFWbzdFRlozajFJel92eFNoUEYtRVRSeDdWdFZMVDFPeDRVVjdxSkVUck1kQTNFeUR0cFBVQlYyYXVFWkd1djJzdmJQRUxLN1hNMXZJWTVYb2YtMkl5SmtvQW5CSk8yS3JCMERYSkh6NXV6cXIwQWdVTGVNTVZJVkkzSTMyb2tid3hGWEI2YkxmVG93VndubDBfbG9JQ1JuYWtBWG5KUmxUZENSMVRISVMyakphWWM4RnJLUzFVMVBWZjlpXzMyZzlsd0p1UkZFcWc2OXF5WlJaSVJEdE80T1Vrc0puN2luSllZbzAxVDZlYjZzTG5UUDJJQkllRURmdUlkMlVqYnpWR0k4TWVfaVRtR19KZkx2OFR0Rk9TeGo4cG5xZ19kc3Ywd1BldTdyTGZicHF5MnhmdmVTODF6R0MyZHU1QkpFUzRVLVpLaVQzeXlYcHdJVlNNb2N5REVTeHk5UnpkRGhOR3pnX3Q4TWxiRlp1blBmTDAxa1NTT1V3NEFxNUFUWVlxQzJWUnhENy05cnhiM0JCLWVqZlpfbXFFdkVZTWhtbUNPRXNXTzZYNG8zVnZZcDNOdlNGSU03V1piY3JwUENIdmdoSldjblBSVDFXM2FxZzNFc2JKbC1qSHpqWWpNZjh6VmowWV9HY1p6dGV6M1JRVGVQTVhuZHhsNWlTZ2dXRm1RRERDVVhWTFprZGJETE1aUjd0dXcwSGstMjk1RUdxeVduQmNXRUxLOVMxQ3ZvZ096X0dvaExTcUpBQnoxU0w2bVZWS1Z4cFR2Wm1UVm1TbWZqcmJoQ01NaGdtdXg1dFY4Ymg0X19tc04tMm9MYjRZNlYyWTRqdGZlUWJFdUhocm5ldTQ5Y3c4aEdoLXBGcUxZa1djOW8tQ3RSWGVVYVppbktrR3Q4SDFXQVVfUTVEMGl3TEsxSTRrUjQwUWx0ek14WlAySHNhak5JTHFWMVp5Wld4by1kZ1hnMUFYZ3RtN3hSWVJ5N09zb2twY2trRFUwelY4QlAwdkgteUpXZnFpSU52RXEyOHloZ3VoTzBRZkhHamE1MDNXWXFWaUgtbzhONDBjeW4yYWZuR01rNVV4QXB4MzBKaGYtbnVFekNYN2VhVWppaXl2c0xQWk11OUtSbDI3ZjdublMyTzlVUlVuSFhFQ1h3UTFPbUliYTZheWVQaS1rVFNhRlRyQ3Y5b3k4Smk4SlR6V0I5czU2bkhsbElKSU5XWE41NEt0MU5HVWREeVJxZDU2aHZkZWJvazQ5NEw1ZUxDa1Rqb2dpdXpMZEdFZkVLNllDekhhSVRrRG5FYlJfRjY0anlfZFNFeWdtSjBOWlJUYUo5UnFNeW1jelZmaFF6X2V1X1RZYlljNXpPOW9wYmxaYjJjOTRBdGhPanJwMExnVzhIQ2FPSndSUTN2eldQS0lLZklWdUpLZXRnTGU0Q2NvREV4VHlyNGN3THc0RGRHdGdrZmlMZlpqbFd5MS1qLTBqT0wtejVFYTVTMEF4anpHZ2ltUVlNOWpVaU9xcGdfR2tHTVVZNzQtMFYwTHJFdHpMM1lubEJXX3MtQkNvaVQzZnN2OXBGajFFZ3RSYVJhSDh3OW9XWEpnM2U3eldpTGxCUy1TVnlOU0F5eVFmY2VzZW04T1ByS1NodkNsclZwcEstR0tPc2V4cEdzR3loUk5pNTBKVWlLOFlNaEVsQ0UweHdEcEItY2E5NHBBZVIzOVZGT3RYNi0yRU9aZnRQNzJFcFdPdGdVZmpJT2YzVC1TQ2Z3SlpKT29kNm5uMnZXVlJZdENGaG8tSDN2cWdISE9FajctT1I3UVc5aERDVWI1OWRJdTVPX1ZjVlBhMXE4ZTJ3cmdUYnpuejNObWxvZDR1TlVxbWp1RHJJXzZzTHNxVWVXWXJUQ3N1WUZqWWRueXJxX0pMaVpLUVpwOUFuZS1ZVTY2bHFFT0hzVkNmX2h1VzJNdTZ5UHZaV1dJLVZCcV94N095RHA0dkU2TWd6SWVSVGZQamRfaFMxcS1BY3Znb2EzaWF1b0JMT0JyYzhhaU9CeHZZTU5uQk45bmZBdTFZeVc3UEhYVzg4TDNiQ1pXTG4xMHFTOXBIWFVyT1lLUjV4X1BzWWpjeHl4aVRBSDFFemxCd0NxNGdKQ3NhbWRkbS1OUTFPcE9EM095UzFRRTg5SXZlQnFva2tEQndtdDgtVFZaQlBXSklrRlVQN3dnZHdCckZNclJQekc1UW1Bckw3eW1YLWd4X05zSkw4QTBCeWc1Y0dJYmtQSG9PZVFoejBvRHRqdGI4YUhYcVRvNTBPbl9jb3FOa05rQlRtdmlNdFBTR1ZXcGVJZnBqQjVNbWFaUW84Nk5IZXlHb1AydkpuYkhGTlNFaXkwM09zb1ZORUNSTFR0QTN4X1c1ZjNPTG9ITmowUlpkY0lFaHdKNHJKRW9yZmFEQkN1cV9VdHdmVDNnOWNCSWI4MTVRZVRaY1Q1eGpfLVZ0UVROQUR3WldXT2NEdllrOGN5RXRhQ2ZwVm9jeHAtamZ1Ri0xamhUaDc3MUxfalJUeGJMNTVXblNsbHZOdmNwbzV1Y0puVjlyWnl0M0J5S2RUZDE4NVI3V1BKT3Y4MmU5NjhwVWNxMlJQaFY0X1lUckJrTjJ1eGE2N0lfNjZmdFdQSTJMVGlObjJlYTQySEh6a3RiWm9uSG1lS3JSNUYxOFNvNFlLNEx0dUZxUVpnak5DS0tWM3Y4Z1VPMms4b0Jpanl2XzFOQVh6VDV6U2MtUnBvakIzZ09EeGFKYzczUUNEYnhTSklsX29XY2M3MHZfTGhNSVNJaWt2bGNoUUNVM0tVdi04cHFVRmpwcU1rVDFDUFJtUmFMU3pVeExfQlBpa2o0QjE0RVlHZXBpWGZ3bTZQN05RRllMdXNkaVlMTUNNalBhZ1h6WnAyLUFJNk9NTExYbnJqVWZTOEhnakxCbmZEeV9VMFlqV1hZR3puLWJvMWFtOVFJWHV1MjFwRHQ2Uk5ibzBjM2VybWZ0bVdlVERCQVI5enNJMFBjRmQ1XzR2Y05NdmhSOXZqdlhFMjVlaExLVWMwSjlkTk5IYnV5d3RPTGNlRjVNdDRON2J6SHBRSTNfUEtnbWlDNEM0WEcxNGpQN0dzNl8yTmNTYUk0aHZLNGVmWmpnN2ZzMTNzblZfSksyTmVOb0RJV0ZLTEQ4LW56RTFMdDZUUTExUjZZM25LZi1qcnRwY21TSzR5UV9yb0tHaFJTZmd4UWcwMWI3dTRGcVhnMkN2UXZ0YlJoQ3dSUGcxWUJPWFN1dGYxWHBFVWREdTU2aGozYnBoR1ZkUVZsWDY5c0FQXzZSXy1WUFdWY1pLdGd5cGx1WVVDRXhKYnVLZ1lrelRBLXRaRFl5OC1MUWVYZWJFNVp2WlBvemVCU0IyMUNTbXVfWDJGV2xCSXpSX0xfd2xzQV9CYzd4QlBKSDdwQmRsa3hvTmZtYW1tSnNmT1d6cVhsT1ltMHZPOEdLZFRoeU5ybi1ieXBFckhPcXhPTXJUck5SeWVQbnhFNHIzdkVwc0Q4Tm5LZkVERGZiMlNUOXhOcHliZXlBejllcFBsZkZaZmNFOTBZLWZPeTF5UzEzeUxqZUd2a255ZkQ0N3kzSmZwdnBBVEwwTmoyZkJxOU9kWDljOVlubXEyaDB0WTFoU1lDNERNRnJVNUJzOFN1Mk1PMEdUSkZyOEJqYzJyU19sc3BFYUEzdUxZU3NBVWF6UVZ3SG9wWTFBOWxEYzhxamdGU0gzZ3R5NHl1SjNuXzY2Z2pEdlNVTlhNRmFDUHFPTHdFZ0FJRHpDQWJxenJ2T0E0TUxiNUE0Njl4YnVZUGxyc19XSWZVaEZEMXJXMm5sLUIxRWZMQjJwX0d5c2dmX3dnSDJlOEFQTC16VU1wSWt0RG1kOFFSZmVubzR0OTU4ZXZsdVFKR2E3MWdMSXRYbGpfU3E2OXRqZWRQbUhzNHNaWFJPaXVPajVuckc5TVZneXl5X3JlMG4xbG5CLUc5NjRNWEt2dHY0LXI2UzFmSXlSYWxNZTFOcUFKODJLbFFGa0tyYm0zUlZldTRIZFlQWEN0alBfN2taZno3WnZaZWM0ck92b19GeHpOdE5uZkNvU21kaEVieGdTU2FxWVJWeVVXUEhMU3BxUkNRVEdVbnBpNWpMMnJKVnNublFvSkNZbXMteno3VzhKVGxTY01veTU4djhvQUtnRXc4SERVdWVPaUkyZnN4MjROOW4tcl9jQjgyUlI2MERlVmhNSzBadXVLbG52NGNkRkhiMTFuSzVDT3NRZmtKTFN3a1ZpZUlYbEJjOTNGcThBWTc4dGQycDNmek01TGlaNnFhU3JXM2w5RnBuaUVWdmJuekhfeDlyU0JaYlphdTdIdzNrc044NURQT05FaU5kZUtHWGR5QU9pSVlTeEpPM2hyUk1iQWtWd0ttbzc4U3FRRU5ORE9aaXZIclJFRkthb3VpaDZSc1Z4ajBOUWhWNHhQWnNybXRGX0JMSi13SUY1Q1VWOGJWbVktRy00ZFdaOFFXbmRzRmpfdmpJZjNVWHZDWGdTbjlwcXMtYnoyNG1DUDVseDhIbmxPX19RUVo1SmotenhFSURGUEpkV0dXY0E5d0JNLXpoYnByazdyOEFGVEZ5UFVXSVJiV1hpeV9rQ09UeDhmd0FsUk9lNElFbGVuRTZxNW1BY1FGUlZQMVYtQzZPUGxzY0xidjlKYnpFUERVTTlMT0FHMnRoUDRrdnkwX3hpblY1X3gxWlAwN3U0dWVLYzdESkV5NkdSb3VZd0hkVy14YWhZT0p4OHUyQ1MzUDFHWW5zaU1GZi1URTRPZDhpMU5YT29LdVdZOVVSV04tdDFsTjB4RmhOcEFRX0VubFQ2SXZ4d3JtRmtINXJTWTU3VGo0STVEdURXX2JQdVFBcTZ1dHNiRVYxOHVGSnZyZ1hFY0VMbzJnXzVHcUNMdU8xUXY2R1ZmYWJ6SHNUbnltd1dPVUY0X3NkZUpucTJoUThUemVyLVRLN2JrUy1hZXRfem0yUmdBVkQwZnFjWEFVSGdNTko4Z29iOEVUWkdfUXMwSjBnOTRsc0p4cDlSd25NX3kzT1JOR3pFa2Vzc242VVZyQlFwcHlKQjQwRzk1MGJqeUg0VmRWRFhxWDBSekVRX1U5VFo5RGhHVWx5dklPdmNrUTFtWVRSbzZNTGhmYkNpemZBLWxVak5WMklYSU5nUFNfV2ZFRTBkeXZLMktNMlF2Ujl6em14XzlYLVlmNlNZT2N3SFBVbWVEQjJQeTM4SUhOZTZCc3JFc3VNZUFraFF1bmRES05OSlZ3SnZLNGVXY2gxeF8tczRMU21QSHBLUDM2eFpjWDhMRkk2d0J4ZVoxazFpU2Y4cDFtajBLXzJHOGJELU1mN2dISWwzWTUxbWpGM3kxQWZUSVF6TzBiS3NjVUNLX2tRdElLSjVaM1ZGV0lVVGdaQlZzbmpkZUtkc2dfNXNEbldrWkQ0MF9FQWE2VzRCdnpmUUUzVGhweExOQlFjSENYRF9Gb1dlTWprOXBCLTdBWFFPZmhPRThWU196VG80ejZtTjFNTEdkNGNBc1FVZDdjNzAwaFJQZHNSZlprRWFwRjVUSTRsTW1LYWxqUXpHWXZ5NkZrUWtINUdyVnUySUk3NDNhZm4waFg3dHFsaF80d3F1X2xPcEowRlduOWFqOXV0eDVWaGNvXzdMT2s0TU5YWlRkX3hMU0pCdHVSYW5MMDhwSTliX1RidDFIdy1qWTVqWGFEM3RkX2hXb1JhUjJwLTg0WjZzam95WUo5cG5jLXhJd3JmZXE4RkIwbU1OYy1aa3VNcUwwUkJrZTVDOC1zbWpXREhHdVJhU05BOGhWN3VMa0FhdE55bmo2dURvX0RtalAtWE9McDMySEtXSnJIR0FFQXYyVlFDQWNUeEo4ckNieUdOOFp0WUthTzZMRnVNeE9SY2Itd0hmcjdHVm8zSi1wdE16SGhwZmdrQTdGTlJqQjA5RnBScWRXNE51UWtRXzV4YUJQWk1iM1Zudm8yQkU4aG1JTEtIUUVySDNsdkJ5bTQzRHZOeHRBNjJUTGFxWnhsOEloNS1kNDZJVWstdXdtOEQ0d3EzUlBhbUQwYlhnVXJwV1otaG5NOFZVWnpUeEpySWV4eXE0aFFmY0kwaVNnQWZXSWplMjg1WWlrVXhfYzFXS3F0eldzY3hfQVBTUUowZWd1dzVzaEkyY0RBYlZGZmFIQlItUVdrR0xaYmVIbkNGdUNEcUZUdzYxUXhEN1dPS3lKdFVlRzZwWGMyTXVKMVJBZnJGeHRlSWNVNnI4VEtXSVNOSnhJQy04ejU0dk5RNmZWanBwZ1NxeC1QOXJoMWNTQUtSU0NqTUFURTQzMkV0Z0gxS0g1QW85eWlaVGxpdGQtb3U0d2ZWSW82bXM2RERFRWNkdkJvYjNxZ1ZyTEFKVVJMMFpJWS1TQVhONGVNQkk4OEY2Y2JmSHdqd0Y2WXhISWZRMnRtUmNDa2lGcXBNN1EzNjVZMlY3blFNbG1JcHh5NG43Ny1zdmFicWd6Vkp3SXo1SjNYVlN6QVNWNHdyX0Z6dTNPVS10d21BVHg3Q0RLb0tNdzhFNmZDdE1NTDJ1OURvMVRZdmFBRGFHUl9BMnFSX0poem5lald6LWtPZlR3NnJ1R1l0UjBtb29GOVhKNEdxVTNPNXFrSjNIeWt5dm81ZENnUmRGbDNNMkRRTUktS2R1QXR6RnhyRUI3TkF0YlR3QTZ3R29kVFk0eGUwYkQ4Z2FURWRmUFFMYVBhX2RGN1c4dXFtMHhLMU1ubC11SlpERGZmSE92UURPdGF4dDJyckFyZlJnNEd6Q1hZd0ttQlhXZmRRZ0prOEMySW9tTWV2c1JOZk9jakViY1pxaEpmQUZSZmRFTEw1MHloODBQbUJfSDFTUlpzU1NQeTctZGNGZWx0M0R0OENZNGt3N1BDWjl1TmphS2phSTJVa2xST00yN0VCLWZrZGhVRV9KNWFXYk41ZnJ1Mk16RERaZmpVOFg0M0xDRDFQeXVWR29VeEZDbEF6d0ItTkhnNGREeVlpcjNEMnpaQko4VnRiNlRuSFdlWkM5dVVJQnJTYzJuMm5WeFFVZjhRSDNvY1dCU2VYOUZEaWNMOU5PTkZtOHJ3XzhXeFBmVkgxVlprVFNMNHhfby1vbnUtSllWQzZfZlowcFpxNTFnb01WTWRNZjFFLWp0a0hJV2ZYc3hKUHZkUG1pY08xNm85TTdjQjM4Rl9IYm5Gelo0cEdPMXhZbkNfWEVrUEszNG9QWGxlaFdOUFZsZFJtbHFJZ0ZaSHpPa0doRFM1MnBNMENIRUFnWkhRaHBYcVM2OXFwQjhxOE42bHZNS2ZHQktIOENDQ3k0THlITDlwTkhORkZ1aVBuTm9iZGNDOTZaNGNsQ21YX2pKeXhBV0NPQ2IwbmJ4TUdIcmszVlRmbmlaWG1uU2ZxcWFUTjNhZDhYZXBBSnRnMk94RVg1dmdoa0s1b2J0TjFxYjQzeFhzQmpPdklDVHZOQzhZSkF6TjM4YXgza19nVnpJaUUteHNpbWxTTWtWY01KRmJWdUtXQlNrMXNhdkJ1WnhCOVRJbmRLcnQ5MG1MZEx4MHkzT2pHUHNyVUtTbVVjNHZXdXpIRGRwbjJmbmhfZHNPb21oMUY5VjZGVV9ZS1lTczZwRmxUMDFrUjR2T0JBU2NtUWRWbHVhb3FjcjVpUG9iMTFIbzBnR1lyZ3lZSWx3WklIWlZkSlotelBjTlhTSUdITk16cmFLWmRaNWFlOG16RDRHQTZRcVJScWV1enpMU3Z2ZUZicGdxdUNrSUZqWXNHTTBnckVCczdxYzl1d25uWW4taHdKc3Z5QU9oTml3YXZCT2c1ZmJwRklYS1RlMXN2d3pmUlcyNWpFZGVqUnk3ZThjNWJlYktLZjhxR0lBWUVTQWFNT25iNjlOTC1fYk10MC1MM3ZIRmh2OXpPM2F2OFNHNEpvbndBTDcwa1otN3BUZzJLSk9LbUJaQ25ET1RHLTlkT2pMRW13Vnl0VVgtTWZTbVJyb045TGxiRDc1Nk1nY0NsbHVxVVNlVjd4VDhaVktDd1JOdWdxZHJVbWMwR3RESnhyYW8yT0JnMjVGYWZGaWlNbm1ZVWJWbzlPYi02Y21qQWxLQXBYR1IwRXU5d1R1eDBONDRZWUdMSzQ1eDg5VHBpUzFiTVdtbnVXT2g2VExKYkhZUnhkaWpyeXJwb3c0c1VBRVkxeHZSamxzWWp0T01rN09XU21wM3RPMGwwbk9sNWU0bHRLZTJtZkJQX2ZjdUhKRFVQVnpGZzU2elJ4dzhYakxfdU1LM1ZER05IMGZLSi1CZFB4Rno2ZlU5X2FBdEN1bElIamptU0xjay03b3BvVkFPZVRMRVhyRWhPNEV3MHlHa3R5X2RtYUY1UVdkV3RfV05JTUIwUXVYbkt6SXBoT25lZXdQRmdfM0dRaXlKS2piVFU1VjR2OENxRjZCa192Q1BsNVZDUkFzWGFJM0o0S0xCQnI2dWp4V1JEYU9OSTlJVGRsUDdmdzB2X3RxMjBZRVVHM0JfVTVNa3N3RzB6SEZOcWpHY0hQWk84ZHhLa0ZHTWJXbWF3RU5kZnhQNmphcFRBUmpIZGNhQkl6Ym5veUpKbERLVmJrX3FCUWdWRmllVjN5QjFJdkx4bGM4Mmpfd1ZZY2hSSDlWUF9fdlFfMlpJQUhWVE5HcUtkNU5Cb29sOTZrRUdXRk8ySkg1OG5fWG1NMVJ5RUhCTXdtdFZ2b0JsRlVDbTRmeDZLRGdXNWZMTEt5bFBMNEZxTVhRTDN2SlhvWHl1LVNnY2tYX2lFYllJWmE5N3cyMEV5aUhKZTFIQlRCSDViRzF2RUZsV3J4R2VBTmlYeDkybDQ0NDJUd0lHckdQOHVONkpWRkNMZ1BVcjVtZW0tbmFsaG43dDZmMjdBY0o1SlBfZ1k4SDUzeUpIa1M5TTI4MWpSaFF0OEtRMk8wWk5wSGR6YTkzaWJ2LVJyRWV3MmNmOEw0UWR5S2JneUtHSGFrVFBja2lfYmlja2kxUk5kUy0waHR6WXNoVHRPTUF4LWJFbTRmbTY1NVZVbTJjckRkSXExbmo0d0F4emEtd19wajA4Wk82X0RwNEtpV3pvR0VyWVNNUzl2TnFnN2p3S1BmSUlLOGJsQjJoNl9MZ09neXU4ZWpUa0JQZHFhTER0SndOcE9OWG1IWW9vRW5kdG5ub0NaWEJjeVVmNGFjeElOVE1sMFVUemczLTBUUWZhRlA2aThVbVNwWmZYejRubnRiRnBBVzJpSl9iVWNqS3hfZk5PUkJDZVZZSk12Mk1EeXFOSUFGRWFibGhVSFJwaEpkWmxFcm9RWE1GZl82Y1VVc2VLaDVfVURPRjhlUi1ZQWtXc0xYY3dEQkNocnRHd2VCRWNidmxvUGx2VlBlZDgtRVVyeXp4R3E4SHdxU2lhMW9Odm55SzZPVVdTRVg1Wm5EenE1XzN0Tk9qc29Oc3FkZ3hadktDU21qVW5fdjktYzk0NHlkUzJ4OXRraHVoUjB5dmE0OHZkRXk4aFNyb0sySzNubDFaUTJQRjk3eEFQbGg3WkNuREVLbjVybXQ5d3JUVGRKaXdSSG43eXc4V0ZSVk1BbDhiQ244dFdrWVFndHFZUk5WRHZEbS1GR0lXT1J1enE4MGY0MG4wQzNZeDl6WV9HTXJVenl5RjcxMVQxd2RYVFdVSFpDT19MZXhVREFxVFFsU3NmVkpIRlI5ZWg2RjZ0bW1NTDZldnRKM0VfME1WYi01djZFeEVNNkRvbERLY1Y0UTYwYmVYSWY2VHp6SHhTVVd6OV9SVlcyUVl5RW1nci04MWNmd2U5Wmt6ZmpKSFl2SXhRWHVFdU1yTnVrSzNic045ZnU3Yml6MXFLUnoxQkV5RjRNV3YyQ082a1hESHBJS3ZQLXZ0WFFDZzNydHl3SnZ0UjNpY2QzUGRqRnVZSzk1SklvMmh3cW90YTZjZFZySVdZRHZwZkFTc2xrWlptV2pGejJWR3VKUTlLV1pmY1ZwSldMVXg0TG95REtZa2IzTWNUeXZFSy1MUW9saEpaQ1ZhVDV5QTRscTRaZEQtcDdpZjM5VjVnUVVRRFdQSlJURXIxZ1dKY1prLU1Xai1EQ3hhOGplQ00tVlFPc0JKQ0tZZUtFMXVsUldSc1hZRGFaVkJ0RHN3VV81XzhJQUJvRnFhV3ZPVTRjcUhqdHVVa3ZaenhhaG1McER1ZFpLSlRQTENvMEVxY1o0d3MxOEdpc3NncWh1clI4d3B1VzA1Ykl3NGQxbm53RXRTbkF4SjFibzZldS1zcm5qc0J6SUtQM2p3Ni1iZHVhSkJnWHFXT3Z2TWNnYWpOcHFCRlhkeUg5RFI4ZGhuYTlXYzB6SzdYU0p0M0lneW1HVW5YOC1mMFNtNWZ6X0U5clBDRXdXdV9WXzB2RFU0RmZfaUZZMEpQSTFrSE9fbHQyZGl4N1k3WHdJM0NmVFN3VURkZUNLbXdNQ0lXVWEzOWxYMFpQZkwtelVkZUlDWVNnai1ENmRCMnltV2tkYXd0ai1VLVpPRkdIb1RhU0lmR1VXYzRLX3dFOF9qelJRUEp1LWpQY0VXVGRzNlBYeUs3MGppc1NoYnE0azVjMElLQTBzZnlzR2cyTGFBa1lncnB4cF9RdG1jNllGSWg1aWJSbllqbWVpcEE0eUkzV1NvMGRPbVJ6T1dyNnUtbEtuTFlrNnZNZXNuSDg5M19paGR2blNoYXd2X2IwT0FfMldTWjdYZE5nUktZU0JDdkt2d2FBdjJubTdldE11djVNalNMN1JyYlpKN0tzS3d5dVVMNnM4NXYyaHN1M2p2UUJYOFU3bTdTdHVtbDdSVWIzbHJpdVFYVGJMVElTT1UwUlo5VkRZV1dqM0JIQUZWT2dBWHRrbjhWSERURkRZbmhxSXVPeTlmZDNKTkVSeHRkNEp6cHZJTVUxQzlLa1pRSXdaeEFtcDM4azN4Ty0xQlBFVDlmZmktcFhXLThPNFVsaURCSWhyclZkaDBDNHl0Mmo3aVBKQTNXZGxKaUtLN1pqS0JTRHZoeDBmS1gteFJYWEk2dlZ1dFRucWdUMlRkNkhEQU8yMVlhVDBWTnBWbTRJTXBqbVFYVEdpU2lTRWtrMmRLS3BpbFVxQnQtS19ONjVLV1ZzTGJwWld1aVJIQlZZWTNlaFh3dE80R0ZqRkRoT3p6aHVXVFdrZU1uMEFsOVdZN0p3dHNRQzZLeFMtSnNnbF9vZi1hZ3F1RDNVd1JhQlVONXJVdnk0bVdjZ2dSYk9NLXdxaXBZMm5sUldTRldVTEJSQlpibGlpbEQ3b0YxOVV1SFl0YzdaRjVQSEZ6V19EYjB1c1pqWF9iWGVKMVJmLVJPY0FnbS1Jcnl6dWl2djJFSzlnZFpPckNfaDVyMEM4YXZzVTF6d3RpSmF2TEpLVWtmNWZhamozaHY2MkxoVV94TkxJVVl3Y3VGUTJlYUdJeUN1dlI5cXJTSFVsWmdYUm1kdUc2YVNwNUdUMWxYb3djWlFsV2ZkM05CVGp2UHY4NG9GOF94TlRtLUlwblJvSE5NMUxHMXM4c3RMdDk4T3Y2VEF5WlNKTUlyXzRFbWdKcUE4Ny1DYmtjVHpqRnhJMFMxaWxvN04xS2U3R2YyNUhQQ1FDOEo0dHlySkxRMXZNQUdzeFlGS3dCRGlFM05sRzZPMFAxckRjTDBGM0JIbGlZTFVZeWJyQUtxd29WeVlCdUNHNlU1cE9Eenlsd0YycHRTMzVVRDZVRHR1dnpTN2d2MW56RlpzUThSdFFPVlR6VlpScmtJelM5QU1YN1Rfc05rM2phZ0N1aUFoS195d3lJdzZQNEkyYnJYalh0M3JOYWs0cUpySG9vM2xibl84clVwNGs2bE5sU3NvQ2ZIQlpsUmpxQ21zZnJTUGZHTU5OMmFSOFFRdXR3V2wtcHFKZFRjUEh3RjdieTN5RHZJbUlyQ05HdWQ4MkxvNUg0c2RvUnh3UzNtMkE3VERhSVJEVzJXU3JQVlAxbmFodVVEOUhQZnF6Z0FHOEhZazVleXJIX1hQVXNyQlBoUzJuXzFNZmc1TjltNWRUdWNzR3phUTUzMHpwTVVFWjdOdmFUcndXY0ZtM3oyb0NpTUVVT0pQRkI3U1ZNLXhkUU5sMlB1RGlWRnlFNXFmeDR5aV9rSmpLUjZaOEx0cXBJckxCTDc4YXdJbW03M1RSTzZJU0Rncmp1aWdicHFXb2gtS2k4Y1ktNkxYcVNDMzBKSktWWUhtX3FYV3UyRFhXSjJsUFFYWU1QTTZ1MmE4d004VzRxX0RiVE9TTWZvREJDTk1uWjVjU05BR0RnWWJHQkNTNVdnQ3JkYTg2c3VrSVZfUUhCdEVlZlg5WE9URlI5S3RYazE2eUR3bVA1TDMxQU1uTkUwRVIySkQ1M2hxS1RPSU1zUlhfZWlXUGV5WG8xbmQ1X19wcGlobGd1clBnc1gtSk5tLVVuVUg3OU8wcjdaQ3ZCaTUzcVFOUjhjWmRwTkFRMzlvbG9nTTdoTUg0eV9RaEpQamtZSDY4N2dHcEtpYjRSdHdMQTQxOFp6TUl5U3M2ak1XSUV5bkNqUVRVdk5WeFZVMlF0UlV1YVRxZzhQRXlONTYyaFp4eXlBWHRMbnJDQTZOMHhmZWhjQVRoWnhNYXpzYlFaVllaY2FmTEVod0F0YUdrS01kWVNid2RyRTJaVS1VTFdIcXg1LTlYMEFvUGtxNlFTUGRYOUdxWWNaa3ZiRXpBWURZTTlMV2wtQkowdDRoQm1kOHFjQjRmSXByS2NGTHowLWNDVnlWVk9ucEtCOUJoVUhaeVJEeHRtMnJVdUhfVXM5YnYxbzJKSFlxbHhMVGowMl9CTWczTVdGNnpYbEJsQ1JQX3BPei1ybjVhXzYtdkotWDBtWEVWZjFYeUtualN6YzZXY1I0emEzRHJDbFdvWEp5YnhNa1J4d1g2OVhkZExSTUExNjdGbWhDZ3B1UU1yVHQteWxJSjlYUXBwd212UlBNUDFxY3N4cXVIb3lDM0ZrRFZNdDBYcFFBWFJ4U1ZjaGxqUFM3c1QxMGFVYUp6OTY4OFlYZlBmVW1wVDRjMzNTTklnTTRLb2FnM3B2eW5CSmswQkQ1VFR1N19UalpteVYwSWhpRUtZNEFUWmJFOWNDXzBCb3ZXVUtra2F1WDJHcHlzUThJVjVuSWJqVElvLVlwelJnaXZ4X0dtSXRlZmJWbFAwV3ZSM1BITVRKdXdHR2hKd1hXczNfZS01TUQteVdmeHFxYTd4ZFpRR2lyZk5ZcEN3c193STZGTEFFYVQybWUxakhyby1ld3UyTEhSai1DaTdZLXhFUlpFMl9EZFlVVlFaUnhiRWxucnZsU1JrMm9feV9NQ0pGdFlZZkRFZ3VOS3Q1ZmNYYnRuaUJIcGtDNUkySWR3cUdMbE95Y0pKc3U2Y1dOOGV2N3RQU0xtY0FwbnhoamZvMncxSTA2azRWVkdkRFp1cjU2d19KTWRSM2RzZ3BCNmFXakZSZDZxUnc1blhJOUpVUDhJMkM1MFFqd3VYS0ZYQ0VPbmRpN1ZCQlJkTTkyaDF3NXBWTTJwVWtwNnA5VENzWVJmSlBkQzNOeHlURGhhaTNlOUhmUHlyWW4ySWV1MVZGNnhYUVJqSXhFbGFkUVZRRm9TeFluWGZQeXVIWDdCMTRtYVhwdFQ1NWlzV2pOY05oSC1YUFI0ckYwcWVvWDdNbGZDT3Z3dXNScGIyb3FhUWw3SlVlUzc4NE1jaHFlOE5Ha0RXLUxHajVLeGY4cWduU0EyRUVfbFdKc2pJLVJFSGNDREUzQlJpS2FucG1MSG4wTzZHQ3M3TG1lMEoxZGRzR29ycHJ0RVVvZ3dKVTZtQ3kwakpnWlBwTmxMdm5IbGtCYWZXbXNkeEx6LUQ3VTRCcDYzZ3U1ajJJY1FSdUR4UlM5Tk1OeDk0VGsyOU96OFplU3VJeHdEdjZsdndpOFJhRjhVRlNlT2d0RFRsLW9rRnRqVGtTUjVRNGhPUzBpNWlsU3cycnB3SEdxeUJaenpPcDJXMzNvMmdua3VCZmhVMkhRMXgzLV96aWttdVhRU3Y3VW9FeFFDYXJldnd3MXBQUXhEQmszTmFkZTRvUVFzLXNKbWV1OEJaSC0zcXVqUHQ2UjBXSUVsUm5zLU5qRHhyWmxEc3J3UTlCNEtiZHAxLV9pNXNTWUFNYldzT3MycXJOQzQwZkJSd0dtT0ZOZTUwWFkzaFBXQlRrRlBTNUp6cHdiclY1NjJ1YUl3YzZUNm1RNmRsdUZYYmtrMlZ2cFZqZHQ4WFpCaWRrQzNqWGF2aERhZk5yLTdNWWFseldtTkVvUEl4VFNOclhYZXdnYzdEMHNqWWdNekpnd3F5N2FKNDhXTDBPTk8wdWJFcXBROUVSUm5UcHZTMWZkZXhGWWN0b3R3emtsNGc1emxsMEpfSW5Cc3UtLUY1ai1YMGViVE5UWWw5SU54TTBTa21LSExvR04wNEc2YTRuc05jc0d6TERhaEhOTEttUWV1ajE1MUg2alZSVWRCZlU5S1J3bzU3My1wRXE2QUlxOW04WmYzTkpySTJlcWlxMGpxRGFqLXBET3BsQ3ZaRnMzQ1hxT0ZQaEFwWkY4RmF3VEw5Y0l0TGFabnJsT2hTQ0VjamdHdlZGQm93MnhBUHZmOURRYmh3NjdiaVpfMkFWWXJ4alB0VUN0UTZGUnVaT2lNOXozdFctNFdINGJBWU9ZUG5nLUZXR3lwaFFRdkk5a29WbHJnSExfOU0waXlzalZVWXhwbW4tYTZnWkF3OHpWanBRSGtRUFp3QTRCbnNZZ2JxTVcwMU1fTE1FY19HWHFNN0x3ejhmY0ZXNmptSEVOam1GUG9VUVd2akQtQW1EdmtUUGJYVlUyYWttdFFWeFBlWk85SzJpaUVvb1U2ZVhtZlVfeGlTTTFxa2pxaTRNdU1MOWpFSTEwa0x4bmxfNk03OGRTWE9IcGE3NFlxNjhLczYtWFFKMFRkZzhUNEdoRk1rYzFuSHp0bjBGOHJudVV3M2QzTjY4SWNGZUJmaThRV3VId3JKdDh6bG1XeHJ4UXBlb2Y5V19BaW5hdWdBMTYyV0plYmdibkpLY2trOVU1d0tvaUhmZ185azhxb2FzMjJRbUt4OFVSdWhNMFA2NVMwbmdtM2NsemUtRlBab0VXQ29Wa2NMVjhWQ0ZSYjBwSWE4SnZnVlhhY2g1MEJYWkV3UFFVNUZsQUtpQ3lOQk5jQ0c1bVlUUUpvRHhkR2pYWlRnN1MycC1RSXFuNFhrenZmS1RLQlUySTFsTlk0d21EVGNmN1BUMFdkSTdFZW5kdFZCMnVFdWdwRFFNMmplN3lOelZGcFVrLXRlY01acEZGWTlUQkFZVklYNnRvTElrdXUwRDMyMkZoVlpmTjI4Yl8yc1BNUU13d2N2TlRES3p4TUltanZTNWdlbFlrWE9Nc3hPZHZ5TzZuc0NtVXlsSDZndjlQUHlHOWwwNEZjY2tuYjl3NjROSGt4LVpaTXQ1V2ZfcjVncXF3ZjEyNUdGTXpUa1FHdWxveVNseDlOOWFfYlloVjZYTklpQjE0Y3ZjODBaVDhsa0laVWJrelpzMWducWNxWXZ1RkVxemZBWlUtbW9TZXh1UFJQT2dpTjNxNDQ2MGsxVWdtZnA1R0s5bFJKLXBvVUZNLUZYYlBDNzc3TmJjYXdoTTdiaVRuUUVlaTBFMTVPck9OcVdHWG9ocFYxZldzVU1oNTZSWjE4LUhybUpzV05aZW1yQm82dEFBcUxla1NHSnJMRzRMUTVWdm9OVFhDYS1lUmNHOGN2R0FKTkQzODMxVG1fV2JXM3RnNV80VjZzeDJxYndxejJ6b01oRngwLUJoNjhTVkVXNDdLbFFSMkw4WE41VHNLQ3FCRXIwWXoyTzc5cUxNNTZmTDBHY3dWd2hmODl1R2NmNzVvbUxRN21LdEZYa1F0MWk2cEx5OEFBRS05c25kZkhyTUFUMXRlbFFBVGRBT3p5ZkhBTmNHcEw1TXhkbDhvSVBIWnhJTkttZU5vdjlMcmViN3J0bzg0UkZaTm5pM2JDcHVEMWs3R2hrTzN6Yk9qNEdGOEo5Vk4xcmc4M2VGWlYwbl9QSE5ic1RocXRnMGdFUWZiZ1RSRUdUU056MnVHYnlwVVRHZWJaQmxzdWdsRmtfRHpwTWpMMktJaDBBOFBCQ3QyZmVtX1FPOEw2cTNtYzdVV0Z1ZWdHbnNjQzRhMnBTSy1Ldk9JbmJaZEVnZmdtcC1QWDlXaE9TY3RUZWVUVjFaWGQyZHdjek1pMGVYY1NMZi1MNmJPNHVGYmUtcWgyV2lVQzhyMW10bHRmbnJma1NWLWtXalVwTnp0c3NyTWhWblB3OHBhRURmNzdFbEszbER4V2tsSGoyeE5OeGdZWkJUX0hnRkJzMW9RZ255WVE0dEsxNFlpeVNpX3MtMHhQSjh4NHFtZF96NzJ4cWxOZ0RScHI2bm1fR0kzYlRwUUE1c3BPS3FnMDZCZGV5cFhmaTh3RzR1c3F3T3Q3Q0RnWFVwSEVhUGs1eWF0QTFLQVkyRzd6clhQU2M0WjBQU0JfV19aNlNieXJuTHpEM1dxd1N2cDdLa3pqdzRScU8xUmdTZ2xMVHBMcHh2aElIRFRycEdCblpVZTN0ZGdveW1BTkdPcEh2NkZyalo2cE9UclVaYjdBVHNSb1Rvb1prMDNDck4zbThEaGNrUnlYY19ZTkxGVDQxYldnMUI3N055T0FTQjF4ZkNrRW1vV2pQT09ENklYazRLRnMwTWd6ak9aRGdsMjRaandtN0tsZEpkOTljZkhub014ajA1R3NIRnhqR1NRMThGai1MY3lpT3NpbWl6eng2U0RkaG1NZjFXSnVjMHlTbjZncXFNU0ZXQTh6M21TXzEyY2UweTM2c2IwOExLTno0Z2ptMUdNRkJzM3AwZ1pTLUtKQ3ZLdHpMNHNGd2VYRTMzRFBGNGZCRmRybGxEeG1NRGRlWEExb3RkMC1NNGt4cGtKMExnTWNwSGJpVlprUC1xRDdhYzF1Q1pfb0JmbGhHQnJCWHVvMS1Talc4WGhMOHpwclNjRzBrZHJhYW00a3pzREdwZFZqNjc5eGNseFVwbXhOSlBLTFhlZl81dXBHYjhTQl9TWGVkRkF6Z0x4QWFtX0x4RHJ2Q0lXaTBBR1E1RkRVYXpDaWZXZWxOX1hMeFVKR3RuUDdxVmJmb3c5QnlqS29hQ3pkZlJ5alY3VkVjZl9BaUlJZzJ2SUNSbTgwMXVtb3hhemVoRVoyczFIRG5VOE80ejU1WXpabHlELTY5bDdiUGVsTkJ1YlhSZ016OHBmb1kwOVpRVXl5YWR1N0hJWHdMM05CbVRmenlhcEJKRHVJZTJld2ZEeWQxOUlHcGF4d3Y1enAwMWdxSnp4X2Z0SElQQWdkX1pwZk1fWC1wckNobHJjUWhYclBjbDhEd2owdGpnWTRZemtXMmJhS2lWRFRpQ0dTRWNCWGV1clh2SFBSc2w0ZDJqNEV0MUU4dFA5aDlFY2FJYmIyaGpVNVpFSHNXaTVUZS1XWmhyRWswSk1fSkNHd0dib3ZqNlVueG1FcG9wVUtiMHJfNlVEYV9lN0tCUWdUVVo5allmcnhRTVpTX1VSWnBuWlZXZ0NaS2tXcEE2RERhTS1KVmxFTkJhbE9wMjM5U2ttLXp1RUZkZFl5WlpvTUswMTZ1YTJKbGJOOXhOWjR1WEtUekZhemtnWFVuRDRRMmZ3SFdkM0NlSkQ1elljdjI0Z2taWkQ4TDdnbHdpUkRhUHdPM1FXUVQ3MEh6SnNaMGlGVnRUeDVKTkpKTnRxRFA4ZVdJeDhna19XOXotellSWFB6OHc2MWVsdzd5UHNyaFZVdFFhUHNEQW5zZWYtTDlZY0Y2ZzBieGtVWGJQV3FjSGVsTmFRVUxUclBPSlhsSGJCVkZ2eFEyMmRjaHpJYXlwblhMaF9RY1pBa2FDYWZDbzNGaGdYbFQ0dWJjM21kV0JnYTBXenZjaUZjX2l5T1M4UTJWNVBMVHJPb2JFMUlxcnpNZHppaHEweXZiYUp5VUVSTklYM090S0FHLUdTZ25rd1hkYnVNTWZ6enpseXJvZTh5X2xxeGJ0NU9leC1TMUVDNjZUTUdHd3ZncW1NN1FxYzJ3bkh5RmphaVdJWkJEN1BEU0EzdTBtc1g1N3pZOWxDb05JWTJ2ekhOeFBLeUxpTV9NWGhYTElzbEprMWZ6WVR6ZFN4QjFnT21KSWZINE5ZVmxtUnhYck5KcjV2ZFM3ZUhibjFCb2FSN1hlUk9PaWpkeVpLc051ZnAwSElhYzNvZk5vRzVXTkcxdmZJMERyNlhkTUt1SUJaTkRLdzUyeEkxYnprWTVMQ3pCOE1pM29GOXFWM29FS3VmTkNxYlFtcmYwMGRfLUx3SVNlcHRCak5UMnBuMTMtdHhZelk4MUttWW5nblh1OV9tT25tUVl2Zk1jNnBWLS1sVnQxc2NxMEhYWGhOM1pRMHlyaGxwTkswOGNGai04YmJvei0wYmZocGE5Tm5yYjktRGVEU205azc5TXFoRUFRcDFTYkx0VVhPRXRkblliWUpXa2NlTHpCZ2dxN0I0UkY1SU91T09pd2ZoMDc5RV9iRmNBdUc5OElmSXRfTlpRNThpbVBXaXM3eFlLcGRleFJFR3F3WjlSdEFmaUFkUHB1N3ZFcGk2NmpqYVpGeUZpcThBMTEzTEtHUHozMExnM0tlTmVtZ1RJY3pPSVBXcWdPT0o5TEpnWVRqamYyOHZxQmxkbU5BS1E0VTlBTDhUeWZ6UE02aXduUFBrRW9IRlZna0tuSV9FWVphYVpTWVIwZjFaTTRXYlZDWDFvaWJkZVVoQjh0dlptZDg1SXl0dVRaUzlMV29VaFlQd3V3M1NxR05yS1U4T1RCQWVNY3I4SXFvb29BUWJMcnBlLXdyeDhiN2dzclc0MUxxcDFsZWNvZ2N0aVhQTU44bERXLWJzaHVwNU1scEVzTXctbnAzT0FGZnZlVm9uMHBUcW1obWxlRjVxenJXcUUwU3JCYzVScFNOMEVTaEItUkpMZm9OYUd3VzFmNDJDNDJvd0hnRG9SQ2NOLWtWYmJxd0NIRWE3NTRLNXJ6RXB3alRSaXdFOENWUndDUWV4bTBvQkFLTDl2ektIa1pYelAzanZUZjNxOTV0VGh4Q21jemttUjlLQWRfTkhyUGRqVDdIZzdGdS1FYVg2MGxENmhpM0YtSmxqdHhYczlQR01ja1RFQ0l0cWNqMXVhYURtRDV3Wk1tck9QRjN1eUFtZmlSNHBLY1FJckZZdXpreWlYOHdlMEh1Z3RsazZyRXVGZUY4cnJ5VmlkNmN5RTMtSExpRlRqcnA0LUZwYWhxZENBRHFnVU0yLU5OWFVOcHRUX3NpQkktMi1NNUhCT3ZtN05HZGs1TTVncUl5amNMTTRwYjNqeUpqMlhPajR3NkVmYXlOTG40V0RuOWtRbmNkekdlQ0Zzdk9VdFl6cFFUX3VZMGI0X2I3R1YtRU1YaURTQWlBcXVuWGF0ZDN4TDlXQ3o3WXgtMWRzbG5kQUYxMG9BMTl0N0d6Z1ZpNUdWM1dqNTlBeGdBYnlQVGdjTXdzRzBJU3RJSXJNTS1CZWdoYmV2WUVuWDMyd3hjT2pnMFQtcHNtbUNBc1BESmliX0t0bUQ5QUFHRnlFdmNIR0pJYkt4dExKYWRfajJtdVduNXoxN1RDWVdWSGhYLXFFendiSDZRbzBOX0VKTWh4SlNmX2U4T0pjdkNZTC13VVpwUkszanZPWEFsMzRwNjVFZE5DYjlOQThBUHFyV0NJNEVyTm03N3ZaWnd1VVRJTWJkWEVmNndkUGxLRjg4UDcyOFJvY1FTUUREYmdGSEs1YjdzdEJZQU51NHltbDFleXlXVWNJSUZ1QVZkUWRCdGd6UmJTN3JUdVVaX1RFUTVOUkpHVUhkd1ZMalpfMEJiamNkRjhwam1EbEN6TlhsMExjN081Z1pXQlUzc2x3d2dscXRwdkxaZTFTSXlaY0FNeW5laHkwNE9PUGRXdG5JTmV6SWZFRkRXcEdqWUNGN2E4T0dVMXN2Q0UyZTZWYzZDYnNiTWFyVFRXWERTdXdERVNSbHB4N2hDYXJjbzVvVWpYUHVzc0JsV0cxWDdVNmJlMVhid1ZtOVRPN25EVlZSY1NkM256eUQ0MTlXbklYUDlqZXNGRU9tS1ZnTmFaZS1jX3V0VzJFMnpZaGVaLXhncmJSZXlhZnNfZ0R1UHlKZ0JuXzlldllnLUU3TnloVUt2Z1hMMUUtdnQtUjhQckdJTERnWWl0eTFQRmxmVWVQTUxDNXp1SDFhLTVxcjYwOWtZSWZqN2JpSndlOXRHMUdhWHk1TElscEh2WHlIWWpCNkMtM2paQTFBRXdjSUg4YWJWT2dhcXNFMmM0U3JFaXNUX3NmSzg0YUtmRmxyR19RY242STAySXlaeTN5Z3V0c09pRWJKM2tfc0RNYjZGQVNRNDdHdWRUUW1ha0tsMHpTQTJIcFJPaU1tVmVYSFd6SWlObDdyTFllNThKU19KeFhIZFVhNmVUTk1xRzZqd3NKZi1XdV9vS1ZZQWhPWVhtV1h5dFJMS0M3SV9NemFSTHExTnJZYXpScmVERUNHV2FIcXNKeV9YUlE0cl9lYlhzM3p4RHpQQWhBc21xalRvU3ZjWllkMV80Qk5fQjNtbDJic2kxYUl4dzBRdW16dUV4bHJLdloybWFYN3hDM2JuX05oQ2dUUkhkbnBLSFRnSWE5bzIyeEQ2MmUyZ1lwOU5HNW9zZEhuRmVIcE5xWldkSlcweTdESGtwUjRud0RyWWtVOFJudDdmYmxEWENERF85cWNBaGctSUk0NVF5MEFGQkIyUDAtSnprTjBRN1dWVkl3cWFWdWE5YXkyNlhjVmw1TjB3UUhPY09tMVBmWVJ4ZjNUWHktSlMwcEFwRDdKd016ZUkzY3F0SVUwYjAybVhBeGlnUzQ2Sm1HYjV5YTZWaFZXbnNOZEFLTXlLbWE2RndLVWhCVDlEZ2Y4V29kb0I3X21pREswQlJxUkpPX0tuMmdpckxHWmEwMy04QWJmRzhuM1JwQjdFQnpoVHlLUlA4Vkg2d3hJaWkzdENOczR4bEl4YWcwa3JfMWhUaGRPV2tSaDhiTzBuclgtVnpMNW1zaUJpZzF6OVhTdjZxOXRhbWxaZ0RwQ2lSS21WX0R0dXdWY0U1ck1oeG5HV2pQMjdLR2ZOZy1DVThHa2x2R1pDNFlmcGNFWXJjNnc3YmNwNnZjT0syaGlxV1k3Y0ZBTDlpR2hGYW5kbTlsbVcxWnpiVGxiNTlhUm94Q09tZ1Y3eDh0d191N0ZoMHhRZURHamVlS3FTaHNwbjI1ZE1EWi1zUjM0YzAwM1JsMTRBQVRrVlJIUE1ZM0Q4eU1ZeENXM3J5bm5PNHh0cjBUeGZJcU8zeVZ0WHA0anpnVG5VbWRHR2ExcHB3R1BWMVpKQlJoNk1BbTd1cmFkZ3Q3SE9IZGhYTlNCVHBnb1FxeHJDYWpVSmJEaGszTmx1Z1JEN1dBZ0lKNFhLb2NDc1dwUUJ3Q1c3RGJhLUlIRENxRFBOQ1lBYjkxdW9jOGJYNE0wbE01Sm9oYVl3eUVFVVFvNDA2TTZudmxURkE0dnFzRGs1QlF5Zk5rQ3A3WDZpSEdpREwwUFV6ejZ4WTBWd0R3M1V0QnB6OElvb0FYb19pa0d5N1NlQWlNN3hmbDBJTmROWUMyVFhicnRwTS1mSWNjb3Ntb0sxdkNKcUV2TUJoUDJGcmRQMEpoVTE0TlE2YXZONjl6YUU0czJsWlJ0cjNWWW5rNnBFZzZHSldqSFZYazV4VWJOM05JY2cuM3VXX0txeXF5T3lDeTJnVVBST0hZdw"}'} + headers: + cache-control: [no-cache] + content-length: ['42494'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault96da121a.vault.azure.net/certificates/cert96da121a?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/0976f18a025245a883da4cd95817cdab","kid":"https://vault96da121a.vault.azure.net/keys/cert96da121a/0976f18a025245a883da4cd95817cdab","sid":"https://vault96da121a.vault.azure.net/secrets/cert96da121a/0976f18a025245a883da4cd95817cdab","x5t":"lBZqHxjrEB-nYLGV7_WUgTwXqmw","cer":"MIIDOjCCAiKgAwIBAgIQfDI6nhc3Qma4DbZggxxtOjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1MzUwWhcNMjEwOTA2MTgwMzUwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/aAGLY6sJGDqquIwyPToerUQkEH9PXkhm3ys3/4yjDKBSeVa6a9+E5VhXsV0clh/emgxkIe+elh8eZmufWfGzoIiABd3petnwiGsAIwulJDZtIjir/qPOH5qx32o6hrduIQNXcVsLFep0sGLBsFVGLbb6EsioZYvtkVrA2QZ8FPyeDEeifjTrTiQnjX2HSjuFTai21+193sO38goV+I7+p7Du/ER95b4X/QfScUdsPrtBp/22Y6vRThVSa6OqGlSFNZnob3i5OZ38nK/xDdK/UqKVZZ5TA3IPcfUb0Q5vVEXG41N3RCib/9wLl/Ngqcc4tNtccALroQCTufXc8LZHAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBRL7Erd5XMhIj6ONSaCT3FLVUYNiTAdBgNVHQ4EFgQUS+xK3eVzISI+jjUmgk9xS1VGDYkwDQYJKoZIhvcNAQELBQADggEBAJHv7t0Qt8xzEqoc1HtxcjRTjdKIpdXMM3ErPDgXBNIFBoIZt9yhWTlF84jGuMVOUFAIRyt1076P6I1uYLob5XDK5k12m4dyhbqp2xfeqIHKo2NQVKsKEBWNWR5Eu/QKkjJSNn+UpNZSoX6dcYtnKRAGMCIF9vfdlY8WV8eP//QOhh95AySsXT6pYkSpLpERDxMq06M59BLxKzbqdKZ2WNUtne7/cxpjhu7Eb+mrwTdvvL8fhDNUoO/xHg+A1yt73lqmU9G+THQ1rTJ+ijXOt+a8XjAwkjEyXorAHKPESEtmGkyb/7zG5qZLcX758T9giJ4LvnXO5vdWUqTfwmpy9KM=","attributes":{"enabled":true,"nbf":1567792430,"exp":1630951430,"created":1567793030,"updated":1567793030,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault96da121a.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":1567793013,"updated":1567793013}},"pending":{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2308'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnNzU05iRnNJS0F1NGVOTXJ6S3NsNFNHNmppY1JhOXI2a1llcUpGMGlCczZ1UkFBdGhQUmtIVnEyUS1PUTJnTGhIOF9YelV4TlM3ei1NZlEtRFp2cG8wRjJMTTU3Vk9YV01OU0Izd3RQN0IwNkhTTm5EM0lkOFdnUzhYeG8zY3BCbDYzWUcwZ2J4WjN3RVFCV21YLWdVcmpCaDd1Z1FNNnZkOF9MVUxZSDBueG9TanhMNXNCdVBwVVdKVzlFZzFIc2Jrek9jLTYycWtwYWF5MTdoTm0yaVBQWEljYmowbXNaRkNwTmN5NEcyNGZvb3NBRGZ1YXlSOGp1bGh3aDdHV3lEQ2hGc1UzdXNCNFRWRHdmVldXN25DY0Q2alVXRnVVeVVYMTBmR1ctc1JxUzZjMlA1YUptTndRa0xadWY2TmVBWjROUUlxOFI3aTM3V0NrWkZkbTNYZy5qOEp0RV9SQ2VRdld4S1lBUzB2N2NnLlVMeUhBTG1UMEFMUUs4RmZMX2g3dGJPMDB0d2xHQVEzTXNTQWVBcF8wNUY0dmd2UEdEZzNydFZtZWM2dmVHNFFBaUxiZzlQSV9WOGlBVVd6MVlyZkk1d29IQWpFaHBtcktlRU14cEdxUF8yckhCeElBQ3FUb3Q2Y01ZLXVJYWVrMnFHM0t2RVdRalB6cVVWNFMtb2lyS1RTeVZxb1ducVlYQUk5VTVJbFNmSlFGYTVCMVFUSlBQaXhtMENwdUJWbk03em9HemVsYU9Qby1JV1FkYWx4VGs0NkRkaHN4YUgtelpFRXp4eXV1eGFRbkdGVXNuVDlJUnVJajlmeHZwQ1RQQ1dUN1ltcXJZSmFkWTl3SVdCY2xrM0I4WmYtNE1NN09MNlp0WWJSNWF1emhscTJZVHA4alR6MXRtcDZOTFBQaUU1Y0xGc2pscFZuVC1Qa3NCWHA5MXFFQlJHTXZmWUpLZzh6WU56bzdwZTJSckI3Y1pjZzlJZ2lwZHg1Wl9Zbm1Ra1BPMGdXbU91anVBM2lpNU10V2huc0k4Z1lldzZWaXM3TGpYSl84cGpsMjNhaTJ3V21xdDRnYUZmcDBCZHl0ZTc1QkRFenJTZlNKSWlTX0hLcFRDdHAzLURyMDU5MG1zd1IzXzdpRW93SEwxc2tkVGU2cGN1Z0FMRmRpdmkzUHRBX3NPeXNKM3pzNmcxZlpnVThjNnRueVE4WkhScVZidkRiQlo0bzFESkI0dktJV09CRm14TENnRU96ZVo1OHF1OE1jZXE5WHd0aDRyaEJFbEpGSU1sRnhlQkRfWERwdEpYMWg4Q0NUSTZycWV1Z1pOc1dvbnJQRnp5ZWtkM1NaRzlxOW1TSWxKVzllMVVNT0VHYXVkcGRrcG9tdUFDM2RUTHlkNG9NYVNhYV9aU2lnT25jR3VhcGZRaUxodV94VHh1QUp5cFVTTmVmaEJBemM2V0QtemR2SkhXZFdaQzFyUjJtSWJKSW1LQnVZdjZjOExscUFZWGhveHZibWJBcEdfNkkzMEhVZldNUFNfSm5SOFhhc1prVV8yZDdOSU9zeGJySjJGLXQxeV9mM3phT1BUVHgtc2luYTZfdDNoUTUtUGVJZEtHMVZ6YjZxSlhDR0FPOThsLS1nLU5fRU5IWnpFX2Q3V0QtbXk4ckFVRUo1YkxfSm12bzdqck8tLUwxN21QUjRRbENSV05kSVQ1cHJmNENjbExBQnpPWE9NdWtlVVd2VWdRa0JxbHNrMzR5V2VwbkFfOHc0aW4zdGN6NHBFNXlWRU9YdU10aTVjYm9aaS1WLW10QUNzOXgteHlIQVg3ZkZXUzBmamRrQi00YVlrX3I1RGhtcmRWTU8xTmg4Vnk4WXpmeHRENmNBb2NnRERtREpHdXNrajNqYlNfQmhOUVRfSkZyR2VLbHBmMnd6UmZKa2d5WURRbkVEd0lpSjhneFRpZWNsU2tacWFrZ3hqRVMwUk5IcDAyNTNvY3JfSFJvanJLZ3loeDVlcWlBdWxDLWZVeEFpT216UEYteEN6TDlWX2E4QmlUSW1TaFNiRUk2clhFVlh1Y1FCZ1NkV0JLYWs3dVFkM1lTYzk2ODlwOTdJZDlrUTBrelgzc2UtVVFhcGQtYWVGZ2lZdGRrdk5wa05rLWRzOTBNeXFmRllUNjVNcFBBYkhYNWlLTzJiV2ZjbXJ1bUdkaVljRVdpdnJZVUpBQmQ2d3NlYTI5akszaEd0cnRSNjctcnJYaHRTMnQ3R1l4OGdrdzBLclNwaWF5NGd1TVhiM2k5T2t6MlZWOEVqU0owM1YwQ1ZJMWQta1lnTXRlcXNVRGRTTGpzWVZIWFNJLW4zdVNKYTFOdm4tNm82UHJjbmdZOU1PaVVoVkg1NUI2TWwtSloyNDZCc2N1c1RuLVZXSG00N3ZXWlk5N25RRmkzQlVDM29VVG5hNjZfX05KWVRpM0lCQUJkMFRobzg1cU9zbHh4SlNmMnVYOEZPZnVIbjVvUUQzbVE4eFVJUXJXbWI5c3Q1RXFmWVFJbkxBbjZYc2JRMEFxUlprQ2NpMW5aZzVaN212ZFVlam96Z3c0M2ZReV9HWHVoU2RoR245NnRFb0JkbXFEOTdBZEs4a2xLMkpLcHFPX09YbERMbnowRVdsSE9KbkxRdElOR1VvYzNkMFp1MWhjRWtmX3F2S1dTaWtBc3N0Tmd5M2R5ZlNFQXlpR1YxRzJBM1pZZnlhUzllVHZ4N25VRzUwdm1uRTVNdHhTMHQtSU1jbjIxYVQxTnVkUXRmNnhyZ1dVWUpkckU0RGktLUdJWVZVU3BkY3IxUUU0NElCUHNrVi1aQTd3d2ppUlFPZ3h4MFJScVNidzkxcEI2N21qckE5SzN2enFwbXl6RGx6UnZtY21JcS1VczJBMUxubEVUS3A5OGF4T29MbFB3MWU2by1QR051WGRBQzBGT24yQ18zTlhEVjljM0tUR2YwTlQxUWg0SG9tcVk1WUd2UEtrc01iWUZwREJDemNIc19RbEFUbERFUEhVa1NGNmtEMHpOZkN0Nk0zUERmSTliTldzM0lHcExleFk4emM5Y1RPR2dkZ1JMeHBPX0Q4WERhMzlEdVNrNFpTc2txOUgza0pYZkhwWnB5R2dDcXNqczVreVFSdzV6NExTNm5LeHA3aFB1dWtLY2k5VTdqNkR2cEFQUjk2RzFPbmQzM1RDc2F2X0xWZ2M3bkdzYnZiRDZtN0t2WWVNQUlLSXd4SmtpcjA2aUZwZ0YyYTh1emR6TlEweEFkNi1fXzRQQ1g0VDdNQ3BmU055ZEtyb1hxTm9sZXZhNFFLYWQ4M2FEMVJrMFFGZVo5VjZ3eXE1YnZ0WVZxTHlfWE05VFYzNUZWZ3NxRUhJeURrTzZJU0psSWN5a0VCNVVwTHBseG9CVmVoYVM2TDBlOFIxVjNPcXdOYXQwV1lreDFDbnhkb19IWkZUTjQ1cVBvUzMyV3JSUFVRbVZfd2pwaXFzU1dJN1FSOXE4TTc0X3RRVXlZRHdkVVFqdVFPZzlJTEFDbnBLU3Y0ZDdjaFZWRmpRbmp5YXhPQl9mdk1OTGoybnVFYzNnOEd3c3E1dEQwX3lfbmVDamhocFlGXzJvSGV0eE1ZUjJXVTF6Qjh3cDZwSjh2VFViT08yZ0FwamZxSWRGeXJjOVFMRFoyazJ2U3FwZjIzZWVxZ3F1QlQxWld2WExKQTB3UUY5R3pfblFraURBT0ZJdDJYWEtfblZvUVZWR1Q1b01ISEtKM1hhUmp5ck80MXl3VENra1Zsa1dQMGI1R1NMYnRJTktzdTN0MVBLaG1fWHZWNmlfNmxiTGxLaVV4LUR4QnFTTmpsbDBEcGJTMkVyempHVHl2eFp0Q3VpN1RKRnY2TUV2YXdKQ2RENExsNFpncUlQdWFsVnVDOGc2UWNJbDNRX3RXTHU1dXhSa2RiMVdyQWZlUk45WGFFLXhiVGxQYTRTdGxtWm55ODhPc3ZNeHllVktSbzk0RE5nOEh5b0xKLUdSMFJST1ltd3piZFJ2X3l1T0JlV2FlR3hlWXd1NU93X0kzRVBieHZtaF9FM014QW03N1V0cnEyYUdqbmJ4XzJ5Q0V4TzJJeW5qX0RjUklxdFp6UHFpUDZlV2Q4UHZwTGx0bG9ONC1wYTF3dm50V3NPSDU0OXp5Q2NOMHRXRWZQMGNmNUtKQWUyNExnWGdJWmdOY2dQMm9odFZiQ3hoMUxCMVFoc3ctNFJZNTk2T05ucGNjRkVhcGI3TEdUd2lpR25KdzN2MjNIQUhCYWtYOThjOFlPZTdCMTI4a2xWTDhzWXBMUTdSdXV2RzhyY2JXWWtlZmlOaTQ3bmQ2QklRVTV1Rm1SVHc4WWQ0X0pVRXNUazBFNWk0QWpWeWNFX21YVmR0bzVOeUZBUS1jZG16cXBBYWJkQ01UdGs2QjFLem9rTFRrRXJIcmg0U1lwc2RRSExSREcxTjJ1a05mN0h1aFZjb2dUUWhWcmhhRGdpZHVrMnRpcDhUM0lJUkw1WWtiYXpQNURBN0JLUFdxUTZrbUl1eHhoTkdxY2NkdUpUSVN3SS1VaURDTVdaMFlOX2dpcS1DbkU4bGhvbHd6NFdtVFU5dFhfbkYyczlKY2tDUWpDTmYwbzNUM3BOLTRyRHlsZ2kxUVJsa2d0QlRNQmtFUWhyazh5emR6NmhWVjIwTnBMRENfTi02b1BhaW50SEpacU9SVHBOQm42eWU5b2ZacGcxOE5xcUFvd2tKT0JxUWEtUDU5dTBlTEI2ZkpxSm5pSjdkbGhBTGRYOWRrbFcxbU5ZZ3Etd09WQVNYcTBEZHdoZVlBTVRxUHI2b25uV2MzVXFkWFVCVlhrM1RCbEQwQ0FvTF9RYm5jcHBjY0wzVkZlTWtqOXI2QmhfVTRGZXpxa3JIRW1PUkxHSkl6TmNDVzN2NEhJNTVqNktvbHQ3dl9MYzFiQ0JEdDhjRkNHQlVhUWRhcWhQRDh3dHB5b2J4YVFaOC1BUEVmTlVlUnl2aHU0cG1QT1BaOFdRaGN0VV91cXpXeTRvSG54M2F3eTN1dmstVmVtTVFSSFZ6ZlNTX216dmxBUEpZMGl1dURhVFVSWGliZGRVNGtVXzhHQVpaS0JROGtSclhVbmxZbFFBZE5HZ3pxbDJpRmVJaldldDhmWkFJaGEzQUNDZEFNSGpYTEI5Vk5WT3NjQnAySUZYVm5wN2t0bWlRRF85OTVEOGFKcWxfcHNBd04wU0pXSE1PM1RCSExDVVFBNDFvUmR0cGczQ3FNVW50NGpZdHcwUWtEZFlMbE9zV3pDbnNqUm9FWFpFME8wS1JGbkJERzRybzdOZVFhSF9zU2U1Umk2S1BKRDBzaG9lZlRPS1BGSGFzSmlnMHA3RGJzeW9XN2tqcGJmX3lGTlNacmZzMkFtRk9fem14T3QyYkxKSVNVNGd5dmhjNWNudWQ3X1o0LWhOTUFZRVBOUjF1UHpEdFpmMVZEVEc1MjF4VXBaRnRYZFVkeTJQUW53Q3J6Y3dGUHprbWlMMHNWcTczTGNvRlppbEUxckNQTmI1cnBOMUtOa1ZtZkk2cUdKSzk5OU1MVmFKdEZvWFdxYVo5OHZCclNHWUozc0Q0b1dwSllFRksxejdUUkpiUXdjUk5YZ3k4QldLUS1jN3pHeWQxVEh6Ml84RG9GV3JiMnpKemxUcnJubmVsN1BrTnJkMDh2YXpHZHFtTnFod2VZdEt0cDk2UUh6Y1ZsUGpTbkpicW5oTmhMV2JYM3IzSVp1X0F5UjFiUEVRUlJValZCcHliczItM2JuOUhYeWhjNmJVdF9Gd19fV2Y3Z2lMVVNmTWltYmNXMDJOeUFWek1IR1F1S3l1d1VtanpwbHZqcnlDSGFqekF6dVJ3aVJRVjR0clpQemdxcDhteUI2ZC0yQmVSZ09BRmUtNkpjNGFTVUhPLWdaRkJMNGNLcTllLXJFZWdMTlhTU3ZnOHVaVXI2QVdGOXhqdTQ3ZHRMUW0xWW8wNGRXMWJ4MVl2YkRwaElubW5pUldMU28tbENmRGxDUmNZYW5DWjFiNmRnMFk0TzYtTFRuSUFqcVVpMUpWajZwS1NNSnRpTUZaZWc2XzM1ajFUM3BtRGJYekppemxiaHpFTHkwNm51dVAzOGJCTmg1RExIX1ZBYUQ1VTlwS2d1TW54Qy1vQVZRRWZ6TzhJZ3NjS05Jc2xTaXk2LXFXbEt1VXFCeFFiZ3lQR2tXeC1TdUxpRFo2RmROakJnNW1RY2c4NDF5VW4zSmlKSTJ6OXdQTTJKTWRtZG9XaFhtMHFnOUZfU3dib2Y2djREVEVlamw3OTU4TjlRazRQb0FaMHRpckhPaTZZMXVRQm5TYjVnRWJvR25NaGNndFdtZHpmYXZCbVlLV0xTY0Z2WXg5VVRucUxhYWNwSDYxUl9jbVpKZ1dTS1p4UHFDbEtyV2doaWh6dTVOWXhMRkhxSDFzX2tGZFBwbjRWNHd3SVlkQXFVVENZSUVQOU5pZElGd0pDRVg4ekxxQkliYjl5Z2Z6Y3N1bjVBa2RFR0VMVGhDWEVuQjFPcmNoOXpyY0lxYXBYNW9uZ3VuYVN1elpYOEc5ZmkwYU14TWdSSHpkeDllZ3lqeWRRSXVvTlJYYTFqWXp4c2dCS1RuU0JpbHpEbXJJZkxnWWoyRG9jU3FHR3Z1X25uQVZ1SXhkanF1TjFmRkM2eS0zM0pyYlF6YlhwNjRuWGZWbjJuV1lpMVRQd1hYSEpHNmVNTUlCMXFFRU1Kd1B2Z3VSQ0dENzJrLUxTX1MwaW9lOExqdUZoSHlBZS1na2s4a0hZQmItcW1naElsaHpOQnZicEJnbl9rdVBjVnVJb2JOMk03c2tnekxRcm5vVXI4WnEyd0VPeVdoXzVYekk0ZGdXZW5DMmpGcGozU1d5dUQ1YkFqcUcwbFJNbjhMeVk2UFZLYmw0bkNtWGZaMjlpRlBSaVFjUEVmYURVODBSamhiMlJkMEJRX0Z2OVJHb0hoMWxEa3pIRjJOdWFDWUpLVjRCUVI0eXR5ZllvSkthWUhoQXhsVllwOEZHTThGMzV1WTJoejBMNEtzUWpDU05VWHlMenpoZkVFcmxJTE1sOU1PblZxcEpMNGVZTktnY2cwQ3FXRHh3NGVTdmRVM1A1RVZIOHRSTFREMFlNOVJqZ1hsdTNib3FZYnI1Sm5TMHc0a2VoNGk0YXR1M01PdE9WY2RRT0VsLXl5VXNHdFN2OC04RUU0UTBMNTRDWXg3bGRpazNvUDR1cXVWWDRPMFVYM1Jfby1Rd1h1SlFfSVlOcnlMM2w3X19oZjdvRXRyUU9WSnpMOWJFZWZhbU5tR2lseTVKZFdBNVd6dmFBa1h5UlFhZFFTVUlNYUQ4dnRIc2xZdlU3cHpQZjZ6a2oyV2FDTHcxWEVFSTBBNWZJc3lYSUgyaTc2ZVJWWkZQUm9hM1ZqQTFSMWFZX3JjUmdqZGw4QUpWMGZXZFBXOEp4dmRKV00wbDZzMmM2Qy01cW1yY2kxR3BIaW9YeTFXXzBiOUJHcExEMzFZOHRBX2dsMl8zc0VnaDJROFNqdmx6UEt3b1NBV2V2NWtFY1l2T2xZcUVkRTNoSHo5QTFCVVRGMWdkYU9TV3UyVXVsRExNVDRaRklBc1ZpakhZUEJ1em5ab2ZSMU14b3d5elZ1ek1NSzlpaGk0dnlvazhpWWw2LTNCZ195TEFuZE1IUnBQbUU2X1BsUU1VTHZsOUJEVDdUVWtnNUNsZWNsaldRYWwtM01Jdy0yRGNMakE4LW13NGREc2ZLck4zcDUwUjRxNHlOXy1mSS1Pb21fS2ZUdElxQ3VVdDdLNWFOMXV5OUxDWXlsbmpRX2kxRTk0bFNfSnFaY2ZBUjl1RXhudkRjSVRZN2N3SzlOYTFJNmZKbGpPYVBRdFNIamVvSE9tNk5JSU83a1VsQUF1akowcjB1NjRYYk9oMzFwM0dUZWxRaVEwMVJwVGJ2b1ptVkloeXFxTVIycFZJTzlkNWcwMlVYVWRVZTgyU19JRWo2a0FMa3hYVUd2R3JzY05VR0hTNGZSX1pVT2prMDEtNk9GWWcwNXVaZ202MGZUTWlvdTBpdkxoalVaSG52ZldDZ0dwTXAyQVR1ejZvWlJ5RTBWT0JieHpXWVFvVk9WOXI0eVRza1p6ZkNfX1oxeW5KUWRZenp5bVR4ckE5cDI4cXpZblo2YlpzYVNDMnZCQmNuN21leXFETjhfZkswNk5rT1RmZHMwNWViTXpVS0pOcFVXWnJVeWdFOWpjNUhpa0tqWFlRNWpWbzAwbzNSMG5QRGlPUEk4OWhxd09Ha3djUnZkVnlqdHAwVG56YlVCWWtpUW55dF9QQ09Lbm1kMDBMcTg5VndGTldRbkdlMmdwWWdpbU9tdFFEeDBFVGtmWV85MHNyVmQ3UDZoTFpGUUtmcHlXekJhOFVmck1UV3JQS0VoWkNYTlQtVU9Qel84SkVPSjFsQjV0QjhUQk81cnZuWk9DS3ZDbHRZQ1RzQTE4S2MyMzhobmdWRW14WS1XZkd3eXV0OWx5eGJlLW9ubXdxVFQyMWlLUTBoVDRhWUxvZmJ4bFdJeUQ2UVRpazdGWElIRl9QYnJwNnpzczJ1VGdyRlM0Zmgtc1Z6R0FjVDRlSFprbW1YbGhTdExYSlBVeFR5Nllna1NtdkM5dUxZakFUaEpNVDRlYmNDNHFOUmxwWFVSUV9aVXBGcU40eTV0R0c0NklST1o3NDNGdXZoMmFsczBhc25INFo1YW91aTAtVEtGWENDVzZwYmMxZDNpd0hVQWM1TUxOWlBES0NlSWVvNXE1OGxIc0NHWTNpNllpdUxqajY0em9MRzFhckprcmFIMHFkVFphZ0RqT2RIcmkzWFh5NVNxWFlHbVA2OEprR1dwemhGNUwyT3NNaHgxUkxKV0pPQTd2N3NtY08tZ2hxdmZMaVJpTDNQTVRrOHJtMkdDTC1RVlJJOHFneFBUWWtDb3R4dDkzWnkyWG5lSDJPT3lLUXR3WWktZVk2ZEpmMUE1a056Q1JmQTJoekVlVlZzMUR4YnRZblRhbktZZEdZUXFUTTJpYTdwSDZwUTF2eEc1U21DMGx4a2t3SkR1MDdmY3dwQko1NHR4UVBxQnlSYjZnYTdwTGNWS3hzNkVNWnQ0X3hDR3c0Y3p0d2Y4YXRWUnU2Z2JYY3NCRHhvZnZ4SzZlUjI5eUZGcjViTzc2LWVUakhzN0pjcWhYOVh0dWhxcG9MVzd3eFA4VG90dnNjMFNLYl9RbC1OS1AweTZxNnVBLUNycE9hZkJkeEF6cTNObWFrUnBXb3BvWkJVOTk1dGNyZjlDQ2NjVEJtbm1YaTVlNGxoN2VCV2pnaWFKcXJQOTgycV9qVkc1RnRhanlpaGZwZEFQZmMyRlZiWHhHajVnTEd6TEY4bTZWeGh3Mm12NDNPR2wwSnZTN05CN1hYeTlZS0J6c3d0SmN3ckFUQXctRjZEM01la1dTSlpSNDN0Z1ZROEZNV0tSSXpJRzNDRm5NV0syWWIxalNMTkdWazRid2wwdE53aFFTOV9yajJOYTlTV1Y1V01oMGUxdi1ZSTRRRTZSdDNTZU1vNTZaX3B5b0YxOUFoU3RaWEdWWi1CalB0eUVWOWh2OENGRzVGaU1PNHphOGl0RTUxQ05KWVJQclp5YVdFWl9hOFlXTWthQ09fWUhXNnc4bmVNOGFXUmR3QlBEOHJJN1ZNM1pWSDE2WTlLaHBOTUVxbmZ6Mm4tempib0liTkIxRzI5bGNSU0FURGdqZ2p0c1JpbHJXMVFnZDRsNk9kNGVyYlAzNXY4Qzh2ZnFqLVhvVEsyc1hYR2ZxNW84ZjVEYk5rdHEtR2s0WFFQMDFZamV2RFcwU2FRbXg3THVCVVk1N1dNbElHSVJYYkxlZDYxVEpoZncxMVdIeWljUnEtYTllMXZCUU9TUGZ6R0RWZzNWd2lhZVE0QVFkZFdVT3NBR3poUlRRSmtJdGllR1B1TFBtZnlMQlBROFlCMFNYRFkydERscjJhaWVEQ3FGNGh6SEMzSFJWdkdjTW9IRGxwSmlOTVc4Q0JpZ3JxOUZEbm9yVGJWNXdZQTB2MEZuaW9PbkVod05EOXZSZHhuN25md0d4bUFDZnJPM2xpejlMNUtzOWpRU0FBTzZIUnlwMEk1aXp4RnhLSFZXTGpRTlplT1EyY3dBdVVXNXB4LVFLWGNudDhZYlJzQ1dBRTZXTEhXWHpWRnJPTTdnZEhfeGQzTW5wa2tac3NQd2R1cldiQmpoN19pLVdYN1NobGVKMTk2ejEyamRfV0FiZHFnZkpJb1cwTFd2aW5xOVE0ZnZwNkpvUk9nTDdOb0ZuRUhLQ2hjMlRKbFVBeGdtalB5WEpTOFlQQ2EtYk0yMjVYaERSYm5vUTN4RUNOeVRmLUNZb29vUGpwUWpVcFZPVXlUQWV2clBzV0piTGV2ZUJ4MjQtMk1ESWEzeXZxUFNTMUJYWWU2M2ctRmpCVng1SEUyR29lOUJucXQwVGFmMWktdkxvS1R0MndMdzhnai1wMEhZUW0wQjliWjNDMDl4TXE4UXNZZEFFeTlsRUJWZXpjdTdQcUlLdVMxd2pydDZDWThKZVhQX1d6WVgwdGpLM1FlQTZEQ202VmUxU0lodmVFaGNjM0JzRTBXUE1MbGtvQ0hMS2xlUnJPN09kRHUwa3k4STZ3QWswRGU2endnSXdiRmMwdU9IMlZWaWRuc1hHdlhFQ1pvNUFXUFBMUGJGS2l2OHc0ZVVXTFJiSUNBZll2NFRyUW1zdHRpWG9MT3JveXdlSkZkUjdMSjR3djhLeWg4OVpGcDA1ZGNmc3lpdFZyeTNtTGROTUVLdUF6bVR5T1FjRWJ5Tm9qR2pyd2d4WWdEeHlERXFFYno5dkFMaEhvWHQ4TThkcjBnajVmWDdDRDVJalQ3VUg4WW55cmlkMzlnZV80eEFDWjRmTmRNU0tIYktGYTloVUZYanRqQ3VMc1ZudUJxVFNRR0g3WUtFSjdEZHFNQzFzMWpXclIyc0JidHhuUHdJY1ZmOTY2Ny1nbk1FWmowNkVYWlRMNi1CTU1TQVVZV1dJU1hYV1pmbzZzREZPa19FNzZ0b0tUb3RzVm5iZ01VckVGN3pHQkljRFYyOEZrNkw5dnFHbk0xZXpjWUVtYWgtZ2hFeFJsalRYREpaR0FJWnhSVU4tNFpwN0ZlLWFYdVlBNkpVOUVYcDZ5SjdwZVItMkdieXlCeVJ2X3BWOGx4bWRJR3Y1WmZ5WlVvZHJnUzJ6YUdTZHFBcFFNMHdFN05ueGNIQW5sdzMtcXNtaFVSZkZPa1BGcVVsbVRxbWFlZFF1Nlc2dC04dGhwUDM0MlFDdy16QlR6dkwyUG5OYVdZMms5SkhNdnVDcFN5d1FiTHctMHBscXduMEVQNnlyN0tLcXNpbnh6alZuVjZlVndrODJmNmpxdkpOQTNvYVlwVEZ0OUhwRVhscFZGY2tVNTZXOXZvcG5YdzRGWE84Skp6c25fWmVCUGROWWlDbHByRVJfV0tUbEFzY2Z4U19YRXEyZXNsTm9zWXZ0UHpvNGhZVFB6N3NDZWFZWS1Xbm1sZ3pTZkZYYkJuSWNwRWRYV2I4ejJTM1ctUG5sTE1QV3BjYk5WeXBHc3NmM1laTGFWRndhZC1ET1ZkWGNqeWhTbmVmVGdHZk4zUnV1aHlyUTU3RDQ4VWdwWURKNjhXcjE3dElvd3NLOVlnVlozcnlrbXEydFppVXRDSk53bEF3VG9OZXhnUi1RMUFrS3VmVU5QSEZhSW1ZYUR2SlJpSUw0SE5nd0xwd0FmeXVxc2k4Z3U5d21ZM0IwLW1temdHYkZuZ2l4V1dqdk9PMFplRlZ0UWZ5Qk9aYzlLSE56cXBMUDJKNFFIMG92WE51MWRzZU9IeV96bERvREdJZEFmd0ROVDVTdzRnWGdkTVpfVTJ3M0JUaGJVcVFRYXF4VGowZ0IzMnM3cmpveUI0TTNnWFR0V3VibURoRHBxdzU3eWVvb3RNdElNSGtRU1NDWGlLVlFKdkxobGxINkRwdl9tWTRYYUROSWMzaUNzV0kxVm1MbkZFTVo0N1QxakxaWFlYQ2traFhlclRacjg2bHM4WWxqR1NUV0pPbUhxa3RIS2RubkRkaW5aSFVuMTVzS0JHdkpmVG1JclJ4QV9falRVYTFiTzNjczR0XzBZRE1mTXhMTzAydzhUamtHeE5NdDljbXpMa05CT2JtUXZzUkJiRHFzY0V2dFZSZ2dlX25FOHZ2WFhNZ2dIRkQxTVVqelVVdU54NDZ6VTd0YVV1RWdfelJyZG1RQTUxeE85akJOd1Z0UkhNSkowTnhOaVAwU0VXWWxMOERydDc2R1pudHdtamdiNVdJS2JJTlNDUGpscGFqTGx4bmFURFNnUE1WQmc3Q2wtYXJ4LTAwYmozVm5VSmtqejF4eUlwaWZDWDlxeThrWEpwQ2NfWHA5eDFaRDlURjV6VV9XTjJpU2ZpODV1anpySVg5RDJYWTFoaE16bmFTTDc1RE12a0J1UFpfX0NCaWFjcWp2cXJWLUxHdDJKeU5sX1RRT3dDRFhLU1dZOTRmRFBLbmZOaXVFSzRLeGRxUHhxZXkzUVlkMGpYOGN5TmNER083ZXAxVEFxX1FmcHhhcm9kT0FjZXo0QU5kLS1ldnpUX2dqWnB2ZVNQY1JxU1pFYzNVLUhXTjluQ2U0R3ZRNkVMMWhaZV9kbnRDeEQ1MUdncVNCc0JJdDJpdzkwbXgtS0tpQm5obDdseldyVEVNYkF0VUk3UWlreHMxaUh6Vk5oV2tlbFM1eFRicTJtME1QRU5PaXUtWjV1VzBILVZESUQ4OFdXUE9EcG15RUtFT2VjRmFPMVZHVk5YTjhPV3lNay1fNDdESnV2NVQxbDZWTWQ3SzZxSnpiRWR4cWloWkJOME9LZEdpN1RqMnJvcUFQU2ppUG1oUzdZVWtWbGFzYU9XLU5JUTh2NTlCZ25aU3duZXZfSDZxSjhna0plV2xoRjUzUlVBTEhfQVI4UlNtMjZzdndzczdSRy0yaEdmR2ZLTFI3cGdieGpaWXkyQjZvZUNoTnlleUVSTzMwR3pBX2FNdlVfR1NvTjU2RWhUR2U4NEU5VE9TY3dhekVNY0s4MmhPTmNJdGhSM3p6SzRlUFRBbjlfNFBqVFhCRC1KTEpMVVBGcTRMUl9jdnRwb0N5VjBoYU8tMzhYNE93RFR2bGJvVno0WGdaeUFvZ1BzZG5IS3JZX1lNczZqS0FQb0RuWTRlcjBKZTNMeTJ0cnBYQVA1MFlWeWp6X3A1bVpSYzVhLUVzVWVfb2NZOFBzcXNqN3IwNFlPUGxEc3AwWktBUVJ6NUhZOVljUWFuU0I3QUNaVHdfWnFQQ0tZMkJNU1NCUnhrVC1IVlh2VU0zXzJLZE5jUFdIRjJyeGNBbXoyUDc5Vzhobi1lQnE4ajJTd2ZNMUJ0UWJIQXBIT1hkdGJOSC1IU05wOTM3Nzl4ZE9CczFHOHl5NUU3a2k4dEZvV0l5QnZZdXB1bngyQ1l3QkFzUmFFeHFnUUVIZVZfSTdlTDF5WGpvSHVWSXJZNTFTbEpCY2doSUd6cTdnNUEyNnhvN1VjQ2ZHaDBTXzRSd3czYlFhRDZjb1pNa3FxMXZteW5uZVF1M0FubzZGczU0ZDRwS29HdkNqdXVIdjRmTTJkVnkyRlJLQWw4alR2cDFSNTlKY3BkQ2tjekVrdkxETVhUdjdUZ1FySEJrZGdYQ3Z0RVBUSEtNei1xdEVWUk1TckxHdFNSODRtdV9ORGJJTC1CVDk5SXllWWNJWmtZWlluc2pVay13bWxYOGhyM29tdFZqWVUtU1M5SURUVkVWV3F0Q2NJdGxveEVsc1hrWW9CemxEVFhCRE4zZE1IMXY4b0pkNDN6Y1plNy1QcnFtdmlDZjRsUU1QbDhaekZkdjctNzJBU1dKWDRabmFaYnBza1NqZGZtcHJhV0piZkc1MHU2amZNcFZBaVdCVUM1OTQ3ZEpNMmlMV01NUTctT3hsV2RPOVh6SVpUWTlDQ3FkbndwQVBIZFp4N2Njd0R1QVZnc0dsbWd6N0xqT1pjMlMzTmNWRHdZUkM1UGZrR1N2R1lPeExsaExxQTNSMlk0d2pURlVHeTVTYmxYeklvMV9QSlphcWFFZGZrb21wdGdiX04xVDBQbU1qb01jaFFGRmNva3R1MFhxUDdMZzF3dk5YNW1QamYtSXNtMXpuMkxwYkJleWcxdVZhQ1ZnQUhvQXJvQVRGVlNXWTU2SWY5d3UxOXhwamw0ZWNzd3VNY0VuWFMzYmtTVWJlYlFKbWxDZHJEUm1KbFh3cVRxSElVUXNDLUtKUms0R05vZ1h1V2tVNnZfVE5lSFFnUmxiS3NqSWVuelFYc0VGZHEzWnIzTThuYmw1Z0Z6eF83c3l3ZUdlWDVKemhmUHBkbHp6ZVg2QU94V212S1dMWm9WMm1OczFGTE4yTkxPbHVYVF9XWVM3aktGaTZLLUlIUGU2OVQ1M1UxOTJaZEVrbWlDVnp5cGhYZmN0NmdhU3lVTU5CY1lWckQzVWJUNWdCazhIRTJER2xOQXg3U2d4QnNiOFRMdzJ3Z2N6M0kwLWZ3UUVKMllNbkZZRDd6cV9GNFliYUJvWVEweHB1SW1uazNwOU4wdkV0QWdMb0FHaE1BTjJWNEhldFNXYUpkc3BLZlFqT3ZBblBYNG1xZnBWSVpQZngwQUJBX2xXblF5UFF2aFBpVjAxVTBFamtjdFZ4ZFhjREc4cFNXQkRJemRrb0hGX1JMWnhHZDgxeWVodWJENUU2SkhqVllveEVtTjlaek9rQkpVaFVrczdJTTNicVl3VWpZWU1yUHRsWkhvUk1RXzNYMm9RY2tFMFdpTmdYQlVSeEZnN29oUWFyYURMQ2FCWVFVczFKeVpCajB5MmNPR184UmRaNzNFSXh0WDcwTjdwZGpjRU1yZG5MZ2g5Qm1MeklfUmh4b0duSDJiTWZnbFVoaEpKWVd2MmNaMGVqMG0wblYtcnJsa2hMV0hycGJDbGk0R2FwSkpTcVhYNE9PM1FfSmlxVXVXY0d5c2F2eHpuM2g4djhrbXFQVmJWS0JUVTIzX2FNcjN6dm91V2M5VFVIOFVDOXVONURqdVZRQ2U0SmtGX1d5WXk4YTBjTEhWOWR5Wkk1UkhYSGpMWVVvTW8wRWpicWkxQVViU1lNTmZ6OGdoQU5LbVlFSExkbDQ2Zk5FZW9mME1aVTFRb1ZpRUJqbnBTN09sTWh4NDgwTU1iNFFwQno2UHREYWFnMjlFY05xMWZiYTRUeHBnRTFoN3NHZEVTSEQ5Rk1CUzNrVjJMTjlkRHc1VDhReTVndGdObEpySnZhSnVxdm9xLW5DTV8zcERQb29VMGdGVzNQOUVDYWRfekhUQmFpLWFBTG9BN3hKQWdiV0pwdFk2eEt1LU84QURTZWRFRDh4dElqQXNoRDJnVUlWTF9HRWI0SklYUldlU2ZmYUZvcVRJVUpsbEd6bXB0UXZXaXppSFdsSGZub3lnSXNtQ2N0R09aT0M1RGRjTGRTbE9CRUJDMVQtQWxMQU5mNWNjNjJQVjFhYnBOZ3l4dTVhRnRwUEFoSkpwaUFYZllaR1U0dl95aUZ0aWdWQkRUOFVZREFkSFFPVmp5TEhfWS1XOTlCbFk0NzEzQXBDc19iVnJ5a2N0a1lSNUlHaEFCSDl2M3padnIya3JRby0zYk52QnVrcGxEYmk1WTJHc3dtNHZWUjlmMUR2MV9vNTl0VWxxQjVYQWhZMDgwbHZnNXFPczk0bXpwSTZOeDNNWmZpQktfaUg4bnR1UlhDRjN6QTktQXRERjFzR1VnR1JHWjRIbFZGMGVEcWh0elVDZ3NwVVNxbjZMNVhfT3licFZKTGgzRWphckJZYWZua2RJZ3R2Mk42ZHJIR3h5bEdmZ1NYaDZzUlJfX1FtNG11Z19zLW1neEdBWmRUWEhGTlV5ZU1fR1NCUnF5SmFTU21QWmZ4SXVnUmhNb2pRb3Jvc3NmWUgxajBITENDdVZjUjg3UG84OUl5UHlUWGtKLXZoeDhLcUpFTzQzbTNOOVFZN0ROdTgycXZHc0xZSl9CZ3JqUWlkRVNoWDRFa2szOF82TWFlSGtVLXYwWlJBcmE5RjJ5WHgzczF4c2tjRjlwMTdwRE5QczlTS3ctMURIZUI5UVVCMTFSeXA2N1NHYlZQd3pSUWF2T3ZtSmtzOE5JdzNfUjE5RjVnNlpEVjZwdjduRkZQNGhkV0FwQUd1S0NRZmlCQVNIaEl0MkRBV1dkQ3cyY2VtQm1jc25kQUtOaURHRk9jZWRrUC1UeHl6aEE4Y3k2WTZMaDFyU0hZTVFUdlRGSzZGU0dJZjBFUVFhVDFiYTJPMTA1TkxFaXZ2bUJRMWljSDNDcXZrOWNzbzhUVDg1dmRXdFRQNXo2UHBpU1pNbm41akdXSFE2U19fNEZFcTY1dGp2dzBPV2VqN1hiWW9WZjF3OVRWM2xlT3lod2tkUjFXLVllcWMxcXgzdWNseFRnNDI0ZFMwUjNGTnVVbGZlSVMxS1dBVTJSS2p5czZBamY4d3cxNzBYMGVyemx0ODJ5TG84SlgzX0VGM1VmUWlIMURsYlE0enpRdndFekY2aDdXc3FWMGphSnE2Q0ZBbzZDVGNiRlhCaTVYSUkzM0x6MmUwWnFsZGp5TjhtWnBIV2N1eDhmRGtaSG1rc2dLOUpnWG43QllSaHlja3Mwc0wyVGpINTYtbk0zRHhuMEJ2YWVpNVREOHFhVGdmZzRZMnkzQzg0M3QzRE82TVdFVm9lOUthN2lqS21GNVREc0JjNWVOSEpoNFFkMm5XTUNVeGNtMFJIbGFhc1EzeUFXczA2NFhGVGs3V1VEakFOd0I5ZTMtdDRBN2hGZm5abmVkRVhteUEyeUUzLWRGNWdDbWtvWjBJdXAwWnp0RDR6VnBkU1NwaG9tWnVZaElKTmtqbHZSekRQQXZFSXgzNnN4TERLX05FM05KbGdWcW5OT0NPX3hSX1FnblRrNWVYclJTMkhSREtoSmVuOUs4b2ExZl9ZaTdnSmNvci1BRWhyZ1JOOXVIRGJDVGRIOWxNMzZvVUk2NG1YeGxna3A3U1lqdUdKMjZWbXVRdXh2bjFvSkZPOGdXSWV2SEZyNWZDc0xaUlN1bHByUjFWQWxUMTFocEllYThnVmg1VDZYQWJhN1FLTzZ1WHdpUHAzUm5wSVlFSmY4U2J0cnBuUjFSUGk5Zm93ZnIwYUdVWUtyTnBKTlpXNEoyN0l5ZnJwSTFzdmRtanNWbUdLWmpTNzJ2UDhGZncydlpiNnRYQkVPMDlBcmNUenJDLUItWko2cmQwc1c3Vi1meFctdzFsM0NhWXhqbUpvSXpOR0liVWxJRXVjZ1FCTW9LdkFDUF9QZzVVRVJ0UTlJTm11NTYweTdxNEpJdWpXYW9YM3lyYm1kRmdaU3RqY3YtR2dWMk5wWFJSS0I0bDNxSUhnVVBqdFNYTmpSUGRXSmlmeUNkQzY0VHhvY196eTJrWkZDQlVaMlBLUnhhdU1RUlcxSVpUaThwLWNpenNFSGxqZDF5c2hndVlBVWNRN0RkSmdOeVNoWjJpUVlmSE14Um5sQWxHRGlVNlJiYUllLS1rZHdfQUV4ZE9TamtRYldTanlRLVliZVI3UTc1d0xlTDg2T2hNSG5QS3VBYWxxQjdSdDlBOVhCcjM3aFc3cUpEeG1mRGhaR2pKeU14ZktNaEJoek0tTzFKWWZwaE1NTUpZcUxtQV9pQmFDeVdQSnB4U0VhV0dRRS1ETThmdDFtSjdUYkZCYjVhM1JKdHZDdEFYV2psMDBGWEEwQTBmdFBPd1cyWm5jVTRPb092QWRXMHBkbHcyM0NxUkdzbnp3SkxXempEX2xFTkk4eG50Mmg1TEFqdjR3RFpnd3Z5ZUc2ZnhNQ0hMMldMWGVubTFqMndvWU1QNDloblE2bmNTcFdIcmloM2R5d095cmY1R0FBVWZvUlNfWFJUT2ZpVzRyazRHeFNBbm9FaWl1bElvOEZ4OHdJckpOQlFHdnBrUTNBOTVHZE9yaXVwbjBvdU51U3FBdXJvOUZWVXJZUEMtOVJlUU5ycDNCRzMzZ0c5d0YzbzVMODFXcEluUWdjTWk5eXQtcU1Qcy1OdlB0UXZkRFFpUEN0dTFDQ0NfNFloT0pTODAwTmdtazFoVGRqdFc5Z1BsX2NaaGhYZjdLaUl5cEFqZFI0eGdfaDN0RDBGRE91b2Fld3M1Z0Z3RHFHZFZvdWo5WG50dklrX05JWGtWaS1xeHQ3bVUtd2R6N1JfQVBIUTEtSzhvOXNHa215SklMaGNiYjdZZ0huNEZ5N2piSjNIZmJydHAwX3ZObnM0VEwwenhWcGJhVWZGOEwyV1FMVWRrN1RrLUw4a3NHVTNUZG1iVmpRd1NSMlQ1R044bHJWd1loM1RtbjRlSUxob1VUMVBFRXppSjZPRkRSYUJNMTMtcG5tTVVSeEJWNkdGNjdMX0VUSEtYUGcxZ2IwNXJHdGZiZjVrYVRYTkYwUzJQckFzdUw4eWc4N0RUc1pTOEFjWUxYNlc1czZXOWRSdXh4bDdjY1p0MmkxcElDWm9WWVZtZndQS0QyYzZiaDZZcHRuanBqWnZzb3g2UkRyTUhYSG12NU93b2xyaUdHaHg0TEVMQ241MDZIcWxEUWgxbVlKYUVDMDZ3cUNpMWstZHhubE41T0FJWE9acDVnWmlpMGhZTzZ6YmQyN1Bfdm11Y1lNYXNJcXZGdGZTZFp5Q3dMamFoNTNEekUtSVJRdGdibjIxVUpKeFd2TWVxUzBfb3FCRnp1UDFQZ0dhcXJMOUlMWldmekJEaHZ1YTBYajl4c0RheEtuSzMzdk04TXZKZlpiUmVYdlN3NlpLUkhIV2lXNlN1Q0w5bHVUbnJ4X055cGpJR3J2SVFRVTM1UU0ya29CVXdXSmxCVXM5T2pGcjRoQWtYSF9nT2ZBVEt0c2hLTFpGT0ZocVNQSURJVFI2c0N4Qkl3a0ZFWW9DYkhqUnkwSzBaS09GdE9qZGF5b3RLUHJGWkZpMVI4Tm5oMEVtdFNyMHBWNDN5bE0zZ2M1ODJjaC1lM3ZTOC1uWS1XNEVDZGdiQkFPeFRSaGw1WUd4akllZTNYS09oQXRUU0g0a0Zfa0VYTHB1WTFWZ0VKTjBIRl8weFFRR2VnbmYxZE5YQk84WC1CS0RpVWJnSk16NDI0bjJ2S3d3UzlIck1WdGRJendsWlhQVWJvQWlCTkwxNjkweldSaHoyN3RLbG5kZDZnOFpzLU1iX0VaOWtaQTRFSFV0OThsWUJaOExDT2l6akN2Q0ttLWJYRy00QlgwOEJqd3VpbFFicXYyS1N6NU1xRGYza21VY0c0VGtEcDNlbXZoSmoyemlUWHkwdjRWLW5UalI3MnJQNVU2RVd4VXR4UjlsdV9jcFVfNTFZbUZqbU1JR0RWMlZ4X1BTQXB0LVZ2X0Q5SzkzZDFRMFQ2d19MOVcyRUNYaVpwS1k2ei1TelNzX1RxTjc4c3hYWldXamt2UlJpRC1yWEYzbGhMQlpsRGNaZnhRYlBhRk9YYkJpcWQ2QjRNWk1zbGNfaE9JdjR0NzE0RnF5cHlBeHJZR0ZPSXFHbExjZm1jVUZXV2J1Z2lIOFdsMHVXU1d5Qm04cjFvM01kVHE3ZERkaHBKRUVOMEZLNTlRUVdSazg2dVNFYThESklDZURwd0s3bmdJR2pxM0x1VzJrMkZ3dlpzb0Rwb0twUTlFMkRjTGhYalEyTnBWNEUtNFJjYlNVWXo3RTdkWmxrSDRTQ2MwakZ0eVRiS1dhaGdpcjZYNFQ2SWNxOGtCQlZrTTJ2TUdCYy14RzJtWk9EdG1NT2JjVUN5dVhnVHVwZUw1d200R3AtY3NxNVNEMlUtenk5ckN2MC1wYnBHVmVvaDliQnZ0U1hKc2hydzNnakxVcy1ybmY2RW1jT0xmUE9hcU52ZHpIOXo0QTljdTZQQnhhTHEzTDFtYlJwU1lOY0x4X0dvY1pKSmc2WUpsWkJDdkowZ0lxRFl4TEhJazYyejk4OHBUSVZPbl9lZUI0QURzaFJRT1dROEQwV1hNWnlsWkZ5MXFjbE9LY1huYjZ3YkZzMVh2M0t2RTU4dHFubS1uSkp4bFBSMVRvNDY0SlBibG9qRzZRcHlwQzdVZnBzVVRZMHZLeU9jVDIzVm1GUUJNZFJzVUZvUWhlY215dkViR2lSWE9rWFMxQXpBUXV4eFgxX05aODhwaGhjSTZ4OWFWbzdFRlozajFJel92eFNoUEYtRVRSeDdWdFZMVDFPeDRVVjdxSkVUck1kQTNFeUR0cFBVQlYyYXVFWkd1djJzdmJQRUxLN1hNMXZJWTVYb2YtMkl5SmtvQW5CSk8yS3JCMERYSkh6NXV6cXIwQWdVTGVNTVZJVkkzSTMyb2tid3hGWEI2YkxmVG93VndubDBfbG9JQ1JuYWtBWG5KUmxUZENSMVRISVMyakphWWM4RnJLUzFVMVBWZjlpXzMyZzlsd0p1UkZFcWc2OXF5WlJaSVJEdE80T1Vrc0puN2luSllZbzAxVDZlYjZzTG5UUDJJQkllRURmdUlkMlVqYnpWR0k4TWVfaVRtR19KZkx2OFR0Rk9TeGo4cG5xZ19kc3Ywd1BldTdyTGZicHF5MnhmdmVTODF6R0MyZHU1QkpFUzRVLVpLaVQzeXlYcHdJVlNNb2N5REVTeHk5UnpkRGhOR3pnX3Q4TWxiRlp1blBmTDAxa1NTT1V3NEFxNUFUWVlxQzJWUnhENy05cnhiM0JCLWVqZlpfbXFFdkVZTWhtbUNPRXNXTzZYNG8zVnZZcDNOdlNGSU03V1piY3JwUENIdmdoSldjblBSVDFXM2FxZzNFc2JKbC1qSHpqWWpNZjh6VmowWV9HY1p6dGV6M1JRVGVQTVhuZHhsNWlTZ2dXRm1RRERDVVhWTFprZGJETE1aUjd0dXcwSGstMjk1RUdxeVduQmNXRUxLOVMxQ3ZvZ096X0dvaExTcUpBQnoxU0w2bVZWS1Z4cFR2Wm1UVm1TbWZqcmJoQ01NaGdtdXg1dFY4Ymg0X19tc04tMm9MYjRZNlYyWTRqdGZlUWJFdUhocm5ldTQ5Y3c4aEdoLXBGcUxZa1djOW8tQ3RSWGVVYVppbktrR3Q4SDFXQVVfUTVEMGl3TEsxSTRrUjQwUWx0ek14WlAySHNhak5JTHFWMVp5Wld4by1kZ1hnMUFYZ3RtN3hSWVJ5N09zb2twY2trRFUwelY4QlAwdkgteUpXZnFpSU52RXEyOHloZ3VoTzBRZkhHamE1MDNXWXFWaUgtbzhONDBjeW4yYWZuR01rNVV4QXB4MzBKaGYtbnVFekNYN2VhVWppaXl2c0xQWk11OUtSbDI3ZjdublMyTzlVUlVuSFhFQ1h3UTFPbUliYTZheWVQaS1rVFNhRlRyQ3Y5b3k4Smk4SlR6V0I5czU2bkhsbElKSU5XWE41NEt0MU5HVWREeVJxZDU2aHZkZWJvazQ5NEw1ZUxDa1Rqb2dpdXpMZEdFZkVLNllDekhhSVRrRG5FYlJfRjY0anlfZFNFeWdtSjBOWlJUYUo5UnFNeW1jelZmaFF6X2V1X1RZYlljNXpPOW9wYmxaYjJjOTRBdGhPanJwMExnVzhIQ2FPSndSUTN2eldQS0lLZklWdUpLZXRnTGU0Q2NvREV4VHlyNGN3THc0RGRHdGdrZmlMZlpqbFd5MS1qLTBqT0wtejVFYTVTMEF4anpHZ2ltUVlNOWpVaU9xcGdfR2tHTVVZNzQtMFYwTHJFdHpMM1lubEJXX3MtQkNvaVQzZnN2OXBGajFFZ3RSYVJhSDh3OW9XWEpnM2U3eldpTGxCUy1TVnlOU0F5eVFmY2VzZW04T1ByS1NodkNsclZwcEstR0tPc2V4cEdzR3loUk5pNTBKVWlLOFlNaEVsQ0UweHdEcEItY2E5NHBBZVIzOVZGT3RYNi0yRU9aZnRQNzJFcFdPdGdVZmpJT2YzVC1TQ2Z3SlpKT29kNm5uMnZXVlJZdENGaG8tSDN2cWdISE9FajctT1I3UVc5aERDVWI1OWRJdTVPX1ZjVlBhMXE4ZTJ3cmdUYnpuejNObWxvZDR1TlVxbWp1RHJJXzZzTHNxVWVXWXJUQ3N1WUZqWWRueXJxX0pMaVpLUVpwOUFuZS1ZVTY2bHFFT0hzVkNmX2h1VzJNdTZ5UHZaV1dJLVZCcV94N095RHA0dkU2TWd6SWVSVGZQamRfaFMxcS1BY3Znb2EzaWF1b0JMT0JyYzhhaU9CeHZZTU5uQk45bmZBdTFZeVc3UEhYVzg4TDNiQ1pXTG4xMHFTOXBIWFVyT1lLUjV4X1BzWWpjeHl4aVRBSDFFemxCd0NxNGdKQ3NhbWRkbS1OUTFPcE9EM095UzFRRTg5SXZlQnFva2tEQndtdDgtVFZaQlBXSklrRlVQN3dnZHdCckZNclJQekc1UW1Bckw3eW1YLWd4X05zSkw4QTBCeWc1Y0dJYmtQSG9PZVFoejBvRHRqdGI4YUhYcVRvNTBPbl9jb3FOa05rQlRtdmlNdFBTR1ZXcGVJZnBqQjVNbWFaUW84Nk5IZXlHb1AydkpuYkhGTlNFaXkwM09zb1ZORUNSTFR0QTN4X1c1ZjNPTG9ITmowUlpkY0lFaHdKNHJKRW9yZmFEQkN1cV9VdHdmVDNnOWNCSWI4MTVRZVRaY1Q1eGpfLVZ0UVROQUR3WldXT2NEdllrOGN5RXRhQ2ZwVm9jeHAtamZ1Ri0xamhUaDc3MUxfalJUeGJMNTVXblNsbHZOdmNwbzV1Y0puVjlyWnl0M0J5S2RUZDE4NVI3V1BKT3Y4MmU5NjhwVWNxMlJQaFY0X1lUckJrTjJ1eGE2N0lfNjZmdFdQSTJMVGlObjJlYTQySEh6a3RiWm9uSG1lS3JSNUYxOFNvNFlLNEx0dUZxUVpnak5DS0tWM3Y4Z1VPMms4b0Jpanl2XzFOQVh6VDV6U2MtUnBvakIzZ09EeGFKYzczUUNEYnhTSklsX29XY2M3MHZfTGhNSVNJaWt2bGNoUUNVM0tVdi04cHFVRmpwcU1rVDFDUFJtUmFMU3pVeExfQlBpa2o0QjE0RVlHZXBpWGZ3bTZQN05RRllMdXNkaVlMTUNNalBhZ1h6WnAyLUFJNk9NTExYbnJqVWZTOEhnakxCbmZEeV9VMFlqV1hZR3puLWJvMWFtOVFJWHV1MjFwRHQ2Uk5ibzBjM2VybWZ0bVdlVERCQVI5enNJMFBjRmQ1XzR2Y05NdmhSOXZqdlhFMjVlaExLVWMwSjlkTk5IYnV5d3RPTGNlRjVNdDRON2J6SHBRSTNfUEtnbWlDNEM0WEcxNGpQN0dzNl8yTmNTYUk0aHZLNGVmWmpnN2ZzMTNzblZfSksyTmVOb0RJV0ZLTEQ4LW56RTFMdDZUUTExUjZZM25LZi1qcnRwY21TSzR5UV9yb0tHaFJTZmd4UWcwMWI3dTRGcVhnMkN2UXZ0YlJoQ3dSUGcxWUJPWFN1dGYxWHBFVWREdTU2aGozYnBoR1ZkUVZsWDY5c0FQXzZSXy1WUFdWY1pLdGd5cGx1WVVDRXhKYnVLZ1lrelRBLXRaRFl5OC1MUWVYZWJFNVp2WlBvemVCU0IyMUNTbXVfWDJGV2xCSXpSX0xfd2xzQV9CYzd4QlBKSDdwQmRsa3hvTmZtYW1tSnNmT1d6cVhsT1ltMHZPOEdLZFRoeU5ybi1ieXBFckhPcXhPTXJUck5SeWVQbnhFNHIzdkVwc0Q4Tm5LZkVERGZiMlNUOXhOcHliZXlBejllcFBsZkZaZmNFOTBZLWZPeTF5UzEzeUxqZUd2a255ZkQ0N3kzSmZwdnBBVEwwTmoyZkJxOU9kWDljOVlubXEyaDB0WTFoU1lDNERNRnJVNUJzOFN1Mk1PMEdUSkZyOEJqYzJyU19sc3BFYUEzdUxZU3NBVWF6UVZ3SG9wWTFBOWxEYzhxamdGU0gzZ3R5NHl1SjNuXzY2Z2pEdlNVTlhNRmFDUHFPTHdFZ0FJRHpDQWJxenJ2T0E0TUxiNUE0Njl4YnVZUGxyc19XSWZVaEZEMXJXMm5sLUIxRWZMQjJwX0d5c2dmX3dnSDJlOEFQTC16VU1wSWt0RG1kOFFSZmVubzR0OTU4ZXZsdVFKR2E3MWdMSXRYbGpfU3E2OXRqZWRQbUhzNHNaWFJPaXVPajVuckc5TVZneXl5X3JlMG4xbG5CLUc5NjRNWEt2dHY0LXI2UzFmSXlSYWxNZTFOcUFKODJLbFFGa0tyYm0zUlZldTRIZFlQWEN0alBfN2taZno3WnZaZWM0ck92b19GeHpOdE5uZkNvU21kaEVieGdTU2FxWVJWeVVXUEhMU3BxUkNRVEdVbnBpNWpMMnJKVnNublFvSkNZbXMteno3VzhKVGxTY01veTU4djhvQUtnRXc4SERVdWVPaUkyZnN4MjROOW4tcl9jQjgyUlI2MERlVmhNSzBadXVLbG52NGNkRkhiMTFuSzVDT3NRZmtKTFN3a1ZpZUlYbEJjOTNGcThBWTc4dGQycDNmek01TGlaNnFhU3JXM2w5RnBuaUVWdmJuekhfeDlyU0JaYlphdTdIdzNrc044NURQT05FaU5kZUtHWGR5QU9pSVlTeEpPM2hyUk1iQWtWd0ttbzc4U3FRRU5ORE9aaXZIclJFRkthb3VpaDZSc1Z4ajBOUWhWNHhQWnNybXRGX0JMSi13SUY1Q1VWOGJWbVktRy00ZFdaOFFXbmRzRmpfdmpJZjNVWHZDWGdTbjlwcXMtYnoyNG1DUDVseDhIbmxPX19RUVo1SmotenhFSURGUEpkV0dXY0E5d0JNLXpoYnByazdyOEFGVEZ5UFVXSVJiV1hpeV9rQ09UeDhmd0FsUk9lNElFbGVuRTZxNW1BY1FGUlZQMVYtQzZPUGxzY0xidjlKYnpFUERVTTlMT0FHMnRoUDRrdnkwX3hpblY1X3gxWlAwN3U0dWVLYzdESkV5NkdSb3VZd0hkVy14YWhZT0p4OHUyQ1MzUDFHWW5zaU1GZi1URTRPZDhpMU5YT29LdVdZOVVSV04tdDFsTjB4RmhOcEFRX0VubFQ2SXZ4d3JtRmtINXJTWTU3VGo0STVEdURXX2JQdVFBcTZ1dHNiRVYxOHVGSnZyZ1hFY0VMbzJnXzVHcUNMdU8xUXY2R1ZmYWJ6SHNUbnltd1dPVUY0X3NkZUpucTJoUThUemVyLVRLN2JrUy1hZXRfem0yUmdBVkQwZnFjWEFVSGdNTko4Z29iOEVUWkdfUXMwSjBnOTRsc0p4cDlSd25NX3kzT1JOR3pFa2Vzc242VVZyQlFwcHlKQjQwRzk1MGJqeUg0VmRWRFhxWDBSekVRX1U5VFo5RGhHVWx5dklPdmNrUTFtWVRSbzZNTGhmYkNpemZBLWxVak5WMklYSU5nUFNfV2ZFRTBkeXZLMktNMlF2Ujl6em14XzlYLVlmNlNZT2N3SFBVbWVEQjJQeTM4SUhOZTZCc3JFc3VNZUFraFF1bmRES05OSlZ3SnZLNGVXY2gxeF8tczRMU21QSHBLUDM2eFpjWDhMRkk2d0J4ZVoxazFpU2Y4cDFtajBLXzJHOGJELU1mN2dISWwzWTUxbWpGM3kxQWZUSVF6TzBiS3NjVUNLX2tRdElLSjVaM1ZGV0lVVGdaQlZzbmpkZUtkc2dfNXNEbldrWkQ0MF9FQWE2VzRCdnpmUUUzVGhweExOQlFjSENYRF9Gb1dlTWprOXBCLTdBWFFPZmhPRThWU196VG80ejZtTjFNTEdkNGNBc1FVZDdjNzAwaFJQZHNSZlprRWFwRjVUSTRsTW1LYWxqUXpHWXZ5NkZrUWtINUdyVnUySUk3NDNhZm4waFg3dHFsaF80d3F1X2xPcEowRlduOWFqOXV0eDVWaGNvXzdMT2s0TU5YWlRkX3hMU0pCdHVSYW5MMDhwSTliX1RidDFIdy1qWTVqWGFEM3RkX2hXb1JhUjJwLTg0WjZzam95WUo5cG5jLXhJd3JmZXE4RkIwbU1OYy1aa3VNcUwwUkJrZTVDOC1zbWpXREhHdVJhU05BOGhWN3VMa0FhdE55bmo2dURvX0RtalAtWE9McDMySEtXSnJIR0FFQXYyVlFDQWNUeEo4ckNieUdOOFp0WUthTzZMRnVNeE9SY2Itd0hmcjdHVm8zSi1wdE16SGhwZmdrQTdGTlJqQjA5RnBScWRXNE51UWtRXzV4YUJQWk1iM1Zudm8yQkU4aG1JTEtIUUVySDNsdkJ5bTQzRHZOeHRBNjJUTGFxWnhsOEloNS1kNDZJVWstdXdtOEQ0d3EzUlBhbUQwYlhnVXJwV1otaG5NOFZVWnpUeEpySWV4eXE0aFFmY0kwaVNnQWZXSWplMjg1WWlrVXhfYzFXS3F0eldzY3hfQVBTUUowZWd1dzVzaEkyY0RBYlZGZmFIQlItUVdrR0xaYmVIbkNGdUNEcUZUdzYxUXhEN1dPS3lKdFVlRzZwWGMyTXVKMVJBZnJGeHRlSWNVNnI4VEtXSVNOSnhJQy04ejU0dk5RNmZWanBwZ1NxeC1QOXJoMWNTQUtSU0NqTUFURTQzMkV0Z0gxS0g1QW85eWlaVGxpdGQtb3U0d2ZWSW82bXM2RERFRWNkdkJvYjNxZ1ZyTEFKVVJMMFpJWS1TQVhONGVNQkk4OEY2Y2JmSHdqd0Y2WXhISWZRMnRtUmNDa2lGcXBNN1EzNjVZMlY3blFNbG1JcHh5NG43Ny1zdmFicWd6Vkp3SXo1SjNYVlN6QVNWNHdyX0Z6dTNPVS10d21BVHg3Q0RLb0tNdzhFNmZDdE1NTDJ1OURvMVRZdmFBRGFHUl9BMnFSX0poem5lald6LWtPZlR3NnJ1R1l0UjBtb29GOVhKNEdxVTNPNXFrSjNIeWt5dm81ZENnUmRGbDNNMkRRTUktS2R1QXR6RnhyRUI3TkF0YlR3QTZ3R29kVFk0eGUwYkQ4Z2FURWRmUFFMYVBhX2RGN1c4dXFtMHhLMU1ubC11SlpERGZmSE92UURPdGF4dDJyckFyZlJnNEd6Q1hZd0ttQlhXZmRRZ0prOEMySW9tTWV2c1JOZk9jakViY1pxaEpmQUZSZmRFTEw1MHloODBQbUJfSDFTUlpzU1NQeTctZGNGZWx0M0R0OENZNGt3N1BDWjl1TmphS2phSTJVa2xST00yN0VCLWZrZGhVRV9KNWFXYk41ZnJ1Mk16RERaZmpVOFg0M0xDRDFQeXVWR29VeEZDbEF6d0ItTkhnNGREeVlpcjNEMnpaQko4VnRiNlRuSFdlWkM5dVVJQnJTYzJuMm5WeFFVZjhRSDNvY1dCU2VYOUZEaWNMOU5PTkZtOHJ3XzhXeFBmVkgxVlprVFNMNHhfby1vbnUtSllWQzZfZlowcFpxNTFnb01WTWRNZjFFLWp0a0hJV2ZYc3hKUHZkUG1pY08xNm85TTdjQjM4Rl9IYm5Gelo0cEdPMXhZbkNfWEVrUEszNG9QWGxlaFdOUFZsZFJtbHFJZ0ZaSHpPa0doRFM1MnBNMENIRUFnWkhRaHBYcVM2OXFwQjhxOE42bHZNS2ZHQktIOENDQ3k0THlITDlwTkhORkZ1aVBuTm9iZGNDOTZaNGNsQ21YX2pKeXhBV0NPQ2IwbmJ4TUdIcmszVlRmbmlaWG1uU2ZxcWFUTjNhZDhYZXBBSnRnMk94RVg1dmdoa0s1b2J0TjFxYjQzeFhzQmpPdklDVHZOQzhZSkF6TjM4YXgza19nVnpJaUUteHNpbWxTTWtWY01KRmJWdUtXQlNrMXNhdkJ1WnhCOVRJbmRLcnQ5MG1MZEx4MHkzT2pHUHNyVUtTbVVjNHZXdXpIRGRwbjJmbmhfZHNPb21oMUY5VjZGVV9ZS1lTczZwRmxUMDFrUjR2T0JBU2NtUWRWbHVhb3FjcjVpUG9iMTFIbzBnR1lyZ3lZSWx3WklIWlZkSlotelBjTlhTSUdITk16cmFLWmRaNWFlOG16RDRHQTZRcVJScWV1enpMU3Z2ZUZicGdxdUNrSUZqWXNHTTBnckVCczdxYzl1d25uWW4taHdKc3Z5QU9oTml3YXZCT2c1ZmJwRklYS1RlMXN2d3pmUlcyNWpFZGVqUnk3ZThjNWJlYktLZjhxR0lBWUVTQWFNT25iNjlOTC1fYk10MC1MM3ZIRmh2OXpPM2F2OFNHNEpvbndBTDcwa1otN3BUZzJLSk9LbUJaQ25ET1RHLTlkT2pMRW13Vnl0VVgtTWZTbVJyb045TGxiRDc1Nk1nY0NsbHVxVVNlVjd4VDhaVktDd1JOdWdxZHJVbWMwR3RESnhyYW8yT0JnMjVGYWZGaWlNbm1ZVWJWbzlPYi02Y21qQWxLQXBYR1IwRXU5d1R1eDBONDRZWUdMSzQ1eDg5VHBpUzFiTVdtbnVXT2g2VExKYkhZUnhkaWpyeXJwb3c0c1VBRVkxeHZSamxzWWp0T01rN09XU21wM3RPMGwwbk9sNWU0bHRLZTJtZkJQX2ZjdUhKRFVQVnpGZzU2elJ4dzhYakxfdU1LM1ZER05IMGZLSi1CZFB4Rno2ZlU5X2FBdEN1bElIamptU0xjay03b3BvVkFPZVRMRVhyRWhPNEV3MHlHa3R5X2RtYUY1UVdkV3RfV05JTUIwUXVYbkt6SXBoT25lZXdQRmdfM0dRaXlKS2piVFU1VjR2OENxRjZCa192Q1BsNVZDUkFzWGFJM0o0S0xCQnI2dWp4V1JEYU9OSTlJVGRsUDdmdzB2X3RxMjBZRVVHM0JfVTVNa3N3RzB6SEZOcWpHY0hQWk84ZHhLa0ZHTWJXbWF3RU5kZnhQNmphcFRBUmpIZGNhQkl6Ym5veUpKbERLVmJrX3FCUWdWRmllVjN5QjFJdkx4bGM4Mmpfd1ZZY2hSSDlWUF9fdlFfMlpJQUhWVE5HcUtkNU5Cb29sOTZrRUdXRk8ySkg1OG5fWG1NMVJ5RUhCTXdtdFZ2b0JsRlVDbTRmeDZLRGdXNWZMTEt5bFBMNEZxTVhRTDN2SlhvWHl1LVNnY2tYX2lFYllJWmE5N3cyMEV5aUhKZTFIQlRCSDViRzF2RUZsV3J4R2VBTmlYeDkybDQ0NDJUd0lHckdQOHVONkpWRkNMZ1BVcjVtZW0tbmFsaG43dDZmMjdBY0o1SlBfZ1k4SDUzeUpIa1M5TTI4MWpSaFF0OEtRMk8wWk5wSGR6YTkzaWJ2LVJyRWV3MmNmOEw0UWR5S2JneUtHSGFrVFBja2lfYmlja2kxUk5kUy0waHR6WXNoVHRPTUF4LWJFbTRmbTY1NVZVbTJjckRkSXExbmo0d0F4emEtd19wajA4Wk82X0RwNEtpV3pvR0VyWVNNUzl2TnFnN2p3S1BmSUlLOGJsQjJoNl9MZ09neXU4ZWpUa0JQZHFhTER0SndOcE9OWG1IWW9vRW5kdG5ub0NaWEJjeVVmNGFjeElOVE1sMFVUemczLTBUUWZhRlA2aThVbVNwWmZYejRubnRiRnBBVzJpSl9iVWNqS3hfZk5PUkJDZVZZSk12Mk1EeXFOSUFGRWFibGhVSFJwaEpkWmxFcm9RWE1GZl82Y1VVc2VLaDVfVURPRjhlUi1ZQWtXc0xYY3dEQkNocnRHd2VCRWNidmxvUGx2VlBlZDgtRVVyeXp4R3E4SHdxU2lhMW9Odm55SzZPVVdTRVg1Wm5EenE1XzN0Tk9qc29Oc3FkZ3hadktDU21qVW5fdjktYzk0NHlkUzJ4OXRraHVoUjB5dmE0OHZkRXk4aFNyb0sySzNubDFaUTJQRjk3eEFQbGg3WkNuREVLbjVybXQ5d3JUVGRKaXdSSG43eXc4V0ZSVk1BbDhiQ244dFdrWVFndHFZUk5WRHZEbS1GR0lXT1J1enE4MGY0MG4wQzNZeDl6WV9HTXJVenl5RjcxMVQxd2RYVFdVSFpDT19MZXhVREFxVFFsU3NmVkpIRlI5ZWg2RjZ0bW1NTDZldnRKM0VfME1WYi01djZFeEVNNkRvbERLY1Y0UTYwYmVYSWY2VHp6SHhTVVd6OV9SVlcyUVl5RW1nci04MWNmd2U5Wmt6ZmpKSFl2SXhRWHVFdU1yTnVrSzNic045ZnU3Yml6MXFLUnoxQkV5RjRNV3YyQ082a1hESHBJS3ZQLXZ0WFFDZzNydHl3SnZ0UjNpY2QzUGRqRnVZSzk1SklvMmh3cW90YTZjZFZySVdZRHZwZkFTc2xrWlptV2pGejJWR3VKUTlLV1pmY1ZwSldMVXg0TG95REtZa2IzTWNUeXZFSy1MUW9saEpaQ1ZhVDV5QTRscTRaZEQtcDdpZjM5VjVnUVVRRFdQSlJURXIxZ1dKY1prLU1Xai1EQ3hhOGplQ00tVlFPc0JKQ0tZZUtFMXVsUldSc1hZRGFaVkJ0RHN3VV81XzhJQUJvRnFhV3ZPVTRjcUhqdHVVa3ZaenhhaG1McER1ZFpLSlRQTENvMEVxY1o0d3MxOEdpc3NncWh1clI4d3B1VzA1Ykl3NGQxbm53RXRTbkF4SjFibzZldS1zcm5qc0J6SUtQM2p3Ni1iZHVhSkJnWHFXT3Z2TWNnYWpOcHFCRlhkeUg5RFI4ZGhuYTlXYzB6SzdYU0p0M0lneW1HVW5YOC1mMFNtNWZ6X0U5clBDRXdXdV9WXzB2RFU0RmZfaUZZMEpQSTFrSE9fbHQyZGl4N1k3WHdJM0NmVFN3VURkZUNLbXdNQ0lXVWEzOWxYMFpQZkwtelVkZUlDWVNnai1ENmRCMnltV2tkYXd0ai1VLVpPRkdIb1RhU0lmR1VXYzRLX3dFOF9qelJRUEp1LWpQY0VXVGRzNlBYeUs3MGppc1NoYnE0azVjMElLQTBzZnlzR2cyTGFBa1lncnB4cF9RdG1jNllGSWg1aWJSbllqbWVpcEE0eUkzV1NvMGRPbVJ6T1dyNnUtbEtuTFlrNnZNZXNuSDg5M19paGR2blNoYXd2X2IwT0FfMldTWjdYZE5nUktZU0JDdkt2d2FBdjJubTdldE11djVNalNMN1JyYlpKN0tzS3d5dVVMNnM4NXYyaHN1M2p2UUJYOFU3bTdTdHVtbDdSVWIzbHJpdVFYVGJMVElTT1UwUlo5VkRZV1dqM0JIQUZWT2dBWHRrbjhWSERURkRZbmhxSXVPeTlmZDNKTkVSeHRkNEp6cHZJTVUxQzlLa1pRSXdaeEFtcDM4azN4Ty0xQlBFVDlmZmktcFhXLThPNFVsaURCSWhyclZkaDBDNHl0Mmo3aVBKQTNXZGxKaUtLN1pqS0JTRHZoeDBmS1gteFJYWEk2dlZ1dFRucWdUMlRkNkhEQU8yMVlhVDBWTnBWbTRJTXBqbVFYVEdpU2lTRWtrMmRLS3BpbFVxQnQtS19ONjVLV1ZzTGJwWld1aVJIQlZZWTNlaFh3dE80R0ZqRkRoT3p6aHVXVFdrZU1uMEFsOVdZN0p3dHNRQzZLeFMtSnNnbF9vZi1hZ3F1RDNVd1JhQlVONXJVdnk0bVdjZ2dSYk9NLXdxaXBZMm5sUldTRldVTEJSQlpibGlpbEQ3b0YxOVV1SFl0YzdaRjVQSEZ6V19EYjB1c1pqWF9iWGVKMVJmLVJPY0FnbS1Jcnl6dWl2djJFSzlnZFpPckNfaDVyMEM4YXZzVTF6d3RpSmF2TEpLVWtmNWZhamozaHY2MkxoVV94TkxJVVl3Y3VGUTJlYUdJeUN1dlI5cXJTSFVsWmdYUm1kdUc2YVNwNUdUMWxYb3djWlFsV2ZkM05CVGp2UHY4NG9GOF94TlRtLUlwblJvSE5NMUxHMXM4c3RMdDk4T3Y2VEF5WlNKTUlyXzRFbWdKcUE4Ny1DYmtjVHpqRnhJMFMxaWxvN04xS2U3R2YyNUhQQ1FDOEo0dHlySkxRMXZNQUdzeFlGS3dCRGlFM05sRzZPMFAxckRjTDBGM0JIbGlZTFVZeWJyQUtxd29WeVlCdUNHNlU1cE9Eenlsd0YycHRTMzVVRDZVRHR1dnpTN2d2MW56RlpzUThSdFFPVlR6VlpScmtJelM5QU1YN1Rfc05rM2phZ0N1aUFoS195d3lJdzZQNEkyYnJYalh0M3JOYWs0cUpySG9vM2xibl84clVwNGs2bE5sU3NvQ2ZIQlpsUmpxQ21zZnJTUGZHTU5OMmFSOFFRdXR3V2wtcHFKZFRjUEh3RjdieTN5RHZJbUlyQ05HdWQ4MkxvNUg0c2RvUnh3UzNtMkE3VERhSVJEVzJXU3JQVlAxbmFodVVEOUhQZnF6Z0FHOEhZazVleXJIX1hQVXNyQlBoUzJuXzFNZmc1TjltNWRUdWNzR3phUTUzMHpwTVVFWjdOdmFUcndXY0ZtM3oyb0NpTUVVT0pQRkI3U1ZNLXhkUU5sMlB1RGlWRnlFNXFmeDR5aV9rSmpLUjZaOEx0cXBJckxCTDc4YXdJbW03M1RSTzZJU0Rncmp1aWdicHFXb2gtS2k4Y1ktNkxYcVNDMzBKSktWWUhtX3FYV3UyRFhXSjJsUFFYWU1QTTZ1MmE4d004VzRxX0RiVE9TTWZvREJDTk1uWjVjU05BR0RnWWJHQkNTNVdnQ3JkYTg2c3VrSVZfUUhCdEVlZlg5WE9URlI5S3RYazE2eUR3bVA1TDMxQU1uTkUwRVIySkQ1M2hxS1RPSU1zUlhfZWlXUGV5WG8xbmQ1X19wcGlobGd1clBnc1gtSk5tLVVuVUg3OU8wcjdaQ3ZCaTUzcVFOUjhjWmRwTkFRMzlvbG9nTTdoTUg0eV9RaEpQamtZSDY4N2dHcEtpYjRSdHdMQTQxOFp6TUl5U3M2ak1XSUV5bkNqUVRVdk5WeFZVMlF0UlV1YVRxZzhQRXlONTYyaFp4eXlBWHRMbnJDQTZOMHhmZWhjQVRoWnhNYXpzYlFaVllaY2FmTEVod0F0YUdrS01kWVNid2RyRTJaVS1VTFdIcXg1LTlYMEFvUGtxNlFTUGRYOUdxWWNaa3ZiRXpBWURZTTlMV2wtQkowdDRoQm1kOHFjQjRmSXByS2NGTHowLWNDVnlWVk9ucEtCOUJoVUhaeVJEeHRtMnJVdUhfVXM5YnYxbzJKSFlxbHhMVGowMl9CTWczTVdGNnpYbEJsQ1JQX3BPei1ybjVhXzYtdkotWDBtWEVWZjFYeUtualN6YzZXY1I0emEzRHJDbFdvWEp5YnhNa1J4d1g2OVhkZExSTUExNjdGbWhDZ3B1UU1yVHQteWxJSjlYUXBwd212UlBNUDFxY3N4cXVIb3lDM0ZrRFZNdDBYcFFBWFJ4U1ZjaGxqUFM3c1QxMGFVYUp6OTY4OFlYZlBmVW1wVDRjMzNTTklnTTRLb2FnM3B2eW5CSmswQkQ1VFR1N19UalpteVYwSWhpRUtZNEFUWmJFOWNDXzBCb3ZXVUtra2F1WDJHcHlzUThJVjVuSWJqVElvLVlwelJnaXZ4X0dtSXRlZmJWbFAwV3ZSM1BITVRKdXdHR2hKd1hXczNfZS01TUQteVdmeHFxYTd4ZFpRR2lyZk5ZcEN3c193STZGTEFFYVQybWUxakhyby1ld3UyTEhSai1DaTdZLXhFUlpFMl9EZFlVVlFaUnhiRWxucnZsU1JrMm9feV9NQ0pGdFlZZkRFZ3VOS3Q1ZmNYYnRuaUJIcGtDNUkySWR3cUdMbE95Y0pKc3U2Y1dOOGV2N3RQU0xtY0FwbnhoamZvMncxSTA2azRWVkdkRFp1cjU2d19KTWRSM2RzZ3BCNmFXakZSZDZxUnc1blhJOUpVUDhJMkM1MFFqd3VYS0ZYQ0VPbmRpN1ZCQlJkTTkyaDF3NXBWTTJwVWtwNnA5VENzWVJmSlBkQzNOeHlURGhhaTNlOUhmUHlyWW4ySWV1MVZGNnhYUVJqSXhFbGFkUVZRRm9TeFluWGZQeXVIWDdCMTRtYVhwdFQ1NWlzV2pOY05oSC1YUFI0ckYwcWVvWDdNbGZDT3Z3dXNScGIyb3FhUWw3SlVlUzc4NE1jaHFlOE5Ha0RXLUxHajVLeGY4cWduU0EyRUVfbFdKc2pJLVJFSGNDREUzQlJpS2FucG1MSG4wTzZHQ3M3TG1lMEoxZGRzR29ycHJ0RVVvZ3dKVTZtQ3kwakpnWlBwTmxMdm5IbGtCYWZXbXNkeEx6LUQ3VTRCcDYzZ3U1ajJJY1FSdUR4UlM5Tk1OeDk0VGsyOU96OFplU3VJeHdEdjZsdndpOFJhRjhVRlNlT2d0RFRsLW9rRnRqVGtTUjVRNGhPUzBpNWlsU3cycnB3SEdxeUJaenpPcDJXMzNvMmdua3VCZmhVMkhRMXgzLV96aWttdVhRU3Y3VW9FeFFDYXJldnd3MXBQUXhEQmszTmFkZTRvUVFzLXNKbWV1OEJaSC0zcXVqUHQ2UjBXSUVsUm5zLU5qRHhyWmxEc3J3UTlCNEtiZHAxLV9pNXNTWUFNYldzT3MycXJOQzQwZkJSd0dtT0ZOZTUwWFkzaFBXQlRrRlBTNUp6cHdiclY1NjJ1YUl3YzZUNm1RNmRsdUZYYmtrMlZ2cFZqZHQ4WFpCaWRrQzNqWGF2aERhZk5yLTdNWWFseldtTkVvUEl4VFNOclhYZXdnYzdEMHNqWWdNekpnd3F5N2FKNDhXTDBPTk8wdWJFcXBROUVSUm5UcHZTMWZkZXhGWWN0b3R3emtsNGc1emxsMEpfSW5Cc3UtLUY1ai1YMGViVE5UWWw5SU54TTBTa21LSExvR04wNEc2YTRuc05jc0d6TERhaEhOTEttUWV1ajE1MUg2alZSVWRCZlU5S1J3bzU3My1wRXE2QUlxOW04WmYzTkpySTJlcWlxMGpxRGFqLXBET3BsQ3ZaRnMzQ1hxT0ZQaEFwWkY4RmF3VEw5Y0l0TGFabnJsT2hTQ0VjamdHdlZGQm93MnhBUHZmOURRYmh3NjdiaVpfMkFWWXJ4alB0VUN0UTZGUnVaT2lNOXozdFctNFdINGJBWU9ZUG5nLUZXR3lwaFFRdkk5a29WbHJnSExfOU0waXlzalZVWXhwbW4tYTZnWkF3OHpWanBRSGtRUFp3QTRCbnNZZ2JxTVcwMU1fTE1FY19HWHFNN0x3ejhmY0ZXNmptSEVOam1GUG9VUVd2akQtQW1EdmtUUGJYVlUyYWttdFFWeFBlWk85SzJpaUVvb1U2ZVhtZlVfeGlTTTFxa2pxaTRNdU1MOWpFSTEwa0x4bmxfNk03OGRTWE9IcGE3NFlxNjhLczYtWFFKMFRkZzhUNEdoRk1rYzFuSHp0bjBGOHJudVV3M2QzTjY4SWNGZUJmaThRV3VId3JKdDh6bG1XeHJ4UXBlb2Y5V19BaW5hdWdBMTYyV0plYmdibkpLY2trOVU1d0tvaUhmZ185azhxb2FzMjJRbUt4OFVSdWhNMFA2NVMwbmdtM2NsemUtRlBab0VXQ29Wa2NMVjhWQ0ZSYjBwSWE4SnZnVlhhY2g1MEJYWkV3UFFVNUZsQUtpQ3lOQk5jQ0c1bVlUUUpvRHhkR2pYWlRnN1MycC1RSXFuNFhrenZmS1RLQlUySTFsTlk0d21EVGNmN1BUMFdkSTdFZW5kdFZCMnVFdWdwRFFNMmplN3lOelZGcFVrLXRlY01acEZGWTlUQkFZVklYNnRvTElrdXUwRDMyMkZoVlpmTjI4Yl8yc1BNUU13d2N2TlRES3p4TUltanZTNWdlbFlrWE9Nc3hPZHZ5TzZuc0NtVXlsSDZndjlQUHlHOWwwNEZjY2tuYjl3NjROSGt4LVpaTXQ1V2ZfcjVncXF3ZjEyNUdGTXpUa1FHdWxveVNseDlOOWFfYlloVjZYTklpQjE0Y3ZjODBaVDhsa0laVWJrelpzMWducWNxWXZ1RkVxemZBWlUtbW9TZXh1UFJQT2dpTjNxNDQ2MGsxVWdtZnA1R0s5bFJKLXBvVUZNLUZYYlBDNzc3TmJjYXdoTTdiaVRuUUVlaTBFMTVPck9OcVdHWG9ocFYxZldzVU1oNTZSWjE4LUhybUpzV05aZW1yQm82dEFBcUxla1NHSnJMRzRMUTVWdm9OVFhDYS1lUmNHOGN2R0FKTkQzODMxVG1fV2JXM3RnNV80VjZzeDJxYndxejJ6b01oRngwLUJoNjhTVkVXNDdLbFFSMkw4WE41VHNLQ3FCRXIwWXoyTzc5cUxNNTZmTDBHY3dWd2hmODl1R2NmNzVvbUxRN21LdEZYa1F0MWk2cEx5OEFBRS05c25kZkhyTUFUMXRlbFFBVGRBT3p5ZkhBTmNHcEw1TXhkbDhvSVBIWnhJTkttZU5vdjlMcmViN3J0bzg0UkZaTm5pM2JDcHVEMWs3R2hrTzN6Yk9qNEdGOEo5Vk4xcmc4M2VGWlYwbl9QSE5ic1RocXRnMGdFUWZiZ1RSRUdUU056MnVHYnlwVVRHZWJaQmxzdWdsRmtfRHpwTWpMMktJaDBBOFBCQ3QyZmVtX1FPOEw2cTNtYzdVV0Z1ZWdHbnNjQzRhMnBTSy1Ldk9JbmJaZEVnZmdtcC1QWDlXaE9TY3RUZWVUVjFaWGQyZHdjek1pMGVYY1NMZi1MNmJPNHVGYmUtcWgyV2lVQzhyMW10bHRmbnJma1NWLWtXalVwTnp0c3NyTWhWblB3OHBhRURmNzdFbEszbER4V2tsSGoyeE5OeGdZWkJUX0hnRkJzMW9RZ255WVE0dEsxNFlpeVNpX3MtMHhQSjh4NHFtZF96NzJ4cWxOZ0RScHI2bm1fR0kzYlRwUUE1c3BPS3FnMDZCZGV5cFhmaTh3RzR1c3F3T3Q3Q0RnWFVwSEVhUGs1eWF0QTFLQVkyRzd6clhQU2M0WjBQU0JfV19aNlNieXJuTHpEM1dxd1N2cDdLa3pqdzRScU8xUmdTZ2xMVHBMcHh2aElIRFRycEdCblpVZTN0ZGdveW1BTkdPcEh2NkZyalo2cE9UclVaYjdBVHNSb1Rvb1prMDNDck4zbThEaGNrUnlYY19ZTkxGVDQxYldnMUI3N055T0FTQjF4ZkNrRW1vV2pQT09ENklYazRLRnMwTWd6ak9aRGdsMjRaandtN0tsZEpkOTljZkhub014ajA1R3NIRnhqR1NRMThGai1MY3lpT3NpbWl6eng2U0RkaG1NZjFXSnVjMHlTbjZncXFNU0ZXQTh6M21TXzEyY2UweTM2c2IwOExLTno0Z2ptMUdNRkJzM3AwZ1pTLUtKQ3ZLdHpMNHNGd2VYRTMzRFBGNGZCRmRybGxEeG1NRGRlWEExb3RkMC1NNGt4cGtKMExnTWNwSGJpVlprUC1xRDdhYzF1Q1pfb0JmbGhHQnJCWHVvMS1Talc4WGhMOHpwclNjRzBrZHJhYW00a3pzREdwZFZqNjc5eGNseFVwbXhOSlBLTFhlZl81dXBHYjhTQl9TWGVkRkF6Z0x4QWFtX0x4RHJ2Q0lXaTBBR1E1RkRVYXpDaWZXZWxOX1hMeFVKR3RuUDdxVmJmb3c5QnlqS29hQ3pkZlJ5alY3VkVjZl9BaUlJZzJ2SUNSbTgwMXVtb3hhemVoRVoyczFIRG5VOE80ejU1WXpabHlELTY5bDdiUGVsTkJ1YlhSZ016OHBmb1kwOVpRVXl5YWR1N0hJWHdMM05CbVRmenlhcEJKRHVJZTJld2ZEeWQxOUlHcGF4d3Y1enAwMWdxSnp4X2Z0SElQQWdkX1pwZk1fWC1wckNobHJjUWhYclBjbDhEd2owdGpnWTRZemtXMmJhS2lWRFRpQ0dTRWNCWGV1clh2SFBSc2w0ZDJqNEV0MUU4dFA5aDlFY2FJYmIyaGpVNVpFSHNXaTVUZS1XWmhyRWswSk1fSkNHd0dib3ZqNlVueG1FcG9wVUtiMHJfNlVEYV9lN0tCUWdUVVo5allmcnhRTVpTX1VSWnBuWlZXZ0NaS2tXcEE2RERhTS1KVmxFTkJhbE9wMjM5U2ttLXp1RUZkZFl5WlpvTUswMTZ1YTJKbGJOOXhOWjR1WEtUekZhemtnWFVuRDRRMmZ3SFdkM0NlSkQ1elljdjI0Z2taWkQ4TDdnbHdpUkRhUHdPM1FXUVQ3MEh6SnNaMGlGVnRUeDVKTkpKTnRxRFA4ZVdJeDhna19XOXotellSWFB6OHc2MWVsdzd5UHNyaFZVdFFhUHNEQW5zZWYtTDlZY0Y2ZzBieGtVWGJQV3FjSGVsTmFRVUxUclBPSlhsSGJCVkZ2eFEyMmRjaHpJYXlwblhMaF9RY1pBa2FDYWZDbzNGaGdYbFQ0dWJjM21kV0JnYTBXenZjaUZjX2l5T1M4UTJWNVBMVHJPb2JFMUlxcnpNZHppaHEweXZiYUp5VUVSTklYM090S0FHLUdTZ25rd1hkYnVNTWZ6enpseXJvZTh5X2xxeGJ0NU9leC1TMUVDNjZUTUdHd3ZncW1NN1FxYzJ3bkh5RmphaVdJWkJEN1BEU0EzdTBtc1g1N3pZOWxDb05JWTJ2ekhOeFBLeUxpTV9NWGhYTElzbEprMWZ6WVR6ZFN4QjFnT21KSWZINE5ZVmxtUnhYck5KcjV2ZFM3ZUhibjFCb2FSN1hlUk9PaWpkeVpLc051ZnAwSElhYzNvZk5vRzVXTkcxdmZJMERyNlhkTUt1SUJaTkRLdzUyeEkxYnprWTVMQ3pCOE1pM29GOXFWM29FS3VmTkNxYlFtcmYwMGRfLUx3SVNlcHRCak5UMnBuMTMtdHhZelk4MUttWW5nblh1OV9tT25tUVl2Zk1jNnBWLS1sVnQxc2NxMEhYWGhOM1pRMHlyaGxwTkswOGNGai04YmJvei0wYmZocGE5Tm5yYjktRGVEU205azc5TXFoRUFRcDFTYkx0VVhPRXRkblliWUpXa2NlTHpCZ2dxN0I0UkY1SU91T09pd2ZoMDc5RV9iRmNBdUc5OElmSXRfTlpRNThpbVBXaXM3eFlLcGRleFJFR3F3WjlSdEFmaUFkUHB1N3ZFcGk2NmpqYVpGeUZpcThBMTEzTEtHUHozMExnM0tlTmVtZ1RJY3pPSVBXcWdPT0o5TEpnWVRqamYyOHZxQmxkbU5BS1E0VTlBTDhUeWZ6UE02aXduUFBrRW9IRlZna0tuSV9FWVphYVpTWVIwZjFaTTRXYlZDWDFvaWJkZVVoQjh0dlptZDg1SXl0dVRaUzlMV29VaFlQd3V3M1NxR05yS1U4T1RCQWVNY3I4SXFvb29BUWJMcnBlLXdyeDhiN2dzclc0MUxxcDFsZWNvZ2N0aVhQTU44bERXLWJzaHVwNU1scEVzTXctbnAzT0FGZnZlVm9uMHBUcW1obWxlRjVxenJXcUUwU3JCYzVScFNOMEVTaEItUkpMZm9OYUd3VzFmNDJDNDJvd0hnRG9SQ2NOLWtWYmJxd0NIRWE3NTRLNXJ6RXB3alRSaXdFOENWUndDUWV4bTBvQkFLTDl2ektIa1pYelAzanZUZjNxOTV0VGh4Q21jemttUjlLQWRfTkhyUGRqVDdIZzdGdS1FYVg2MGxENmhpM0YtSmxqdHhYczlQR01ja1RFQ0l0cWNqMXVhYURtRDV3Wk1tck9QRjN1eUFtZmlSNHBLY1FJckZZdXpreWlYOHdlMEh1Z3RsazZyRXVGZUY4cnJ5VmlkNmN5RTMtSExpRlRqcnA0LUZwYWhxZENBRHFnVU0yLU5OWFVOcHRUX3NpQkktMi1NNUhCT3ZtN05HZGs1TTVncUl5amNMTTRwYjNqeUpqMlhPajR3NkVmYXlOTG40V0RuOWtRbmNkekdlQ0Zzdk9VdFl6cFFUX3VZMGI0X2I3R1YtRU1YaURTQWlBcXVuWGF0ZDN4TDlXQ3o3WXgtMWRzbG5kQUYxMG9BMTl0N0d6Z1ZpNUdWM1dqNTlBeGdBYnlQVGdjTXdzRzBJU3RJSXJNTS1CZWdoYmV2WUVuWDMyd3hjT2pnMFQtcHNtbUNBc1BESmliX0t0bUQ5QUFHRnlFdmNIR0pJYkt4dExKYWRfajJtdVduNXoxN1RDWVdWSGhYLXFFendiSDZRbzBOX0VKTWh4SlNmX2U4T0pjdkNZTC13VVpwUkszanZPWEFsMzRwNjVFZE5DYjlOQThBUHFyV0NJNEVyTm03N3ZaWnd1VVRJTWJkWEVmNndkUGxLRjg4UDcyOFJvY1FTUUREYmdGSEs1YjdzdEJZQU51NHltbDFleXlXVWNJSUZ1QVZkUWRCdGd6UmJTN3JUdVVaX1RFUTVOUkpHVUhkd1ZMalpfMEJiamNkRjhwam1EbEN6TlhsMExjN081Z1pXQlUzc2x3d2dscXRwdkxaZTFTSXlaY0FNeW5laHkwNE9PUGRXdG5JTmV6SWZFRkRXcEdqWUNGN2E4T0dVMXN2Q0UyZTZWYzZDYnNiTWFyVFRXWERTdXdERVNSbHB4N2hDYXJjbzVvVWpYUHVzc0JsV0cxWDdVNmJlMVhid1ZtOVRPN25EVlZSY1NkM256eUQ0MTlXbklYUDlqZXNGRU9tS1ZnTmFaZS1jX3V0VzJFMnpZaGVaLXhncmJSZXlhZnNfZ0R1UHlKZ0JuXzlldllnLUU3TnloVUt2Z1hMMUUtdnQtUjhQckdJTERnWWl0eTFQRmxmVWVQTUxDNXp1SDFhLTVxcjYwOWtZSWZqN2JpSndlOXRHMUdhWHk1TElscEh2WHlIWWpCNkMtM2paQTFBRXdjSUg4YWJWT2dhcXNFMmM0U3JFaXNUX3NmSzg0YUtmRmxyR19RY242STAySXlaeTN5Z3V0c09pRWJKM2tfc0RNYjZGQVNRNDdHdWRUUW1ha0tsMHpTQTJIcFJPaU1tVmVYSFd6SWlObDdyTFllNThKU19KeFhIZFVhNmVUTk1xRzZqd3NKZi1XdV9vS1ZZQWhPWVhtV1h5dFJMS0M3SV9NemFSTHExTnJZYXpScmVERUNHV2FIcXNKeV9YUlE0cl9lYlhzM3p4RHpQQWhBc21xalRvU3ZjWllkMV80Qk5fQjNtbDJic2kxYUl4dzBRdW16dUV4bHJLdloybWFYN3hDM2JuX05oQ2dUUkhkbnBLSFRnSWE5bzIyeEQ2MmUyZ1lwOU5HNW9zZEhuRmVIcE5xWldkSlcweTdESGtwUjRud0RyWWtVOFJudDdmYmxEWENERF85cWNBaGctSUk0NVF5MEFGQkIyUDAtSnprTjBRN1dWVkl3cWFWdWE5YXkyNlhjVmw1TjB3UUhPY09tMVBmWVJ4ZjNUWHktSlMwcEFwRDdKd016ZUkzY3F0SVUwYjAybVhBeGlnUzQ2Sm1HYjV5YTZWaFZXbnNOZEFLTXlLbWE2RndLVWhCVDlEZ2Y4V29kb0I3X21pREswQlJxUkpPX0tuMmdpckxHWmEwMy04QWJmRzhuM1JwQjdFQnpoVHlLUlA4Vkg2d3hJaWkzdENOczR4bEl4YWcwa3JfMWhUaGRPV2tSaDhiTzBuclgtVnpMNW1zaUJpZzF6OVhTdjZxOXRhbWxaZ0RwQ2lSS21WX0R0dXdWY0U1ck1oeG5HV2pQMjdLR2ZOZy1DVThHa2x2R1pDNFlmcGNFWXJjNnc3YmNwNnZjT0syaGlxV1k3Y0ZBTDlpR2hGYW5kbTlsbVcxWnpiVGxiNTlhUm94Q09tZ1Y3eDh0d191N0ZoMHhRZURHamVlS3FTaHNwbjI1ZE1EWi1zUjM0YzAwM1JsMTRBQVRrVlJIUE1ZM0Q4eU1ZeENXM3J5bm5PNHh0cjBUeGZJcU8zeVZ0WHA0anpnVG5VbWRHR2ExcHB3R1BWMVpKQlJoNk1BbTd1cmFkZ3Q3SE9IZGhYTlNCVHBnb1FxeHJDYWpVSmJEaGszTmx1Z1JEN1dBZ0lKNFhLb2NDc1dwUUJ3Q1c3RGJhLUlIRENxRFBOQ1lBYjkxdW9jOGJYNE0wbE01Sm9oYVl3eUVFVVFvNDA2TTZudmxURkE0dnFzRGs1QlF5Zk5rQ3A3WDZpSEdpREwwUFV6ejZ4WTBWd0R3M1V0QnB6OElvb0FYb19pa0d5N1NlQWlNN3hmbDBJTmROWUMyVFhicnRwTS1mSWNjb3Ntb0sxdkNKcUV2TUJoUDJGcmRQMEpoVTE0TlE2YXZONjl6YUU0czJsWlJ0cjNWWW5rNnBFZzZHSldqSFZYazV4VWJOM05JY2cuM3VXX0txeXF5T3lDeTJnVVBST0hZdw"}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['42495'] + 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://vault96da121a.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault96da121a.vault.azure.net/certificates/cert96da121a/0976f18a025245a883da4cd95817cdab","kid":"https://vault96da121a.vault.azure.net/keys/cert96da121a/0976f18a025245a883da4cd95817cdab","sid":"https://vault96da121a.vault.azure.net/secrets/cert96da121a/0976f18a025245a883da4cd95817cdab","x5t":"lBZqHxjrEB-nYLGV7_WUgTwXqmw","cer":"MIIDOjCCAiKgAwIBAgIQfDI6nhc3Qma4DbZggxxtOjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1MzUwWhcNMjEwOTA2MTgwMzUwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/aAGLY6sJGDqquIwyPToerUQkEH9PXkhm3ys3/4yjDKBSeVa6a9+E5VhXsV0clh/emgxkIe+elh8eZmufWfGzoIiABd3petnwiGsAIwulJDZtIjir/qPOH5qx32o6hrduIQNXcVsLFep0sGLBsFVGLbb6EsioZYvtkVrA2QZ8FPyeDEeifjTrTiQnjX2HSjuFTai21+193sO38goV+I7+p7Du/ER95b4X/QfScUdsPrtBp/22Y6vRThVSa6OqGlSFNZnob3i5OZ38nK/xDdK/UqKVZZ5TA3IPcfUb0Q5vVEXG41N3RCib/9wLl/Ngqcc4tNtccALroQCTufXc8LZHAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBRL7Erd5XMhIj6ONSaCT3FLVUYNiTAdBgNVHQ4EFgQUS+xK3eVzISI+jjUmgk9xS1VGDYkwDQYJKoZIhvcNAQELBQADggEBAJHv7t0Qt8xzEqoc1HtxcjRTjdKIpdXMM3ErPDgXBNIFBoIZt9yhWTlF84jGuMVOUFAIRyt1076P6I1uYLob5XDK5k12m4dyhbqp2xfeqIHKo2NQVKsKEBWNWR5Eu/QKkjJSNn+UpNZSoX6dcYtnKRAGMCIF9vfdlY8WV8eP//QOhh95AySsXT6pYkSpLpERDxMq06M59BLxKzbqdKZ2WNUtne7/cxpjhu7Eb+mrwTdvvL8fhDNUoO/xHg+A1yt73lqmU9G+THQ1rTJ+ijXOt+a8XjAwkjEyXorAHKPESEtmGkyb/7zG5qZLcX758T9giJ4LvnXO5vdWUqTfwmpy9KM=","attributes":{"enabled":true,"nbf":1567792430,"exp":1630951430,"created":1567793030,"updated":1567793030,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault96da121a.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":1567793013,"updated":1567793013}}}'} + headers: + cache-control: [no-cache] + content-length: ['2207'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..3e70177e830f --- /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://vault851e11ad.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: ['Fri, 06 Sep 2019 18:03:30 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault851e11ad.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault851e11ad.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault851e11ad.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault851e11ad.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault851e11ad.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..aef0da165c5b --- /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://vault629d10e9.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: ['Fri, 06 Sep 2019 18:03:30 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault629d10e9.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":1567793011,"updated":1567793011}}'} + headers: + cache-control: [no-cache] + content-length: ['341'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault629d10e9.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":1567793011,"updated":1567793011}}'} + headers: + cache-control: [no-cache] + content-length: ['341'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vault629d10e9.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":1567793011,"updated":1567793011}}'} + headers: + cache-control: [no-cache] + content-length: ['343'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault629d10e9.vault.azure.net/certificates/issuers/issuer","provider":"Test"},{"id":"https://vault629d10e9.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['214'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault629d10e9.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":1567793011,"updated":1567793011}}'} + headers: + cache-control: [no-cache] + content-length: ['341'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vault629d10e9.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":1567793011,"updated":1567793011}}'} + headers: + cache-control: [no-cache] + content-length: ['341'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault629d10e9.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..98e63faa89f4 --- /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://vaultaa0f1292.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: ['Fri, 06 Sep 2019 18:03:34 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCAV7de3Z8cKmKGKOmhlJRoQdfL+9W38oCspd6ET92iAuBGeGy4x6vTcQxACLIdMEP9oWlQoHO7ABBnhDmWy4JhxSEYNjGRsSG83OP03nUXblnpoO6WsT1LHfqmwgKJpbeehrU6zj7gy/suzwwbxZnitNcb7fPRW3Yz4b25C2U2iXtb7DILx/GfBxAP2TXHI2f96vSAfInEcwkBpOVLjSH9hHXOT5tJfOGlC/XkPHXtGILPw7sKSJyJT9VX3eOd53FOrQTIEXHyBozA3Xt9EAUILFsgArfG7rsLDTs6VMC/fsoeF5EGOLY34W0JFUjrhtRcjXtyyEO24TSICBn8uvod","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":"f6b83c40605244f893b9c8192346ab48"}'} + headers: + cache-control: [no-cache] + content-length: ['1291'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:36 GMT'] + expires: ['-1'] + location: ['https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0&request_id=f6b83c40605244f893b9c8192346ab48'] + 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCAV7de3Z8cKmKGKOmhlJRoQdfL+9W38oCspd6ET92iAuBGeGy4x6vTcQxACLIdMEP9oWlQoHO7ABBnhDmWy4JhxSEYNjGRsSG83OP03nUXblnpoO6WsT1LHfqmwgKJpbeehrU6zj7gy/suzwwbxZnitNcb7fPRW3Yz4b25C2U2iXtb7DILx/GfBxAP2TXHI2f96vSAfInEcwkBpOVLjSH9hHXOT5tJfOGlC/XkPHXtGILPw7sKSJyJT9VX3eOd53FOrQTIEXHyBozA3Xt9EAUILFsgArfG7rsLDTs6VMC/fsoeF5EGOLY34W0JFUjrhtRcjXtyyEO24TSICBn8uvod","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":"f6b83c40605244f893b9c8192346ab48"}'} + headers: + cache-control: [no-cache] + content-length: ['1291'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:36 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCAV7de3Z8cKmKGKOmhlJRoQdfL+9W38oCspd6ET92iAuBGeGy4x6vTcQxACLIdMEP9oWlQoHO7ABBnhDmWy4JhxSEYNjGRsSG83OP03nUXblnpoO6WsT1LHfqmwgKJpbeehrU6zj7gy/suzwwbxZnitNcb7fPRW3Yz4b25C2U2iXtb7DILx/GfBxAP2TXHI2f96vSAfInEcwkBpOVLjSH9hHXOT5tJfOGlC/XkPHXtGILPw7sKSJyJT9VX3eOd53FOrQTIEXHyBozA3Xt9EAUILFsgArfG7rsLDTs6VMC/fsoeF5EGOLY34W0JFUjrhtRcjXtyyEO24TSICBn8uvod","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":"f6b83c40605244f893b9c8192346ab48"}'} + headers: + cache-control: [no-cache] + content-length: ['1291'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:45 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCAV7de3Z8cKmKGKOmhlJRoQdfL+9W38oCspd6ET92iAuBGeGy4x6vTcQxACLIdMEP9oWlQoHO7ABBnhDmWy4JhxSEYNjGRsSG83OP03nUXblnpoO6WsT1LHfqmwgKJpbeehrU6zj7gy/suzwwbxZnitNcb7fPRW3Yz4b25C2U2iXtb7DILx/GfBxAP2TXHI2f96vSAfInEcwkBpOVLjSH9hHXOT5tJfOGlC/XkPHXtGILPw7sKSJyJT9VX3eOd53FOrQTIEXHyBozA3Xt9EAUILFsgArfG7rsLDTs6VMC/fsoeF5EGOLY34W0JFUjrhtRcjXtyyEO24TSICBn8uvod","cancellation_requested":false,"status":"completed","target":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292","request_id":"f6b83c40605244f893b9c8192346ab48"}'} + headers: + cache-control: [no-cache] + content-length: ['1201'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCAV7de3Z8cKmKGKOmhlJRoQdfL+9W38oCspd6ET92iAuBGeGy4x6vTcQxACLIdMEP9oWlQoHO7ABBnhDmWy4JhxSEYNjGRsSG83OP03nUXblnpoO6WsT1LHfqmwgKJpbeehrU6zj7gy/suzwwbxZnitNcb7fPRW3Yz4b25C2U2iXtb7DILx/GfBxAP2TXHI2f96vSAfInEcwkBpOVLjSH9hHXOT5tJfOGlC/XkPHXtGILPw7sKSJyJT9VX3eOd53FOrQTIEXHyBozA3Xt9EAUILFsgArfG7rsLDTs6VMC/fsoeF5EGOLY34W0JFUjrhtRcjXtyyEO24TSICBn8uvod","cancellation_requested":false,"status":"completed","target":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292","request_id":"f6b83c40605244f893b9c8192346ab48"}'} + headers: + cache-control: [no-cache] + content-length: ['1201'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/63670a584af64b908683d5a061e15aaa","kid":"https://vaultaa0f1292.vault.azure.net/keys/certaa0f1292/63670a584af64b908683d5a061e15aaa","sid":"https://vaultaa0f1292.vault.azure.net/secrets/certaa0f1292/63670a584af64b908683d5a061e15aaa","x5t":"XN_DXzWWx9uSpOmcil5QEfZMFVk","cer":"MIIDNjCCAh6gAwIBAgIQaA5RuWGHTT2PPKFm/DmQoTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTM0OVoXDTIwMDkwNjE4MDM0OVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFMzEre7bjyy+4sg3wqU9E31gjDNmMB0GA1UdDgQWBBTMxK3u248svuLIN8KlPRN9YIwzZjANBgkqhkiG9w0BAQsFAAOCAQEADJJ1AP7AQpujkElgUL3wgDMtvB9o4z/zO992YkcbjEzSpuooibw6ajtStTtMAVXPjLsP3/8TtrwYXBkiDcAydjzW7xiiuLiMKL+IG2ZhuloQosjGGhHkD4ms+tJ2HwhjlNwx3KPq9mAMVtOJVEKpNaitlq4lf9dKSKkyQn0eCEjEpykEhuLaPz5w0nqa0v4vciEdt8iPS7ymAqTP/WJDNMCXJQlh0mXwLckS2jCqzxnb63OGpz66grA//K72vYDMiKAZ0DS8It0B9XLozlXcaeA9QpY7yug8QIW3+Qn/xE03tt9cMzGaUGmQQx5vqA+CtbvkOicqMq6ZSOICl86gYg==","attributes":{"enabled":true,"nbf":1567792429,"exp":1599415429,"created":1567793029,"updated":1567793029,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultaa0f1292.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":1567793016,"updated":1567793016}},"pending":{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2355'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/63670a584af64b908683d5a061e15aaa","kid":"https://vaultaa0f1292.vault.azure.net/keys/certaa0f1292/63670a584af64b908683d5a061e15aaa","sid":"https://vaultaa0f1292.vault.azure.net/secrets/certaa0f1292/63670a584af64b908683d5a061e15aaa","x5t":"XN_DXzWWx9uSpOmcil5QEfZMFVk","cer":"MIIDNjCCAh6gAwIBAgIQaA5RuWGHTT2PPKFm/DmQoTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTM0OVoXDTIwMDkwNjE4MDM0OVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFMzEre7bjyy+4sg3wqU9E31gjDNmMB0GA1UdDgQWBBTMxK3u248svuLIN8KlPRN9YIwzZjANBgkqhkiG9w0BAQsFAAOCAQEADJJ1AP7AQpujkElgUL3wgDMtvB9o4z/zO992YkcbjEzSpuooibw6ajtStTtMAVXPjLsP3/8TtrwYXBkiDcAydjzW7xiiuLiMKL+IG2ZhuloQosjGGhHkD4ms+tJ2HwhjlNwx3KPq9mAMVtOJVEKpNaitlq4lf9dKSKkyQn0eCEjEpykEhuLaPz5w0nqa0v4vciEdt8iPS7ymAqTP/WJDNMCXJQlh0mXwLckS2jCqzxnb63OGpz66grA//K72vYDMiKAZ0DS8It0B9XLozlXcaeA9QpY7yug8QIW3+Qn/xE03tt9cMzGaUGmQQx5vqA+CtbvkOicqMq6ZSOICl86gYg==","attributes":{"enabled":true,"nbf":1567792429,"exp":1599415429,"created":1567793029,"updated":1567793042,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vaultaa0f1292.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":1567793016,"updated":1567793016}},"pending":{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2388'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/63670a584af64b908683d5a061e15aaa","kid":"https://vaultaa0f1292.vault.azure.net/keys/certaa0f1292/63670a584af64b908683d5a061e15aaa","sid":"https://vaultaa0f1292.vault.azure.net/secrets/certaa0f1292/63670a584af64b908683d5a061e15aaa","x5t":"XN_DXzWWx9uSpOmcil5QEfZMFVk","cer":"MIIDNjCCAh6gAwIBAgIQaA5RuWGHTT2PPKFm/DmQoTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTM0OVoXDTIwMDkwNjE4MDM0OVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYrsPDYq+25pR827GkrWv/VXPHmvMKGWcUxC04fKMXOJ8XDIEn+HKKblM3YmJ6csjTi6BM3oS1Z8hj0qtS2E+tNS5LJ9bwsv5d2aKF2qNXsFekWLgWUIeyPywdHXlonzN06Fs2WnM2kEnvKMZwpdXER0ChKMoxDfHx/83/N1URTJ5RBCkw/VGzWUbfsrXKvHW4jVHukMrJbt7Z5GKnxSWXt3Z3Ak/ZlDvAcY+T2lGVs3Gd/ppY2h7YrwnI3CjarTdOfSYqSAhLjqCra09Wnde9mZPY5kQJAbV61thbDEMC5BXPmbG8AqjV2OImDRBihR20b3RyieRXEG4isIzlKrkECAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFMzEre7bjyy+4sg3wqU9E31gjDNmMB0GA1UdDgQWBBTMxK3u248svuLIN8KlPRN9YIwzZjANBgkqhkiG9w0BAQsFAAOCAQEADJJ1AP7AQpujkElgUL3wgDMtvB9o4z/zO992YkcbjEzSpuooibw6ajtStTtMAVXPjLsP3/8TtrwYXBkiDcAydjzW7xiiuLiMKL+IG2ZhuloQosjGGhHkD4ms+tJ2HwhjlNwx3KPq9mAMVtOJVEKpNaitlq4lf9dKSKkyQn0eCEjEpykEhuLaPz5w0nqa0v4vciEdt8iPS7ymAqTP/WJDNMCXJQlh0mXwLckS2jCqzxnb63OGpz66grA//K72vYDMiKAZ0DS8It0B9XLozlXcaeA9QpY7yug8QIW3+Qn/xE03tt9cMzGaUGmQQx5vqA+CtbvkOicqMq6ZSOICl86gYg==","attributes":{"enabled":true,"nbf":1567792429,"exp":1599415429,"created":1567793029,"updated":1567793042,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vaultaa0f1292.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":1567793016,"updated":1567793016}},"pending":{"id":"https://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2388'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa0f1292.vault.azure.net/certificates/certaa0f1292/63670a584af64b908683d5a061e15aaa?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Certificate + not found: certaa0f1292/versions/63670a584af64b908683d5a061e15aaa"}}'} + headers: + cache-control: [no-cache] + content-length: ['130'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..c059d2043a2b --- /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://vaultdda41c5d.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: ['Fri, 06 Sep 2019 18:03:31 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=","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":"f3ac31a70a3f4ac9a5ec88f5e37bb19c"}'} + headers: + cache-control: [no-cache] + content-length: ['1340'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:32 GMT'] + expires: ['-1'] + location: ['https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0&request_id=f3ac31a70a3f4ac9a5ec88f5e37bb19c'] + 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=","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":"f3ac31a70a3f4ac9a5ec88f5e37bb19c"}'} + headers: + cache-control: [no-cache] + content-length: ['1340'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:32 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=","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":"f3ac31a70a3f4ac9a5ec88f5e37bb19c"}'} + headers: + cache-control: [no-cache] + content-length: ['1340'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:42 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=","cancellation_requested":false,"status":"completed","target":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert","request_id":"f3ac31a70a3f4ac9a5ec88f5e37bb19c"}'} + headers: + cache-control: [no-cache] + content-length: ['1255'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=} + headers: + cache-control: [no-cache] + content-length: ['956'] + content-type: [application/pkcs10; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfSM0jGsQhmbc2kS/CA80uHSoGLvfBtLXarHlPft6S+Glgh7UVxeOUV0RQjodE3U3bWFQ9bkmTUTEagLUm2/UxUggWIsU3KIzp81prb7zQrN1dGcCX8cVXW3RLLC4cwe9r/0iNJIYszei2khuHFotyJ0xZeGURroQmuIMhNRbBg/Oz4NjveDK5psg1L39U0LWkgumR3In2LfAckemi/e6qGDVA2KSyn4dCCHdE50LMEZLrWVjCf+/NWrH0w5LzC/IjXMbfXo2/b9WK0afWecZQNxLcTlpe+7Kmci8NUyrmjKTjoVbFs+hfH/rehhQW9xEfyv/k4FkgJLC0vzTsWeeQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACncBXter25SQ2wFjWa6YTXMQ8xIlAme6y3v6utDrpDUtdRrTo83WMULbiTcDtU1BeKHutCstnjfakpVKi2ncBJHvg0xiRLIlzZhObTdNONf9eXEGBmE+DLwNkrB2eTxLWswNkzQweCt2ObDVhOFjCXRikWZixG4JUSeOLqKiViZHkQJa0K6xBjgMJFtILAtFZKBMEjRlZ4yG3WLbwWLl4QMjtaa9MZxbiwDwHx2aVm9U/VEPmaQUCWslMoqlj89bBJ+op5P+gdvjMg90qttCAbiAlMFkZMjW32NqOENcaKlalblawyDqqTW/zYQdYWmH4esKOim4p1fpPnZ6/07ofg=","cancellation_requested":false,"status":"completed","target":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert","request_id":"f3ac31a70a3f4ac9a5ec88f5e37bb19c"}'} + headers: + cache-control: [no-cache] + content-length: ['1255'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert?api-version=7.0 + response: + body: {string: '{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/d7c61a628f9045b9af2e7e16f83f7f71","kid":"https://vaultdda41c5d.vault.azure.net/keys/unknownIssuerCert/d7c61a628f9045b9af2e7e16f83f7f71","sid":"https://vaultdda41c5d.vault.azure.net/secrets/unknownIssuerCert/d7c61a628f9045b9af2e7e16f83f7f71","x5t":"BGEyMkk9V5n7iJrru4gF7HyKkKk","cer":"MIIDWjCCAkKgAwIBAgIQFrhpOuuaTJyCnswH8rTkmzANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1MzQ5WhcNMjEwOTA2MTgwMzQ5WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCp9IzSMaxCGZtzaRL8IDzS4dKgYu98G0tdqseU9+3pL4aWCHtRXF45RXRFCOh0TdTdtYVD1uSZNRMRqAtSbb9TFSCBYixTcojOnzWmtvvNCs3V0ZwJfxxVdbdEssLhzB72v/SI0khizN6LaSG4cWi3InTFl4ZRGuhCa4gyE1FsGD87Pg2O94MrmmyDUvf1TQtaSC6ZHcifYt8ByR6aL97qoYNUDYpLKfh0IId0TnQswRkutZWMJ/781asfTDkvML8iNcxt9ejb9v1YrRp9Z5xlA3EtxOWl77sqZyLw1TKuaMpOOhVsWz6F8f+t6GFBb3ER/K/+TgWSAksLS/NOxZ55AgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFB9Lm10htrCqBq9QQFE8ZCQFj1D8MB0GA1UdDgQWBBQfS5tdIbawqgavUEBRPGQkBY9Q/DANBgkqhkiG9w0BAQsFAAOCAQEAlH0HFpFWT5mhh8HC8GAKe/ZXlFng+HVsH4y0MKwVOidYB3CfnMtLOnUEZYZqyAbDkqL6HzVQmbE0cR9iOh5bgUx689v5ZNLZliHRvyb442M3V30WYRhxfeljCd6RBHvIohdMGaHW/qZBFGLE+tqQGsTjLDsJ9w903YYl0by6s0d546hYwQR8RhU4KnPwhoIEB5YjAtV5556aQt8WLgk4G1seYS3PWXbh61iuo6icaGwp6uPdL4JlGmWC/zr1DFga0RRDjDu9SaCo7I1BrSouucYocL3Jcshu60HswF8HbsLvx/wptz1BrdF16RMpT8+dbPAwFaKt0CaAfwDOwryyTg==","attributes":{"enabled":true,"nbf":1567792429,"exp":1630951429,"created":1567793030,"updated":1567793030,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultdda41c5d.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":1567793012,"updated":1567793012}},"pending":{"id":"https://vaultdda41c5d.vault.azure.net/certificates/unknownIssuerCert/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2407'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..20be32baf4b0 --- /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://vaultf5650dfd.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert0f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert0f5650dfd/2a7baea39dd7430da8145bb9213828bb","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert0f5650dfd/2a7baea39dd7430da8145bb9213828bb","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert0f5650dfd/2a7baea39dd7430da8145bb9213828bb","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":1567793016,"updated":1567793016,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793016,"updated":1567793016}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert1f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert1f5650dfd/55b40954a6354d95ab15900386f185b2","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert1f5650dfd/55b40954a6354d95ab15900386f185b2","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert1f5650dfd/55b40954a6354d95ab15900386f185b2","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":1567793017,"updated":1567793017,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793017,"updated":1567793017}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert2f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert2f5650dfd/98fcc94ef81e47e2a452ffec3b53c69b","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert2f5650dfd/98fcc94ef81e47e2a452ffec3b53c69b","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert2f5650dfd/98fcc94ef81e47e2a452ffec3b53c69b","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":1567793017,"updated":1567793017,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793017,"updated":1567793017}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert3f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert3f5650dfd/8c302cb076184853be1add880fad8599","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert3f5650dfd/8c302cb076184853be1add880fad8599","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert3f5650dfd/8c302cb076184853be1add880fad8599","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":1567793018,"updated":1567793018,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793018,"updated":1567793018}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert4f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert4f5650dfd/6e25619244624c4d8bca8bebee576ffa","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert4f5650dfd/6e25619244624c4d8bca8bebee576ffa","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert4f5650dfd/6e25619244624c4d8bca8bebee576ffa","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":1567793018,"updated":1567793018,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793018,"updated":1567793018}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert5f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert5f5650dfd/b5d9b859760d49b785b4ef9626544f67","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert5f5650dfd/b5d9b859760d49b785b4ef9626544f67","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert5f5650dfd/b5d9b859760d49b785b4ef9626544f67","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":1567793019,"updated":1567793019,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793019,"updated":1567793019}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates/cert6f5650dfd/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert6f5650dfd/0b1203c04d9147f586f8bed191a8d8d1","kid":"https://vaultf5650dfd.vault.azure.net/keys/cert6f5650dfd/0b1203c04d9147f586f8bed191a8d8d1","sid":"https://vaultf5650dfd.vault.azure.net/secrets/cert6f5650dfd/0b1203c04d9147f586f8bed191a8d8d1","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":1567793019,"updated":1567793019,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultf5650dfd.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":1567793019,"updated":1567793019}}}'} + headers: + cache-control: [no-cache] + content-length: ['1794'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultf5650dfd.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert0f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793016,"updated":1567793016},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert1f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793017,"updated":1567793017},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert2f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793017,"updated":1567793017},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert3f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793018,"updated":1567793018},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert4f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793018,"updated":1567793018},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert5f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793019,"updated":1567793019},"subject":""},{"id":"https://vaultf5650dfd.vault.azure.net/certificates/cert6f5650dfd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793019,"updated":1567793019},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['1630'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..e4c247dfd890 --- /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://vault79c016b7.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: ['Fri, 06 Sep 2019 18:03:31 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/ca4a9ab3eea74bc5afa568bf98a17ae8","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/ca4a9ab3eea74bc5afa568bf98a17ae8","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/ca4a9ab3eea74bc5afa568bf98a17ae8","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":1567793011,"updated":1567793011,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793011}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/4ce82491c833469f8d650bb81c1caafd","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/4ce82491c833469f8d650bb81c1caafd","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/4ce82491c833469f8d650bb81c1caafd","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":1567793012,"updated":1567793012,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793012}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/f114f3171a83433c9846a42164fa95be","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/f114f3171a83433c9846a42164fa95be","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/f114f3171a83433c9846a42164fa95be","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":1567793013,"updated":1567793013,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793013}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/7b8a235e63fb451595a0892856122b67","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/7b8a235e63fb451595a0892856122b67","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/7b8a235e63fb451595a0892856122b67","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":1567793013,"updated":1567793013,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793013}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/f518a69096d24504914a23820979b2d4","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/f518a69096d24504914a23820979b2d4","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/f518a69096d24504914a23820979b2d4","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":1567793014,"updated":1567793014,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793014}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/b51167fbd4eb49b4bc21a2eb4583473c","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/b51167fbd4eb49b4bc21a2eb4583473c","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/b51167fbd4eb49b4bc21a2eb4583473c","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":1567793014,"updated":1567793014,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793014}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/8098692fa4b64681ae4d23cc6d082c7f","kid":"https://vault79c016b7.vault.azure.net/keys/certver79c016b7/8098692fa4b64681ae4d23cc6d082c7f","sid":"https://vault79c016b7.vault.azure.net/secrets/certver79c016b7/8098692fa4b64681ae4d23cc6d082c7f","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":1567793015,"updated":1567793015,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault79c016b7.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":1567793011,"updated":1567793015}}}'} + headers: + cache-control: [no-cache] + content-length: ['1802'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault79c016b7.vault.azure.net/certificates/certver79c016b7/versions?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/4ce82491c833469f8d650bb81c1caafd","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793012,"updated":1567793012},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/7b8a235e63fb451595a0892856122b67","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793013,"updated":1567793013},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/8098692fa4b64681ae4d23cc6d082c7f","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793015,"updated":1567793015},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/b51167fbd4eb49b4bc21a2eb4583473c","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793014,"updated":1567793014},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/ca4a9ab3eea74bc5afa568bf98a17ae8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793011,"updated":1567793011},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/f114f3171a83433c9846a42164fa95be","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793013,"updated":1567793013},"subject":""},{"id":"https://vault79c016b7.vault.azure.net/certificates/certver79c016b7/f518a69096d24504914a23820979b2d4","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793014,"updated":1567793014},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['1875'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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": "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: + - 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..2681f4b820bb --- /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://vaultcf0f1333.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsY+ixX/Jd85QYjEskVyzGvZNC4fXMgwIChOZSVRHQZuAESPF4CbAGlx3NBYNnMSOzeWLJnDN1XaO6Bk0MZhH1zehhpqLymOGoUQ3bV8hCXsJjK/4kKf94lwLOFVuDmItAHOWSXJ5WUbFqfA14RWUGw48KVjtNe3LOv9p+q19tnPDdtShA0JxoW7XmaXeHfbK46aD/Ilw44eMoQBKJ3mVxLbuQeWiShX3/xqDo1ekdKriy+ignJWuOAyLp5PfgHj9x9tA4axfsnhvDvTBdhVCZZedjknQO9shsM/xQqdeIV20MoCH8vVMY7YoO13GxmfUsyENJ0jCwTSN6vrDlRXOwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFvS1gJOhqfbD4Qg/NXrB5m65AhBVHZE8Xh1N1ZsSFrHa/6WbmETZl+K1oIpNf9X1AXpRlvFVJ3iAG3cAkY4YPAW5Rc57x2OLhHCmIeZjoKSJQ+qPCvb660WMCpEemAs952USjIPUEnPydTU0knebJoPELEYr0UZr/AWtIblRWOTkwrkW2qM58yiFzYyGtxHhxccpW3LTkQgv4LWkXBspv0Na7a9GuSeY/pR6u40qg9xZ5Sj8BSk21H9YbYIRnIy10Ur9iqeMB3I9H//KtFfSyOfRWXjZ41OSyIBgnDBEyheOmsnB+kY3evgavhvZZQwwfLjAl4equfQApB+5L2042w=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"52c779ac092843428e139d5d17c58d26"}'} + headers: + cache-control: [no-cache] + content-length: ['1220'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:33 GMT'] + expires: ['-1'] + location: ['https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0&request_id=52c779ac092843428e139d5d17c58d26'] + 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsY+ixX/Jd85QYjEskVyzGvZNC4fXMgwIChOZSVRHQZuAESPF4CbAGlx3NBYNnMSOzeWLJnDN1XaO6Bk0MZhH1zehhpqLymOGoUQ3bV8hCXsJjK/4kKf94lwLOFVuDmItAHOWSXJ5WUbFqfA14RWUGw48KVjtNe3LOv9p+q19tnPDdtShA0JxoW7XmaXeHfbK46aD/Ilw44eMoQBKJ3mVxLbuQeWiShX3/xqDo1ekdKriy+ignJWuOAyLp5PfgHj9x9tA4axfsnhvDvTBdhVCZZedjknQO9shsM/xQqdeIV20MoCH8vVMY7YoO13GxmfUsyENJ0jCwTSN6vrDlRXOwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFvS1gJOhqfbD4Qg/NXrB5m65AhBVHZE8Xh1N1ZsSFrHa/6WbmETZl+K1oIpNf9X1AXpRlvFVJ3iAG3cAkY4YPAW5Rc57x2OLhHCmIeZjoKSJQ+qPCvb660WMCpEemAs952USjIPUEnPydTU0knebJoPELEYr0UZr/AWtIblRWOTkwrkW2qM58yiFzYyGtxHhxccpW3LTkQgv4LWkXBspv0Na7a9GuSeY/pR6u40qg9xZ5Sj8BSk21H9YbYIRnIy10Ur9iqeMB3I9H//KtFfSyOfRWXjZ41OSyIBgnDBEyheOmsnB+kY3evgavhvZZQwwfLjAl4equfQApB+5L2042w=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"52c779ac092843428e139d5d17c58d26"}'} + headers: + cache-control: [no-cache] + content-length: ['1220'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:33 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsY+ixX/Jd85QYjEskVyzGvZNC4fXMgwIChOZSVRHQZuAESPF4CbAGlx3NBYNnMSOzeWLJnDN1XaO6Bk0MZhH1zehhpqLymOGoUQ3bV8hCXsJjK/4kKf94lwLOFVuDmItAHOWSXJ5WUbFqfA14RWUGw48KVjtNe3LOv9p+q19tnPDdtShA0JxoW7XmaXeHfbK46aD/Ilw44eMoQBKJ3mVxLbuQeWiShX3/xqDo1ekdKriy+ignJWuOAyLp5PfgHj9x9tA4axfsnhvDvTBdhVCZZedjknQO9shsM/xQqdeIV20MoCH8vVMY7YoO13GxmfUsyENJ0jCwTSN6vrDlRXOwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFvS1gJOhqfbD4Qg/NXrB5m65AhBVHZE8Xh1N1ZsSFrHa/6WbmETZl+K1oIpNf9X1AXpRlvFVJ3iAG3cAkY4YPAW5Rc57x2OLhHCmIeZjoKSJQ+qPCvb660WMCpEemAs952USjIPUEnPydTU0knebJoPELEYr0UZr/AWtIblRWOTkwrkW2qM58yiFzYyGtxHhxccpW3LTkQgv4LWkXBspv0Na7a9GuSeY/pR6u40qg9xZ5Sj8BSk21H9YbYIRnIy10Ur9iqeMB3I9H//KtFfSyOfRWXjZ41OSyIBgnDBEyheOmsnB+kY3evgavhvZZQwwfLjAl4equfQApB+5L2042w=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"52c779ac092843428e139d5d17c58d26"}'} + headers: + cache-control: [no-cache] + content-length: ['1220'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:44 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsY+ixX/Jd85QYjEskVyzGvZNC4fXMgwIChOZSVRHQZuAESPF4CbAGlx3NBYNnMSOzeWLJnDN1XaO6Bk0MZhH1zehhpqLymOGoUQ3bV8hCXsJjK/4kKf94lwLOFVuDmItAHOWSXJ5WUbFqfA14RWUGw48KVjtNe3LOv9p+q19tnPDdtShA0JxoW7XmaXeHfbK46aD/Ilw44eMoQBKJ3mVxLbuQeWiShX3/xqDo1ekdKriy+ignJWuOAyLp5PfgHj9x9tA4axfsnhvDvTBdhVCZZedjknQO9shsM/xQqdeIV20MoCH8vVMY7YoO13GxmfUsyENJ0jCwTSN6vrDlRXOwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFvS1gJOhqfbD4Qg/NXrB5m65AhBVHZE8Xh1N1ZsSFrHa/6WbmETZl+K1oIpNf9X1AXpRlvFVJ3iAG3cAkY4YPAW5Rc57x2OLhHCmIeZjoKSJQ+qPCvb660WMCpEemAs952USjIPUEnPydTU0knebJoPELEYr0UZr/AWtIblRWOTkwrkW2qM58yiFzYyGtxHhxccpW3LTkQgv4LWkXBspv0Na7a9GuSeY/pR6u40qg9xZ5Sj8BSk21H9YbYIRnIy10Ur9iqeMB3I9H//KtFfSyOfRWXjZ41OSyIBgnDBEyheOmsnB+kY3evgavhvZZQwwfLjAl4equfQApB+5L2042w=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"52c779ac092843428e139d5d17c58d26"}'} + headers: + cache-control: [no-cache] + content-length: ['1220'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03:54 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsY+ixX/Jd85QYjEskVyzGvZNC4fXMgwIChOZSVRHQZuAESPF4CbAGlx3NBYNnMSOzeWLJnDN1XaO6Bk0MZhH1zehhpqLymOGoUQ3bV8hCXsJjK/4kKf94lwLOFVuDmItAHOWSXJ5WUbFqfA14RWUGw48KVjtNe3LOv9p+q19tnPDdtShA0JxoW7XmaXeHfbK46aD/Ilw44eMoQBKJ3mVxLbuQeWiShX3/xqDo1ekdKriy+ignJWuOAyLp5PfgHj9x9tA4axfsnhvDvTBdhVCZZedjknQO9shsM/xQqdeIV20MoCH8vVMY7YoO13GxmfUsyENJ0jCwTSN6vrDlRXOwIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFvS1gJOhqfbD4Qg/NXrB5m65AhBVHZE8Xh1N1ZsSFrHa/6WbmETZl+K1oIpNf9X1AXpRlvFVJ3iAG3cAkY4YPAW5Rc57x2OLhHCmIeZjoKSJQ+qPCvb660WMCpEemAs952USjIPUEnPydTU0knebJoPELEYr0UZr/AWtIblRWOTkwrkW2qM58yiFzYyGtxHhxccpW3LTkQgv4LWkXBspv0Na7a9GuSeY/pR6u40qg9xZ5Sj8BSk21H9YbYIRnIy10Ur9iqeMB3I9H//KtFfSyOfRWXjZ41OSyIBgnDBEyheOmsnB+kY3evgavhvZZQwwfLjAl4equfQApB+5L2042w=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"52c779ac092843428e139d5d17c58d26"}'} + headers: + cache-control: [no-cache] + content-length: ['1220'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"x5c": ["TUlJQ3lqQ0NBYklDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREFlRncweE9UQTVNRFl4T0RBME1EUmFGdzB4T1RBNU1EWXhPREExTURSYU1CRXhEekFOQmdOVkJBTVRCazE1UTJWeWREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU03R1Bvc1YveVhmT1VHSXhMSkZjc3hyMlRRdUgxeklNQ0FvVG1VbFVSMEdiZ0JFanhlQW13QnBjZHpRV0RaekVqczNsaXlad3pkVjJqdWdaTkRHWVI5YzNvWWFhaThwamhxRkVOMjFmSVFsN0NZeXYrSkNuL2VKY0N6aFZiZzVpTFFCemxrbHllVmxHeGFud05lRVZsQnNPUENsWTdUWHR5enIvYWZxdGZiWnp3M2JVb1FOQ2NhRnUxNW1sM2gzMnl1T21nL3lKY09PSGpLRUFTaWQ1bGNTMjdrSGxva29WOS84YWc2TlhwSFNxNHN2b29KeVZyamdNaTZlVDM0QjQvY2ZiUU9Hc1g3SjRidzcwd1hZVlFtV1huWTVKMER2YkliRFA4VUtuWGlGZHRES0FoL0wxVEdPMktEdGR4c1puMUxNaERTZEl3c0UwamVyNnc1VVZ6c0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQW40NDNWc0k1VS9XUmh4cnlMa0pYZGRwanZkbW13L2ZaZGJJK0prZVVTQ1VPcEozRVlleDFKYzNpSUsrWGY5Nk40cmpPVlRubTgwTzB1d09nZ2llNzRUTitBUmJVdE4xSHdDZVJlZjZmQUtRQW01NnZtUS9RSmZiaWJVb2tZSE9EZVNvbjI4dnIyRE52UG9XZlFPWTE5UWFUYS9FS2loTUhtVlNoaWFRWEw4dUVXZTA0cmpBd0g4S25uNDVaTWpUYTl4S3RLc1N6ZlJYZjh4T0JuVWxheVBRNlJNVndCa0NCdmVkbzcvbFh4cDFVN0l4aUlQc1BERVJYRmFOSzVkR25hYmZjcFhnQnY1YlN4elJRVFI3UitXTlA4V2FZSm13WUN4enQ5dGlXcTZ2VWNkRkd5MEN5a3F4S2FkQ1docGhHMFdrcWdZZlFVZkEvSWhrdVZDLzJGdz09"]}' + 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://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending/merge?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/95a0faf01cab4b4199065d5f92f9648e","kid":"https://vaultcf0f1333.vault.azure.net/keys/mergeCertificate/95a0faf01cab4b4199065d5f92f9648e","sid":"https://vaultcf0f1333.vault.azure.net/secrets/mergeCertificate/95a0faf01cab4b4199065d5f92f9648e","x5t":"pEn5VXKGKRRnICvP4dHXtikfWRQ","cer":"MIICyjCCAbICAQEwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MDYxODA0MDRaFw0xOTA5MDYxODA1MDRaMBExDzANBgNVBAMTBk15Q2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7GPosV/yXfOUGIxLJFcsxr2TQuH1zIMCAoTmUlUR0GbgBEjxeAmwBpcdzQWDZzEjs3liyZwzdV2jugZNDGYR9c3oYaai8pjhqFEN21fIQl7CYyv+JCn/eJcCzhVbg5iLQBzlklyeVlGxanwNeEVlBsOPClY7TXtyzr/afqtfbZzw3bUoQNCcaFu15ml3h32yuOmg/yJcOOHjKEASid5lcS27kHlokoV9/8ag6NXpHSq4svooJyVrjgMi6eT34B4/cfbQOGsX7J4bw70wXYVQmWXnY5J0DvbIbDP8UKnXiFdtDKAh/L1TGO2KDtdxsZn1LMhDSdIwsE0jer6w5UVzsCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAn443VsI5U/WRhxryLkJXddpjvdmmw/fZdbI+JkeUSCUOpJ3EYex1Jc3iIK+Xf96N4rjOVTnm80O0uwOggie74TN+ARbUtN1HwCeRef6fAKQAm56vmQ/QJfbibUokYHODeSon28vr2DNvPoWfQOY19QaTa/EKihMHmVShiaQXL8uEWe04rjAwH8Knn45ZMjTa9xKtKsSzfRXf8xOBnUlayPQ6RMVwBkCBvedo7/lXxp1U7IxiIPsPDERXFaNK5dGnabfcpXgBv5bSxzRQTR7R+WNP8WaYJmwYCxzt9tiWq6vUcdFGy0CykqxKadCWhphG0WkqgYfQUfA/IhkuVC/2Fw==","attributes":{"enabled":true,"nbf":1567793044,"exp":1567793104,"created":1567793044,"updated":1567793044,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultcf0f1333.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":1567793013,"updated":1567793013}},"pending":{"id":"https://vaultcf0f1333.vault.azure.net/certificates/mergeCertificate/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2201'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04:04 GMT'] + expires: ['-1'] + location: ['https://vaultcf0f1333.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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..4c4a68b62f05 --- /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://vault12a60ed1.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: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault12a60ed1.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault12a60ed1.vault.azure.net/certificates/policyCertificate/99d5549c8b2e42bc95830e0597751f4a","kid":"https://vault12a60ed1.vault.azure.net/keys/policyCertificate/99d5549c8b2e42bc95830e0597751f4a","sid":"https://vault12a60ed1.vault.azure.net/secrets/policyCertificate/99d5549c8b2e42bc95830e0597751f4a","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":1567793012,"updated":1567793012,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault12a60ed1.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":1567793012,"updated":1567793012}}}'} + headers: + cache-control: [no-cache] + content-length: ['1810'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault12a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault12a60ed1.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":1567793012,"updated":1567793012}}'} + headers: + cache-control: [no-cache] + content-length: ['540'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault12a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault12a60ed1.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":1567793012,"updated":1567793013}}'} + headers: + cache-control: [no-cache] + content-length: ['537'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault12a60ed1.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault12a60ed1.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":1567793012,"updated":1567793013}}'} + headers: + cache-control: [no-cache] + content-length: ['537'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:03: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..550b9c414424 --- /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://vaultcfef134b.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: ['Fri, 06 Sep 2019 18:04:39 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + x-powered-by: [ASP.NET] + status: {code: 401, message: Unauthorized} +- 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://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","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":1567793079,"updated":1567793079,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793079,"updated":1567793079}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","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":1567793080,"updated":1567793080,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793080,"updated":1567793080}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg0cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg1cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg2cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg3cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg4cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg5cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg6cfef134b/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","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":1567793085,"updated":1567793085,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793085,"updated":1567793085}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b","deletedDate":1567793085,"scheduledPurgeDate":1575569085,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","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":1567793079,"updated":1567793079,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793079,"updated":1567793079}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","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":1567793080,"updated":1567793080,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793080,"updated":1567793080}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg0cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg0cfef134b/cfb4c20308c94abba52f898fabeb25ca","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg1cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg1cfef134b/5682b43753bc494f944919ed8f8c02a4","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg2cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg2cfef134b/9434a977fbfe4ffa985af99c574e628a","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":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793083,"updated":1567793083}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg3cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg3cfef134b/d12994c11837482189d9d0c5f77514a3","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg4cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg4cfef134b/303e23c1a53c4620829bc3334a308e9f","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg5cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg5cfef134b/7b6ec608b12d4504a7876fcec3b4bad3","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":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793084,"updated":1567793084}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certprg6cfef134b?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","kid":"https://vaultcfef134b.vault.azure.net/keys/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","sid":"https://vaultcfef134b.vault.azure.net/secrets/certprg6cfef134b/00ecf42cfcd74d1d9471ce2c9e674031","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":1567793085,"updated":1567793085,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793085,"updated":1567793085}}}'} + headers: + cache-control: [no-cache] + content-length: ['1965'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg0cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg1cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg2cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793083,"updated":1567793083,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg3cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg4cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg5cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793084,"updated":1567793084,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b","deletedDate":1567793087,"scheduledPurgeDate":1575569087,"id":"https://vaultcfef134b.vault.azure.net/certificates/certprg6cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793085,"updated":1567793085,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b","deletedDate":1567793085,"scheduledPurgeDate":1575569085,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793079,"updated":1567793079,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793080,"updated":1567793080,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vaultcfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b","deletedDate":1567793086,"scheduledPurgeDate":1575569086,"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"}}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['5711'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec0cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","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":1567793079,"updated":1567793079,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793079,"updated":1567793079}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec1cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","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":1567793080,"updated":1567793080,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793080,"updated":1567793080}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec2cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec3cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec4cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec5cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certrec6cfef134b/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg0cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg1cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg2cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg3cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg4cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg5cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/deletedcertificates/certprg6cfef134b?api-version=7.0 + response: + body: {string: ''} + headers: + cache-control: [no-cache] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.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: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec0cfef134b/a3a8210310784404b6409ac585a88c97","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":1567793079,"updated":1567793079,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793079,"updated":1567793079}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec1cfef134b/531ae0dd2ce94dd3b380e595b53a3c35","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":1567793080,"updated":1567793080,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793080,"updated":1567793080}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec2cfef134b/91b526fef53a4a8cb5a01c7ac3e140a4","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec3cfef134b/cc4751cfc402400db146d233e3c1fcc5","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec4cfef134b/e9d2bfa845c143a38367c271c80b3841","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":1567793081,"updated":1567793081,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793081,"updated":1567793081}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec5cfef134b/41ec03cdbb0a44499ca4eec7ec1f1d8b","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfef134b.vault.azure.net/certificates/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","kid":"https://vaultcfef134b.vault.azure.net/keys/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","sid":"https://vaultcfef134b.vault.azure.net/secrets/certrec6cfef134b/d3ce264cc1d746548355f75f0bc41067","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":1567793082,"updated":1567793082,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultcfef134b.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":1567793082,"updated":1567793082}}}'} + headers: + cache-control: [no-cache] + content-length: ['1818'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..acebd769804f --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_async_request_cancellation_and_deletion.yaml @@ -0,0 +1,231 @@ +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://vault95aa1ed5.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: 'Fri, 06 Sep 2019 18:04:41 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","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":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: + cache-control: no-cache + content-length: '1347' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:43 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', f, '8', + '6', c, '4', '2', '5', '9', c, '4', f, '6', '4', '5', c, '3', b, '8', c, a, + '6', c, '5', '9', f, '4', e, '1', '9', '1', '9', '5'] + 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","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":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1346', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","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":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1346', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:43 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","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":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1346', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:53 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","cancellation_requested":true,"status":"cancelled","request_id":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1181', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","cancellation_requested":true,"status":"cancelled","request_id":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1181', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAysEWRu59ghH/taALaNRpg53GTdBVPmas0+4sFyu/0+kugNXBvy6HHrhsucJvMX1g8nG3e+zPmi7efOpfoL2910sFQeQF9brwD24CVOhkGRWiav4UQVL+4WTTYDbn1Ixy16ybEMebfn+5mujXDMe6TDqJLnSAFffdybCgrIAP9dPfleqQpyaTnXoGuFXj6d1k1tzVLXhACyfgnKeEkR3+5vjjwT4Bpxrzp++a2t94NjODJubnAU+rPXd8gqVAv+6qk7Tm0KD6WrppvQAQPQVux8moAUT/2qdHJHMJRRUyuK7ggje0/L1mRhJgAIj12Lboygpbixrr7e+of9XCNbj/1QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAJghrUyu0UubPbLJGi3oJU+lY+6/iRwa0N9ZN6JR6II4eACicT/JjcGKlo02behgrM0cFr2xpQx0Tsi1OPpaa5AH5vfitjElu6VEsZm2cuTFjlQZDDLCQiCEzrEGu/KlNtW67gFFdpMWqedOWsKhz5crEuU+bxumHW++jKJxFtRpW+DUWkJt+4GMO7Rhr83oc5dpVjkzIxkBGxe3iQumdaOxNg1mZzBYB4xxX5hquBEBxG4/iWoxfczQmbKKm6nqVb3xeqvd3MNCdv4CN8db2LZyWswNjIVdv+W2Y8lbcj2sQ2g5W6sZP7GGbYvuKO6OsZfYp++A7/uAPmVnLRD/CSQ=","cancellation_requested":true,"status":"cancelled","request_id":"f86c4259c4f645c3b8ca6c59f4e19195"}'} + headers: {cache-control: no-cache, content-length: '1181', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.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: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault95aa1ed5.vault.azure.net/certificates/asyncCanceledDeletedCert/07e2c40b62484b84a99970cbf524f4d0","attributes":{"enabled":false,"nbf":1567792482,"exp":1630951482,"created":1567793082,"updated":1567793082,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault95aa1ed5.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":1567793082,"updated":1567793082}}}'} + headers: {cache-control: no-cache, content-length: '922', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault95aa1ed5.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..9199aac4397b --- /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://vaultcfa1497.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov+vniqC7LpgWtjYzjIEf6s93RVPgi3SlWm3u4bk4YQzLnYYtyTwWP4IuC4m2H4UseUs3GA+0W1n0rGkkJMqP9D8GX/4Lhp4hshn3e48F9XGna7+DAW3FKvHOWrrW/UxzXNXp+4wzGHRqLU/GzM3KYF1Bb4alGzxBWDN5YMqpgseeCxVgyaEa0MsWr7HVXVUwNjGVPsaxS3fPqnxDOxWNZMCbY7r1UU7Or8vy7f2MzPUJD7YTtvaGD4Xk7rR3uaairyzWnrdSeeOn0iVewtXvPvjzxmZNw/2/f6RE5i4Wosta9fa/l4ca6lVkmC99GFO7Pkq1Wvtwo3+6dHx/9cyqQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAEZCpzPBq/T1hByBsvpKpYerQAK34nNZbyqhQaf/O5PoSGpRmzmKX7ydGN5NSScc8TuBVGN5AraY/8RXvOehj0sWEBtPwZpiCkgF8ms1YL8S9gipSiclJ2coCNkhTaDs/HB6pfNFOcGgi2rHWSfb2o/f435e2hGkSEwDqGHwYYkct3mP4SDDqZ89sDGExmmWYcjwqX4YSFzYpYs+9+WHlTiRTzzoXWfSkxl3Cox+Kky2G7tEO76AtWDEP1tNEv0v3dD2Mzu49B+XBsomZEqVSwAzU2G7OnmXdiG0e0KIf8ew8pMoFysExieSOSPrmU0ls5PvTFffInjoo03IXbQkiU=","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":"59a8344affe446e1aaae08b2883fb71f"}'} + headers: + cache-control: no-cache + content-length: '1293' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:13 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, 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, '=', '5', '9', a, '8', '3', '4', '4', a, f, + f, e, '4', '4', '6', e, '1', a, a, a, e, '0', '8', b, '2', '8', '8', '3', + f, b, '7', '1', 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov+vniqC7LpgWtjYzjIEf6s93RVPgi3SlWm3u4bk4YQzLnYYtyTwWP4IuC4m2H4UseUs3GA+0W1n0rGkkJMqP9D8GX/4Lhp4hshn3e48F9XGna7+DAW3FKvHOWrrW/UxzXNXp+4wzGHRqLU/GzM3KYF1Bb4alGzxBWDN5YMqpgseeCxVgyaEa0MsWr7HVXVUwNjGVPsaxS3fPqnxDOxWNZMCbY7r1UU7Or8vy7f2MzPUJD7YTtvaGD4Xk7rR3uaairyzWnrdSeeOn0iVewtXvPvjzxmZNw/2/f6RE5i4Wosta9fa/l4ca6lVkmC99GFO7Pkq1Wvtwo3+6dHx/9cyqQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAEZCpzPBq/T1hByBsvpKpYerQAK34nNZbyqhQaf/O5PoSGpRmzmKX7ydGN5NSScc8TuBVGN5AraY/8RXvOehj0sWEBtPwZpiCkgF8ms1YL8S9gipSiclJ2coCNkhTaDs/HB6pfNFOcGgi2rHWSfb2o/f435e2hGkSEwDqGHwYYkct3mP4SDDqZ89sDGExmmWYcjwqX4YSFzYpYs+9+WHlTiRTzzoXWfSkxl3Cox+Kky2G7tEO76AtWDEP1tNEv0v3dD2Mzu49B+XBsomZEqVSwAzU2G7OnmXdiG0e0KIf8ew8pMoFysExieSOSPrmU0ls5PvTFffInjoo03IXbQkiU=","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":"59a8344affe446e1aaae08b2883fb71f"}'} + headers: {cache-control: no-cache, content-length: '1293', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:13 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov+vniqC7LpgWtjYzjIEf6s93RVPgi3SlWm3u4bk4YQzLnYYtyTwWP4IuC4m2H4UseUs3GA+0W1n0rGkkJMqP9D8GX/4Lhp4hshn3e48F9XGna7+DAW3FKvHOWrrW/UxzXNXp+4wzGHRqLU/GzM3KYF1Bb4alGzxBWDN5YMqpgseeCxVgyaEa0MsWr7HVXVUwNjGVPsaxS3fPqnxDOxWNZMCbY7r1UU7Or8vy7f2MzPUJD7YTtvaGD4Xk7rR3uaairyzWnrdSeeOn0iVewtXvPvjzxmZNw/2/f6RE5i4Wosta9fa/l4ca6lVkmC99GFO7Pkq1Wvtwo3+6dHx/9cyqQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAEZCpzPBq/T1hByBsvpKpYerQAK34nNZbyqhQaf/O5PoSGpRmzmKX7ydGN5NSScc8TuBVGN5AraY/8RXvOehj0sWEBtPwZpiCkgF8ms1YL8S9gipSiclJ2coCNkhTaDs/HB6pfNFOcGgi2rHWSfb2o/f435e2hGkSEwDqGHwYYkct3mP4SDDqZ89sDGExmmWYcjwqX4YSFzYpYs+9+WHlTiRTzzoXWfSkxl3Cox+Kky2G7tEO76AtWDEP1tNEv0v3dD2Mzu49B+XBsomZEqVSwAzU2G7OnmXdiG0e0KIf8ew8pMoFysExieSOSPrmU0ls5PvTFffInjoo03IXbQkiU=","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":"59a8344affe446e1aaae08b2883fb71f"}'} + headers: {cache-control: no-cache, content-length: '1293', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:23 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov+vniqC7LpgWtjYzjIEf6s93RVPgi3SlWm3u4bk4YQzLnYYtyTwWP4IuC4m2H4UseUs3GA+0W1n0rGkkJMqP9D8GX/4Lhp4hshn3e48F9XGna7+DAW3FKvHOWrrW/UxzXNXp+4wzGHRqLU/GzM3KYF1Bb4alGzxBWDN5YMqpgseeCxVgyaEa0MsWr7HVXVUwNjGVPsaxS3fPqnxDOxWNZMCbY7r1UU7Or8vy7f2MzPUJD7YTtvaGD4Xk7rR3uaairyzWnrdSeeOn0iVewtXvPvjzxmZNw/2/f6RE5i4Wosta9fa/l4ca6lVkmC99GFO7Pkq1Wvtwo3+6dHx/9cyqQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAEZCpzPBq/T1hByBsvpKpYerQAK34nNZbyqhQaf/O5PoSGpRmzmKX7ydGN5NSScc8TuBVGN5AraY/8RXvOehj0sWEBtPwZpiCkgF8ms1YL8S9gipSiclJ2coCNkhTaDs/HB6pfNFOcGgi2rHWSfb2o/f435e2hGkSEwDqGHwYYkct3mP4SDDqZ89sDGExmmWYcjwqX4YSFzYpYs+9+WHlTiRTzzoXWfSkxl3Cox+Kky2G7tEO76AtWDEP1tNEv0v3dD2Mzu49B+XBsomZEqVSwAzU2G7OnmXdiG0e0KIf8ew8pMoFysExieSOSPrmU0ls5PvTFffInjoo03IXbQkiU=","cancellation_requested":false,"status":"completed","target":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497","request_id":"59a8344affe446e1aaae08b2883fb71f"}'} + headers: {cache-control: no-cache, content-length: '1201', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending","issuer":{"name":"Self"},"csr":"MIICqjCCAZICAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAov+vniqC7LpgWtjYzjIEf6s93RVPgi3SlWm3u4bk4YQzLnYYtyTwWP4IuC4m2H4UseUs3GA+0W1n0rGkkJMqP9D8GX/4Lhp4hshn3e48F9XGna7+DAW3FKvHOWrrW/UxzXNXp+4wzGHRqLU/GzM3KYF1Bb4alGzxBWDN5YMqpgseeCxVgyaEa0MsWr7HVXVUwNjGVPsaxS3fPqnxDOxWNZMCbY7r1UU7Or8vy7f2MzPUJD7YTtvaGD4Xk7rR3uaairyzWnrdSeeOn0iVewtXvPvjzxmZNw/2/f6RE5i4Wosta9fa/l4ca6lVkmC99GFO7Pkq1Wvtwo3+6dHx/9cyqQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAEZCpzPBq/T1hByBsvpKpYerQAK34nNZbyqhQaf/O5PoSGpRmzmKX7ydGN5NSScc8TuBVGN5AraY/8RXvOehj0sWEBtPwZpiCkgF8ms1YL8S9gipSiclJ2coCNkhTaDs/HB6pfNFOcGgi2rHWSfb2o/f435e2hGkSEwDqGHwYYkct3mP4SDDqZ89sDGExmmWYcjwqX4YSFzYpYs+9+WHlTiRTzzoXWfSkxl3Cox+Kky2G7tEO76AtWDEP1tNEv0v3dD2Mzu49B+XBsomZEqVSwAzU2G7OnmXdiG0e0KIf8ew8pMoFysExieSOSPrmU0ls5PvTFffInjoo03IXbQkiU=","cancellation_requested":false,"status":"completed","target":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497","request_id":"59a8344affe446e1aaae08b2883fb71f"}'} + headers: {cache-control: no-cache, content-length: '1201', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLklOQ3ZyTWJGM2FCVlFiVDE4V0lOOGJZQ3hFVmtaeTdVY2J5RXpPaE9Tb3dTQXBtV21mUE56b2R5cDUtdXVZaWJRUC1XaGMzQWMxeHpIZXV1M2FGckk0UHdPTzZpcHl3ZDl6ZE9QOXk1WW84YjF4clZOeUV2RXM0SWpkNGVQckp3TmM3eTJXYmlqX25kdVFxTzQxTkd5QXRUaTVfM1RaLTQ3cVN5WGRrVTU3TG4wel95VmpFbEtFS05Oa245aGJCOW5EbFB6S0tpNEhDTnF4UXpRRjFISUpXSEJTdGMtbW8xRElvdElFUmFmaWtGcWxTalpRNXM5QlZCMDNsbHU5eFdobG5fWDFWMWpjcTEybUE2VTd6Wld0NnNHcXR3TEl2c1I5NWRYWjFMMVB3UUJORTVoNjBLOVl2MGpzYnI5dTFfOTV6ZXVETmhUSDl2SThHc2ozcTRpQS5jOXJPUWlFM2FHRm1DV1RGRkNvdWRRLk5hVDhaQ3hkbXBpb3Y3NU5jWS0zdVpNdHI0TzlwLUh4Y3BhTXY3b1FMT09sNThQUWJZSjNia24xU1F1SjF3QVF2QnZwN1NZX2NwRGU0ekIxVTVFa1dVUmRMdnVKZENIUDgwbnEtb0l1Wml3U2t3X2YyaVNCdkxyM2xnZkpUbDVFT0wwbjBxd21OcUZLQ2E4eWNfQUw1TG5WaW51d1hiMWFWOXl2aTJoUGllbF9qcTJXWGNFV3JBUHNGSUtNVkhaN0JQallKOHl2czFmcERqdDRsRHh5dXlqMi1XN3hGdElUZ192dUNuUEhVd282dklqSUNVbzBwQ0xKU2tKc1RhZGwtRHZIZmt3bEdndmxJZU93WUpjT3BQVnI4STBpd0h3dU9Tcm5JWDhHMzNObl9SeHhpTTVvZnlDaGhYQmg4NDFyaGhVd0lSbnN1cHB1alNObklnbXNVd2JQSTJJanp3OXA3NE9lejlsV3RVSnF3SHV2c255Y1FJTFRBeDk2VkxSOXhmU3MtTTE5OUc3WVlmUmRvdnlZYzFmcUYzdDlUS3RkMC01Y3FOUE11SUNEOXg4ZWYzcjNJeTMzNkFEQXBGVDZFSTZKYlVoZUZ5TlpkdlRxWFNiczBuQWs1a1FwY3RZWDkzTklVVE14OUdaaklfU21tUTE1SVVTSFA2Q0UtNHZFOVJxU2ZhVkhPd1BNX0NpS25tMWZLUG1ZQ284V3M5RnZmcTJocll5ckJ4czVQWGhza3dfWmNGaUtzSThfOHRlOW5zZUZLelRfWkFaTjVkdXp6NmJNQURlSzduV0FwNldrOUdqWnVGVkc0ZjJvNTlSVkhoSVJtNllvaVIxeWhmc3g2TnlzbXhEQ2RBdUw0WkI4LWUtWWhQWVdBc1pqTml0aFU1dGIzUUJ4SmxNemtpbHg3My0zb2hlc2hpOEYxZGlmT3VCbDdvek1QMzdZc2JkRFJZa1libk5weE5Wd2dPR2M2aDVfS0lPcWRTdWtkZ0FrZERnWVBIU19UcDJiZVRLNmJYbnRPQzJacldBUmxjT2NjZW9LX2JTYW02Skk1bXJXQUxhemNxS3g0MG5iRWVaZ0o1UkJld3JHOExpS3c4Zk5EdFVlSkxtY2lFYUVxSnR5SjBZdG1MQWNmNWFFOUhLSDlVbVJDSWNBa05DeDVjbUdJQ2xXVnFRbV9MdFh0TFpmZkpabHBTdXRVNnV6UzNWUUVUUjJFZXNoYnZpSE5ucjktS0gxaWNkdmJEQVpaV2FMTlYtN0NKNEhEa1d5ZThlVzROdHFLekxhNXBzS3dQc05oR1k4a2NaaWxaMnhmeXNVUjQtUmttbWR6RmtpQ3FfMEpoRVRGejJUaVd6LVpuYk9BVGs5VzZlcW5YbEN4YTZOS1d0elJubncxWjRwN2RFVHZmYUV4YV95ZDR3dUdRbGx0dFJITzJtWEFxT1hlY1hmMFNabE4tR0lVSkdPMzI0LXkxZ1p1MUtlcWg4ZTB6T0VrR25ldHZhOXhHVGlXdmt3VXc5T1RuSTN5dmlHMmE1TTFoQmc3dzc3Qno0M19lUDBQbzUzLTczMDMta2RmemdyNngyajYtRmhpSDNFTENibWNhYWNDaFVBUmVSbHdyTnBwcTFza1oxTThWdkpIYlIwNmdXbGt6UWhaSTRnSXczdWZsclRRYlpGRVotV1N4VkNIRHlEeGR6WHdlY041VXpfbmxGZW5Wa0NwUFFibVd2RUhDMGhNYVhCZmJVUTNKanZZdV9HTHhXejlSZkRfT19CUDQzSGF1bFVOSWpRV1o0cmg4TGZGWTh5NWF0TTVqdERBbHE4VlNxUDNLenUwckR4QU5LNlc5LUpOd0h6bTYtVzdSYnBmbjBPSW1qVGc2X2VtZE1YX2ZnWTBLVXhtWUJjMEpCTnBwVU16VXI3aU9ZMzBkTVM3aEdRbVk0ZG1QZnpKLWo0QnhkVl9Yc0twTHMwZHFMOFZTRDVjWnpmY0cxQjVPdjV0WXZNNFRfZ3VwMGdpekdTVHFNaURvYkJNbHdVYnFEV19LWmdwWHZXRmlnOHMzMVUtNEVpTEtObHFfRk9IYUhDTlRRY3ZwX1daQUZkUGlaajYzemFUNmpSd25CcEdHZkx5Qzdpdmo5WENpd1VIeWVNVDd1U0VOUE95MmFSVVA5UDdlWkxMTWZWWkJZUXhUNlJncHE4X3VzYnNWZ3J2Z2pBeXIxVXNxN1BxcUh4dHQzZjRmZ3Q5OVBQeG13aW40WnhZcWI4UXVSRGctX1l1Zzg1ckoybkV5UlVta2FLT1diVG9QMjVwa2h3cU9RN2VLaDNhc05TNnlkNERVaGo4X3dOdFI4cjk3Tlo3SVRZUnBSSmxiUWpUN2dYVS1QbG5EMWh2Mmd2RkdLTGUzWldKazM3eHlsaFFTSW5oX1pMbEpYNWJfTDhRRGd3NlB4YkZ1c0tsbUNrcVB2VXZVY084eGd6bE1EMHNZVHdXV2RFcTRfX25vTVFMYl9WRGlVSzA5Y1I4SXUwRHdSeWpfY2NKVW9oQnJITGlWNVFKSzIwZnR3NGI2QU5ZWnFpWEFCR0R2dnlqdjBjWk9sYjNIWDc2Ui1XbUVacklDRWhQWTF1XzVlRjU2MHctbHBzc1d0YWRZNmd3MldvUmZ3b2trUURrVDlqQzhLR3VlMi0tTzNRMDAwdFFkekY0SC1CZnc3ajVuNFlmck9OQ1RjUmwzWnhjZVBpRk5oLU16S1o1bEtmRGpXb2dZS2g4NTRwZnVSUUFpcXdvQ1J5QTAtSVdJWnpCT19BN1FuZ1pYUjl6TThxLXV4VVhKckJIQzlXQml0TExaeERvWmIwU3lRWFpaMXNKX2IyQnNsM2RnQlpjN2hkcm13OEpkemhTSHVFNzU0TzduNmpUZ1BkM1NoZ3diS0FFNlFiVG1mc2d0Nm1XdUtIemtFX1pJYVdBTWEtUTdzVGZvaG13ZXhZTG1xbEFBX0QyMUU1ZDZISzFmUURUNzdyYTJ6SW9uV2QzX3l5VTZXeHBVU3Y1eW80b295N2QyWFlUeG5hNHlGRWd2RFEwQnY1Y2RHUS05TWY0djlzcmloakJNMFRhUFh4dDl2VkxVWGFTTk9DUlNlSkdGc2xNM1JBT1NuWWdKTVM1Qm1sZWVFb3Zlb2ZldlIxUk9hUUFvSm15RzZNczVZNTV4U3ZjMFJqVTRnd3BqQ0RzVloyS19pYl9ROEc5UjFrbktxYmVnZDZ6cmNKMk0tWWJjLVpmWWVWUUs1TFhBTldZOHNOb2xma0FMYm1KZWd2YXRsUUZWd3ZLbEJaUVpPYmFicTg1cmw3NTFFNVBNVHdHd0ZMYUZ5bGk5RW9Rd1U2NzdUekpOa21QNmFxN1lMRy1lTFBUQkZZeHQ4WGFGX1ZFYkdYTmQtalhIWmJGR1FuSlBUYmhfTkhmZ2NseHd6UUpXczMtYWJzX3Q2eEM1NklEX3JSdEFvYUFjdWMzdVRVM2VtMnNfTEs4SnBaQzFlMXRlQS1iWlhWQTc4cHZ1ZXl6YVNmczY5MThIS05laWNCWF9Td181dE1SWml0NW0yUHctU1EzX3NtSkhmUlB4dy1FejFrVjlueFF4S1F5SHpNM0t6b2lpM0ZXOG1NNDhpb1lfVEp3MGFUdmExa3VleTM2ODRiSldFMndCYmJnXzBSNndCUEtUdVlqcG5yeHZsbFQ3TjJ1X25zcnNLUU5KQzVrMHdvTlRQaExpSEFSUGd6NkQxeHQ2ZFozVVBOaUwxSnI1elNkZFVORDhHUnQyUk5faUFWMnpta1d4YW4ydG9Nb1BBWVIzOHNsOHg5T2p6aWhCRF9xTUNneU5lY3R5WHJuajFSNWFFa2NqN2thMkJWbEFwWm8zZ0RFN0V2bXdHSVRaQzE2MEozczk5b1liLVY0c0d3Rm51REV5R1g5QUxnWWhGWnl4eXlySzJpZDdvYkhSQVdXSDM2OVEtcy1WcElXcC1KdEo4cEJjcF9fMU9JZlF0MC01YVAzNzdwYlh5V3AwZ0xiRVhtQ2k1cTFLNzdiNllwYjBUaE9HT0R5N3ZtVVZIaWNyZlZVeXlTbnZCYmlydFlDU3BPZW0yQkVPZzRLMW01MUs4bDZPcjdSdTNVZi1DZl9sYVdTQlB6UjZvMUZjTFAyTkZuS3JvV2J5UUlwUWltbmVLS0JFNUxrZ0xZQ1RiR1JFZEx5V2t4d01jb2E3UXdLNmtsSERWUm1xY3c5Z2JvN0ZwZ0toWnhXb2dqQnZ0YklzMzhhSF9xN2F4UGo2ZWtCazFza1JWWnRqMjJJRUE3VlZzaTF5Mi1sMThfM1R3a2otYlc4b2x4NTRiWjJSemhESnBxR3IyZ0hFTm1qeVVHM3JXVldEeHRHVXpTNHpXWWIyNklreVZTZHJmeE1Pb1RjNml5SHpIUHBGRE9ULUhGMzFJc094dU1IOGwtTEJxZFdXY2hmdlR1ZlJGcWF4QUthdnR2X2JZZnJzWWh3dU93ajZKbHNhUTZHT0p2M1hnS29UNFNBelpwWFNuUTQ5b1lDZExGYnVxWmFSNF83OXp4RFZrLXlqUWdZR1VaaFpHYmNEc3hnM09wbWtJZjlDd0o5OGgwbHk3eTlieDFnQldMd1ZVSGl4ZUJlelpXWEo3VElKNldUNUVKcFR2akdhX1B2M241bEVDYV80VDVGcjB4NmNqVEpuRTd5X01rcW1lbURRS202bVFrYnFLaWN0M3FXQ0lrOElYaHEwcklMZmZKbzNyak0xZDNrWHRqXzU0bUNiYWdyNWpyWUlyUnQ2SjJJU1N1WVlqVlQ0eGhucVV4bVRuT2h3UFNBcFJHcUdxSm1iYUlER2hsOVZfbjBzR1FrUU1fbVpGYzhpWlJhdGhXUkpGUVNzYmhUNWgxY0hwbzQzOUNqbE0tME9PWE1kSzk0aWU0ZVFBZWFaU3NqUEhLbV8zZTdDMmpvWnUyektQN01FNE5sV0UwWV8wY3kyVjBOTWV6M3NYR3Fqblh2c3I5TmZYZm83N1NPcEp0UzhRc0lsWXdUN1ZiVlFOUFQyekowTXJFUEMwTXBKRWZpejZXaVFGSWUxbXZZNjBCZi1QZzAzd0dSVVpCNTNxRWg3cXphVThuejhHazMwVzQ2cnA1eHdCdzBqOHpLbDE0ZW11R1oyUFNNZk4yLVBqSzM0N1FOY3NabHRxZFBJYmFJSzR5QmlyRmM0UDR3ajVRcjF5WnJ1RnU4N0VUUWJwdlJGc1gtdjA4N3JuUGFHTjY0VHlQeUk5YkJDUnR3dUphcTlscl9JdE9OVHFlMzBzMk1sbDFCLUY0VFhhejNrdHV3aWFxMTR6QnZrTm9KZUNBcDhEeURMLU9EM0pmUTFMQ0c3eTNsMEJCdnFtVHYxRlFEaXBZV29BeEN4M0M5MTNsVTRFWFlrbEFrZ1liWFZ2TzUzaDJoYlVLLS04VzNSM3RkRXJoTXJFb0U2V0ZGSUlxYU1mQkZlVm1DYi1VRER2eDVIeXNMcFFmdXhKeXdDWlRrTFU5dnA5Um9aYU1IVWdIVnlKMXp1VUtsVlNuNFFjS25hMVJCaUgwRU9DWm8xaEZkcUJXamVnRUhvYzlxYk5jUWtzLThqWTBGbUtOTzJUQnJxQ3AyTk5mZ3JpUDFidlJoc3dpbVlNWnE5UWlMT3NEeWJpRk5PN05ldXRGdVAzb1Y1dF9lNTQ5V3F0Y2ZhWHd0NWtGOFJhUHlzSlZUREtodm1qSGdPVzBXZTh2WFNXazVYNVVCd0NfbzFBU2lrc0JpT1BlNTBWUDF5UlY2aXJya21IVGNDY3VGWjBsQkRHaUllVDMwd2NfR2R1Y1IwWThZaHhScWlCdkZWeGNLNWdpRWU3UUZ6VGxYSUxyTW1uQXR2bE55RnJoZWFvYURaRTVDZk5QUWJQbXYxTHR3UUxlaFZCSjkzN2NLNjRJUXVfaEtLUzlORkMwdmFPT2tZSGt6M29IUHUtNlc0MG5vQXZRMUxYWllTRU5YdEpCSTdhRkZVdHVfWE9DbUc4dmhvczlMUVJQR1UwZEtOVGlHdDVlaUFPUFltRUFhVXIyR1ZjSTlKdWhPclpvTU5GSUVFUng4THdOTnFBYWpGQWZhek5udWZyWTlIWWdUX1NLNXFBR0MydE0ydVlGN194UWFUM0M2Sll3WllodHhTYmVJd1p1YmpNZ3RUeGxuUF9jT2NYaWRPU2NUQlhTbUsxYWZ3dVdESGpUVmY0UjBkMDdNcmRBQ2pfZTVTSTlhSHAtVDBkX1B6MVI0eUZpNkg2d0hTbjZhUzVkNHlGVlNSOTdMM3dQVE9nUGF6QXZxZl9vOTU4VFBxYTlveGszMlFqNjFTSnFQV2E2YnB1YnltN1pvZWlqdXNocndCTkRKaTlzdXFpa25ZX0Y4Q0cwQjVqaU5BaE1UcW0zanhKd3B0UG1yZnFnUHlGQTVPX3pEdWs3dWxCLUhVYlBTZnMwVUdmV3huX1ZZZGZQWEJscEJpZnU0Njd0TWtjSzdfMGFfUHdLZU1UQTZYUzRiYkxVcDIyX1hqU2VyNGl6bmlYTGMtYTgwZmUtMGZFejA2LVlNMlZneWh4ODhRMkFLQkZ1d3V1c3Jsb3hhWFVjSEZJeW1QYTRKTVJ1YnlUcllSWjRTaDgwa0ZhUGRrTjY2OXY2WXA5Rzgtd0ZPWHl4blJ1RGFMZWR3aFF1OXAwcHFXbEZad0xBX0FYOXZtLV92SExtU3o1RUpGLWpLLV9BakpSU29HcTY2eEw2cExzRHZmTDFPdHE3b2FNRzV1Xzl0YnhnVFVhTlN2WW9DVHl1NFBudERxMXp3X09IUTB3U1NTb2RnSm95bkZaM3Y4X2QzeEZpMkFwcDlNamt2dlh6TkRXM3dSVHF6dTBVd2w3eGt6MmlES2hhU1owMDZncUpTRVE1TDhYVGxkcUJzYjdTX29GNndYTEtsZlZtT1RkTUU2T3RxZkNHS1VpbUppRVc2S3ZXWTlOaW1FeS0tVFo0QUxhMlJNZUtqaThqcEtqUDdlbERIU0JRQnFwaWlaeFBvakh2NTZ4TmZuMC1fQW9UTUd1QmM5LVpEOC1lY0FHSVJzS3pMSWlTY3gtRWRXX3NDX0YxT1ByN0FQRW5rYXFCUzZuekM2UmdNOHluZkUxM3FabDZGRV9EMjFHa2ZRRF9aNXNmWUM2RlJQZFBQZFNDWUZIeGoxcEZueUUxTG1DVF85azA2d2VOdXRUZVpCR0V3ZUdtbG9NdWpQT0VYbzQ5NTVhWDFxMG14MjRfUzktSWU1aE8xTDBVWTFpZUl4SDBybjFuM3ZEWFREbC04bk5ZcUZGYVJwMEhzVFNYTDYzREdVdm0yUUhlNi1QRFRmR3dhNDkyWlE5ejdrM1ptb0xsSzVuNkVDdllaQUZtVzBhUFhyaWR1UTNyUjBHeHFKbUZPZlJjb1o1aUQtLW56aWFleHpYbkNLVnhfQVUtX2YtMUthcEkwLUxWQmdvaWptMTNmUVlEQkZXTXNqQTMzSHFQV3d0T3A4YWZMaUZBUVUwSmpGc1BBOUVKcXpEVFBZQnNtN050NkVONTRGYmhzN1NlR2poZWc1SHVqdFhUS3gwb0NkaDJDSEhsVnZJQnZqVTZDSkJZUzV0RTNwT1BPbHJGRUNBcFg1VXJyckVaalZGQktmenoyOERGR29iYVByaG5TQUczUE1mUTFmN0t1MC1FWjhDM0F6WlJLWXA0ZHVDbXM1MTloMm04NEhXOFNQTnJRQU9GeG9mdVNBUHlDZkxDUmdvcFV3a2syYTZudkttUFVJOWU5WEJEMXJNOV9vc1NqZEJZQU5UWmlsNDVtU0VFT1BoMjBiYWRZLU1kaXJrNU5QdE5rMHYxcmZlSFhwQkhpbHVpSEFrTXM2MDQyX1JDRWNtZFZOWWM5aDJzMG92TXdMZkRkWkFXT2xTWGtCcUNPSnZGWUtRaW9FS1FiR0VjNGRjTzRiNmZtQTVtVTJWQXVuQTE3aV91bTBWVnQ4T2pNcDVVQ1Q1MVJLa2I0cnNkQ3FOeVhXQVNUWlIxNlh2LWhmX2prdUFDR0FjbzhLbldVam90NVp0MllHdmlLaG1GVFp5MXVTZFNXNTlleElxQ1ozSjRCOUpXdW01bWpITWhJREpqRTh2Ni1yUzVlOU5iOUozYlc5YS1BZ2tlVHpRSDRkVTRBSUk5NHlSSXdXTFlrN1lrdk9JOW1RSmRqVmdxb3ZWVXRsOVlRNF9pSVIyY05Tc002SnNMdFRHV3g4WDFBYWdIekcyUkhjS1htaWxxS1UzUm9FZi1YVTcwSGtLYXZyZEg4ZmRPeW5rMm9LYWFHRElGOGJyY0ZjcFd1TzR3Z2VzS1ZIZHNmWk1PNFl1R0FQc19PSkw4TnNGcDJYbWk2ZEdUSVZ3WkdhMnFuSUV0TERyWWtDNjBuN3hGY2g0NzdrUTRDd0ZnMkpNb0pqVzd1MXB1Z2V2ODZITno2WmlKckxjNEJGV2FVREdETERLOWtwOGJ4bnlydnBoR3l6Q1l5MG5NN1JKWV9fRDFocHBmRjdteE56RGdTZ0FUcUpKWDZCckp2bk94MlVZS0h5Z1dGdGNQOEpYRXpqajZITmtuZF9mZTc2cWJ1Y3VDYkQ1TEZndHM2OGM5M2o0X0hhYk93SFJoVGVMaUpxMUdQQTJQZTJwZU53clZqRjZFNUFXRWJKc1FKWXdzazVSUC15djItM2VGV0ZrRVd2S19TbTJkSWRGSlNzQlk2NHpjY2QwWkxDcFlCbkFlYjllRFF2T2g5bThTSERZYjVSYjR0U3NWMVdjclE4S3dnd0VTWWphRWxnOWNIcDVYYmNPMVFiYXI2WnJTTzBGbGs1NkRiSk8yMVdHNlByb3dZZ1N3WVc4UG40YnNybm04TkdBWGJJVnhlUDE3MF9vWU5iNEVvcEhWNm8yWXZtVjRZMGt3RFJHVmZ3Y0IxS3YzVDVqckpqT2ZXVHd4Z012MVdlc3lHd3BUNmpUSjZzbmZJQm9nSWpaaHhnNFlfbFE3ajVsUlFMUFk0dVlNcGlvbHpSTlAwM3ZRd05nR0g3TnhBS3I0TXh0NVY5YTNiajM5VTNzczMybGM2MHdZVXZjd1VkdW13bndnOEJPWWZ3ZDlqVEJOdk5hYXRpaFllbTlIV1ZKY1dVZEJodm8zYjV2U3RZVU5ES25XVHlKOHlDRHJ1QVprVHFvRmUtcWpPYU5TWWNndWtVXzFIVmIycHZOeEU1Z0VfSTRTLWFwbjNpazdGTDN1QmlLaXpRMmZlWGg4Q2czUmpLRnRhZlR1SjdDZEpBbkxIZE5IQzVhZG5Md3BOZEEtQnRZbmtXUE1KcnAxWFcxNVg2aWNCdktOZWxBRHJVX1RSVmQ3RTRDdkExVUlTT1NGNnZCbUNWRkNkeTRiUkE4ejVlLXJwSkdLSVgwMW9BXzFBOUtLR2hxOUNzaFVtUV8xYURZZVlMSmNQQmt0ekpGeHR0YzBwQkxWVWNQNTU5Wnd1RlkzSmdjVkhta0pJOWQzQWlleG10d3Q4TnRhMXpOV0xwNWdZVWVCUDZJY0ZjRFlEZk9QRUdOZ19wWFFFX1ZOR3NTVHJVelJ1Sm9IWmZtVW1ZNVhBYzlPVnktaEs0UjVqRkN5dkFfUmF4ZUhXclRZaGIxc1NiZmlNY29BMzgzblNXSE5LN1J3bVRyYmRNR0lNTW84SVlTRjdsdlM0MXZsZUNIeXN1dVQzOXRDYzN2bWxCakx0WDAwV3lzTk9LSkpIcDFZa093RHFzMGcxTWVjbDJUVmwybG5CTENHMGVUUS1Pdm4tYmN2S1NBRVkwNmZTaFBnOElCSlR6UG5qZWNCZVJSaVJJQ1hTRGpsWGxDcXhmTU93R2xnMmVvNHl1U2p2TkdPMXplSDNGcnBlUzI4c3E2QWhnSUtHWWxNVkF0OUpGVE9tbFRTRllYZG5MVnJsYW0tblBKcFpSX1d6V0tOdklJQmxyRFJsQkdVZjNETUlodkViNmNEOUVEbGtnaG5jRFQ5U1lvMmpVdzdzWGdMREJVNHRLTVltaG1zbHZvdll2aWJ2bXZuVDh4RGV2ODZNQmoyaDEwQTdHT2h2NHZqb2k5SlNjdWp2Q0VNcXZncWR2WXNubzZfVjJGdnRnS01zcklMZjdWcWE4X3kxZWlPRGJWQldXd0x1Wm5RR3JWTzRQdTQ0YzRqTFc1ZFEtRzVNdzVJOUxoamxBd0ZIaV9BNGFnUDhucUZheXlNcm9hS1htZERfYjFWa1o1RDdNWXZjTWVGcG9qZzJ6NVZ2c1A1bGNQZXRKQ0tPTnFWTnFKQTF3NW9SYXo1NnE3VHRYRXNDRFhXNG44YnZIRUJQXzZMTFZrTXZJTXZqQTlHVF9EX0Z4Um94c3ltTERqRFFzNkNoLXV1X3A2RzZiR0VId2hJVlEwUU1zZTdvTVYtSWxmVzdRT1pDYnRtUjRFcUtpemVZeG5qZjBWbGl6Z1lqWWdiR0c5aTd4OU5Kb1IyUTM4NElwcUxxUVMzbWIyU0ZTX09fSEo1b0p1VXBLVmczN0dMd0x5QzdiNDRlTmlzcVV4T1k4Z0dxR1pLVTFfNy1idkJiNHdXWUxzUUJKNFpaU19CY2paVmRNSVNybzZEd2tSUmtPLWFCa1dwMk5OU1NYV1B1WkpOWVZFbjJPUVpEeTFpUmlUVDFVVklQeTVrRDg0bUlaRXViSUdnX1lsZDhjMXV6MG1HbDFxa0phXzNnM2g1WlRydXRmOVRZdTZyQlROY3pfM1IxOEp1cXRwZkRBN0hyU0pCM1QyQ1laVkgwZW51Y0l2eUc0NkxCY3NDOWZicDYtZFJLenktVTNnWWhiLURrNkZ0ZHJUM1cyaFdQRkRWbENreDZOeXdhcFQ5WWkyZ2d4ZlB3X1ktOU1aNUJ2STYyek5sRVA5NUlmaU4yS3VMaUVDMkJqenYwS041YkZDVVBTdWRqSWR5aWpVQmFLc3RGb2ZLWnNrSFA1U3Q5UHBucnZNUi1nZDN2anBBRFh1SHU1N3h2WDROLVBfaE9UNXBIRkQ4NVBZeVFlXzM2cTRBaVJFOHpaSzdoRDNVdGtBbTNDR0N3aGpmTEplTGRiUllpN3haQ1loWkZfdmhVRmVFaU9NM0xoUlAwN3hpSmlOVEhKbXBINzVnSDUwLU9hbkNVSHlTdlprNFAwSHRfYTJ2aWdkNm5TaFB6VDhUU3F1M2RXaFV0d2FJTC1oVmhQYi1rZVpHa1g2VmlsNlZyamtfdnRnNUhDT2ZqdVRKbUNHYlFhZGluMHdDWm5aVEZuTlBnSmNZYWY0LXZKMUwzSlkxMllFd0dOLXlOb1JkVm5od09YTmxyNlk3M1RpekRQc0xmMWs3LS14eHZjWThkbUhyZUd3YmV4bnUtTU1ISndNdVRpZFZ5MG44b3A0akpNUnlZOV9wMUxkZFNRLVJPSzBtc1lidHhJLWhSYklGLWdEbHhHTHltX0dadW9MS0RtQTJRZ3pzUWhoUHExbGVjVEplcFFVZGhVNWo0eXl5MXlNd19TbkZkem1KbjdnRF95S2Jrd1lTX2VFSk9CQm1UTlJsSTNnUHZkS3NuejFiTTZGQlU1aDFYcFotMnhmYUplaVBQTXE0V3duZ2xCM05HNlItNk9kcGtCeW9QUzJsTS1xb1paQm15cjhCX3dRSGVGcFM4bENmR0tIeTZ6LXZOejhTSk13SGg2c2RPbTRhamQ2ZmJ3Mk5KTkJCdTc4WTQ0XzdNNjcxT2lQOTVzMFlBck1DYjJfZkVWaXAyZUhlMklUQzBhWlFXbExmbzdsTHpPd2pJSENNU0VlZV9zY04yVndnWFpQN3RMS3ZuZWE4Z3c1Z0pYaWhqcHRGOUw2NUt2V3Y4THI4NHBoZFg3TGdRN3ROQVI1SHhLSEhaOEVQbzJQX0lvRHZwZkZ3RTk5c0dlV0JuZmxYdk5zSU5tcnplZHM2VTR2UVNOeUVWX0lBejVDTXptUEUzbHBVLUs5UG9KMmlNUVBYYUszUVA5NmR1TGc3Z2M4ZmxCd3lzYWhnTHY4M1VKVjVqZ0lJNjBUbW1SN3VCOERFM1JvS3NJVW9EczZIWTFPV1hVanU2c2Q3QlhJQkZDeDJiWWc5OFNtZ2hqd0tWWktzWE10T2NMcXliMWpoYWRYTC1OUTVpLUFJdHJEa0Q1S083Vm1fZWNpN1hvcmlDTUNaSFFaaU9uVXJ3QktTdkt6dkpiaHRHc1RSV01WRWg2aEw3eHpVOGtvLUs4SmtvUnBxNXFJaDNwWndNUGdNTnBnQTA2TnhGazhybXhrT2pvLVR1YV81VThxaHRDNUtlcDdhdVFVelVVOUlwaldPTS1IZGJPaTJOcXlWSHhjSjhLeFprLXd1eTl5SkJwUUJybkxXMlJJZUk3aDdWYW1IbGhDVDM3UVRmMUtrTFFYS0lVQUVMRHFHSXFiSzNWbk5scXNySkVILVgwM0hvZWtaS1FMV21ra1RsbU5lTzNFTG1acHZvNEFmT0hCOEJjZS0xNm85RW9GQ1hsMENJUTJLRDh6T0YtdVJIQlRmR1hBYTRJTGRhX2lKdzlFY01yRm5Bb2VJNzVGUEt4eVRYRVdROEVOaUdWVHBUam1jV2dCaHBJV09NQXZ3YzZnaGtaSlZvWXZnXzk4TTgzSHIxZXotaS1rY3hDWGV3RWxSU3pUajBzQ09uV0dHSGo2S3psS3ExZmFZYUFoZFJjaFdON1ltTTRsLWszZGllaFRYQkJXbjdjVmFCb29lb09YNWU2dFk3Ul9zNnFZQUZ1eUpPeHRTQUhhYU51QTZvZ0FKeUhUcHd4akd0Z21kU2lfNWdJeHNkYmNqTkxZa1VEcC0zYWpRajRLa3lvTTdDbV9yemJ6TmZDeGdVaVdsS0xrQlFUZVhNa3NsZUx1Rl9sWGIwLTBWR2VGMUE3RkhTV0Nzc3Z5c1JWZDhqNFpGUUZkdjBOc2dvR1prYlNCb29NOUtWNlBCcFBQa01sOXpQbnZ6X0JNMVFnQTFITjQ0NmQzLXdrZVliVnFtNlVVRXByZlZuaHVnaFFXX0dEV1AwYW9yMHk3Q3FkZkxrbk5kU1pqNzZqNHAzNG1HWS1SczlhZDk4dVNOZkJ0YnB0WWtkZTQzZlJKOWd3Nkt2QzRUa05ua1NKT3FQai1CQmplTmFHTTZKaEkxeE9sdVZ1M29FMzZzM0JDdXRmYl96UjhYRHlVODgwNmxRdTgzWDVoQU1qLU1vMlVoNW82TnI3YUlhLXhselBsV2FWV3RlZWw1c2ROZkl3cGVHUzVOWVA1TEQ5dFRzT2V0eG4xTm5YcXF3dEpkWGNfYVEtanZyZ01feUpiMElJc2lkcmJ0WmVxbjVoZGZNQTFETkFpUVplZG44OENlV2w4Y05ZQ2JVTHowTHNVMDJxaDEycXlHWnlNVXRkWkw5b2JmQXJOWEFvNE9YMmRlUUhnZ3BXaldxamJZMTVQVm9RandWN0U0bk9iUkk1WkFHczg3QWRDRmxodDJpU2cyY2JYT2ROR1JHVW9VSVZSS1VrOE5yQVlMVTdSRkZ4aGFyNjBSUWVnWHcxWm4tS1FTdW9wR0xZVXczRlQ3cmRhLU0wdnAwN2V0dUp5dTJhNE5RUmtDNGJlaHRxeURnT0JOWTRuTFNlcHBTZzVpdXpBdmFoZG03TzhKSnRtTjhvV3p4RFRYM0ZNVngxNVdEXzYxQ19mN04tUzJDTXg4aDNwOGtxZHZLa1R1SWdMbTFyRlMtYTdwTU1BZnQ4VWw4eG5YSmZFaTU5Nno4NzkxYl9Cd1JjeTZlNDZBX3lyOF9lSXBtcU5CWTZDU1duZFdPUEthaEFfRnpOQ1dNWFBwU0hXZXByMV9rdXEzTVdhOW55bm05dnFpUGhqUDhWUk1rbW9ueU9CTmNkU0tHMDZHbGxVVzg2UEZiSGM2NzBTWTg4OHllVnJsWlRXWXVGRjFvLVU2VnFLVU1NUnNVUENXYk01MVJaaVVYR2xfazhKc1hCN1VrZ3MzRFN2YldBNGs3TlBXQy1iVTFObWpKSERtZnJIMWstUFlzYXhsa0R3bEFhSWNESk9GRkdqSnVlSUFKZGhyUXBLZE8zM1NmVnBzTzhTaFlEOG9JbEZpcjlXZGNWWTVSenZSR0Y5SkwzcDcyaTNId1Ytc0laUE9rZWFHR1FpXzRYb1BXNTFkakJ2V3FqZFl3aW16ak9XSEh1SE1nY2lNOTRKSWRLeHFBbjIwd0U2RHZHU3FJaEE2dXBUSFQ3NzItV2lXQnNCM0pMWHZfSUxUQk93S3JZa3RRajFRbG5BT0tlUjhIcW85RVpQSGJwOEpHYjh5NEtieHFfdzRIUWRYU3RPQ3Z2VG9RZWQ3alBIbzlRc3dac3k2N0YxTDBzNE9SWl9DWFh5SWxKVVNuZFdQN0V3eDhJTjdCY2FQdmY5RVZsR25Jc3ZoZkN5MTRCVlhsY0dWeTNCLXFiNmM3SDdEUmpuWVRFM19SNFprWmJpcFRnWEJIQzhzeWVfLTVkcm5pNngtczdxMWk2SFhkaGhZdmhfdmQ0VkFzdGNyQzBaS3Z1QjJPWHRia3c1QjZleTNGNGJxSU5BNTdZY3gzU3hlLXBLNXo1V2VJVUxsRk5FdWhIcnVZY2lEM3B1WkNYeWRXeGxCMXVfN28yUVZRdUNCa1Z2LU1ZdDNDNzB6STFvYXk2cTVoNnpDZHA2RXBKNUNkUHcwNUJJaU1zZjlQVGVSSGJsZmFRd0taTWhGT2xNQVZmaGgwRnpLVzBGSFVCaTlfUU53QV9UdXhjUEF3bENFdWo2YzJ3aGdVQnlmcUFaaDFHT0xLcXRTSHhIdS00dFluajFVTmJnanlLbWhORHlycmZTbm5pVGVzMmNuVGhYX1NTWU04dWZHcVRKYzVKN2Y3NHVOdEdkWjR1NGlnX1hLamdWanc1NGRqY2c1cGROZkFDRll3SFJpY0lqbTZQblQ4UXZtN1hidkxVa2NBdHRjTG50NXllVUFLVks3X0FpX250VWZxekVWdGpqZUNXZmxIeDQwNTg4Vmk2QlV2RjhuNEkxYmJ6eE0zTnh4V3JMOFcxWWRnajZNT2VzRmpXcTllY3pSTnBNcGpDRzVKYkdkYml6WFA1OVh3SnBsOVZTNUFrcEpVUFVOcUdFaXBJSTFXLVA3aXByV0tINk8zV3FMdlJYSUdxamZGZXZvczEzZGprTEwtOGpNNFVCSjdnWGcwcUZGYlR1QlJPOENSdXFpMlRRa2FyaW5qQlQ5ZWRVcVNPMWlDUFprU2gtM2FvMXZDUklXY2hZeEJmVDc4SU5xOHdVR3FHbndxQTc3eGFCai1vaDNMMTZRQzhNY3pISDJhUXhmTGM4SGFMRU54cFFQTDN3ZmhBWktSYUozY0luWG5HSTMwUDU4Z2NjVkVpdWxUdEN5dzM4clVmVzc5VnlEOExZd3dJS0hLU3plSVc2TEdjUS1nYVF3TVZRa3ZONUJNeU9BT1Q4RVdwQUo1V25neTd0OHgwUDc4Sk1DMnQ0UUdndTRiWDAyanU5enNFaTRsNVVwRlhWbkdFNWYyQWlPS2ZhbURJcUF0dlpFcmpNMjRxb1k5QXNySEFGYko4cWpZeFlEWFNXdXA5dlNZYi1VLTNuV0NGZXRFUWk4Y2xkQzVqSVpEWmk0U3JNMkZIXzNSRU0zMWEwckdFUlRlOC1nQkszVkdzOFZfa0lfSjZiWFpjVWQzSVF6Mkh1WWphSG9TcXJWSm5rQWE4d3FqeDhJWkVkUEFqcWJRWVNHc2g5QVZ2MDdwUnhPd0FISWUzN1dzU1FlR2N3VG40YXFIcVQxZUljSEJMQXJqLTk5RDdwSkRFR0N1N2Rtc0ZPLUJPTFNZYnQydVdmU2tQdWZOc1F0OGRyQnBSd3Y4YjdBblctd2tfZFl6OXFRUnJCTy1aMzNwNlJONFJVaDQtQVg5Nm9ZVWdtZ0dWVm84OWNNS090VGd4SzBwZlNDdEpkWjdTQU0zY3RuWDh3Y0cwSkJBWmV4T2JIbjFYVW90QTNfbjhzQ3VBaUJZZEYyM3dIRlM2QU41d2NxcExkQkNrNElXTnZYTWdKRHNYNll1M0xQOWg4RjYxY0RhRHZJUEJQb2ZFLVE3UjJzVGZ3QnlOYUFsdlU0Z3V0eGt6WUFLQVQ0c3NHUnVaMVpkNkRQeHMzc0JMcGYyZTZ1ZThJNjRtYTdHaGpsU2d2b2tZSzRQSFFHSl9jY0lTVXIxc0Q1N2UwZHJpYTkwc0pqd0JEdkp0QlBXN3JyWG5GYThUVWRhempzdURGUElTUy1hQ0lCdWdMZ3NxSE16TEU5MDkwSVFmWWVDNDY5eng0c0d1LUx1TUhBbW0xNjVWeW5mZHNqYjk5WkRmVFVtcUpRYkFCV2hLYWhFU2RVZTBwQ0FFZXpOTEtxcGFaMFZZUXh3MUJrRzgtY2ZLQU5GNTRvUTROMUtlXzZpeW9pS0tWQ2dvaW5fZzJIUVc2UHRhTWVLMG51clpUbUxqZTZXeGwzZFFnMXdES0xaamhtMWVOTC04dXhtMGI1MFNUVXFvV0RMdUUxaDhfTHVyaGt2d1FqRGEtOHJLcUczZzZ2Um5ZSUY1TlR4MENsd3RTeHkwQnR0VnlCX3ZLbFhCTGtWVEJCVVk4Y1hEc0ctNGNjbmdNVlpaMm1IdFpzUjA0YXk5d1FORV8tWWctdUFzMDllX1VLQ01sVVZKaXBfN09hN1hsUjVTR0hyS3BrNjlpNnFpZG91S0RxaXY4dDBfdlFDRkFUWGNNdFVackZ5MV8xamFiWGZfN2JFMU1xNVlaaHdjLU5pRzhvQzl1aThjOHNuM0FQeVVmdDhLUlFHYVFWeXJQcWl2NmlQSmdMdHFKSjEzbEFqTlZ6M3RNMExfemhUbWJzU0lwRzg2VEcyMUN0RC1GbnNaZ0ZmN3dPWDVmRU9YTzFCaHBneU96SDlCOVBpeTlpdEpSWHNZNnFjZWlIMzU4b3d2dzZqMEpDbnQ0aS1TclJ6MnNLOWlkUGFmMjRuUXVZdkwxM1lRR25KWV93YjhhY05Kd0R4R19XS1AwWWl2RHd3UVRYV2RjTThpM0lKSzdESzd2X05MNFVEdDNneDdnMWQyNTdkdFlyYWlRQlRDQWQyU1JoeHo5UlByQlR0MEtzU3NtVXVmMVdFN1ZvMTAtWWZ0YVo5NWxrbkFEZGk4TW15d3dlMVZIeUVxbDNJdXhURGV6cEtvWjlrLWRrcEJqX2h0WmhRQ2JYSmE1WmJsOTcwSDVLSi1MajdSeE9FTnBPenBBRks2dUw2VktBY093Mk5GQzY0czIyUW8wU0E4VlRNS1dCYWpCVFFIYUJ2ZUxmQlE5M0cxZFpYcVlxSjgwaHExZVVCX2h2X0NHSlJHeDJRcUNndjROTlJCSFI3SU5wRUU2aWJtaEptYWpXMkw0VTVtSFVFTzFnbVpUMGtUOVRlSzQ2MzJzdXI4THYzenZ0d3lJT0Zlcnljbl9veGg4M2UxSkZFZGJ4MGR3SEo0UHpETjl4RTlyNzkweTZCc3RzN3Mybzh3UDU0VGlhNnp5eW54Yl91S0JER19MSmEycE5MQmpobmNtVjFuQXVfRkg5QVduTnB4U1NXOFhQU2RNT3FnY3BHM2dmRWJ3dzdveTQ3R1puWGx6S0ZlaVFqb3ZTVXN6QU9Mc0lDVGpZVGdRZmVKRWp2WDJnanpMcXMyeF9uQ1pRMDhDOGdKMkFMTU5zaThSUFpnTXZHMjN4SFV5a3VOclNhdGU1MmtxVXVNVnpLNllUbE0zbTRKeUtkbm9VTHZIQ0ZocHgzNldOR2NtMVpDNmlMX2lQbmdIX3N4aG1EVEswVXFGMS1tbGpTMXVXM2pkekx5LTQyLXZHbDI4dFFnOFFmOWlYblIyQjJSUlFpTE5rajdwNnhtOU8ycFdHSUVHa0xjbFFHMjFGTTRMWDJ3UnB0NTZ2YlZBSTZPUlYwM09mdFZVM1I5X01qYzRtS01vR0RIdjJZc2lxNUMzMnVfeGFId01uQ0xHOXNCYjVCaFpnWTJvc29XaHBkWHhLNmh6TjMzdmRzcDF3Q0FZYVFXcVZLNS15X0RxVlBuYWFxd1BkVk1qTFlQYmxVRkQ1dTRkZ05WUjJPb1BVeEN2UVZOM3l3NHE5aXlUQ1N3SjMwd2pocVZpM2xQYjVJWFpsdnZFcktlblZuM1cyNmUta1VOQnZmRF94VnFRVGtpY2RNSWIydkk1NDhPR1BUR0xFMXFxMlR1a2tCenBIQS1MWmcxQ3RjWWR4N28zR0JMVV8yLTc5TzdHN041QmRXQ1g0Wll3b2R6cDBlZXJ3eXFXVGJ2RkJsZEQzQUZxcV9LNVlRQVZBQTk1MWNOLXpEVUViSmNIWWx4QnVlMEowMHFSZU14NDB6MlpnWEFHUVNxREtLTUNJRS1GWXlqbm5pMDZHdkt4cERGVE1aQzhCTGFfd0pMTzIwcnNpbzktN0Jjc3VGeHhvTTg3QWJUdzlRajdnekUtaE4zWlpidkpldUpXR1drU0t2RXlnTVhIckswaVNmREJ0MkQzd25mUTVWSGNSMVFBMGI0UXl5STFoOGpoLWpPZFNxNnhoWGppSVFwZmI2Nm9kMHBrVFpRZkxkVmtsTjMxODJya2dlT0VGQjNGVnAtbjRLVjBQaXRDMTRkZTFfdFI5ckNfb2pSamdMdktqZkNNcEVJOUEzRVVKVU9lVXZUUmZNdmg0LUNPdVh2MGk5aEp3RzBydGlDZ19WZWQ2S0kycnpWckxVZVlaa2MxMEN3ZzJISVhBdzVfZ09pMzRqcDdKN2dxTDJvelk4Rm9KMEpwZDNkQ2d1bkxaWlBiUXdfdDlUUjRaZ2x3VE4za25GN2E1U0hldHBSNkhyQ3BFaG8yeHRXeHRkUFVTU1QybE8yMnpTS1pUUk1uenoxejZtaTNNYV95TlNya3UtTlQ4eFF3cU1Nd09MRE5aZndZcUtXRWJvQW5fT0JEUHNxVUtxNTdZUlFKeW92TnlFaTQwbGJibzdRSk1tMkR6Z25xN0Q5R04xakZvRnE5Q3p5bkVGblUzMXBpMm1jTnJkajdOT0NfdW4xeTk2LXZDX1lEUm5PblpqaWo1NTN3WV9KSjRraUYwMDNHVi10emdEaEpoUWVYZHhSNGRabnVnazg2QTZqQ3E0ODlHYzl1TnRnY29fOHN5VGlzSFlydjBNM0dETDNsZVY3R2hqNkdMeWdiZ0xKc2JFc1hzV0ZoMzlaRmNtcGplRGRaMkFPY1R6Z29RdVVMNDFhYnF5VVpONzJsTXNvTG91bmd5U1QwMnJaZWlRMHRoVVNwdjVfMFlXRjBCOHMwU0NEQ0FFZ3pqVTFuSjVZM2M5S19FSzBRcUFORkN5Nzl4YVRHblVvdEsyQnFMVVZhaDZxVWJPMmdpT2RncFFQR2RlZFdBXzVnNnBQMlhOQkVOVTJ6TXJCV1MtWEptWFgtNmo1Nmh6TUhGQnVPZkdTazRIZmNPWjBtMXg5MFF5X1FnTEVTVk1PZHg2LUh3UEdtUkhEekgwVnRqVDh4RG0yLUV6OHdkazI0cU9kWUdQM2JkaWJobHRTTkFCSXRNd3BfeGZDWk9Ib2UxSWliYzhicEpCNkRPU3ZYTzV3SGZudUhtekc3Q0IyWVU2RWsxaW9OQ2t6a2ktNGVSR0ZlY3Y5RXBjTFg3bGNiVkRpMlZoU3JPazBEV1JDWXVKX0h1cHFWRXNnMXNsX0NVZDZialJqYTVTRFJEb3pYcVdJejhDbzZWZTMtNEs3algxY2xZTzR6dnVIaUFCUnhtMEFtd1BPUmttNUZmTEhuQmZMZEp2M28yd04zc2RPMEIwcE54Z3hhWEhFRzhvRmd3aGU0c0JsWXVuenM2bi1zVnVFRHZnZGdxMElSeXFCZDNVQTFpOEViN2VPUEJuV0g5bGo4aDFzOUdyTTgxbnBJTjFJU1hkUTVIckI5ckJleW5wbTE2dGhUVldaamwxd2JhLXBHR3N5bG5SS2FuVUJ0VVMwVUJYWE4yM2s5V3RIQUZ4bEFtaXR0Z1UyYk9EaXAzNFUxeVpEajJFWXpQZlZPOW85cVlIZU9vUHlwSFl2Uk1vNm1pOVdIV013blloak5KUjJxeE9XNXYzVThTM016cS1femRnMWJJSk1hVEFDdVhiZVBlWDRwdVlUZ3FsV3NPVXZ2VjIzRVNKSDluWERsOWlvQzVZN3o5Q3Z5QTY1VWg4bThNNldJVnU4ajhtamVnYkZwWDBEYS1tbWZMLXUzSkdhQm13NU04VGpRdzRTUENVMTRXUDU4LS1UVjM4QXNrN2NRRnl3QmIwdFdfSThVSGtsbWFfb3QydDcxNGE1NjYxUjVxNko5alpnNGxZMm1nOTV6SEV5VEpqZjJDSVBzXzdrVjR5aGR6eVpTbWFPdTZCWUJZMGlCOVhIbUFRSzljalNOMktHMkVEcFZfUWFsY3AxRmNfQkVvdHJpY01ZbTlnTU9KUFVUQ2ZxeHZMU05ZNWlLaWx6TnhLSkQwRlVIcnpWQTFqbWdEWDk2ZmhCakhadTVJX3JjMm96dzNISXNnSE1IdE9yOXBhRGlGT2NiN1JLNkN6TkVNS0dqSnhtSU9hWkRjd0xYbkFXZjR5dUZsQmtxM1RHdkU1TGhmbVMyN0gwTXZHV08tSWFBVFRoX1M2enhOb2pMeC1mdDlIMUctVGRfM3BycXU5aFZaN1lTV3NhZUROQ0lQMkJzYXU0aE5Vb0RVdDI2bUg1TEZDc1lXUkhZcnREUk1ydS1SZXIxNUtHcElibkVwc3dEcTdjcThtQl93NERfOE9McmZ2dnMyaGEwOEZGVW1FbE9RN0FCcy05SHNpeVZpN3FmTzROcGp2em1uMWNHWmo0UnhHZTZtNkxOXzNjMHN5eG5jOEViVWJaMmgyeTVSRkhCVmM2ekhmYlctOE1JUlNGWkJJWVVqUU1YS3hRWnZxbTUwaC05cEkydlhlQ2ZKWXhsQk5Wbm0wcTRKVFdzY1lMSy1ELTNDa0NOWFdkQTlHbmJ3dm1fb2J6U3pKQUZOLWczR2VlX21DY2NoX1ppdDNBQ0lxenFYQTV1OHZRNWFkbVlRRExJNkNfYjRJVXpGUWhPLUZrZ0tERWJmcVRtb2M2YnJ0UHlCSi1QV0xwSXZpb2NTYnNXdFgzNmQydkdiLUhVYTJyc3hjWHk3RmY0WnY2MTlTNjFoSWFzc2FlblZ3VW1WTWRCSF9VU05LTVkxLVdneUhncXpRNFhEMzVlRThhVGQtS1J5aHlmZW1lRVNPNmJENk9BSzFxWDBoQkd4ckU4ZGMzSnpNSXdTaURGZVduVU5TbXQwOWRKVzVlbm1nU1lPWjh0TXE2U0c2VE5vMjJ0UmNpNXBUZHZoX0FIOGlBczgzT2JENGNTSGhWcElyNGgtQzd3Z19GLUNZdk1Dd1JiVE81WUlOcmtmbHJEQ2NrNHljUTlhSXZNMVNKVHdSNjVMWjVLUmFXYTliN0lQRFdib2trcnNTUHJXSmlGRV9VcTFqSlpwaWRPdWsta0wxMkNJd19LOVpvZzBYVWR0Vy00TDNSTjR2OGZpempRMnBHUEFtRkxENThvQjlUUXZFVXdqVS1WaEstWkljc3NldTlJNmdCSTNxcGVTU2xBQWpqRTlIZ3lFZjhGYV83MHFRLWxGWkRzRmVpZmZPYzdzMUl2T2htbXotcjFGZHlsdFFoT2xLX2hkV0ZtenVBTlV6OEFpTnJIS1hYZlBBbUFUcXZuV0Q3bXphYzZ3OXJpb2pfNGRfbk81NVBYcDVnV20zX3cxd01MekR6YzFDbVRMRE1ZUC1STDluNnFoMUlnMmZzcXotVEZyVDJEWEhRQnN1WllqaVhKZGl6VFRzdTZnWmVFbDdMVC1wNWJSaDZ2QVF0Z3FmWW90Y0k0MnlTWGNsOEJmbFJXdFpEbGZyODZZc3JFSU1DUzZETW42a2lhZWtGd2d2eXlxUEVCdlR5UjRIbWFLdEx0WW5yZ3F1NGR0V0ZaX3hZMDFEa0RQN2xFOExjUHd5akd0bjVVYzJDYm55bWFMbjF3UnpPRHQtQmRoLUhMdXZfRnNHOHY4cEtHWmtGejF2ZXBqZ0htZ1UwRTNMZEJ2X19UUkZBclNmZzZCdTF6T3JJVjc4QWtOQXdfYzVpS1hBajNSSFlQRWxvN25CSnE0TktWb2U1bEpYNVBxRm4yUGZLLUNXWmhQdTc3WWNueFJmeXJORUlucWtNSnhMQW54MVhYVzQ5d1pHWkpiUlVndDlHVnlKUGtxX3llRFlkS1ZZWk1ldGVYSGs4dF93S2x4cEJZcG9UZWZDZEc4NUNaMXdGM3E5a3NVeUIwQURpQzBrMTNjMWhJNzJVVk4wUTNVbHdXeVhrX25JXzVOS2xPMWlVa3paT29KN2MzcktSaUdXRkhpVUxnckRteHJ2MUxUMjF5bGcyMjZvbXpTZ0ZqZXRpeHo5M0dxX3RONzBiNmtBeTVmQ1Vldll6RUlOUWhGR1JxVEF6aXQzR0xyZWUyTkZGZll2ZnhZaDVqdXVWQ0JwM0N4UmJnQXJmWTVjU0dfSHRzVmx5TWRMeFhvUEliSVl0Ym1RWXp4UmJxVHBXOTBEaDd4VF9zdlYtNEhSVUN1OWRMYkVpSmx4SDVFMEtTZHQ5WWp2ZV9FRlVhUWxUX2ZPbVJVS3ptME9uU3hraTlrSFFSOEZuNGl3NnhjZWFETnhCMXFhbEFSQUhZeEZKUFoxWUY4UTc1V1Rkd1BmVjU1b2dKNjVYZk1PLUpLMWFpbFVYQ2VJSDQweXdMNnV5TGh1bFVNZjFTQUxFdEMwQkp0OXdOdUN0RHI2MksxcksxckhXdmRaRUlfYW92Qk43czQzSFBzMmNSRDltdjFSYktGR0tfX2dsbFpVN1RrcHNZaGd4bGh1ZDZuV3NkcnczcGd1RW5TaFhybG9VSTNxNmVxUGp2c2U3MG5XbW10ZzdHc0JhTEQ5cUR3Ukc5NGpIdjB6RE1YTHNSeG5RMGVkM24tcWY0YllZLXRrbUJpQ0F4XzF6ZDkxT2pWSC1lWEp1ZmdjS1Q4WlF3NVN0SU82VjdwRGd0YlRIRjRzbE1WVDVDSlNWUk5XYzdKZGhyZjNKMHNDcGEwWmpQWHJPTGRPREFleC14bVVSZGtLVnV3ZTNOSk5mSGtuTi1pU0NYSkU1alZCRlozYzhUOUdRZ180MXRMaVh5WEI0RDlPZ0pPcmFQaXJVdlplTVIwUU1YVEpaNW5YdW9KS3dDZnBGdjY0dThqZGV6VmxfUTB4d2FWRnlFamNtY1JjZG9lTHgwcXhlblFBVEtqLWhTWUF5ZHhQY3RVdTRCQUR6OEJBSmlCYVEtZlN1ZFdfeXpGV2ZmT2RGTTVYc1V2MWF5RnlUdmp6RFM2em1fRTRtQmxpamgxSzB0cHp1Mm9EU2JROU5KUkRWYmxFNVlFbE1HVE0tRzl3SzRTOEh5bFB5ejdQNWk5VXh3T3R1R0gzRkpkOWs4OXktSHU3WS0zTVVwMlZoY1A0UjZyTHg3dUtnQmNCdDZDcGZvYTA0dFBzOW0zZUF3ZFlwUEowZVgyaVM0X0FFdEFBTlpsM09RbUJ6RDY3NDRfSlNiZUdLZ3VCeVBJOGtTX2pEQW1RY3Y1QkI0S3hKdnJ5RVNQMlZ6dVdsZ1U0cWZKTGpMa0ltS2IyVGxqUUY0alFYemZ6ZUVsQXlsU0txbEs1Z0ZYNzZPZHowZkxqYWFhbk8wWWFFN2JmdXBoN25BWFJFdG1SY3VvVFcwLVhxRTZ2NDFzR3UtQUJBN0M2bUNJaV9QVXZNZ3ZQa2pBaXZ0cExsY2diYkx1eW5sZzBhYlpwbjhQWndkbTlMUjRjckRITTlKQ1JDMFNpT1BYMHpCNFZ2cC1ZcEtoSGJRSmg5czMzQ001VVFPLUhxbjhCNzFhQk1TZzBqM0Z4RUxaTW1yQXFiX0I2V2xlaU1RSHlvWlFDak5rREJ1Ui1zZExIVS1xdHZBS3h5NFFIM0Z2UHFZM29RWndvSzJ6cjhkNmtWNlc4TkI2eTRHQnpFX2ZZY1p6NDdncTlBTTl3d0JJUWxibl9JV1JObEwtbWtON1NJM000TUtDQmJfTkdQV2YzckZBOEtGaDhIMl9WeXdwY2p2YUd4eWxZR0lLM0tzMExJRVdQUjJCSS1qbWVhbGRUQlczc2RJblpob29RbTFmYnBUZ1h6c0NDeWNnbUZvTXRLX3YzWHJleVBCY1lKc3BIVUNmTjAzYnVrbEkyM1JUQ0lnTmxhZ1V4cFZDYjJmY0Yya1lqWTE1X1dWVDg5NndxVXVpUlpzczBsOUJkUXhVcURVMjF3ZHVGR2JVdWNBaWpISHJsX1UzMVpVZ1FOY1VTUWVCU3pYUzMxNGcyb3M2SFNKZTA0QUNWdkk2eVhWRXJod2xGdlkwWlJENDNDUlE4Wi1hNmQwdXJEbll4VU8wcmNtRXBmaHU4TXNvNVZWT24wb3JJMl9qYjl0a245UTc4QzFVaU1oUzhVSmdTcHRwbmxTaFRzaVo3SVNqWUtuQlowaHRYcGVDMUcxSkRWMkt0MW4xRVBqckhyMmhKcC1WYkU4b3RzR0kzd29jN3hWejV6N2dhakZfdjRnN0lIcm0tcEJ6a01JMnI4aGI4Q21yN3h4WG1tczh1R2J2MUVYM2pCQUU0MWJOSndIQm9seEFJdWEwbGhabVV0UGlkZU1UUkdGY1k4dlFVLU9VM2dlbTJ5ZXV1ZzhUUF8xcVo4TE9UWDhuZnJtSld1T0taenM4YXY4OW1JSjRjLTVuSl9TVUVrdWpLRTA2Z0JacWdTNFFvWEtNQUdHTHRLdEtGWnVMWXpIcHdwRkxMQ1FpMi1CRTJfaTdET3AxMG96Y0lEZDBDc2xPRmhaWWpHcGZ6OTh3NmpoY1NQdk9uaEtoYWFhLXYtcUhMUmhTZFk4MEdmbS1FVVYzYUg4RUlNUHE0VkxRaE84QU1fQnE4eDJKdHEwVVE0QXR3WHExNDZpVktmUXRRVVBuNHVyeEVfVXlBQWFZMm1aaVVwc3NzdlU1blJWRzZiWUVTZGZsQ1JEakV3RzY4eW0wY1hudUlSTDI5Vkx2Wmc2cl9pQnEtZEVKekVlNFVub081ZkxwSUQtRF9zcjdfQ3Q1QWY5bVA1bE9LN1dUa3BkQkxtNEpQNV9jMFZMQTg1aHI1aTlvZW90MlJINDlFME5pNUg5dmRBSWoxd2RCSU41NXFtbF9nQ1dnYjZnOGNHZTJWTHVrSEJ0dHJYNlZ5aVVQRW1lRDh5NXZCb1NydngtT2Zoel8yQmFrY2FQMHI5d0o0dXlvRzd2UjdvVV8wN29ESFJ3Y0ZzUFZDQ0pjb0l6MVdRc2xxWm12aE1ITnBlQjh4V1RQUEYxWXFkSHV4b1B1WkxfRHhmaUtZMjNJbzkxcnphcTFkTTFONlYyd0g2dEJCaW0wc21LMFJHR2VYdXNGNndvakJTd2dKYWUxcDBLb2xvLWJ6bW5aZ2RQR0xtU1l1M1VsRDZyLTN5RDR1Y3lTbHdOWng4djdTcTNVWndzaWFmZTlXZmNObFBRSFpOUjlCaU9ZYlpwOWVnNTN5bnc3QnNaZjJJc1BlbmdyUXU1SUhFOVFBdXRodHFXWWV2ZmxiMVBEd2o5TE9CUGs0aHVvekhtWHlldUlfZmVaVGpEQWJvZ2RXeFZSWUVKbEVLcjBNU290aGo3VHViVVRYUll0QzhOU2dhMFI4aWNrX2FKSnQ5MzB3QkUtczlGXzllWWo2Tm1fNGh4bzJrZTRHYmNwMUhERHhtd0N0bGZHWERpam0zTEVBVFhuTUxnOVIxRThmTEtQT1dFUy1aMEFnNXZHdk9MYmoyV0l5S3dGX25HRV9FdzVmYXNnZks0cFkteXZRRnp0NFhyeHpBYnBaRFRrT2tVbkw2ZEhNVW5tTE1SQjE1S29iMnlXT2M2bmtHSGhIcXBzQzM4R2J0b05qblU4SW5jWWh3SVM0c2dHVkpBcy1FQTBGUGpuNmtncng4aVBtNXRUWlY3MklUZW5mUXE3cThDMWxaTFRMUTNyXy1ndjJCdlREcUdOMGY1bW1PSXJxTzl2dUsxdi1FX0NXakJMaGl2a0Z3Y013TDV4VVR5ZFJzM09QOU1ON1RJYWU4RFZ3ZDRONHBwRWJMQ3FNaERubnRUYkJlSm4wTGRjSVhTQWtOd3NXeXZXR0FMd29XX2JTMHFsdVU5TWRSdkUyX3d2OWVzU3VJbVp1aGJ0anl4NVJYLTRfbjhwSUZ6dFF0S1JpNW10VUdWYTdLUVk3YWlmcnNzamVEdnNGb3IwUDhNaWVHU0J4X1hCSy1QMDFuTU9pZkt0NDBEekQ5TEFxNWFncFk4TmxfM0xHQTFXN0hOZk9OTmtOVjAwRVB0NmpaSVdHcTFXaUo2bG4tLW5HV1pCSnNXaHJPeXFablk4Q1Nubm1vaGo1ejRVSFlteVlrbGEyS3dURGJkSXZNLWh2c0V5QzJQS0FFSGMzcHF4YUpSZjNrck9rSlRWNE1VTFV1SHdaVlVIeGphVUV3QmtnT2pMWElOU3owNFpmcWZBMjRvVVkyUlZwc2dvQ0NTQ3BOaFRkQnZxM2p2M1p6czlvLVdYQldKaWFpdWVOUy1aeEpnbjdPbDlRWkxfLTFtLXZKeEwxV2luclpQMXVadl92N20tSVQyV0J6eE1HT1kzcnFxc3BPQk9jZklBRW5zMGp6WEhFNm53VndNVUd3eHhPTmxaVFh1anV3UDF6UHpsa1I5SHM2YlNmZUtvUFNTR0RfZ0lkaVNDalI3WWVwQlhkb1I3c21aNXFBMlpjcU1rdHVJYWlRRjltaHVFZlc3d3BaRHA4cFpLMDFZVzVQR1VtUUJTbF95c2dzaGExSFVZV3B4VktISHpwMWg1a3RmYjNDMEw3Q3RGWjJCODNZVGdLYUFnWFY4bVhOYU4wQWZNdlYxdEFXNkY1NmQ4RHh3empaODhubUtrOXFwRmNlWk02dzVGR2toSndSc2xkb2tkV3VYME5RNmN1aEllQ3dYaVM1MU05VTJIR1JQLUtSSGlPb1prQk1MbmlBZ0VlNzVhZXFNTFhna25UUTRLRXFFUEYxc21oWEZtbGIzRHBfTTRlc2lSMjVwekdocll4VkdKck1PSXlvUG1oUF9VdjRpU2pqVmxRZHNwek9yY040TlJ5Qy1kLWlkSEowOWhFVjlMT2stdG8xaWs1TDdtVVQtUVNEclc1TlhRb0Y0d2ZlS2ZhUFlBWm1GQWRENk1pa2U5bUZqUnptdnFSU3M1YXA2SHZUSUhDQVkzamRCMHAzQzVLMklZQk8zOTZfVElKZDBFX0Y1bktpbHNVMElGa29OX3Q4LWJKYUV5MWlMOGs4am9VX3E0aGZzV1p6SUh2azkyRzJZaGE2MF84bFBUMlRXd3poNW54d3RSbXljeldDakpoaDNPUnBZZjc2bi1Fb2RRTGVjX0ZwUUFUSTd0ckxndUJtakZFMW54QmNzQ04zd1lLSFc3VEt0MzNkeHRkYmcyS2R1ZzhIbm5CV1BkRlNzeFlFZnJVUTNEanBsSkduX2s0dVhQSVdnaFFBeG81VTVyNnNlUG1mSjdxaXFfUUZMcUNhSWthakFsa0x3T3p3MmU1UHB3NWJiVTh5N3l1V1BxUmhpTldpU1FGaDZ6UHFOY0Z1SDQyRHpNZ1JQb2hPNHhGZ1owWEh1bXZDcU1RSVVNR3pRTDlXWHduVzVlSnNxZFdHa0VQanJHcVBJUVhrSnk3Z3BaVUJCSllVTnhTQk5fLXhnZGhwRDRKOWNGWEpXcTVlT05lcjlBOUJDZWFJa2pzZlpaOEhsTUxZc2hwYmNZM3oydmgzaDVIWnBsWEVlVnhUckhpSVE1cVVkbFRUV1VIOU9WTDBuanZ0NUt0VWdwaFE5OElqQ3ExcktLajhBNGN3TllqTGxEWjJydnRIX0lBY3Y0SFozTDE4VHN0NzJKUDhrM2RGM3Z4Qm9TRURxNDhpbjZyV0tzb0VfazFNdEdoaUNVOE5WSW85OTdhU0RKNnVNbThsNjExS21zV2VldTNhdGZDSmFpNXp4UVVmTm9SYUJUdWNmS3N5QkozaEFhYmxlSVlNM2Zmc0tiNDdWODU5MzlBTDd1XzVHM0lvY3Q0WE9KNWVkSmwyaXVGU0xpR2I4eXpZQk9PTlhtZFgzRkdkSlNiZGU4X2NBNm1wOXBhenV6UXFrbldhRk03RFJUZXRwZjJRZDc0MU9BcWtYWmhUb09scXZxZXd6X3RKaDVGSXNGNFltcXNxV1F6anBxOG44UVQtTWlyY1gxUkN4Mkl6NERIbGtjNEl0RENpbXhIbEE2RWF0d29RU1BXU05nYlZNMGZMR05DM2VCdlFSNUU0ak9zVnlCRmJodlladlBaYW5GU0RwRWk5VGVMT1RBRFNCRUxLRmVyTmhHejhrX2VBbjB4bW52T2ZIWmJqUlUzWHkxU2JsaFN5MUV0U3BKSDJObkt3N3h4NGZDUlZQemhzOXhXd1pJOUZVa2lKTGFoemJzWWlhWG5ybTVkSWNFNHBSdUE2cm5ac0g4NkdVb1lPdU1UZmYtRGh2SHR4YWZNOEU1UDdEQ3ZCWFFiVFJOd1VzaEVQNWUzMGI0UnhrOWJvMkltbXVmcHRLZGNuX3JEdEhoaE1pUy1jS0dZUzZ5TndSSE1oZ1dyWTZPUkhwamJIb0FuV3piRlJnNk4yOW1oTDZrcnlYc3gwcm1pWkVkWjdwSmpwUXV0d3A1TVN4V01QNXNlb1NpTldDenhBZXpCZXNrQmtyQ21hQklCZzdLVjZHYi15QXk5aTh5VktLVi1IWld0Zk0xYWpCMXF3a0hpd1RUWWVZeFdDc1p5eXZvNWJzYzFscXJ3amRrb2RkS3NQWlZYWW1neVRyRjNhRXgwUHNkUTdoLUxZWTk3bjhJYk1VcTdjdWRYWEQyQ1NiOTd5NVY2UEhzR2l2TG5BdEwxdW9ZcjhnMjV3WlBHUzMxdW9Td2w1ZGNGLXh4Y2trU29QUDRqVXlySnZONjJsM0psRmhWS09wVnA0ZTAxOWFFamxRYm4wNzVMVUFkUy1ZN3duN011UUdWTXZaWXdvS1JhSTlZVnZ1MjVidndCUFBxQkU1YWlQQlVyelNHdUhFY1pmeE9KNmhmSzJYSnREQ1loYkFoUHpXcW9vWkZ5UDF4ZzZYRnprS2FIYnBybXNWUjVteGpGZ2ttYkxZRTZBNVUzQ2RITFJxTzRINlI0MHV0RVc3MEozWHlSWHJBT1haenZEOVVWaVVyTnR6dnAxUzNMVWJGMWN0N1ZGMTV2a1ZSV293akV4WmtYdHZuNDQ4anlOWkZCRU5iTXl5QUtsV0hTazBRNGdoNnEtWkVVaW44R1FHdWhxczhPaW1ZNWhyOEstbU1DRTNjRm81LS1EaHMzNTdYWml5Tl94YnhWNmtfY2lGZTRVUUFnWVZOLUQyWmt3MVZyU1gzWU5NdHNOTEJjTHpFWjJsR1Y3b1pyRjFYblZ1LVczZGgwRmdfR284MlZ6VkluTTVWMFpLVkh0a3NBbmYyUDBvTnRMZ3VDa2ZVNEpPNmhXZ0VlVGtYUG1jbWJFYlBIT3F4VDNyOFdCcTBrdllnV3lRdWU4blJmNktPWmVzN0hzRVJvbVU5R01lQzFzT0pXbFpNXzViNGtCWXAwUVlIcXphY1pUOWZHNlhTSmhBTnRKaS1tLXlEakMwdVZxNFp4SzNzTTZNaTRXS3hibktST2RLWUdrel8wa2RJRkFBMjgyQ0FIZDd2d0p0QUVpTHZVTVJ4d0dNYW4yR0JaMlhQNlcwV1AwUFlmNVdiNFVBMVJaTWY2NHRjR2MxYVowLTY4eTZjSHQ0Q2kxdkRuM1AydDhRVWVKV1d0am1JMDlRQ1AwR1pVV2ExVXFnTGZnancwTlNJV2NENjZYNnlVZHAtSDRUQ3dvYWFkaF8xbmJjNVpVR2VoWENlNU9ZSkFrNzRVOHl0dFhLQ1BKaVBEejVzOFNuYkREWS1EM3JFTzRCWVFkS3RwaTVRS3ZKUHlpUTZhNjloTlZzYW15akJkLUw3VE5UeGlCdVVFTktCYnA3Qk5YVExCdzRhX01wMXoyTXNGVjJLbUVRQk1yWmRnSElld294eU1Wa21qcFo0aFBqLWhSZXNQVkYwX2VNa0M0bVpHR1VnTGdRck9UMDRPdGZfblRHTGpmSTlmT0lra1A0TVR4MmFlWTE1UTZhNlIwSUtXUjk5bEVQZTlLd0JWY0NPdmVPVVlrWmJMNDhZa2YyLW0yWkxmcnBzcDZmdmNnTXowekpxZmVwSEhRTnpyYkJyMHBFVW1CQm03a3M3TG5FNURIMEsyTFFyNV95bWdXSk1xOFhTN1JmWDJUQmZRVUlQN0dDbTJWZXduOGN1MmZ4bE5MR2ktNHVuX1RGRjNtR0xGOEYtMWtkdnh4N2R4VXVyS3Y5Ym00Si00M2k3RHNlNGJsYXd5ajFqNG5KaS1RdGJXM19qdzJxY2pWVFdpdHk5Q1FXYVFmVUhLX3VtcHJneVdxcHRUcWZwbXRPZEdLNHJvQ0pKeGZXZ0k0d0lDMjZlcG9lVDl1amF1dWFiWWVkeE9pNHlBWEZjM0NTcWNfcTBEZXN0SEdtM2pLeVpFb256a1ZfMllOajlMQmg2UHRncGc3OTY3Y3FXU0VZZHRSdG8tQmxUTmlobFhNMVpaYUdsVFJhQVFDUlRoNUVGUDJ2TkxPaFQ0bHhpMVBNbGMzSktSZXV6QjRaTW1BZGgwR1JSMjhoaHZHRGFRRGxaUWltZmN5VkxlYnkzYWdndnpDbzB0V090Ui1lWng1YWFxS3B5Vmtud3hudms2M0I5S3dZZGM2YzR2Vzg0YlhlVU1yMWxCeGlaenZpR0VOb1FFM2tubG1DekpOUVljWWRZbHc4TlZxWmJGR0VEODMwaTNUejFOcHQ0bVZYQWRjaVBUMUJVTEhaZFNLdU8zbXZLVXRMb29ETDNPMkRwMTRjUzNMeWhiQ2h1U253N2hmZTFyS0Fpc3NsZ2hTNGtXTVZfMHFYZnNPTjRtMnVRenVDRVlzcEZ6MElXaFQ3aHhERVFXU0c4eXhLSTl5TTJnc3pZSHZSejFqZUtUNUt5R29kdnZWV19tN0MxTlBvNktMTUJEUFc3YXhoOHMtSDJvM1pDR2d5YUh5LXl5S09VeE5iWng4eVBnRmIxMWZ5djBqYzF0STZmMFNXTnVrRWhWeGpDaWcxX1NyUXBwZjgxNUt5ZDEzZnA3VjBTR3RTZDRHSWplbFI1NDhma0xZMHdYaTNuX2U3YWJJdkktV2hLZWlrNHN4ZGV0SjRQQWRFM1BkMVdMend0b21ZSDR1VUprbS1uYmJpRGNNNkRfOUpJX3UxVGRaX0RwRXBJZjYxZUEyc3cybzBLblVybU51cEJhd2xMd01vaUNCdFk3SGJRUUQtNlRhNDRRYTBmaFlKQjNuUmhWcXpyLV9STTJ4ckp1bXd0N0tUNmpvUzNsc1pvOEd5cVp3aWVZeXZRM0dFUi1DeEhiV0pPY1ozQWdHTlV0akdWT0dvamd0MWJhMjJwS1d3VzV6ZllRWV9KMWZlYzJCb1VwQnpQV2ZBWUwtYnBaSkVhSjR6QkdYMUNPcVlJYzNsdDFWQU1Qako3MDNJVE9PcEppRWI1Z0lYOVQ5VnlhWWQzOXF0Zmh3ZGVTYzQ0eU1LNHI4SkdvSFZ5eWp5T19OSGlURm9yRk0zOWg0OWNLcjA1TjVVZTlHckZZRGhTeExzak1zLU92WG5jZmpZT2NnWmRQa1RpTEtYZUpEdF9TdU8yQ0wxMW9JaFE0d2dhYTdSakxfbFdHNW9IOUMtY3pDamFrX2Fib0VScjNnT3RzR0Z6by13aGlLYVdka1lBU0lncU9pX1hIaDZjNFd4NUN4VWNsVGpOOUVOd245QTRMckdnMkluNFFMZW5DeUpGRXlPVlZiOHpodmwtM1Rxc3ZBSnpNS2hXQS04N0F2V1M4UEJSSFdvaDkyQjc5eFBCRE1fN1U4U0s3YmEtYTNjYmxqSm9wb0d3OFIwX0xBNGk3TDdVdlNGOWhwOTcxaUppZjJlbEdjQ2l4LVBzRXdnTzVzLUdzaE0wd1BHbm0yWEhuTnduOTh2RWUyNkZWLXVFVml1WHk3cUZ5VE1zT1hCNWlIanJiN0cwR0xSTXkzT0NpdzFXYmdYMGhQcEdjT05IMWRSeHZ4dExVRnRMYmFYeUVTSjNzQWVtSGdpMGpZaWJRcWZ4TngzbURDVXVwSjFsM3B4VFlPQnZrWEJxbmE3dlUzYlRHRWNfLVgtSG0zQzdsdFpHVld4TjdKb1NiYU1SLU82cHlhOG8wVGpmTXEwOHlYYzVqR3NuQTlhcG50Z1BmeHdranhrX0dYRDdaOExKX291NmJhQU5RX0JBUXcxUTJUOVVYNkJ0dl90UHdZYnFSWHdLbzdkTWYzS1NOYXBLZy01S0p0TmVuTFAxaE9MVjZmeWlCWnVmb2ZEVDlYTFlVcWcyQ2RtWDZkd05pV2g3YmVtSWdlLTNJcTlrNDBGVmFxUkFuSTNzdE1jUm9Ba1UxVkk5WVZVZkRrQjIxX3B1WTJvUV9HaUd3MXRDaC1YQjNOU2ZHV1dYWnMtUWpQUHl6SEVHTXdZcmU0WU1sa1dnLWVMdU5QdnliZEZ2QUYzUGQtYjNzZW5lajZkT3RROWxvY1hsbWotSVZ1eGdEWEJmV3NlVVhZMHNvNjhWVEZyYktiTV9oVmJhTktMUnYyV3JoRHZVSGFtaGRqR3BjQTFnbFNvc0hyNGJiVlRaSkxuS2Uta1pXZ2RTUC1kdlFVenFHZjk3N2NuUWp4M0NyUGVjRWh5WTVHX2gtSzBXalg2ajNjVlhyYlF0VnAzd3A1bHgtQU1Db05oc19KSnVSU1F4aGRiQU9OdGhBb2lTQzZ1MTZfOHB5OGppb0NVM0tGYmhtOC1RMExuVjVVbW1aaEs5bVR4d0Q4bi1jck52YUhmQmdtYTBua2VScDg4WGFwNkNaRUtFZjZranRCWks3WjMzRTJXbTZpSnpjbktMaGk1NjZpd28wdnZaQTNBUjdveXd1QVd3VXlJamVFeFg2QVdnZkRrLWdyTzJPaGJQT1dFTXJONnNzZjd5ampXeDFjU1kwM1lDYjRHUVZLR0xydGVlN2w2MHUtYWFFYjFXdG9PZVAyRVBDOEszbHNkc2NfZHB6TzlmMFhnUWJMVFRUX19yV01kRURiYUFjOWo2YXMzYU5vQ0R0SmpLaWp1SnkwZEw3NzQtaDlrUnZWUllDUl9OQl91NnJsRExQXzhLNzBEaDExOGNnQUg0MGlTdzV6LWhxVmxDRVZYSDIzdjBHYlRnWl8xdUtJN25yeF9BVkMzOWJ6dVNzamlqNjJySzdJQk5zQjFBVjJxTzI3OEVCcVFzZXo0U1I4Y0xEaE1FVkJ5VFJqNkxHYndQZjNDTWdDR0NNRjU5YjNJOV82Z2xJUHVYSUFLaTVtRWxuTm45aGJ3UlZKbFdPZUk4OTIwQmZDV1B6LUgyYTRaYmVNV3NFQWJhcWZ4ekRPSVBvYkdlNHlZbmlId0U1aGY2Y2xDa2gzUDhWZUgySjFkWWMtUVJfdm1zaHBBTmdUbk5fckRFRFN6andwS09yZFlmSjNoMy1QY01qU2lFUndLNjJJTUMtZjFva1NlTjIxT3NJeUVEMFdRSXlhOVFmSmxnSktVRTlMTmFUQ3IyN1dGRVhwV1FQT19XbmNOcmNuWF9KeHJuaU9SYUtUdEV4OTNtekctYlZPN2kzdmczUHdNM2NCcjlXd2h1Qm9MUnhLc3RDWGwwdWdJV1JkNnRRRlk2UW5iOGZXNWdKZ2dja2FxNHY2azRIeXRjejNsSEpERERVUmU4R0xBdm9DZzVvVWNGa3haT3FvWmZTMVpQeWRlQ0syeXVuRHVBSENFQjBTMktHYTZ5WU1SUjlfcm5Ydy1fOUJSU0NoRWJKY2djSlNmUGdDZ3J6QmZ5TlJtQ2lYVS16NGJIMnBEQmFpRFFWUzVQTEZzVHNKQzVCbEkxRGpfN3ZwYlBLZ1NWVVlVQUlUc2Z3OUlBY0wzQXo4QndKc0o4dTd1SHBER0o0SzBPeUJZN1U4WE1QbG1jdTZDNERHSUx4WmhrMlZtZWV0NHJMcGtNSkZtTGpiVW84XzNfZURTbDVkckxBcS14TXJvSXdCdmVLZko4SFJFUy0zTGU0VHFOLWlIVWdMQjMyYmljMmxZd0k4ZXgzMS1ZYmVybGFSaG1OMUw3ckxsX2d4Z255TGkwdjFvVVFnWlhjYzRYalpRTE5lRlNTVmRaWlJ2T3FXb3BtbGxoV0NIX0ZNQnZCbHM1b1h0YlA3enRWMk9Na2dhMGI2a19WQUY0YW9ZNUktclNnQU9fNWlVYl9jZ3VKX1F6UkNHcmtGNExGaUZRdy1HVkdweEVZN1RwR1lsMHlNS19neGVuQVJndEhjUnA4OEZxNmt1SW40NWJYVGdjZDlfczY4QXBJYm93aEUyV0MwY3VEMDVtZ1QyaFVxRE1VMTZUOTV3T3liblZXOXJLVXY4ckRhdnpTVnZ5WmVKZ3RCeHptdERPcHBvWm9vSlBGcUFGVDNyakdNblV2LV9yaWNJQkM4TWhSamRIcVJuV0RZX3NScUxvMDFZaVRVZU5NUkdhSi1YeHh1R01vRUotN3BiWnotYUVnQnNLakNfNWp2VDg4ZG9TOVRxTGNlUzQtWTgyVGFFanJYQXRZS2hXM0VuVFZvVjFJb2xUeDl3OExpd2xhWGtBYmM2Y2VoUUg2dklXOTlzMXM2djBSdzhTNF9OdHN1aU1oN2h5THA2YndXUXdyVHhwT2txSExiVUFZRWhEUWtGZmw1SURxel80bWFmeHBoOER5cWpUU2tIUlNLbzgtbGZISXJaUVpwNDFLZzlKUnFOaVRHR2tMU3ZPb0xWbmk3Z3B1MTFxc1FWR1pxeUhkQTcxUy1Fd2RON2N5NkNPT2c4bXhQU1lENFZ6YXRSWWNpeVRiNmNOWGJaUnFLTVlTNmQxaW55T1pWWUUyVDVVanlZV3pleEJ2ZTNZRTJKeDY5dkRhaUJScWxWaGdhajVtYkZ3WWZGWHVaZjBTUDQ1eW5LdGxFWXhUZjZxbDQxeUYxQnZTM3NteEtIaVpGVzFLUUk4THNLVEUxMW5qTHJKeERGMVFZTDdOYTJHbG9mNm1FYzlkTzlUbnUtS0VxVGZGZ0kyVHFaTmZyczNHTzZiSTNIaEkwZEE1STNVM0R4QTk4cWJnT3dkU2FyWktqZTZDSVYwT2FyTmhxMjNWbk1PZF8xaktUOERGaVFfdzI1SjVMN3FSLWlqUl9zbTg2UThKbzYtbWdlTU5hbjNxSlpNOEhSeDBmVkRwVVFEZVBxQkpUcFFrZjFqYzZPLWN5RkdhdGRTNVAyYmhMc0xCb01BSWJlNy1QOW1LNkhGcGcybXhqajk4ODRoNWxYZ0pXQlduemxGWTV3QW9vNlo1SURiQVE5ZVpxOVVOYV85ekF6VTZTaDNaSjRqemZFLVBWc0F3QVdPSDh4SU9tbkxpcWZqU0RIZkNlWUxPWndGVzZhdlN1VDlibGVlWWREV1FsZ0g2YkpyZi15X1lhWUhWOHF5TnBod3VOQzFPdmZkRU1nejl5T1diQTRtTWxUbG1fVzMtaS1EN1h1T1kzYk8wTU5CdjJ1bjRYMU5zNXE3blkzODIwNE1PY3NKM2p6NjRIMnlzMGtjbHJETExGQUFVYVRLelJmSzlVbzlGRjl6X0NQQ001ajIxaWxQazdUUGE2QWNES0w3MUFrMVE0VzlZSEJFbE56RFlGSTFSMjJyR2pDRGFkeEhYb0tvQU5iOVR3Z2Q2UC10SzdFdXprczFHNEVDSGxJazFiNXV5X3ZaNTR6djU3R2h6Znd6NW9DYXJ0dDNLaWpMYlFyMGw1RmpHeklFYTV4SlhRa1ZhY2ZxVVVmV0JqbFMxRVJvMDBJR2xBTHQyT1NwSDROaXJWdjZIQm4xZ19OZEVad3ZKbEpTV2p3djdyZjdSdDYyQkFvaWExZllxbTlwTHZpWDAwRXozWjJuc3RmZ3ZWUTdBZk1zMTdycmw3WDFVUWpvZTIwSF94NmhwcElDYmF0V04zcl9JeUR6LWY3T2hTMERyYUMwR29ORXJsd0FBblZWSW9DRlNvTjdLQ013TjQxS2RxQ01kYUdSaWJlSXRSSzlBSWhLaEZGVGhHLWk3MFh5aW8tdVU2c21CX05QOExTY2dqNWRhQS1yTHRMbW9Ya0FYcXpscW5IN0tlUlRLb1FWQnZaeE1hN3dieDk5cHBta0J1SFdPNm5ZcHE1M3NtdFJEQnFLOU1UWml0M3FvU1k4NzdwUFBGXzY2MXdta3RmU0NRWUk4MUduMXEtYVRzSWMwN2ttNEFFaU1OaExiUG5oX1hCZk9KNW1ydzFNZTZ3Z0lmalEzanZhRnNGNXdYUzJHdzRlRzBoeXVrMXZzTU0yRjY0bW1YRXRqeDlUVDN0SGIxb3ZLMU1haTVscDVqckJqTzd3YkI5NXN2M0h6aW9Ha0pCODZsT1J5eWFESVM4cVgzOWhfZjcyVU9uTUFOWXYxMWJiMk9MdGdpdkVIMWlEdm9pNGhPSjIwM1VRMWtYUFVidkM1LXhGaExvWDd5RUNaMERTMEMzV3J2bkdJbUJKWm5heDIySmN4VzAwUkd0RmE0cmhqV2dCNnJveWtmNnMzSG14alEtcERfXzU2ak5TMnduSlpOTlh1MWFleUhWZnVkNHEzdG9ZdWFscTN3NTNlTVNZdHhmMDkwellxQU95SWJ5MVdTc1ZVVkJ4Y0JqSTBucm5IMVhmUzBlbUsxbFVLMGl6Rl84a3dyZ0RwN1RJM0JuMUNOYllTdUVMMVNhU2lMMkdfUk1TS3NKNGZiY2k5Z3lCZXEwUklmMUFaT3pBc3MtZnJZT1k1SUZvNGlTSDdzc1FvNkg0QnRBQlRlOTFoRzd3Q2N6UHhpS1FzdXNqN3FXeFRVdktUU3ZFSjNsV3gta2E3NkNiejNMdWhQT29qU1BaRVpieEhoVWF1WkF5TEw0MldyV1pVMHZTYnd3VjB4eTBSWFFkLVhsQzNzeHozLTZDeDR1bzBZZEJDcHE3RjVrSnoxTFZqaEpCcmhObW5JX2Vid3kyaEFfR1RWMFVJVkRNSUlocGFZT2xHd09fMm53WE1VOS1jVGJqMzRtdE5YZE5oLWx2djV5a2FvMFotamtGM0djRHJUQnJSMENLWndSMVNBSFlHZTlyMDZCM1RVU0dnYWZfcmEybldFZFJrVkdjekpMSEd4UUZuOHZ2YUlIZkxMN3I3S3VSalJkeHE5aW51cExXTGxNYkEwcVg3Mk5yY012UkhCbXg0N0xnQVpqbThIWlhSb05uUXlNLVBQUlBlTndWc1F4SGJNd040cjh5UVY3T29BeTlYdUJhMFZpU1FoWml5ejBzaDdtLU5nR0U3OW1XV3hHU2U3emVIT0NNeEtLdUVBZW82VlhfX18zVUdmQW5QYUI1ZS1YaXZ5d2NoM2lYYVF0a3pEXzQzTERFSF90dnVNNWdzRFJQclZvYzhPanZ5cjVtQnRrVzc3ZkFVNWZJOUxBUm9nUUNSUVp4aHNJSVFVSkRsSERUNWN4Ti1DSGxoMjZqNlhuU3picC1IVXN4NHJELWIwaGg2eVF1RUJsVC1ocHpPYWVsSEpPQkRHSTA5eURZMGlHbkNpTFk0TUEwUHN1STN6eE1pY2hJR2VVak5NQXZsWkFkZDdUNG5naTlUTUNkbHNtSW4xTXJBUUh6YW0zR0FCZXlRN0dyajZmWEpkbHVzM0lGRzZXZDFrRE80ZlkycktsczEza1o1T25mcFpSamVWcjUtVFI4MmpuYkdZUDl2aGQ3Q25jY0ZGU2NqQkd1c1dtVlpHQnBFWE9RTVBhWm14MXVMeUlvMFFxM3RKQ3ZzUVlwX0RHN3NFWk8yczNybzNvZ3lkbFJac3B1UEtqQ3dnYnVyRkFNbXN0TkJ6RVRvdFFTVHB0TWtQajl3X3BxdE5jSUxHRWNhQjdGdWZ4VHd3YXU5NF9hWDRsNUdtcW1uX1BwMHM5S284d3lUcVlNTzgzUmxidFc1cGpvQUVGODVpMjhQbHZpdUZZc2ZVMjNyMW85RnJxZzhIWFptQkF1V0JXMmRRVlpET3VpNnRjY0NZWmpsNWNFUHc3TzdEd2ROXzNoV1Q0SkFaSTVoQ1dBRjFBYmxYU0M0WFc0ZmdIN054blY0ZGNIN2RMWV91QUhzZWJWcXRPU2F4UHB4bFhBYnN4VFBGbXNmeU5pYWtlSTRjNXk0aFR3N2ItUTh4MnpTSUlvZmFJMlBSM1dQZFV6dFR5bk5YNlMxTTBNdXZQaXBNVWZlTFpLYmlNTzZDcklCVG9sc0xOaktZcmZWNUtQTTRRVUZEUjNNWTd4TFliV3J4Q1NtNXZwMUdHX3VIS09lSEE0WjRKdHRaTHJpOHNSam85aTB1YUdnaVlOa3daVGw4bU90NW16UUNtUGFnWjlPTzlpbks0eWZ2ZFYxNnhfRmdLSjNpazJ3TjlxM1h5dHdfVGJQNHVnMFRnUkx6U3FUNk4wd1lHMmttaHZpazBjdVV0TTloNERqbi04UmdOYXh1SldfVWd3WVlQcmpSUjJTblJySVZMajNpcGRrYVpGbk1FcVhyUTl4dDZSRzlaOGFSWGt1QklmOGhmdXFMejFEa2FOZFRmNDlxOHNFdFhWSHdBM2JELVR0TzNvX2x3NlotWDlCNGx1U29DVEVFbE1DSGk0cVVrQTY0Z3BacU1MNzlwTkJ4ZmNueDNrY1ZKanRvZEpVNlhvcFFOdHQ0Z0NzR0tlMm5KMEtNVjlCYW9vTVlta3hYSVdzMnZHS0YtbHBON2J2MUQ1aUR6b0xCV1lpWG52UzRNcVZtS0loYXRqempiZk5QMmdRSEFHMWo2UHRWbl9RUWdQbG1Qc1lKWkV1elVvMWhIdVFKNVNpcFc1NXl0VFpOT3dyVlNRVUhicnV2VGp4M0lPdG5zaWtSd1ZGSmEtMWhXajljZ2hQT2E3clE1TzZBc21DejZkZ25XaHdxQWZYREV5c1EyazRGcGJKWF90Q2hHTE04TFA4OVo5ZkUxdkktbWtRQjNsdnhvdWR5R1N0WnJXX1YtRC1oWko0TFRRa0k4Zm1FZnhudjdnMWxwTU5BWWtOTVhxbS1vSnpqX3p3VDc3NnlQYjcyR1BqcjhuT3Y1eWh2RzNVWHd3VzVkVVNBQzFXaUlPVXVQSHotMGNrRG5IZlNpcHdhWmIxTHhFQkVzaE9pWHJCeG53cEZ0cXZjc0xDNjZPemI1UHZJWGdSRXpvcHA5RUJfRWlMQ2VPZGRvaVV2ZklzSkxqUThES05SdDZBbzNBOVF1M0dxU2R4VWc3c3FNSEFZUmhlT25zazJycUlleDlJa05NUGlKNlZ3ZW80VVlHVElRQy0wTUMxVEF2QS1fTUZSWDJBQlhQTUpRVjhYS290UDRNNld3cllwN3ZENnM5d1lFdjhjakcxRFV1c0VlQnIzWkxkUlRKWm1wZ2FvMV9yTVJrUG9DSjlsWlJOQkhWSkxaaHMtLTFzUFRiY0ctNnBIVDM3Smw4SlhJZ0EyZlBGWmNfVmtkeXhRcDF2NEtLZjVRTGpMaHBHTU5xWWJ0MHhTWmExeUVRb3pCWU1jZFRFUHpZanR6Q0J5ZFVmRW9HelRHcU5BaDNQMGpPaU5qc1I2NWwtN3hkeE1FUE1pdUpPM2JRd3RLaXUya0dEMTNBdm0xeGVNVXNpTTFENXhMeVZnNzk3ZXMyS05qbXBUSzl0aFl4d1VRbUZVcWp1OV80a1cyNVRhMVVyc1d1WHNJeFhCa0dmU2QxTXVEcHZDU1FjOTg1OWFuT1dvb0RZOVdxV1NZblJTeWwzVVBvV01DOUVTYlFXVG9ldmtNcmRLWHNXbWg0RVZZR0VOM0MzTHh5ajZFX2xBazI5b184Vk82aGRtWjVfdmJSaTNMdFBNWmlBdFUtbzhVdTFucExoaEdMbVRHa3lSNVBWS3NYT09HOWtpeER5bk9wVXdfV1BVTTlCVWtVcG90WEpUcWRXV1RrbHBJT1FPa1M0TmQtclFNSm5YYmVGTEtvR1lRQk5WTm9UMTlNdXRpY05WS1NfejloRUE0YXU4QS16dDJJRlU3WnF3TG5oQlRQRVJ5aUNFclotMm5adVJIbktxTFVjUHBJLUY2UzBVakd0Z05RU2dSbVFnQVUxUFdvNU5TZEY1VFk2UEtPeXR3SHFCc2JWQVY3NXF5OWVZclBMMzZPTTZqQ19MQ2ZkbVRwMk8tZXhvQ25KOG9LUzZsWWdOSVhJZ2NMSkcycTMtMXRiNmozTklsVWhTaVZrS2JTNm9QbnNCX1AwaVQtTkJrbFJjS3ExTWNiemRVUkJhSHoxOEVXRHc0ZGcyUW1vOEQ5UnpFV1VMMXNUUkhMWlVYbjFHVTMzX3BlSmhTNm5IOHJxcmpiWGwwd1d1ZEdCZ2NmTG1Sb25DVWl1V1hkSVRrM0NIcUp1VmNaV3NrYVFJSFFvMWhEVXAwNERUX1FSWVNjSE1oRjR1MFo3djNZZzBQUXlNMTR5dzlEVFdzZ05PY05QLVF1REFsbVdLTXpqZHlYcV9Dc1RfckN0Sm90bXoxNWE1S0xGcUpYNGJGY2d3Z2tyWWV3dWUtQVF4UkpySk5SSGgxaHpsaXJ6ZWphRGhFU2QtZmE3NU55SUpGSHZRZ3BCSU1CNUFqYkN2SXR3SHZRaEFUUEc4cWtienp5X0I0d1dSM2Z2WThHNjZKVmFyeEtXSEdTU0xZNS1WYktSTDF4Q0dUUHQ2cFc1SWMxNUQ1ZVJjeUcya1BoTDk0bXQyblJoTExkTl9UOHZKLUhBcko1anNFV190ZjdSNUZhWDdPbXhGc21CeGRtZHU2cnlKNzF4eWpTaExlekJPOTlnb1ZYSzRtNGUxRjdkWHFvN2RDV3htX2dSZ0wxZkpueXJuM3EwbHNHYWZoZDUwX1I4VEYxaHhRRlJ1aFBtSUt1R0J6bWtLamVwdWJXeWxiMW1vbmZ3X2lJS0RLTlM2b0oyTExLTjZ2bXNkeGc5MHJKdVY0bDUyT0RjN1NIUm41SXNpYmxGY2RzRmlTeUVucUczNnIzbzFEQWtwWEQzWlFyeThaUmFyYkw3a2otTVNUVGNGZUNPNmQwRWVpZE1jRmd6TnFrQUwzUE1rNDZvZzBBVzZ1c2htdjhVV20zWXRwU0ZDSXRXdGhKTV9ienhINWhsMVdPdG44SmNxblBWQWFaTDRhNldTSG5yb1pJMFRaMm0xMm5vWW9lcU1CSkgxNVFPVlBPdjZMTWNpR3paT1VvR09NMTV0MWQ3ZU1pTm5TaTZCOS1uYUdabE04MlJjWUw4TlNtNXZTckZBMXFpWTNTOGtmZjVpVDBWQU5ocHlLeHlwMlNxb19wQ2hVZlJRclFLay1PS0VBMmZNUW1hZ2FWcTMwLXZHckpBOXhoRDdzd1hac1dYN1BWazNsbjlfOTJqdHByUUlxZ0tWSWhua1pVcmFNSlIzdklrajhvQ2U3MW40MHhBdU9tMDBnMmFhb3hjXzQ4VEJ0dnpDVGFjYjlZMGJnYWxOYl9RcUUtODNhSHlwdEZaMFZqVVFCbDY0WVpGZmMtdFJZNTVOelRTZXZ1VG9RczhKWnJyRXNjYkV5SmdqWGxkQ0NGbmtETUN2WEZlakVMRldoMDdJMXgzbEowWldSeVc4Uzh2a0RLWnE2MC42UDM2cjlDa2c1V0s0RVlzVDZ1UHVB"}'} + headers: {cache-control: no-cache, content-length: '42464', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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://vaultcfa1497.vault.azure.net/certificates/certcfa1497?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/554f5eca7f2e42009173c299dbee817b","kid":"https://vaultcfa1497.vault.azure.net/keys/certcfa1497/554f5eca7f2e42009173c299dbee817b","sid":"https://vaultcfa1497.vault.azure.net/secrets/certcfa1497/554f5eca7f2e42009173c299dbee817b","x5t":"HI3CLuPpqfe2c50MaE4H8eaGtjs","cer":"MIIDOjCCAiKgAwIBAgIQGaLR85GnTpGwQlbCuTPl8TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NDIzWhcNMjEwOTA2MTgwNDIzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi/6+eKoLsumBa2NjOMgR/qz3dFU+CLdKVabe7huThhDMudhi3JPBY/gi4LibYfhSx5SzcYD7RbWfSsaSQkyo/0PwZf/guGniGyGfd7jwX1cadrv4MBbcUq8c5autb9THNc1en7jDMYdGotT8bMzcpgXUFvhqUbPEFYM3lgyqmCx54LFWDJoRrQyxavsdVdVTA2MZU+xrFLd8+qfEM7FY1kwJtjuvVRTs6vy/Lt/YzM9QkPthO29oYPheTutHe5pqKvLNaet1J546fSJV7C1e8++PPGZk3D/b9/pETmLhaiy1r19r+XhxrqVWSYL30YU7s+SrVa+3Cjf7p0fH/1zKpAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQN0cJiDDG8eQggijY98tcXN+c3BjAdBgNVHQ4EFgQUDdHCYgwxvHkIIIo2PfLXFzfnNwYwDQYJKoZIhvcNAQELBQADggEBAIJ/6HG9HobUmkQUgDIBjImWswQzy6Hlm0WKRKuTfyFLoqdzt3vcDB2hIIbXmsaCu8qbqG8QWTw9+tXk34h4PUutE6b5if+dgOMr2W3sL6FHqsQR46soQkgOVVjZFyo8Z0eepFgjOW9elj7BrU9SAcWcGc0dUXGkISgkDfzSQcmLLlxBbWPHEMyVDerLsLUwDT2xRIrpfmLdeWI0CLJ8Pl+fWZDnWwG+hw8VIU8Ore9ftisApPzkT169+KwmgOrKy1aPTQlk4K8ehZHdiSweoYV3+cYNSsFYvNhAqdS1SzVa1x927W70fytAZzNV0iA79elamZgW+gaFvflK390JM+Q=","attributes":{"enabled":true,"nbf":1567792463,"exp":1630951463,"created":1567793063,"updated":1567793063,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultcfa1497.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":1567793053,"updated":1567793053}},"pending":{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/pending"}}'} + headers: {cache-control: no-cache, content-length: '2298', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.vault.azure.net, + /certificates/certcfa1497, api-version=7.0, ''] +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLklOQ3ZyTWJGM2FCVlFiVDE4V0lOOGJZQ3hFVmtaeTdVY2J5RXpPaE9Tb3dTQXBtV21mUE56b2R5cDUtdXVZaWJRUC1XaGMzQWMxeHpIZXV1M2FGckk0UHdPTzZpcHl3ZDl6ZE9QOXk1WW84YjF4clZOeUV2RXM0SWpkNGVQckp3TmM3eTJXYmlqX25kdVFxTzQxTkd5QXRUaTVfM1RaLTQ3cVN5WGRrVTU3TG4wel95VmpFbEtFS05Oa245aGJCOW5EbFB6S0tpNEhDTnF4UXpRRjFISUpXSEJTdGMtbW8xRElvdElFUmFmaWtGcWxTalpRNXM5QlZCMDNsbHU5eFdobG5fWDFWMWpjcTEybUE2VTd6Wld0NnNHcXR3TEl2c1I5NWRYWjFMMVB3UUJORTVoNjBLOVl2MGpzYnI5dTFfOTV6ZXVETmhUSDl2SThHc2ozcTRpQS5jOXJPUWlFM2FHRm1DV1RGRkNvdWRRLk5hVDhaQ3hkbXBpb3Y3NU5jWS0zdVpNdHI0TzlwLUh4Y3BhTXY3b1FMT09sNThQUWJZSjNia24xU1F1SjF3QVF2QnZwN1NZX2NwRGU0ekIxVTVFa1dVUmRMdnVKZENIUDgwbnEtb0l1Wml3U2t3X2YyaVNCdkxyM2xnZkpUbDVFT0wwbjBxd21OcUZLQ2E4eWNfQUw1TG5WaW51d1hiMWFWOXl2aTJoUGllbF9qcTJXWGNFV3JBUHNGSUtNVkhaN0JQallKOHl2czFmcERqdDRsRHh5dXlqMi1XN3hGdElUZ192dUNuUEhVd282dklqSUNVbzBwQ0xKU2tKc1RhZGwtRHZIZmt3bEdndmxJZU93WUpjT3BQVnI4STBpd0h3dU9Tcm5JWDhHMzNObl9SeHhpTTVvZnlDaGhYQmg4NDFyaGhVd0lSbnN1cHB1alNObklnbXNVd2JQSTJJanp3OXA3NE9lejlsV3RVSnF3SHV2c255Y1FJTFRBeDk2VkxSOXhmU3MtTTE5OUc3WVlmUmRvdnlZYzFmcUYzdDlUS3RkMC01Y3FOUE11SUNEOXg4ZWYzcjNJeTMzNkFEQXBGVDZFSTZKYlVoZUZ5TlpkdlRxWFNiczBuQWs1a1FwY3RZWDkzTklVVE14OUdaaklfU21tUTE1SVVTSFA2Q0UtNHZFOVJxU2ZhVkhPd1BNX0NpS25tMWZLUG1ZQ284V3M5RnZmcTJocll5ckJ4czVQWGhza3dfWmNGaUtzSThfOHRlOW5zZUZLelRfWkFaTjVkdXp6NmJNQURlSzduV0FwNldrOUdqWnVGVkc0ZjJvNTlSVkhoSVJtNllvaVIxeWhmc3g2TnlzbXhEQ2RBdUw0WkI4LWUtWWhQWVdBc1pqTml0aFU1dGIzUUJ4SmxNemtpbHg3My0zb2hlc2hpOEYxZGlmT3VCbDdvek1QMzdZc2JkRFJZa1libk5weE5Wd2dPR2M2aDVfS0lPcWRTdWtkZ0FrZERnWVBIU19UcDJiZVRLNmJYbnRPQzJacldBUmxjT2NjZW9LX2JTYW02Skk1bXJXQUxhemNxS3g0MG5iRWVaZ0o1UkJld3JHOExpS3c4Zk5EdFVlSkxtY2lFYUVxSnR5SjBZdG1MQWNmNWFFOUhLSDlVbVJDSWNBa05DeDVjbUdJQ2xXVnFRbV9MdFh0TFpmZkpabHBTdXRVNnV6UzNWUUVUUjJFZXNoYnZpSE5ucjktS0gxaWNkdmJEQVpaV2FMTlYtN0NKNEhEa1d5ZThlVzROdHFLekxhNXBzS3dQc05oR1k4a2NaaWxaMnhmeXNVUjQtUmttbWR6RmtpQ3FfMEpoRVRGejJUaVd6LVpuYk9BVGs5VzZlcW5YbEN4YTZOS1d0elJubncxWjRwN2RFVHZmYUV4YV95ZDR3dUdRbGx0dFJITzJtWEFxT1hlY1hmMFNabE4tR0lVSkdPMzI0LXkxZ1p1MUtlcWg4ZTB6T0VrR25ldHZhOXhHVGlXdmt3VXc5T1RuSTN5dmlHMmE1TTFoQmc3dzc3Qno0M19lUDBQbzUzLTczMDMta2RmemdyNngyajYtRmhpSDNFTENibWNhYWNDaFVBUmVSbHdyTnBwcTFza1oxTThWdkpIYlIwNmdXbGt6UWhaSTRnSXczdWZsclRRYlpGRVotV1N4VkNIRHlEeGR6WHdlY041VXpfbmxGZW5Wa0NwUFFibVd2RUhDMGhNYVhCZmJVUTNKanZZdV9HTHhXejlSZkRfT19CUDQzSGF1bFVOSWpRV1o0cmg4TGZGWTh5NWF0TTVqdERBbHE4VlNxUDNLenUwckR4QU5LNlc5LUpOd0h6bTYtVzdSYnBmbjBPSW1qVGc2X2VtZE1YX2ZnWTBLVXhtWUJjMEpCTnBwVU16VXI3aU9ZMzBkTVM3aEdRbVk0ZG1QZnpKLWo0QnhkVl9Yc0twTHMwZHFMOFZTRDVjWnpmY0cxQjVPdjV0WXZNNFRfZ3VwMGdpekdTVHFNaURvYkJNbHdVYnFEV19LWmdwWHZXRmlnOHMzMVUtNEVpTEtObHFfRk9IYUhDTlRRY3ZwX1daQUZkUGlaajYzemFUNmpSd25CcEdHZkx5Qzdpdmo5WENpd1VIeWVNVDd1U0VOUE95MmFSVVA5UDdlWkxMTWZWWkJZUXhUNlJncHE4X3VzYnNWZ3J2Z2pBeXIxVXNxN1BxcUh4dHQzZjRmZ3Q5OVBQeG13aW40WnhZcWI4UXVSRGctX1l1Zzg1ckoybkV5UlVta2FLT1diVG9QMjVwa2h3cU9RN2VLaDNhc05TNnlkNERVaGo4X3dOdFI4cjk3Tlo3SVRZUnBSSmxiUWpUN2dYVS1QbG5EMWh2Mmd2RkdLTGUzWldKazM3eHlsaFFTSW5oX1pMbEpYNWJfTDhRRGd3NlB4YkZ1c0tsbUNrcVB2VXZVY084eGd6bE1EMHNZVHdXV2RFcTRfX25vTVFMYl9WRGlVSzA5Y1I4SXUwRHdSeWpfY2NKVW9oQnJITGlWNVFKSzIwZnR3NGI2QU5ZWnFpWEFCR0R2dnlqdjBjWk9sYjNIWDc2Ui1XbUVacklDRWhQWTF1XzVlRjU2MHctbHBzc1d0YWRZNmd3MldvUmZ3b2trUURrVDlqQzhLR3VlMi0tTzNRMDAwdFFkekY0SC1CZnc3ajVuNFlmck9OQ1RjUmwzWnhjZVBpRk5oLU16S1o1bEtmRGpXb2dZS2g4NTRwZnVSUUFpcXdvQ1J5QTAtSVdJWnpCT19BN1FuZ1pYUjl6TThxLXV4VVhKckJIQzlXQml0TExaeERvWmIwU3lRWFpaMXNKX2IyQnNsM2RnQlpjN2hkcm13OEpkemhTSHVFNzU0TzduNmpUZ1BkM1NoZ3diS0FFNlFiVG1mc2d0Nm1XdUtIemtFX1pJYVdBTWEtUTdzVGZvaG13ZXhZTG1xbEFBX0QyMUU1ZDZISzFmUURUNzdyYTJ6SW9uV2QzX3l5VTZXeHBVU3Y1eW80b295N2QyWFlUeG5hNHlGRWd2RFEwQnY1Y2RHUS05TWY0djlzcmloakJNMFRhUFh4dDl2VkxVWGFTTk9DUlNlSkdGc2xNM1JBT1NuWWdKTVM1Qm1sZWVFb3Zlb2ZldlIxUk9hUUFvSm15RzZNczVZNTV4U3ZjMFJqVTRnd3BqQ0RzVloyS19pYl9ROEc5UjFrbktxYmVnZDZ6cmNKMk0tWWJjLVpmWWVWUUs1TFhBTldZOHNOb2xma0FMYm1KZWd2YXRsUUZWd3ZLbEJaUVpPYmFicTg1cmw3NTFFNVBNVHdHd0ZMYUZ5bGk5RW9Rd1U2NzdUekpOa21QNmFxN1lMRy1lTFBUQkZZeHQ4WGFGX1ZFYkdYTmQtalhIWmJGR1FuSlBUYmhfTkhmZ2NseHd6UUpXczMtYWJzX3Q2eEM1NklEX3JSdEFvYUFjdWMzdVRVM2VtMnNfTEs4SnBaQzFlMXRlQS1iWlhWQTc4cHZ1ZXl6YVNmczY5MThIS05laWNCWF9Td181dE1SWml0NW0yUHctU1EzX3NtSkhmUlB4dy1FejFrVjlueFF4S1F5SHpNM0t6b2lpM0ZXOG1NNDhpb1lfVEp3MGFUdmExa3VleTM2ODRiSldFMndCYmJnXzBSNndCUEtUdVlqcG5yeHZsbFQ3TjJ1X25zcnNLUU5KQzVrMHdvTlRQaExpSEFSUGd6NkQxeHQ2ZFozVVBOaUwxSnI1elNkZFVORDhHUnQyUk5faUFWMnpta1d4YW4ydG9Nb1BBWVIzOHNsOHg5T2p6aWhCRF9xTUNneU5lY3R5WHJuajFSNWFFa2NqN2thMkJWbEFwWm8zZ0RFN0V2bXdHSVRaQzE2MEozczk5b1liLVY0c0d3Rm51REV5R1g5QUxnWWhGWnl4eXlySzJpZDdvYkhSQVdXSDM2OVEtcy1WcElXcC1KdEo4cEJjcF9fMU9JZlF0MC01YVAzNzdwYlh5V3AwZ0xiRVhtQ2k1cTFLNzdiNllwYjBUaE9HT0R5N3ZtVVZIaWNyZlZVeXlTbnZCYmlydFlDU3BPZW0yQkVPZzRLMW01MUs4bDZPcjdSdTNVZi1DZl9sYVdTQlB6UjZvMUZjTFAyTkZuS3JvV2J5UUlwUWltbmVLS0JFNUxrZ0xZQ1RiR1JFZEx5V2t4d01jb2E3UXdLNmtsSERWUm1xY3c5Z2JvN0ZwZ0toWnhXb2dqQnZ0YklzMzhhSF9xN2F4UGo2ZWtCazFza1JWWnRqMjJJRUE3VlZzaTF5Mi1sMThfM1R3a2otYlc4b2x4NTRiWjJSemhESnBxR3IyZ0hFTm1qeVVHM3JXVldEeHRHVXpTNHpXWWIyNklreVZTZHJmeE1Pb1RjNml5SHpIUHBGRE9ULUhGMzFJc094dU1IOGwtTEJxZFdXY2hmdlR1ZlJGcWF4QUthdnR2X2JZZnJzWWh3dU93ajZKbHNhUTZHT0p2M1hnS29UNFNBelpwWFNuUTQ5b1lDZExGYnVxWmFSNF83OXp4RFZrLXlqUWdZR1VaaFpHYmNEc3hnM09wbWtJZjlDd0o5OGgwbHk3eTlieDFnQldMd1ZVSGl4ZUJlelpXWEo3VElKNldUNUVKcFR2akdhX1B2M241bEVDYV80VDVGcjB4NmNqVEpuRTd5X01rcW1lbURRS202bVFrYnFLaWN0M3FXQ0lrOElYaHEwcklMZmZKbzNyak0xZDNrWHRqXzU0bUNiYWdyNWpyWUlyUnQ2SjJJU1N1WVlqVlQ0eGhucVV4bVRuT2h3UFNBcFJHcUdxSm1iYUlER2hsOVZfbjBzR1FrUU1fbVpGYzhpWlJhdGhXUkpGUVNzYmhUNWgxY0hwbzQzOUNqbE0tME9PWE1kSzk0aWU0ZVFBZWFaU3NqUEhLbV8zZTdDMmpvWnUyektQN01FNE5sV0UwWV8wY3kyVjBOTWV6M3NYR3Fqblh2c3I5TmZYZm83N1NPcEp0UzhRc0lsWXdUN1ZiVlFOUFQyekowTXJFUEMwTXBKRWZpejZXaVFGSWUxbXZZNjBCZi1QZzAzd0dSVVpCNTNxRWg3cXphVThuejhHazMwVzQ2cnA1eHdCdzBqOHpLbDE0ZW11R1oyUFNNZk4yLVBqSzM0N1FOY3NabHRxZFBJYmFJSzR5QmlyRmM0UDR3ajVRcjF5WnJ1RnU4N0VUUWJwdlJGc1gtdjA4N3JuUGFHTjY0VHlQeUk5YkJDUnR3dUphcTlscl9JdE9OVHFlMzBzMk1sbDFCLUY0VFhhejNrdHV3aWFxMTR6QnZrTm9KZUNBcDhEeURMLU9EM0pmUTFMQ0c3eTNsMEJCdnFtVHYxRlFEaXBZV29BeEN4M0M5MTNsVTRFWFlrbEFrZ1liWFZ2TzUzaDJoYlVLLS04VzNSM3RkRXJoTXJFb0U2V0ZGSUlxYU1mQkZlVm1DYi1VRER2eDVIeXNMcFFmdXhKeXdDWlRrTFU5dnA5Um9aYU1IVWdIVnlKMXp1VUtsVlNuNFFjS25hMVJCaUgwRU9DWm8xaEZkcUJXamVnRUhvYzlxYk5jUWtzLThqWTBGbUtOTzJUQnJxQ3AyTk5mZ3JpUDFidlJoc3dpbVlNWnE5UWlMT3NEeWJpRk5PN05ldXRGdVAzb1Y1dF9lNTQ5V3F0Y2ZhWHd0NWtGOFJhUHlzSlZUREtodm1qSGdPVzBXZTh2WFNXazVYNVVCd0NfbzFBU2lrc0JpT1BlNTBWUDF5UlY2aXJya21IVGNDY3VGWjBsQkRHaUllVDMwd2NfR2R1Y1IwWThZaHhScWlCdkZWeGNLNWdpRWU3UUZ6VGxYSUxyTW1uQXR2bE55RnJoZWFvYURaRTVDZk5QUWJQbXYxTHR3UUxlaFZCSjkzN2NLNjRJUXVfaEtLUzlORkMwdmFPT2tZSGt6M29IUHUtNlc0MG5vQXZRMUxYWllTRU5YdEpCSTdhRkZVdHVfWE9DbUc4dmhvczlMUVJQR1UwZEtOVGlHdDVlaUFPUFltRUFhVXIyR1ZjSTlKdWhPclpvTU5GSUVFUng4THdOTnFBYWpGQWZhek5udWZyWTlIWWdUX1NLNXFBR0MydE0ydVlGN194UWFUM0M2Sll3WllodHhTYmVJd1p1YmpNZ3RUeGxuUF9jT2NYaWRPU2NUQlhTbUsxYWZ3dVdESGpUVmY0UjBkMDdNcmRBQ2pfZTVTSTlhSHAtVDBkX1B6MVI0eUZpNkg2d0hTbjZhUzVkNHlGVlNSOTdMM3dQVE9nUGF6QXZxZl9vOTU4VFBxYTlveGszMlFqNjFTSnFQV2E2YnB1YnltN1pvZWlqdXNocndCTkRKaTlzdXFpa25ZX0Y4Q0cwQjVqaU5BaE1UcW0zanhKd3B0UG1yZnFnUHlGQTVPX3pEdWs3dWxCLUhVYlBTZnMwVUdmV3huX1ZZZGZQWEJscEJpZnU0Njd0TWtjSzdfMGFfUHdLZU1UQTZYUzRiYkxVcDIyX1hqU2VyNGl6bmlYTGMtYTgwZmUtMGZFejA2LVlNMlZneWh4ODhRMkFLQkZ1d3V1c3Jsb3hhWFVjSEZJeW1QYTRKTVJ1YnlUcllSWjRTaDgwa0ZhUGRrTjY2OXY2WXA5Rzgtd0ZPWHl4blJ1RGFMZWR3aFF1OXAwcHFXbEZad0xBX0FYOXZtLV92SExtU3o1RUpGLWpLLV9BakpSU29HcTY2eEw2cExzRHZmTDFPdHE3b2FNRzV1Xzl0YnhnVFVhTlN2WW9DVHl1NFBudERxMXp3X09IUTB3U1NTb2RnSm95bkZaM3Y4X2QzeEZpMkFwcDlNamt2dlh6TkRXM3dSVHF6dTBVd2w3eGt6MmlES2hhU1owMDZncUpTRVE1TDhYVGxkcUJzYjdTX29GNndYTEtsZlZtT1RkTUU2T3RxZkNHS1VpbUppRVc2S3ZXWTlOaW1FeS0tVFo0QUxhMlJNZUtqaThqcEtqUDdlbERIU0JRQnFwaWlaeFBvakh2NTZ4TmZuMC1fQW9UTUd1QmM5LVpEOC1lY0FHSVJzS3pMSWlTY3gtRWRXX3NDX0YxT1ByN0FQRW5rYXFCUzZuekM2UmdNOHluZkUxM3FabDZGRV9EMjFHa2ZRRF9aNXNmWUM2RlJQZFBQZFNDWUZIeGoxcEZueUUxTG1DVF85azA2d2VOdXRUZVpCR0V3ZUdtbG9NdWpQT0VYbzQ5NTVhWDFxMG14MjRfUzktSWU1aE8xTDBVWTFpZUl4SDBybjFuM3ZEWFREbC04bk5ZcUZGYVJwMEhzVFNYTDYzREdVdm0yUUhlNi1QRFRmR3dhNDkyWlE5ejdrM1ptb0xsSzVuNkVDdllaQUZtVzBhUFhyaWR1UTNyUjBHeHFKbUZPZlJjb1o1aUQtLW56aWFleHpYbkNLVnhfQVUtX2YtMUthcEkwLUxWQmdvaWptMTNmUVlEQkZXTXNqQTMzSHFQV3d0T3A4YWZMaUZBUVUwSmpGc1BBOUVKcXpEVFBZQnNtN050NkVONTRGYmhzN1NlR2poZWc1SHVqdFhUS3gwb0NkaDJDSEhsVnZJQnZqVTZDSkJZUzV0RTNwT1BPbHJGRUNBcFg1VXJyckVaalZGQktmenoyOERGR29iYVByaG5TQUczUE1mUTFmN0t1MC1FWjhDM0F6WlJLWXA0ZHVDbXM1MTloMm04NEhXOFNQTnJRQU9GeG9mdVNBUHlDZkxDUmdvcFV3a2syYTZudkttUFVJOWU5WEJEMXJNOV9vc1NqZEJZQU5UWmlsNDVtU0VFT1BoMjBiYWRZLU1kaXJrNU5QdE5rMHYxcmZlSFhwQkhpbHVpSEFrTXM2MDQyX1JDRWNtZFZOWWM5aDJzMG92TXdMZkRkWkFXT2xTWGtCcUNPSnZGWUtRaW9FS1FiR0VjNGRjTzRiNmZtQTVtVTJWQXVuQTE3aV91bTBWVnQ4T2pNcDVVQ1Q1MVJLa2I0cnNkQ3FOeVhXQVNUWlIxNlh2LWhmX2prdUFDR0FjbzhLbldVam90NVp0MllHdmlLaG1GVFp5MXVTZFNXNTlleElxQ1ozSjRCOUpXdW01bWpITWhJREpqRTh2Ni1yUzVlOU5iOUozYlc5YS1BZ2tlVHpRSDRkVTRBSUk5NHlSSXdXTFlrN1lrdk9JOW1RSmRqVmdxb3ZWVXRsOVlRNF9pSVIyY05Tc002SnNMdFRHV3g4WDFBYWdIekcyUkhjS1htaWxxS1UzUm9FZi1YVTcwSGtLYXZyZEg4ZmRPeW5rMm9LYWFHRElGOGJyY0ZjcFd1TzR3Z2VzS1ZIZHNmWk1PNFl1R0FQc19PSkw4TnNGcDJYbWk2ZEdUSVZ3WkdhMnFuSUV0TERyWWtDNjBuN3hGY2g0NzdrUTRDd0ZnMkpNb0pqVzd1MXB1Z2V2ODZITno2WmlKckxjNEJGV2FVREdETERLOWtwOGJ4bnlydnBoR3l6Q1l5MG5NN1JKWV9fRDFocHBmRjdteE56RGdTZ0FUcUpKWDZCckp2bk94MlVZS0h5Z1dGdGNQOEpYRXpqajZITmtuZF9mZTc2cWJ1Y3VDYkQ1TEZndHM2OGM5M2o0X0hhYk93SFJoVGVMaUpxMUdQQTJQZTJwZU53clZqRjZFNUFXRWJKc1FKWXdzazVSUC15djItM2VGV0ZrRVd2S19TbTJkSWRGSlNzQlk2NHpjY2QwWkxDcFlCbkFlYjllRFF2T2g5bThTSERZYjVSYjR0U3NWMVdjclE4S3dnd0VTWWphRWxnOWNIcDVYYmNPMVFiYXI2WnJTTzBGbGs1NkRiSk8yMVdHNlByb3dZZ1N3WVc4UG40YnNybm04TkdBWGJJVnhlUDE3MF9vWU5iNEVvcEhWNm8yWXZtVjRZMGt3RFJHVmZ3Y0IxS3YzVDVqckpqT2ZXVHd4Z012MVdlc3lHd3BUNmpUSjZzbmZJQm9nSWpaaHhnNFlfbFE3ajVsUlFMUFk0dVlNcGlvbHpSTlAwM3ZRd05nR0g3TnhBS3I0TXh0NVY5YTNiajM5VTNzczMybGM2MHdZVXZjd1VkdW13bndnOEJPWWZ3ZDlqVEJOdk5hYXRpaFllbTlIV1ZKY1dVZEJodm8zYjV2U3RZVU5ES25XVHlKOHlDRHJ1QVprVHFvRmUtcWpPYU5TWWNndWtVXzFIVmIycHZOeEU1Z0VfSTRTLWFwbjNpazdGTDN1QmlLaXpRMmZlWGg4Q2czUmpLRnRhZlR1SjdDZEpBbkxIZE5IQzVhZG5Md3BOZEEtQnRZbmtXUE1KcnAxWFcxNVg2aWNCdktOZWxBRHJVX1RSVmQ3RTRDdkExVUlTT1NGNnZCbUNWRkNkeTRiUkE4ejVlLXJwSkdLSVgwMW9BXzFBOUtLR2hxOUNzaFVtUV8xYURZZVlMSmNQQmt0ekpGeHR0YzBwQkxWVWNQNTU5Wnd1RlkzSmdjVkhta0pJOWQzQWlleG10d3Q4TnRhMXpOV0xwNWdZVWVCUDZJY0ZjRFlEZk9QRUdOZ19wWFFFX1ZOR3NTVHJVelJ1Sm9IWmZtVW1ZNVhBYzlPVnktaEs0UjVqRkN5dkFfUmF4ZUhXclRZaGIxc1NiZmlNY29BMzgzblNXSE5LN1J3bVRyYmRNR0lNTW84SVlTRjdsdlM0MXZsZUNIeXN1dVQzOXRDYzN2bWxCakx0WDAwV3lzTk9LSkpIcDFZa093RHFzMGcxTWVjbDJUVmwybG5CTENHMGVUUS1Pdm4tYmN2S1NBRVkwNmZTaFBnOElCSlR6UG5qZWNCZVJSaVJJQ1hTRGpsWGxDcXhmTU93R2xnMmVvNHl1U2p2TkdPMXplSDNGcnBlUzI4c3E2QWhnSUtHWWxNVkF0OUpGVE9tbFRTRllYZG5MVnJsYW0tblBKcFpSX1d6V0tOdklJQmxyRFJsQkdVZjNETUlodkViNmNEOUVEbGtnaG5jRFQ5U1lvMmpVdzdzWGdMREJVNHRLTVltaG1zbHZvdll2aWJ2bXZuVDh4RGV2ODZNQmoyaDEwQTdHT2h2NHZqb2k5SlNjdWp2Q0VNcXZncWR2WXNubzZfVjJGdnRnS01zcklMZjdWcWE4X3kxZWlPRGJWQldXd0x1Wm5RR3JWTzRQdTQ0YzRqTFc1ZFEtRzVNdzVJOUxoamxBd0ZIaV9BNGFnUDhucUZheXlNcm9hS1htZERfYjFWa1o1RDdNWXZjTWVGcG9qZzJ6NVZ2c1A1bGNQZXRKQ0tPTnFWTnFKQTF3NW9SYXo1NnE3VHRYRXNDRFhXNG44YnZIRUJQXzZMTFZrTXZJTXZqQTlHVF9EX0Z4Um94c3ltTERqRFFzNkNoLXV1X3A2RzZiR0VId2hJVlEwUU1zZTdvTVYtSWxmVzdRT1pDYnRtUjRFcUtpemVZeG5qZjBWbGl6Z1lqWWdiR0c5aTd4OU5Kb1IyUTM4NElwcUxxUVMzbWIyU0ZTX09fSEo1b0p1VXBLVmczN0dMd0x5QzdiNDRlTmlzcVV4T1k4Z0dxR1pLVTFfNy1idkJiNHdXWUxzUUJKNFpaU19CY2paVmRNSVNybzZEd2tSUmtPLWFCa1dwMk5OU1NYV1B1WkpOWVZFbjJPUVpEeTFpUmlUVDFVVklQeTVrRDg0bUlaRXViSUdnX1lsZDhjMXV6MG1HbDFxa0phXzNnM2g1WlRydXRmOVRZdTZyQlROY3pfM1IxOEp1cXRwZkRBN0hyU0pCM1QyQ1laVkgwZW51Y0l2eUc0NkxCY3NDOWZicDYtZFJLenktVTNnWWhiLURrNkZ0ZHJUM1cyaFdQRkRWbENreDZOeXdhcFQ5WWkyZ2d4ZlB3X1ktOU1aNUJ2STYyek5sRVA5NUlmaU4yS3VMaUVDMkJqenYwS041YkZDVVBTdWRqSWR5aWpVQmFLc3RGb2ZLWnNrSFA1U3Q5UHBucnZNUi1nZDN2anBBRFh1SHU1N3h2WDROLVBfaE9UNXBIRkQ4NVBZeVFlXzM2cTRBaVJFOHpaSzdoRDNVdGtBbTNDR0N3aGpmTEplTGRiUllpN3haQ1loWkZfdmhVRmVFaU9NM0xoUlAwN3hpSmlOVEhKbXBINzVnSDUwLU9hbkNVSHlTdlprNFAwSHRfYTJ2aWdkNm5TaFB6VDhUU3F1M2RXaFV0d2FJTC1oVmhQYi1rZVpHa1g2VmlsNlZyamtfdnRnNUhDT2ZqdVRKbUNHYlFhZGluMHdDWm5aVEZuTlBnSmNZYWY0LXZKMUwzSlkxMllFd0dOLXlOb1JkVm5od09YTmxyNlk3M1RpekRQc0xmMWs3LS14eHZjWThkbUhyZUd3YmV4bnUtTU1ISndNdVRpZFZ5MG44b3A0akpNUnlZOV9wMUxkZFNRLVJPSzBtc1lidHhJLWhSYklGLWdEbHhHTHltX0dadW9MS0RtQTJRZ3pzUWhoUHExbGVjVEplcFFVZGhVNWo0eXl5MXlNd19TbkZkem1KbjdnRF95S2Jrd1lTX2VFSk9CQm1UTlJsSTNnUHZkS3NuejFiTTZGQlU1aDFYcFotMnhmYUplaVBQTXE0V3duZ2xCM05HNlItNk9kcGtCeW9QUzJsTS1xb1paQm15cjhCX3dRSGVGcFM4bENmR0tIeTZ6LXZOejhTSk13SGg2c2RPbTRhamQ2ZmJ3Mk5KTkJCdTc4WTQ0XzdNNjcxT2lQOTVzMFlBck1DYjJfZkVWaXAyZUhlMklUQzBhWlFXbExmbzdsTHpPd2pJSENNU0VlZV9zY04yVndnWFpQN3RMS3ZuZWE4Z3c1Z0pYaWhqcHRGOUw2NUt2V3Y4THI4NHBoZFg3TGdRN3ROQVI1SHhLSEhaOEVQbzJQX0lvRHZwZkZ3RTk5c0dlV0JuZmxYdk5zSU5tcnplZHM2VTR2UVNOeUVWX0lBejVDTXptUEUzbHBVLUs5UG9KMmlNUVBYYUszUVA5NmR1TGc3Z2M4ZmxCd3lzYWhnTHY4M1VKVjVqZ0lJNjBUbW1SN3VCOERFM1JvS3NJVW9EczZIWTFPV1hVanU2c2Q3QlhJQkZDeDJiWWc5OFNtZ2hqd0tWWktzWE10T2NMcXliMWpoYWRYTC1OUTVpLUFJdHJEa0Q1S083Vm1fZWNpN1hvcmlDTUNaSFFaaU9uVXJ3QktTdkt6dkpiaHRHc1RSV01WRWg2aEw3eHpVOGtvLUs4SmtvUnBxNXFJaDNwWndNUGdNTnBnQTA2TnhGazhybXhrT2pvLVR1YV81VThxaHRDNUtlcDdhdVFVelVVOUlwaldPTS1IZGJPaTJOcXlWSHhjSjhLeFprLXd1eTl5SkJwUUJybkxXMlJJZUk3aDdWYW1IbGhDVDM3UVRmMUtrTFFYS0lVQUVMRHFHSXFiSzNWbk5scXNySkVILVgwM0hvZWtaS1FMV21ra1RsbU5lTzNFTG1acHZvNEFmT0hCOEJjZS0xNm85RW9GQ1hsMENJUTJLRDh6T0YtdVJIQlRmR1hBYTRJTGRhX2lKdzlFY01yRm5Bb2VJNzVGUEt4eVRYRVdROEVOaUdWVHBUam1jV2dCaHBJV09NQXZ3YzZnaGtaSlZvWXZnXzk4TTgzSHIxZXotaS1rY3hDWGV3RWxSU3pUajBzQ09uV0dHSGo2S3psS3ExZmFZYUFoZFJjaFdON1ltTTRsLWszZGllaFRYQkJXbjdjVmFCb29lb09YNWU2dFk3Ul9zNnFZQUZ1eUpPeHRTQUhhYU51QTZvZ0FKeUhUcHd4akd0Z21kU2lfNWdJeHNkYmNqTkxZa1VEcC0zYWpRajRLa3lvTTdDbV9yemJ6TmZDeGdVaVdsS0xrQlFUZVhNa3NsZUx1Rl9sWGIwLTBWR2VGMUE3RkhTV0Nzc3Z5c1JWZDhqNFpGUUZkdjBOc2dvR1prYlNCb29NOUtWNlBCcFBQa01sOXpQbnZ6X0JNMVFnQTFITjQ0NmQzLXdrZVliVnFtNlVVRXByZlZuaHVnaFFXX0dEV1AwYW9yMHk3Q3FkZkxrbk5kU1pqNzZqNHAzNG1HWS1SczlhZDk4dVNOZkJ0YnB0WWtkZTQzZlJKOWd3Nkt2QzRUa05ua1NKT3FQai1CQmplTmFHTTZKaEkxeE9sdVZ1M29FMzZzM0JDdXRmYl96UjhYRHlVODgwNmxRdTgzWDVoQU1qLU1vMlVoNW82TnI3YUlhLXhselBsV2FWV3RlZWw1c2ROZkl3cGVHUzVOWVA1TEQ5dFRzT2V0eG4xTm5YcXF3dEpkWGNfYVEtanZyZ01feUpiMElJc2lkcmJ0WmVxbjVoZGZNQTFETkFpUVplZG44OENlV2w4Y05ZQ2JVTHowTHNVMDJxaDEycXlHWnlNVXRkWkw5b2JmQXJOWEFvNE9YMmRlUUhnZ3BXaldxamJZMTVQVm9RandWN0U0bk9iUkk1WkFHczg3QWRDRmxodDJpU2cyY2JYT2ROR1JHVW9VSVZSS1VrOE5yQVlMVTdSRkZ4aGFyNjBSUWVnWHcxWm4tS1FTdW9wR0xZVXczRlQ3cmRhLU0wdnAwN2V0dUp5dTJhNE5RUmtDNGJlaHRxeURnT0JOWTRuTFNlcHBTZzVpdXpBdmFoZG03TzhKSnRtTjhvV3p4RFRYM0ZNVngxNVdEXzYxQ19mN04tUzJDTXg4aDNwOGtxZHZLa1R1SWdMbTFyRlMtYTdwTU1BZnQ4VWw4eG5YSmZFaTU5Nno4NzkxYl9Cd1JjeTZlNDZBX3lyOF9lSXBtcU5CWTZDU1duZFdPUEthaEFfRnpOQ1dNWFBwU0hXZXByMV9rdXEzTVdhOW55bm05dnFpUGhqUDhWUk1rbW9ueU9CTmNkU0tHMDZHbGxVVzg2UEZiSGM2NzBTWTg4OHllVnJsWlRXWXVGRjFvLVU2VnFLVU1NUnNVUENXYk01MVJaaVVYR2xfazhKc1hCN1VrZ3MzRFN2YldBNGs3TlBXQy1iVTFObWpKSERtZnJIMWstUFlzYXhsa0R3bEFhSWNESk9GRkdqSnVlSUFKZGhyUXBLZE8zM1NmVnBzTzhTaFlEOG9JbEZpcjlXZGNWWTVSenZSR0Y5SkwzcDcyaTNId1Ytc0laUE9rZWFHR1FpXzRYb1BXNTFkakJ2V3FqZFl3aW16ak9XSEh1SE1nY2lNOTRKSWRLeHFBbjIwd0U2RHZHU3FJaEE2dXBUSFQ3NzItV2lXQnNCM0pMWHZfSUxUQk93S3JZa3RRajFRbG5BT0tlUjhIcW85RVpQSGJwOEpHYjh5NEtieHFfdzRIUWRYU3RPQ3Z2VG9RZWQ3alBIbzlRc3dac3k2N0YxTDBzNE9SWl9DWFh5SWxKVVNuZFdQN0V3eDhJTjdCY2FQdmY5RVZsR25Jc3ZoZkN5MTRCVlhsY0dWeTNCLXFiNmM3SDdEUmpuWVRFM19SNFprWmJpcFRnWEJIQzhzeWVfLTVkcm5pNngtczdxMWk2SFhkaGhZdmhfdmQ0VkFzdGNyQzBaS3Z1QjJPWHRia3c1QjZleTNGNGJxSU5BNTdZY3gzU3hlLXBLNXo1V2VJVUxsRk5FdWhIcnVZY2lEM3B1WkNYeWRXeGxCMXVfN28yUVZRdUNCa1Z2LU1ZdDNDNzB6STFvYXk2cTVoNnpDZHA2RXBKNUNkUHcwNUJJaU1zZjlQVGVSSGJsZmFRd0taTWhGT2xNQVZmaGgwRnpLVzBGSFVCaTlfUU53QV9UdXhjUEF3bENFdWo2YzJ3aGdVQnlmcUFaaDFHT0xLcXRTSHhIdS00dFluajFVTmJnanlLbWhORHlycmZTbm5pVGVzMmNuVGhYX1NTWU04dWZHcVRKYzVKN2Y3NHVOdEdkWjR1NGlnX1hLamdWanc1NGRqY2c1cGROZkFDRll3SFJpY0lqbTZQblQ4UXZtN1hidkxVa2NBdHRjTG50NXllVUFLVks3X0FpX250VWZxekVWdGpqZUNXZmxIeDQwNTg4Vmk2QlV2RjhuNEkxYmJ6eE0zTnh4V3JMOFcxWWRnajZNT2VzRmpXcTllY3pSTnBNcGpDRzVKYkdkYml6WFA1OVh3SnBsOVZTNUFrcEpVUFVOcUdFaXBJSTFXLVA3aXByV0tINk8zV3FMdlJYSUdxamZGZXZvczEzZGprTEwtOGpNNFVCSjdnWGcwcUZGYlR1QlJPOENSdXFpMlRRa2FyaW5qQlQ5ZWRVcVNPMWlDUFprU2gtM2FvMXZDUklXY2hZeEJmVDc4SU5xOHdVR3FHbndxQTc3eGFCai1vaDNMMTZRQzhNY3pISDJhUXhmTGM4SGFMRU54cFFQTDN3ZmhBWktSYUozY0luWG5HSTMwUDU4Z2NjVkVpdWxUdEN5dzM4clVmVzc5VnlEOExZd3dJS0hLU3plSVc2TEdjUS1nYVF3TVZRa3ZONUJNeU9BT1Q4RVdwQUo1V25neTd0OHgwUDc4Sk1DMnQ0UUdndTRiWDAyanU5enNFaTRsNVVwRlhWbkdFNWYyQWlPS2ZhbURJcUF0dlpFcmpNMjRxb1k5QXNySEFGYko4cWpZeFlEWFNXdXA5dlNZYi1VLTNuV0NGZXRFUWk4Y2xkQzVqSVpEWmk0U3JNMkZIXzNSRU0zMWEwckdFUlRlOC1nQkszVkdzOFZfa0lfSjZiWFpjVWQzSVF6Mkh1WWphSG9TcXJWSm5rQWE4d3FqeDhJWkVkUEFqcWJRWVNHc2g5QVZ2MDdwUnhPd0FISWUzN1dzU1FlR2N3VG40YXFIcVQxZUljSEJMQXJqLTk5RDdwSkRFR0N1N2Rtc0ZPLUJPTFNZYnQydVdmU2tQdWZOc1F0OGRyQnBSd3Y4YjdBblctd2tfZFl6OXFRUnJCTy1aMzNwNlJONFJVaDQtQVg5Nm9ZVWdtZ0dWVm84OWNNS090VGd4SzBwZlNDdEpkWjdTQU0zY3RuWDh3Y0cwSkJBWmV4T2JIbjFYVW90QTNfbjhzQ3VBaUJZZEYyM3dIRlM2QU41d2NxcExkQkNrNElXTnZYTWdKRHNYNll1M0xQOWg4RjYxY0RhRHZJUEJQb2ZFLVE3UjJzVGZ3QnlOYUFsdlU0Z3V0eGt6WUFLQVQ0c3NHUnVaMVpkNkRQeHMzc0JMcGYyZTZ1ZThJNjRtYTdHaGpsU2d2b2tZSzRQSFFHSl9jY0lTVXIxc0Q1N2UwZHJpYTkwc0pqd0JEdkp0QlBXN3JyWG5GYThUVWRhempzdURGUElTUy1hQ0lCdWdMZ3NxSE16TEU5MDkwSVFmWWVDNDY5eng0c0d1LUx1TUhBbW0xNjVWeW5mZHNqYjk5WkRmVFVtcUpRYkFCV2hLYWhFU2RVZTBwQ0FFZXpOTEtxcGFaMFZZUXh3MUJrRzgtY2ZLQU5GNTRvUTROMUtlXzZpeW9pS0tWQ2dvaW5fZzJIUVc2UHRhTWVLMG51clpUbUxqZTZXeGwzZFFnMXdES0xaamhtMWVOTC04dXhtMGI1MFNUVXFvV0RMdUUxaDhfTHVyaGt2d1FqRGEtOHJLcUczZzZ2Um5ZSUY1TlR4MENsd3RTeHkwQnR0VnlCX3ZLbFhCTGtWVEJCVVk4Y1hEc0ctNGNjbmdNVlpaMm1IdFpzUjA0YXk5d1FORV8tWWctdUFzMDllX1VLQ01sVVZKaXBfN09hN1hsUjVTR0hyS3BrNjlpNnFpZG91S0RxaXY4dDBfdlFDRkFUWGNNdFVackZ5MV8xamFiWGZfN2JFMU1xNVlaaHdjLU5pRzhvQzl1aThjOHNuM0FQeVVmdDhLUlFHYVFWeXJQcWl2NmlQSmdMdHFKSjEzbEFqTlZ6M3RNMExfemhUbWJzU0lwRzg2VEcyMUN0RC1GbnNaZ0ZmN3dPWDVmRU9YTzFCaHBneU96SDlCOVBpeTlpdEpSWHNZNnFjZWlIMzU4b3d2dzZqMEpDbnQ0aS1TclJ6MnNLOWlkUGFmMjRuUXVZdkwxM1lRR25KWV93YjhhY05Kd0R4R19XS1AwWWl2RHd3UVRYV2RjTThpM0lKSzdESzd2X05MNFVEdDNneDdnMWQyNTdkdFlyYWlRQlRDQWQyU1JoeHo5UlByQlR0MEtzU3NtVXVmMVdFN1ZvMTAtWWZ0YVo5NWxrbkFEZGk4TW15d3dlMVZIeUVxbDNJdXhURGV6cEtvWjlrLWRrcEJqX2h0WmhRQ2JYSmE1WmJsOTcwSDVLSi1MajdSeE9FTnBPenBBRks2dUw2VktBY093Mk5GQzY0czIyUW8wU0E4VlRNS1dCYWpCVFFIYUJ2ZUxmQlE5M0cxZFpYcVlxSjgwaHExZVVCX2h2X0NHSlJHeDJRcUNndjROTlJCSFI3SU5wRUU2aWJtaEptYWpXMkw0VTVtSFVFTzFnbVpUMGtUOVRlSzQ2MzJzdXI4THYzenZ0d3lJT0Zlcnljbl9veGg4M2UxSkZFZGJ4MGR3SEo0UHpETjl4RTlyNzkweTZCc3RzN3Mybzh3UDU0VGlhNnp5eW54Yl91S0JER19MSmEycE5MQmpobmNtVjFuQXVfRkg5QVduTnB4U1NXOFhQU2RNT3FnY3BHM2dmRWJ3dzdveTQ3R1puWGx6S0ZlaVFqb3ZTVXN6QU9Mc0lDVGpZVGdRZmVKRWp2WDJnanpMcXMyeF9uQ1pRMDhDOGdKMkFMTU5zaThSUFpnTXZHMjN4SFV5a3VOclNhdGU1MmtxVXVNVnpLNllUbE0zbTRKeUtkbm9VTHZIQ0ZocHgzNldOR2NtMVpDNmlMX2lQbmdIX3N4aG1EVEswVXFGMS1tbGpTMXVXM2pkekx5LTQyLXZHbDI4dFFnOFFmOWlYblIyQjJSUlFpTE5rajdwNnhtOU8ycFdHSUVHa0xjbFFHMjFGTTRMWDJ3UnB0NTZ2YlZBSTZPUlYwM09mdFZVM1I5X01qYzRtS01vR0RIdjJZc2lxNUMzMnVfeGFId01uQ0xHOXNCYjVCaFpnWTJvc29XaHBkWHhLNmh6TjMzdmRzcDF3Q0FZYVFXcVZLNS15X0RxVlBuYWFxd1BkVk1qTFlQYmxVRkQ1dTRkZ05WUjJPb1BVeEN2UVZOM3l3NHE5aXlUQ1N3SjMwd2pocVZpM2xQYjVJWFpsdnZFcktlblZuM1cyNmUta1VOQnZmRF94VnFRVGtpY2RNSWIydkk1NDhPR1BUR0xFMXFxMlR1a2tCenBIQS1MWmcxQ3RjWWR4N28zR0JMVV8yLTc5TzdHN041QmRXQ1g0Wll3b2R6cDBlZXJ3eXFXVGJ2RkJsZEQzQUZxcV9LNVlRQVZBQTk1MWNOLXpEVUViSmNIWWx4QnVlMEowMHFSZU14NDB6MlpnWEFHUVNxREtLTUNJRS1GWXlqbm5pMDZHdkt4cERGVE1aQzhCTGFfd0pMTzIwcnNpbzktN0Jjc3VGeHhvTTg3QWJUdzlRajdnekUtaE4zWlpidkpldUpXR1drU0t2RXlnTVhIckswaVNmREJ0MkQzd25mUTVWSGNSMVFBMGI0UXl5STFoOGpoLWpPZFNxNnhoWGppSVFwZmI2Nm9kMHBrVFpRZkxkVmtsTjMxODJya2dlT0VGQjNGVnAtbjRLVjBQaXRDMTRkZTFfdFI5ckNfb2pSamdMdktqZkNNcEVJOUEzRVVKVU9lVXZUUmZNdmg0LUNPdVh2MGk5aEp3RzBydGlDZ19WZWQ2S0kycnpWckxVZVlaa2MxMEN3ZzJISVhBdzVfZ09pMzRqcDdKN2dxTDJvelk4Rm9KMEpwZDNkQ2d1bkxaWlBiUXdfdDlUUjRaZ2x3VE4za25GN2E1U0hldHBSNkhyQ3BFaG8yeHRXeHRkUFVTU1QybE8yMnpTS1pUUk1uenoxejZtaTNNYV95TlNya3UtTlQ4eFF3cU1Nd09MRE5aZndZcUtXRWJvQW5fT0JEUHNxVUtxNTdZUlFKeW92TnlFaTQwbGJibzdRSk1tMkR6Z25xN0Q5R04xakZvRnE5Q3p5bkVGblUzMXBpMm1jTnJkajdOT0NfdW4xeTk2LXZDX1lEUm5PblpqaWo1NTN3WV9KSjRraUYwMDNHVi10emdEaEpoUWVYZHhSNGRabnVnazg2QTZqQ3E0ODlHYzl1TnRnY29fOHN5VGlzSFlydjBNM0dETDNsZVY3R2hqNkdMeWdiZ0xKc2JFc1hzV0ZoMzlaRmNtcGplRGRaMkFPY1R6Z29RdVVMNDFhYnF5VVpONzJsTXNvTG91bmd5U1QwMnJaZWlRMHRoVVNwdjVfMFlXRjBCOHMwU0NEQ0FFZ3pqVTFuSjVZM2M5S19FSzBRcUFORkN5Nzl4YVRHblVvdEsyQnFMVVZhaDZxVWJPMmdpT2RncFFQR2RlZFdBXzVnNnBQMlhOQkVOVTJ6TXJCV1MtWEptWFgtNmo1Nmh6TUhGQnVPZkdTazRIZmNPWjBtMXg5MFF5X1FnTEVTVk1PZHg2LUh3UEdtUkhEekgwVnRqVDh4RG0yLUV6OHdkazI0cU9kWUdQM2JkaWJobHRTTkFCSXRNd3BfeGZDWk9Ib2UxSWliYzhicEpCNkRPU3ZYTzV3SGZudUhtekc3Q0IyWVU2RWsxaW9OQ2t6a2ktNGVSR0ZlY3Y5RXBjTFg3bGNiVkRpMlZoU3JPazBEV1JDWXVKX0h1cHFWRXNnMXNsX0NVZDZialJqYTVTRFJEb3pYcVdJejhDbzZWZTMtNEs3algxY2xZTzR6dnVIaUFCUnhtMEFtd1BPUmttNUZmTEhuQmZMZEp2M28yd04zc2RPMEIwcE54Z3hhWEhFRzhvRmd3aGU0c0JsWXVuenM2bi1zVnVFRHZnZGdxMElSeXFCZDNVQTFpOEViN2VPUEJuV0g5bGo4aDFzOUdyTTgxbnBJTjFJU1hkUTVIckI5ckJleW5wbTE2dGhUVldaamwxd2JhLXBHR3N5bG5SS2FuVUJ0VVMwVUJYWE4yM2s5V3RIQUZ4bEFtaXR0Z1UyYk9EaXAzNFUxeVpEajJFWXpQZlZPOW85cVlIZU9vUHlwSFl2Uk1vNm1pOVdIV013blloak5KUjJxeE9XNXYzVThTM016cS1femRnMWJJSk1hVEFDdVhiZVBlWDRwdVlUZ3FsV3NPVXZ2VjIzRVNKSDluWERsOWlvQzVZN3o5Q3Z5QTY1VWg4bThNNldJVnU4ajhtamVnYkZwWDBEYS1tbWZMLXUzSkdhQm13NU04VGpRdzRTUENVMTRXUDU4LS1UVjM4QXNrN2NRRnl3QmIwdFdfSThVSGtsbWFfb3QydDcxNGE1NjYxUjVxNko5alpnNGxZMm1nOTV6SEV5VEpqZjJDSVBzXzdrVjR5aGR6eVpTbWFPdTZCWUJZMGlCOVhIbUFRSzljalNOMktHMkVEcFZfUWFsY3AxRmNfQkVvdHJpY01ZbTlnTU9KUFVUQ2ZxeHZMU05ZNWlLaWx6TnhLSkQwRlVIcnpWQTFqbWdEWDk2ZmhCakhadTVJX3JjMm96dzNISXNnSE1IdE9yOXBhRGlGT2NiN1JLNkN6TkVNS0dqSnhtSU9hWkRjd0xYbkFXZjR5dUZsQmtxM1RHdkU1TGhmbVMyN0gwTXZHV08tSWFBVFRoX1M2enhOb2pMeC1mdDlIMUctVGRfM3BycXU5aFZaN1lTV3NhZUROQ0lQMkJzYXU0aE5Vb0RVdDI2bUg1TEZDc1lXUkhZcnREUk1ydS1SZXIxNUtHcElibkVwc3dEcTdjcThtQl93NERfOE9McmZ2dnMyaGEwOEZGVW1FbE9RN0FCcy05SHNpeVZpN3FmTzROcGp2em1uMWNHWmo0UnhHZTZtNkxOXzNjMHN5eG5jOEViVWJaMmgyeTVSRkhCVmM2ekhmYlctOE1JUlNGWkJJWVVqUU1YS3hRWnZxbTUwaC05cEkydlhlQ2ZKWXhsQk5Wbm0wcTRKVFdzY1lMSy1ELTNDa0NOWFdkQTlHbmJ3dm1fb2J6U3pKQUZOLWczR2VlX21DY2NoX1ppdDNBQ0lxenFYQTV1OHZRNWFkbVlRRExJNkNfYjRJVXpGUWhPLUZrZ0tERWJmcVRtb2M2YnJ0UHlCSi1QV0xwSXZpb2NTYnNXdFgzNmQydkdiLUhVYTJyc3hjWHk3RmY0WnY2MTlTNjFoSWFzc2FlblZ3VW1WTWRCSF9VU05LTVkxLVdneUhncXpRNFhEMzVlRThhVGQtS1J5aHlmZW1lRVNPNmJENk9BSzFxWDBoQkd4ckU4ZGMzSnpNSXdTaURGZVduVU5TbXQwOWRKVzVlbm1nU1lPWjh0TXE2U0c2VE5vMjJ0UmNpNXBUZHZoX0FIOGlBczgzT2JENGNTSGhWcElyNGgtQzd3Z19GLUNZdk1Dd1JiVE81WUlOcmtmbHJEQ2NrNHljUTlhSXZNMVNKVHdSNjVMWjVLUmFXYTliN0lQRFdib2trcnNTUHJXSmlGRV9VcTFqSlpwaWRPdWsta0wxMkNJd19LOVpvZzBYVWR0Vy00TDNSTjR2OGZpempRMnBHUEFtRkxENThvQjlUUXZFVXdqVS1WaEstWkljc3NldTlJNmdCSTNxcGVTU2xBQWpqRTlIZ3lFZjhGYV83MHFRLWxGWkRzRmVpZmZPYzdzMUl2T2htbXotcjFGZHlsdFFoT2xLX2hkV0ZtenVBTlV6OEFpTnJIS1hYZlBBbUFUcXZuV0Q3bXphYzZ3OXJpb2pfNGRfbk81NVBYcDVnV20zX3cxd01MekR6YzFDbVRMRE1ZUC1STDluNnFoMUlnMmZzcXotVEZyVDJEWEhRQnN1WllqaVhKZGl6VFRzdTZnWmVFbDdMVC1wNWJSaDZ2QVF0Z3FmWW90Y0k0MnlTWGNsOEJmbFJXdFpEbGZyODZZc3JFSU1DUzZETW42a2lhZWtGd2d2eXlxUEVCdlR5UjRIbWFLdEx0WW5yZ3F1NGR0V0ZaX3hZMDFEa0RQN2xFOExjUHd5akd0bjVVYzJDYm55bWFMbjF3UnpPRHQtQmRoLUhMdXZfRnNHOHY4cEtHWmtGejF2ZXBqZ0htZ1UwRTNMZEJ2X19UUkZBclNmZzZCdTF6T3JJVjc4QWtOQXdfYzVpS1hBajNSSFlQRWxvN25CSnE0TktWb2U1bEpYNVBxRm4yUGZLLUNXWmhQdTc3WWNueFJmeXJORUlucWtNSnhMQW54MVhYVzQ5d1pHWkpiUlVndDlHVnlKUGtxX3llRFlkS1ZZWk1ldGVYSGs4dF93S2x4cEJZcG9UZWZDZEc4NUNaMXdGM3E5a3NVeUIwQURpQzBrMTNjMWhJNzJVVk4wUTNVbHdXeVhrX25JXzVOS2xPMWlVa3paT29KN2MzcktSaUdXRkhpVUxnckRteHJ2MUxUMjF5bGcyMjZvbXpTZ0ZqZXRpeHo5M0dxX3RONzBiNmtBeTVmQ1Vldll6RUlOUWhGR1JxVEF6aXQzR0xyZWUyTkZGZll2ZnhZaDVqdXVWQ0JwM0N4UmJnQXJmWTVjU0dfSHRzVmx5TWRMeFhvUEliSVl0Ym1RWXp4UmJxVHBXOTBEaDd4VF9zdlYtNEhSVUN1OWRMYkVpSmx4SDVFMEtTZHQ5WWp2ZV9FRlVhUWxUX2ZPbVJVS3ptME9uU3hraTlrSFFSOEZuNGl3NnhjZWFETnhCMXFhbEFSQUhZeEZKUFoxWUY4UTc1V1Rkd1BmVjU1b2dKNjVYZk1PLUpLMWFpbFVYQ2VJSDQweXdMNnV5TGh1bFVNZjFTQUxFdEMwQkp0OXdOdUN0RHI2MksxcksxckhXdmRaRUlfYW92Qk43czQzSFBzMmNSRDltdjFSYktGR0tfX2dsbFpVN1RrcHNZaGd4bGh1ZDZuV3NkcnczcGd1RW5TaFhybG9VSTNxNmVxUGp2c2U3MG5XbW10ZzdHc0JhTEQ5cUR3Ukc5NGpIdjB6RE1YTHNSeG5RMGVkM24tcWY0YllZLXRrbUJpQ0F4XzF6ZDkxT2pWSC1lWEp1ZmdjS1Q4WlF3NVN0SU82VjdwRGd0YlRIRjRzbE1WVDVDSlNWUk5XYzdKZGhyZjNKMHNDcGEwWmpQWHJPTGRPREFleC14bVVSZGtLVnV3ZTNOSk5mSGtuTi1pU0NYSkU1alZCRlozYzhUOUdRZ180MXRMaVh5WEI0RDlPZ0pPcmFQaXJVdlplTVIwUU1YVEpaNW5YdW9KS3dDZnBGdjY0dThqZGV6VmxfUTB4d2FWRnlFamNtY1JjZG9lTHgwcXhlblFBVEtqLWhTWUF5ZHhQY3RVdTRCQUR6OEJBSmlCYVEtZlN1ZFdfeXpGV2ZmT2RGTTVYc1V2MWF5RnlUdmp6RFM2em1fRTRtQmxpamgxSzB0cHp1Mm9EU2JROU5KUkRWYmxFNVlFbE1HVE0tRzl3SzRTOEh5bFB5ejdQNWk5VXh3T3R1R0gzRkpkOWs4OXktSHU3WS0zTVVwMlZoY1A0UjZyTHg3dUtnQmNCdDZDcGZvYTA0dFBzOW0zZUF3ZFlwUEowZVgyaVM0X0FFdEFBTlpsM09RbUJ6RDY3NDRfSlNiZUdLZ3VCeVBJOGtTX2pEQW1RY3Y1QkI0S3hKdnJ5RVNQMlZ6dVdsZ1U0cWZKTGpMa0ltS2IyVGxqUUY0alFYemZ6ZUVsQXlsU0txbEs1Z0ZYNzZPZHowZkxqYWFhbk8wWWFFN2JmdXBoN25BWFJFdG1SY3VvVFcwLVhxRTZ2NDFzR3UtQUJBN0M2bUNJaV9QVXZNZ3ZQa2pBaXZ0cExsY2diYkx1eW5sZzBhYlpwbjhQWndkbTlMUjRjckRITTlKQ1JDMFNpT1BYMHpCNFZ2cC1ZcEtoSGJRSmg5czMzQ001VVFPLUhxbjhCNzFhQk1TZzBqM0Z4RUxaTW1yQXFiX0I2V2xlaU1RSHlvWlFDak5rREJ1Ui1zZExIVS1xdHZBS3h5NFFIM0Z2UHFZM29RWndvSzJ6cjhkNmtWNlc4TkI2eTRHQnpFX2ZZY1p6NDdncTlBTTl3d0JJUWxibl9JV1JObEwtbWtON1NJM000TUtDQmJfTkdQV2YzckZBOEtGaDhIMl9WeXdwY2p2YUd4eWxZR0lLM0tzMExJRVdQUjJCSS1qbWVhbGRUQlczc2RJblpob29RbTFmYnBUZ1h6c0NDeWNnbUZvTXRLX3YzWHJleVBCY1lKc3BIVUNmTjAzYnVrbEkyM1JUQ0lnTmxhZ1V4cFZDYjJmY0Yya1lqWTE1X1dWVDg5NndxVXVpUlpzczBsOUJkUXhVcURVMjF3ZHVGR2JVdWNBaWpISHJsX1UzMVpVZ1FOY1VTUWVCU3pYUzMxNGcyb3M2SFNKZTA0QUNWdkk2eVhWRXJod2xGdlkwWlJENDNDUlE4Wi1hNmQwdXJEbll4VU8wcmNtRXBmaHU4TXNvNVZWT24wb3JJMl9qYjl0a245UTc4QzFVaU1oUzhVSmdTcHRwbmxTaFRzaVo3SVNqWUtuQlowaHRYcGVDMUcxSkRWMkt0MW4xRVBqckhyMmhKcC1WYkU4b3RzR0kzd29jN3hWejV6N2dhakZfdjRnN0lIcm0tcEJ6a01JMnI4aGI4Q21yN3h4WG1tczh1R2J2MUVYM2pCQUU0MWJOSndIQm9seEFJdWEwbGhabVV0UGlkZU1UUkdGY1k4dlFVLU9VM2dlbTJ5ZXV1ZzhUUF8xcVo4TE9UWDhuZnJtSld1T0taenM4YXY4OW1JSjRjLTVuSl9TVUVrdWpLRTA2Z0JacWdTNFFvWEtNQUdHTHRLdEtGWnVMWXpIcHdwRkxMQ1FpMi1CRTJfaTdET3AxMG96Y0lEZDBDc2xPRmhaWWpHcGZ6OTh3NmpoY1NQdk9uaEtoYWFhLXYtcUhMUmhTZFk4MEdmbS1FVVYzYUg4RUlNUHE0VkxRaE84QU1fQnE4eDJKdHEwVVE0QXR3WHExNDZpVktmUXRRVVBuNHVyeEVfVXlBQWFZMm1aaVVwc3NzdlU1blJWRzZiWUVTZGZsQ1JEakV3RzY4eW0wY1hudUlSTDI5Vkx2Wmc2cl9pQnEtZEVKekVlNFVub081ZkxwSUQtRF9zcjdfQ3Q1QWY5bVA1bE9LN1dUa3BkQkxtNEpQNV9jMFZMQTg1aHI1aTlvZW90MlJINDlFME5pNUg5dmRBSWoxd2RCSU41NXFtbF9nQ1dnYjZnOGNHZTJWTHVrSEJ0dHJYNlZ5aVVQRW1lRDh5NXZCb1NydngtT2Zoel8yQmFrY2FQMHI5d0o0dXlvRzd2UjdvVV8wN29ESFJ3Y0ZzUFZDQ0pjb0l6MVdRc2xxWm12aE1ITnBlQjh4V1RQUEYxWXFkSHV4b1B1WkxfRHhmaUtZMjNJbzkxcnphcTFkTTFONlYyd0g2dEJCaW0wc21LMFJHR2VYdXNGNndvakJTd2dKYWUxcDBLb2xvLWJ6bW5aZ2RQR0xtU1l1M1VsRDZyLTN5RDR1Y3lTbHdOWng4djdTcTNVWndzaWFmZTlXZmNObFBRSFpOUjlCaU9ZYlpwOWVnNTN5bnc3QnNaZjJJc1BlbmdyUXU1SUhFOVFBdXRodHFXWWV2ZmxiMVBEd2o5TE9CUGs0aHVvekhtWHlldUlfZmVaVGpEQWJvZ2RXeFZSWUVKbEVLcjBNU290aGo3VHViVVRYUll0QzhOU2dhMFI4aWNrX2FKSnQ5MzB3QkUtczlGXzllWWo2Tm1fNGh4bzJrZTRHYmNwMUhERHhtd0N0bGZHWERpam0zTEVBVFhuTUxnOVIxRThmTEtQT1dFUy1aMEFnNXZHdk9MYmoyV0l5S3dGX25HRV9FdzVmYXNnZks0cFkteXZRRnp0NFhyeHpBYnBaRFRrT2tVbkw2ZEhNVW5tTE1SQjE1S29iMnlXT2M2bmtHSGhIcXBzQzM4R2J0b05qblU4SW5jWWh3SVM0c2dHVkpBcy1FQTBGUGpuNmtncng4aVBtNXRUWlY3MklUZW5mUXE3cThDMWxaTFRMUTNyXy1ndjJCdlREcUdOMGY1bW1PSXJxTzl2dUsxdi1FX0NXakJMaGl2a0Z3Y013TDV4VVR5ZFJzM09QOU1ON1RJYWU4RFZ3ZDRONHBwRWJMQ3FNaERubnRUYkJlSm4wTGRjSVhTQWtOd3NXeXZXR0FMd29XX2JTMHFsdVU5TWRSdkUyX3d2OWVzU3VJbVp1aGJ0anl4NVJYLTRfbjhwSUZ6dFF0S1JpNW10VUdWYTdLUVk3YWlmcnNzamVEdnNGb3IwUDhNaWVHU0J4X1hCSy1QMDFuTU9pZkt0NDBEekQ5TEFxNWFncFk4TmxfM0xHQTFXN0hOZk9OTmtOVjAwRVB0NmpaSVdHcTFXaUo2bG4tLW5HV1pCSnNXaHJPeXFablk4Q1Nubm1vaGo1ejRVSFlteVlrbGEyS3dURGJkSXZNLWh2c0V5QzJQS0FFSGMzcHF4YUpSZjNrck9rSlRWNE1VTFV1SHdaVlVIeGphVUV3QmtnT2pMWElOU3owNFpmcWZBMjRvVVkyUlZwc2dvQ0NTQ3BOaFRkQnZxM2p2M1p6czlvLVdYQldKaWFpdWVOUy1aeEpnbjdPbDlRWkxfLTFtLXZKeEwxV2luclpQMXVadl92N20tSVQyV0J6eE1HT1kzcnFxc3BPQk9jZklBRW5zMGp6WEhFNm53VndNVUd3eHhPTmxaVFh1anV3UDF6UHpsa1I5SHM2YlNmZUtvUFNTR0RfZ0lkaVNDalI3WWVwQlhkb1I3c21aNXFBMlpjcU1rdHVJYWlRRjltaHVFZlc3d3BaRHA4cFpLMDFZVzVQR1VtUUJTbF95c2dzaGExSFVZV3B4VktISHpwMWg1a3RmYjNDMEw3Q3RGWjJCODNZVGdLYUFnWFY4bVhOYU4wQWZNdlYxdEFXNkY1NmQ4RHh3empaODhubUtrOXFwRmNlWk02dzVGR2toSndSc2xkb2tkV3VYME5RNmN1aEllQ3dYaVM1MU05VTJIR1JQLUtSSGlPb1prQk1MbmlBZ0VlNzVhZXFNTFhna25UUTRLRXFFUEYxc21oWEZtbGIzRHBfTTRlc2lSMjVwekdocll4VkdKck1PSXlvUG1oUF9VdjRpU2pqVmxRZHNwek9yY040TlJ5Qy1kLWlkSEowOWhFVjlMT2stdG8xaWs1TDdtVVQtUVNEclc1TlhRb0Y0d2ZlS2ZhUFlBWm1GQWRENk1pa2U5bUZqUnptdnFSU3M1YXA2SHZUSUhDQVkzamRCMHAzQzVLMklZQk8zOTZfVElKZDBFX0Y1bktpbHNVMElGa29OX3Q4LWJKYUV5MWlMOGs4am9VX3E0aGZzV1p6SUh2azkyRzJZaGE2MF84bFBUMlRXd3poNW54d3RSbXljeldDakpoaDNPUnBZZjc2bi1Fb2RRTGVjX0ZwUUFUSTd0ckxndUJtakZFMW54QmNzQ04zd1lLSFc3VEt0MzNkeHRkYmcyS2R1ZzhIbm5CV1BkRlNzeFlFZnJVUTNEanBsSkduX2s0dVhQSVdnaFFBeG81VTVyNnNlUG1mSjdxaXFfUUZMcUNhSWthakFsa0x3T3p3MmU1UHB3NWJiVTh5N3l1V1BxUmhpTldpU1FGaDZ6UHFOY0Z1SDQyRHpNZ1JQb2hPNHhGZ1owWEh1bXZDcU1RSVVNR3pRTDlXWHduVzVlSnNxZFdHa0VQanJHcVBJUVhrSnk3Z3BaVUJCSllVTnhTQk5fLXhnZGhwRDRKOWNGWEpXcTVlT05lcjlBOUJDZWFJa2pzZlpaOEhsTUxZc2hwYmNZM3oydmgzaDVIWnBsWEVlVnhUckhpSVE1cVVkbFRUV1VIOU9WTDBuanZ0NUt0VWdwaFE5OElqQ3ExcktLajhBNGN3TllqTGxEWjJydnRIX0lBY3Y0SFozTDE4VHN0NzJKUDhrM2RGM3Z4Qm9TRURxNDhpbjZyV0tzb0VfazFNdEdoaUNVOE5WSW85OTdhU0RKNnVNbThsNjExS21zV2VldTNhdGZDSmFpNXp4UVVmTm9SYUJUdWNmS3N5QkozaEFhYmxlSVlNM2Zmc0tiNDdWODU5MzlBTDd1XzVHM0lvY3Q0WE9KNWVkSmwyaXVGU0xpR2I4eXpZQk9PTlhtZFgzRkdkSlNiZGU4X2NBNm1wOXBhenV6UXFrbldhRk03RFJUZXRwZjJRZDc0MU9BcWtYWmhUb09scXZxZXd6X3RKaDVGSXNGNFltcXNxV1F6anBxOG44UVQtTWlyY1gxUkN4Mkl6NERIbGtjNEl0RENpbXhIbEE2RWF0d29RU1BXU05nYlZNMGZMR05DM2VCdlFSNUU0ak9zVnlCRmJodlladlBaYW5GU0RwRWk5VGVMT1RBRFNCRUxLRmVyTmhHejhrX2VBbjB4bW52T2ZIWmJqUlUzWHkxU2JsaFN5MUV0U3BKSDJObkt3N3h4NGZDUlZQemhzOXhXd1pJOUZVa2lKTGFoemJzWWlhWG5ybTVkSWNFNHBSdUE2cm5ac0g4NkdVb1lPdU1UZmYtRGh2SHR4YWZNOEU1UDdEQ3ZCWFFiVFJOd1VzaEVQNWUzMGI0UnhrOWJvMkltbXVmcHRLZGNuX3JEdEhoaE1pUy1jS0dZUzZ5TndSSE1oZ1dyWTZPUkhwamJIb0FuV3piRlJnNk4yOW1oTDZrcnlYc3gwcm1pWkVkWjdwSmpwUXV0d3A1TVN4V01QNXNlb1NpTldDenhBZXpCZXNrQmtyQ21hQklCZzdLVjZHYi15QXk5aTh5VktLVi1IWld0Zk0xYWpCMXF3a0hpd1RUWWVZeFdDc1p5eXZvNWJzYzFscXJ3amRrb2RkS3NQWlZYWW1neVRyRjNhRXgwUHNkUTdoLUxZWTk3bjhJYk1VcTdjdWRYWEQyQ1NiOTd5NVY2UEhzR2l2TG5BdEwxdW9ZcjhnMjV3WlBHUzMxdW9Td2w1ZGNGLXh4Y2trU29QUDRqVXlySnZONjJsM0psRmhWS09wVnA0ZTAxOWFFamxRYm4wNzVMVUFkUy1ZN3duN011UUdWTXZaWXdvS1JhSTlZVnZ1MjVidndCUFBxQkU1YWlQQlVyelNHdUhFY1pmeE9KNmhmSzJYSnREQ1loYkFoUHpXcW9vWkZ5UDF4ZzZYRnprS2FIYnBybXNWUjVteGpGZ2ttYkxZRTZBNVUzQ2RITFJxTzRINlI0MHV0RVc3MEozWHlSWHJBT1haenZEOVVWaVVyTnR6dnAxUzNMVWJGMWN0N1ZGMTV2a1ZSV293akV4WmtYdHZuNDQ4anlOWkZCRU5iTXl5QUtsV0hTazBRNGdoNnEtWkVVaW44R1FHdWhxczhPaW1ZNWhyOEstbU1DRTNjRm81LS1EaHMzNTdYWml5Tl94YnhWNmtfY2lGZTRVUUFnWVZOLUQyWmt3MVZyU1gzWU5NdHNOTEJjTHpFWjJsR1Y3b1pyRjFYblZ1LVczZGgwRmdfR284MlZ6VkluTTVWMFpLVkh0a3NBbmYyUDBvTnRMZ3VDa2ZVNEpPNmhXZ0VlVGtYUG1jbWJFYlBIT3F4VDNyOFdCcTBrdllnV3lRdWU4blJmNktPWmVzN0hzRVJvbVU5R01lQzFzT0pXbFpNXzViNGtCWXAwUVlIcXphY1pUOWZHNlhTSmhBTnRKaS1tLXlEakMwdVZxNFp4SzNzTTZNaTRXS3hibktST2RLWUdrel8wa2RJRkFBMjgyQ0FIZDd2d0p0QUVpTHZVTVJ4d0dNYW4yR0JaMlhQNlcwV1AwUFlmNVdiNFVBMVJaTWY2NHRjR2MxYVowLTY4eTZjSHQ0Q2kxdkRuM1AydDhRVWVKV1d0am1JMDlRQ1AwR1pVV2ExVXFnTGZnancwTlNJV2NENjZYNnlVZHAtSDRUQ3dvYWFkaF8xbmJjNVpVR2VoWENlNU9ZSkFrNzRVOHl0dFhLQ1BKaVBEejVzOFNuYkREWS1EM3JFTzRCWVFkS3RwaTVRS3ZKUHlpUTZhNjloTlZzYW15akJkLUw3VE5UeGlCdVVFTktCYnA3Qk5YVExCdzRhX01wMXoyTXNGVjJLbUVRQk1yWmRnSElld294eU1Wa21qcFo0aFBqLWhSZXNQVkYwX2VNa0M0bVpHR1VnTGdRck9UMDRPdGZfblRHTGpmSTlmT0lra1A0TVR4MmFlWTE1UTZhNlIwSUtXUjk5bEVQZTlLd0JWY0NPdmVPVVlrWmJMNDhZa2YyLW0yWkxmcnBzcDZmdmNnTXowekpxZmVwSEhRTnpyYkJyMHBFVW1CQm03a3M3TG5FNURIMEsyTFFyNV95bWdXSk1xOFhTN1JmWDJUQmZRVUlQN0dDbTJWZXduOGN1MmZ4bE5MR2ktNHVuX1RGRjNtR0xGOEYtMWtkdnh4N2R4VXVyS3Y5Ym00Si00M2k3RHNlNGJsYXd5ajFqNG5KaS1RdGJXM19qdzJxY2pWVFdpdHk5Q1FXYVFmVUhLX3VtcHJneVdxcHRUcWZwbXRPZEdLNHJvQ0pKeGZXZ0k0d0lDMjZlcG9lVDl1amF1dWFiWWVkeE9pNHlBWEZjM0NTcWNfcTBEZXN0SEdtM2pLeVpFb256a1ZfMllOajlMQmg2UHRncGc3OTY3Y3FXU0VZZHRSdG8tQmxUTmlobFhNMVpaYUdsVFJhQVFDUlRoNUVGUDJ2TkxPaFQ0bHhpMVBNbGMzSktSZXV6QjRaTW1BZGgwR1JSMjhoaHZHRGFRRGxaUWltZmN5VkxlYnkzYWdndnpDbzB0V090Ui1lWng1YWFxS3B5Vmtud3hudms2M0I5S3dZZGM2YzR2Vzg0YlhlVU1yMWxCeGlaenZpR0VOb1FFM2tubG1DekpOUVljWWRZbHc4TlZxWmJGR0VEODMwaTNUejFOcHQ0bVZYQWRjaVBUMUJVTEhaZFNLdU8zbXZLVXRMb29ETDNPMkRwMTRjUzNMeWhiQ2h1U253N2hmZTFyS0Fpc3NsZ2hTNGtXTVZfMHFYZnNPTjRtMnVRenVDRVlzcEZ6MElXaFQ3aHhERVFXU0c4eXhLSTl5TTJnc3pZSHZSejFqZUtUNUt5R29kdnZWV19tN0MxTlBvNktMTUJEUFc3YXhoOHMtSDJvM1pDR2d5YUh5LXl5S09VeE5iWng4eVBnRmIxMWZ5djBqYzF0STZmMFNXTnVrRWhWeGpDaWcxX1NyUXBwZjgxNUt5ZDEzZnA3VjBTR3RTZDRHSWplbFI1NDhma0xZMHdYaTNuX2U3YWJJdkktV2hLZWlrNHN4ZGV0SjRQQWRFM1BkMVdMend0b21ZSDR1VUprbS1uYmJpRGNNNkRfOUpJX3UxVGRaX0RwRXBJZjYxZUEyc3cybzBLblVybU51cEJhd2xMd01vaUNCdFk3SGJRUUQtNlRhNDRRYTBmaFlKQjNuUmhWcXpyLV9STTJ4ckp1bXd0N0tUNmpvUzNsc1pvOEd5cVp3aWVZeXZRM0dFUi1DeEhiV0pPY1ozQWdHTlV0akdWT0dvamd0MWJhMjJwS1d3VzV6ZllRWV9KMWZlYzJCb1VwQnpQV2ZBWUwtYnBaSkVhSjR6QkdYMUNPcVlJYzNsdDFWQU1Qako3MDNJVE9PcEppRWI1Z0lYOVQ5VnlhWWQzOXF0Zmh3ZGVTYzQ0eU1LNHI4SkdvSFZ5eWp5T19OSGlURm9yRk0zOWg0OWNLcjA1TjVVZTlHckZZRGhTeExzak1zLU92WG5jZmpZT2NnWmRQa1RpTEtYZUpEdF9TdU8yQ0wxMW9JaFE0d2dhYTdSakxfbFdHNW9IOUMtY3pDamFrX2Fib0VScjNnT3RzR0Z6by13aGlLYVdka1lBU0lncU9pX1hIaDZjNFd4NUN4VWNsVGpOOUVOd245QTRMckdnMkluNFFMZW5DeUpGRXlPVlZiOHpodmwtM1Rxc3ZBSnpNS2hXQS04N0F2V1M4UEJSSFdvaDkyQjc5eFBCRE1fN1U4U0s3YmEtYTNjYmxqSm9wb0d3OFIwX0xBNGk3TDdVdlNGOWhwOTcxaUppZjJlbEdjQ2l4LVBzRXdnTzVzLUdzaE0wd1BHbm0yWEhuTnduOTh2RWUyNkZWLXVFVml1WHk3cUZ5VE1zT1hCNWlIanJiN0cwR0xSTXkzT0NpdzFXYmdYMGhQcEdjT05IMWRSeHZ4dExVRnRMYmFYeUVTSjNzQWVtSGdpMGpZaWJRcWZ4TngzbURDVXVwSjFsM3B4VFlPQnZrWEJxbmE3dlUzYlRHRWNfLVgtSG0zQzdsdFpHVld4TjdKb1NiYU1SLU82cHlhOG8wVGpmTXEwOHlYYzVqR3NuQTlhcG50Z1BmeHdranhrX0dYRDdaOExKX291NmJhQU5RX0JBUXcxUTJUOVVYNkJ0dl90UHdZYnFSWHdLbzdkTWYzS1NOYXBLZy01S0p0TmVuTFAxaE9MVjZmeWlCWnVmb2ZEVDlYTFlVcWcyQ2RtWDZkd05pV2g3YmVtSWdlLTNJcTlrNDBGVmFxUkFuSTNzdE1jUm9Ba1UxVkk5WVZVZkRrQjIxX3B1WTJvUV9HaUd3MXRDaC1YQjNOU2ZHV1dYWnMtUWpQUHl6SEVHTXdZcmU0WU1sa1dnLWVMdU5QdnliZEZ2QUYzUGQtYjNzZW5lajZkT3RROWxvY1hsbWotSVZ1eGdEWEJmV3NlVVhZMHNvNjhWVEZyYktiTV9oVmJhTktMUnYyV3JoRHZVSGFtaGRqR3BjQTFnbFNvc0hyNGJiVlRaSkxuS2Uta1pXZ2RTUC1kdlFVenFHZjk3N2NuUWp4M0NyUGVjRWh5WTVHX2gtSzBXalg2ajNjVlhyYlF0VnAzd3A1bHgtQU1Db05oc19KSnVSU1F4aGRiQU9OdGhBb2lTQzZ1MTZfOHB5OGppb0NVM0tGYmhtOC1RMExuVjVVbW1aaEs5bVR4d0Q4bi1jck52YUhmQmdtYTBua2VScDg4WGFwNkNaRUtFZjZranRCWks3WjMzRTJXbTZpSnpjbktMaGk1NjZpd28wdnZaQTNBUjdveXd1QVd3VXlJamVFeFg2QVdnZkRrLWdyTzJPaGJQT1dFTXJONnNzZjd5ampXeDFjU1kwM1lDYjRHUVZLR0xydGVlN2w2MHUtYWFFYjFXdG9PZVAyRVBDOEszbHNkc2NfZHB6TzlmMFhnUWJMVFRUX19yV01kRURiYUFjOWo2YXMzYU5vQ0R0SmpLaWp1SnkwZEw3NzQtaDlrUnZWUllDUl9OQl91NnJsRExQXzhLNzBEaDExOGNnQUg0MGlTdzV6LWhxVmxDRVZYSDIzdjBHYlRnWl8xdUtJN25yeF9BVkMzOWJ6dVNzamlqNjJySzdJQk5zQjFBVjJxTzI3OEVCcVFzZXo0U1I4Y0xEaE1FVkJ5VFJqNkxHYndQZjNDTWdDR0NNRjU5YjNJOV82Z2xJUHVYSUFLaTVtRWxuTm45aGJ3UlZKbFdPZUk4OTIwQmZDV1B6LUgyYTRaYmVNV3NFQWJhcWZ4ekRPSVBvYkdlNHlZbmlId0U1aGY2Y2xDa2gzUDhWZUgySjFkWWMtUVJfdm1zaHBBTmdUbk5fckRFRFN6andwS09yZFlmSjNoMy1QY01qU2lFUndLNjJJTUMtZjFva1NlTjIxT3NJeUVEMFdRSXlhOVFmSmxnSktVRTlMTmFUQ3IyN1dGRVhwV1FQT19XbmNOcmNuWF9KeHJuaU9SYUtUdEV4OTNtekctYlZPN2kzdmczUHdNM2NCcjlXd2h1Qm9MUnhLc3RDWGwwdWdJV1JkNnRRRlk2UW5iOGZXNWdKZ2dja2FxNHY2azRIeXRjejNsSEpERERVUmU4R0xBdm9DZzVvVWNGa3haT3FvWmZTMVpQeWRlQ0syeXVuRHVBSENFQjBTMktHYTZ5WU1SUjlfcm5Ydy1fOUJSU0NoRWJKY2djSlNmUGdDZ3J6QmZ5TlJtQ2lYVS16NGJIMnBEQmFpRFFWUzVQTEZzVHNKQzVCbEkxRGpfN3ZwYlBLZ1NWVVlVQUlUc2Z3OUlBY0wzQXo4QndKc0o4dTd1SHBER0o0SzBPeUJZN1U4WE1QbG1jdTZDNERHSUx4WmhrMlZtZWV0NHJMcGtNSkZtTGpiVW84XzNfZURTbDVkckxBcS14TXJvSXdCdmVLZko4SFJFUy0zTGU0VHFOLWlIVWdMQjMyYmljMmxZd0k4ZXgzMS1ZYmVybGFSaG1OMUw3ckxsX2d4Z255TGkwdjFvVVFnWlhjYzRYalpRTE5lRlNTVmRaWlJ2T3FXb3BtbGxoV0NIX0ZNQnZCbHM1b1h0YlA3enRWMk9Na2dhMGI2a19WQUY0YW9ZNUktclNnQU9fNWlVYl9jZ3VKX1F6UkNHcmtGNExGaUZRdy1HVkdweEVZN1RwR1lsMHlNS19neGVuQVJndEhjUnA4OEZxNmt1SW40NWJYVGdjZDlfczY4QXBJYm93aEUyV0MwY3VEMDVtZ1QyaFVxRE1VMTZUOTV3T3liblZXOXJLVXY4ckRhdnpTVnZ5WmVKZ3RCeHptdERPcHBvWm9vSlBGcUFGVDNyakdNblV2LV9yaWNJQkM4TWhSamRIcVJuV0RZX3NScUxvMDFZaVRVZU5NUkdhSi1YeHh1R01vRUotN3BiWnotYUVnQnNLakNfNWp2VDg4ZG9TOVRxTGNlUzQtWTgyVGFFanJYQXRZS2hXM0VuVFZvVjFJb2xUeDl3OExpd2xhWGtBYmM2Y2VoUUg2dklXOTlzMXM2djBSdzhTNF9OdHN1aU1oN2h5THA2YndXUXdyVHhwT2txSExiVUFZRWhEUWtGZmw1SURxel80bWFmeHBoOER5cWpUU2tIUlNLbzgtbGZISXJaUVpwNDFLZzlKUnFOaVRHR2tMU3ZPb0xWbmk3Z3B1MTFxc1FWR1pxeUhkQTcxUy1Fd2RON2N5NkNPT2c4bXhQU1lENFZ6YXRSWWNpeVRiNmNOWGJaUnFLTVlTNmQxaW55T1pWWUUyVDVVanlZV3pleEJ2ZTNZRTJKeDY5dkRhaUJScWxWaGdhajVtYkZ3WWZGWHVaZjBTUDQ1eW5LdGxFWXhUZjZxbDQxeUYxQnZTM3NteEtIaVpGVzFLUUk4THNLVEUxMW5qTHJKeERGMVFZTDdOYTJHbG9mNm1FYzlkTzlUbnUtS0VxVGZGZ0kyVHFaTmZyczNHTzZiSTNIaEkwZEE1STNVM0R4QTk4cWJnT3dkU2FyWktqZTZDSVYwT2FyTmhxMjNWbk1PZF8xaktUOERGaVFfdzI1SjVMN3FSLWlqUl9zbTg2UThKbzYtbWdlTU5hbjNxSlpNOEhSeDBmVkRwVVFEZVBxQkpUcFFrZjFqYzZPLWN5RkdhdGRTNVAyYmhMc0xCb01BSWJlNy1QOW1LNkhGcGcybXhqajk4ODRoNWxYZ0pXQlduemxGWTV3QW9vNlo1SURiQVE5ZVpxOVVOYV85ekF6VTZTaDNaSjRqemZFLVBWc0F3QVdPSDh4SU9tbkxpcWZqU0RIZkNlWUxPWndGVzZhdlN1VDlibGVlWWREV1FsZ0g2YkpyZi15X1lhWUhWOHF5TnBod3VOQzFPdmZkRU1nejl5T1diQTRtTWxUbG1fVzMtaS1EN1h1T1kzYk8wTU5CdjJ1bjRYMU5zNXE3blkzODIwNE1PY3NKM2p6NjRIMnlzMGtjbHJETExGQUFVYVRLelJmSzlVbzlGRjl6X0NQQ001ajIxaWxQazdUUGE2QWNES0w3MUFrMVE0VzlZSEJFbE56RFlGSTFSMjJyR2pDRGFkeEhYb0tvQU5iOVR3Z2Q2UC10SzdFdXprczFHNEVDSGxJazFiNXV5X3ZaNTR6djU3R2h6Znd6NW9DYXJ0dDNLaWpMYlFyMGw1RmpHeklFYTV4SlhRa1ZhY2ZxVVVmV0JqbFMxRVJvMDBJR2xBTHQyT1NwSDROaXJWdjZIQm4xZ19OZEVad3ZKbEpTV2p3djdyZjdSdDYyQkFvaWExZllxbTlwTHZpWDAwRXozWjJuc3RmZ3ZWUTdBZk1zMTdycmw3WDFVUWpvZTIwSF94NmhwcElDYmF0V04zcl9JeUR6LWY3T2hTMERyYUMwR29ORXJsd0FBblZWSW9DRlNvTjdLQ013TjQxS2RxQ01kYUdSaWJlSXRSSzlBSWhLaEZGVGhHLWk3MFh5aW8tdVU2c21CX05QOExTY2dqNWRhQS1yTHRMbW9Ya0FYcXpscW5IN0tlUlRLb1FWQnZaeE1hN3dieDk5cHBta0J1SFdPNm5ZcHE1M3NtdFJEQnFLOU1UWml0M3FvU1k4NzdwUFBGXzY2MXdta3RmU0NRWUk4MUduMXEtYVRzSWMwN2ttNEFFaU1OaExiUG5oX1hCZk9KNW1ydzFNZTZ3Z0lmalEzanZhRnNGNXdYUzJHdzRlRzBoeXVrMXZzTU0yRjY0bW1YRXRqeDlUVDN0SGIxb3ZLMU1haTVscDVqckJqTzd3YkI5NXN2M0h6aW9Ha0pCODZsT1J5eWFESVM4cVgzOWhfZjcyVU9uTUFOWXYxMWJiMk9MdGdpdkVIMWlEdm9pNGhPSjIwM1VRMWtYUFVidkM1LXhGaExvWDd5RUNaMERTMEMzV3J2bkdJbUJKWm5heDIySmN4VzAwUkd0RmE0cmhqV2dCNnJveWtmNnMzSG14alEtcERfXzU2ak5TMnduSlpOTlh1MWFleUhWZnVkNHEzdG9ZdWFscTN3NTNlTVNZdHhmMDkwellxQU95SWJ5MVdTc1ZVVkJ4Y0JqSTBucm5IMVhmUzBlbUsxbFVLMGl6Rl84a3dyZ0RwN1RJM0JuMUNOYllTdUVMMVNhU2lMMkdfUk1TS3NKNGZiY2k5Z3lCZXEwUklmMUFaT3pBc3MtZnJZT1k1SUZvNGlTSDdzc1FvNkg0QnRBQlRlOTFoRzd3Q2N6UHhpS1FzdXNqN3FXeFRVdktUU3ZFSjNsV3gta2E3NkNiejNMdWhQT29qU1BaRVpieEhoVWF1WkF5TEw0MldyV1pVMHZTYnd3VjB4eTBSWFFkLVhsQzNzeHozLTZDeDR1bzBZZEJDcHE3RjVrSnoxTFZqaEpCcmhObW5JX2Vid3kyaEFfR1RWMFVJVkRNSUlocGFZT2xHd09fMm53WE1VOS1jVGJqMzRtdE5YZE5oLWx2djV5a2FvMFotamtGM0djRHJUQnJSMENLWndSMVNBSFlHZTlyMDZCM1RVU0dnYWZfcmEybldFZFJrVkdjekpMSEd4UUZuOHZ2YUlIZkxMN3I3S3VSalJkeHE5aW51cExXTGxNYkEwcVg3Mk5yY012UkhCbXg0N0xnQVpqbThIWlhSb05uUXlNLVBQUlBlTndWc1F4SGJNd040cjh5UVY3T29BeTlYdUJhMFZpU1FoWml5ejBzaDdtLU5nR0U3OW1XV3hHU2U3emVIT0NNeEtLdUVBZW82VlhfX18zVUdmQW5QYUI1ZS1YaXZ5d2NoM2lYYVF0a3pEXzQzTERFSF90dnVNNWdzRFJQclZvYzhPanZ5cjVtQnRrVzc3ZkFVNWZJOUxBUm9nUUNSUVp4aHNJSVFVSkRsSERUNWN4Ti1DSGxoMjZqNlhuU3picC1IVXN4NHJELWIwaGg2eVF1RUJsVC1ocHpPYWVsSEpPQkRHSTA5eURZMGlHbkNpTFk0TUEwUHN1STN6eE1pY2hJR2VVak5NQXZsWkFkZDdUNG5naTlUTUNkbHNtSW4xTXJBUUh6YW0zR0FCZXlRN0dyajZmWEpkbHVzM0lGRzZXZDFrRE80ZlkycktsczEza1o1T25mcFpSamVWcjUtVFI4MmpuYkdZUDl2aGQ3Q25jY0ZGU2NqQkd1c1dtVlpHQnBFWE9RTVBhWm14MXVMeUlvMFFxM3RKQ3ZzUVlwX0RHN3NFWk8yczNybzNvZ3lkbFJac3B1UEtqQ3dnYnVyRkFNbXN0TkJ6RVRvdFFTVHB0TWtQajl3X3BxdE5jSUxHRWNhQjdGdWZ4VHd3YXU5NF9hWDRsNUdtcW1uX1BwMHM5S284d3lUcVlNTzgzUmxidFc1cGpvQUVGODVpMjhQbHZpdUZZc2ZVMjNyMW85RnJxZzhIWFptQkF1V0JXMmRRVlpET3VpNnRjY0NZWmpsNWNFUHc3TzdEd2ROXzNoV1Q0SkFaSTVoQ1dBRjFBYmxYU0M0WFc0ZmdIN054blY0ZGNIN2RMWV91QUhzZWJWcXRPU2F4UHB4bFhBYnN4VFBGbXNmeU5pYWtlSTRjNXk0aFR3N2ItUTh4MnpTSUlvZmFJMlBSM1dQZFV6dFR5bk5YNlMxTTBNdXZQaXBNVWZlTFpLYmlNTzZDcklCVG9sc0xOaktZcmZWNUtQTTRRVUZEUjNNWTd4TFliV3J4Q1NtNXZwMUdHX3VIS09lSEE0WjRKdHRaTHJpOHNSam85aTB1YUdnaVlOa3daVGw4bU90NW16UUNtUGFnWjlPTzlpbks0eWZ2ZFYxNnhfRmdLSjNpazJ3TjlxM1h5dHdfVGJQNHVnMFRnUkx6U3FUNk4wd1lHMmttaHZpazBjdVV0TTloNERqbi04UmdOYXh1SldfVWd3WVlQcmpSUjJTblJySVZMajNpcGRrYVpGbk1FcVhyUTl4dDZSRzlaOGFSWGt1QklmOGhmdXFMejFEa2FOZFRmNDlxOHNFdFhWSHdBM2JELVR0TzNvX2x3NlotWDlCNGx1U29DVEVFbE1DSGk0cVVrQTY0Z3BacU1MNzlwTkJ4ZmNueDNrY1ZKanRvZEpVNlhvcFFOdHQ0Z0NzR0tlMm5KMEtNVjlCYW9vTVlta3hYSVdzMnZHS0YtbHBON2J2MUQ1aUR6b0xCV1lpWG52UzRNcVZtS0loYXRqempiZk5QMmdRSEFHMWo2UHRWbl9RUWdQbG1Qc1lKWkV1elVvMWhIdVFKNVNpcFc1NXl0VFpOT3dyVlNRVUhicnV2VGp4M0lPdG5zaWtSd1ZGSmEtMWhXajljZ2hQT2E3clE1TzZBc21DejZkZ25XaHdxQWZYREV5c1EyazRGcGJKWF90Q2hHTE04TFA4OVo5ZkUxdkktbWtRQjNsdnhvdWR5R1N0WnJXX1YtRC1oWko0TFRRa0k4Zm1FZnhudjdnMWxwTU5BWWtOTVhxbS1vSnpqX3p3VDc3NnlQYjcyR1BqcjhuT3Y1eWh2RzNVWHd3VzVkVVNBQzFXaUlPVXVQSHotMGNrRG5IZlNpcHdhWmIxTHhFQkVzaE9pWHJCeG53cEZ0cXZjc0xDNjZPemI1UHZJWGdSRXpvcHA5RUJfRWlMQ2VPZGRvaVV2ZklzSkxqUThES05SdDZBbzNBOVF1M0dxU2R4VWc3c3FNSEFZUmhlT25zazJycUlleDlJa05NUGlKNlZ3ZW80VVlHVElRQy0wTUMxVEF2QS1fTUZSWDJBQlhQTUpRVjhYS290UDRNNld3cllwN3ZENnM5d1lFdjhjakcxRFV1c0VlQnIzWkxkUlRKWm1wZ2FvMV9yTVJrUG9DSjlsWlJOQkhWSkxaaHMtLTFzUFRiY0ctNnBIVDM3Smw4SlhJZ0EyZlBGWmNfVmtkeXhRcDF2NEtLZjVRTGpMaHBHTU5xWWJ0MHhTWmExeUVRb3pCWU1jZFRFUHpZanR6Q0J5ZFVmRW9HelRHcU5BaDNQMGpPaU5qc1I2NWwtN3hkeE1FUE1pdUpPM2JRd3RLaXUya0dEMTNBdm0xeGVNVXNpTTFENXhMeVZnNzk3ZXMyS05qbXBUSzl0aFl4d1VRbUZVcWp1OV80a1cyNVRhMVVyc1d1WHNJeFhCa0dmU2QxTXVEcHZDU1FjOTg1OWFuT1dvb0RZOVdxV1NZblJTeWwzVVBvV01DOUVTYlFXVG9ldmtNcmRLWHNXbWg0RVZZR0VOM0MzTHh5ajZFX2xBazI5b184Vk82aGRtWjVfdmJSaTNMdFBNWmlBdFUtbzhVdTFucExoaEdMbVRHa3lSNVBWS3NYT09HOWtpeER5bk9wVXdfV1BVTTlCVWtVcG90WEpUcWRXV1RrbHBJT1FPa1M0TmQtclFNSm5YYmVGTEtvR1lRQk5WTm9UMTlNdXRpY05WS1NfejloRUE0YXU4QS16dDJJRlU3WnF3TG5oQlRQRVJ5aUNFclotMm5adVJIbktxTFVjUHBJLUY2UzBVakd0Z05RU2dSbVFnQVUxUFdvNU5TZEY1VFk2UEtPeXR3SHFCc2JWQVY3NXF5OWVZclBMMzZPTTZqQ19MQ2ZkbVRwMk8tZXhvQ25KOG9LUzZsWWdOSVhJZ2NMSkcycTMtMXRiNmozTklsVWhTaVZrS2JTNm9QbnNCX1AwaVQtTkJrbFJjS3ExTWNiemRVUkJhSHoxOEVXRHc0ZGcyUW1vOEQ5UnpFV1VMMXNUUkhMWlVYbjFHVTMzX3BlSmhTNm5IOHJxcmpiWGwwd1d1ZEdCZ2NmTG1Sb25DVWl1V1hkSVRrM0NIcUp1VmNaV3NrYVFJSFFvMWhEVXAwNERUX1FSWVNjSE1oRjR1MFo3djNZZzBQUXlNMTR5dzlEVFdzZ05PY05QLVF1REFsbVdLTXpqZHlYcV9Dc1RfckN0Sm90bXoxNWE1S0xGcUpYNGJGY2d3Z2tyWWV3dWUtQVF4UkpySk5SSGgxaHpsaXJ6ZWphRGhFU2QtZmE3NU55SUpGSHZRZ3BCSU1CNUFqYkN2SXR3SHZRaEFUUEc4cWtienp5X0I0d1dSM2Z2WThHNjZKVmFyeEtXSEdTU0xZNS1WYktSTDF4Q0dUUHQ2cFc1SWMxNUQ1ZVJjeUcya1BoTDk0bXQyblJoTExkTl9UOHZKLUhBcko1anNFV190ZjdSNUZhWDdPbXhGc21CeGRtZHU2cnlKNzF4eWpTaExlekJPOTlnb1ZYSzRtNGUxRjdkWHFvN2RDV3htX2dSZ0wxZkpueXJuM3EwbHNHYWZoZDUwX1I4VEYxaHhRRlJ1aFBtSUt1R0J6bWtLamVwdWJXeWxiMW1vbmZ3X2lJS0RLTlM2b0oyTExLTjZ2bXNkeGc5MHJKdVY0bDUyT0RjN1NIUm41SXNpYmxGY2RzRmlTeUVucUczNnIzbzFEQWtwWEQzWlFyeThaUmFyYkw3a2otTVNUVGNGZUNPNmQwRWVpZE1jRmd6TnFrQUwzUE1rNDZvZzBBVzZ1c2htdjhVV20zWXRwU0ZDSXRXdGhKTV9ienhINWhsMVdPdG44SmNxblBWQWFaTDRhNldTSG5yb1pJMFRaMm0xMm5vWW9lcU1CSkgxNVFPVlBPdjZMTWNpR3paT1VvR09NMTV0MWQ3ZU1pTm5TaTZCOS1uYUdabE04MlJjWUw4TlNtNXZTckZBMXFpWTNTOGtmZjVpVDBWQU5ocHlLeHlwMlNxb19wQ2hVZlJRclFLay1PS0VBMmZNUW1hZ2FWcTMwLXZHckpBOXhoRDdzd1hac1dYN1BWazNsbjlfOTJqdHByUUlxZ0tWSWhua1pVcmFNSlIzdklrajhvQ2U3MW40MHhBdU9tMDBnMmFhb3hjXzQ4VEJ0dnpDVGFjYjlZMGJnYWxOYl9RcUUtODNhSHlwdEZaMFZqVVFCbDY0WVpGZmMtdFJZNTVOelRTZXZ1VG9RczhKWnJyRXNjYkV5SmdqWGxkQ0NGbmtETUN2WEZlakVMRldoMDdJMXgzbEowWldSeVc4Uzh2a0RLWnE2MC42UDM2cjlDa2c1V0s0RVlzVDZ1UHVB"}' + headers: + Accept: [application/json] + Content-Length: ['42465'] + 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://vaultcfa1497.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vaultcfa1497.vault.azure.net/certificates/certcfa1497/554f5eca7f2e42009173c299dbee817b","kid":"https://vaultcfa1497.vault.azure.net/keys/certcfa1497/554f5eca7f2e42009173c299dbee817b","sid":"https://vaultcfa1497.vault.azure.net/secrets/certcfa1497/554f5eca7f2e42009173c299dbee817b","x5t":"HI3CLuPpqfe2c50MaE4H8eaGtjs","cer":"MIIDOjCCAiKgAwIBAgIQGaLR85GnTpGwQlbCuTPl8TANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NDIzWhcNMjEwOTA2MTgwNDIzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi/6+eKoLsumBa2NjOMgR/qz3dFU+CLdKVabe7huThhDMudhi3JPBY/gi4LibYfhSx5SzcYD7RbWfSsaSQkyo/0PwZf/guGniGyGfd7jwX1cadrv4MBbcUq8c5autb9THNc1en7jDMYdGotT8bMzcpgXUFvhqUbPEFYM3lgyqmCx54LFWDJoRrQyxavsdVdVTA2MZU+xrFLd8+qfEM7FY1kwJtjuvVRTs6vy/Lt/YzM9QkPthO29oYPheTutHe5pqKvLNaet1J546fSJV7C1e8++PPGZk3D/b9/pETmLhaiy1r19r+XhxrqVWSYL30YU7s+SrVa+3Cjf7p0fH/1zKpAgMBAAGjfDB6MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQN0cJiDDG8eQggijY98tcXN+c3BjAdBgNVHQ4EFgQUDdHCYgwxvHkIIIo2PfLXFzfnNwYwDQYJKoZIhvcNAQELBQADggEBAIJ/6HG9HobUmkQUgDIBjImWswQzy6Hlm0WKRKuTfyFLoqdzt3vcDB2hIIbXmsaCu8qbqG8QWTw9+tXk34h4PUutE6b5if+dgOMr2W3sL6FHqsQR46soQkgOVVjZFyo8Z0eepFgjOW9elj7BrU9SAcWcGc0dUXGkISgkDfzSQcmLLlxBbWPHEMyVDerLsLUwDT2xRIrpfmLdeWI0CLJ8Pl+fWZDnWwG+hw8VIU8Ore9ftisApPzkT169+KwmgOrKy1aPTQlk4K8ehZHdiSweoYV3+cYNSsFYvNhAqdS1SzVa1x927W70fytAZzNV0iA79elamZgW+gaFvflK390JM+Q=","attributes":{"enabled":true,"nbf":1567792463,"exp":1630951463,"created":1567793063,"updated":1567793063,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultcfa1497.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":1567793053,"updated":1567793053}}}'} + headers: {cache-control: no-cache, content-length: '2199', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultcfa1497.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..b944d4f84f13 --- /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://vaultf8b2142a.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultf8b2142a.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://vaultf8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf8b2142a.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultf8b2142a.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://vaultf8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf8b2142a.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultf8b2142a.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://vaultf8b2142a.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaultf8b2142a.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultf8b2142a.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://vaultf8b2142a.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultf8b2142a.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..3b00a24a538e --- /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://vaultd1371366.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: 'Fri, 06 Sep 2019 18:04:44 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd1371366.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":1567793085,"updated":1567793085}}'} + headers: {cache-control: no-cache, content-length: '341', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd1371366.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":1567793085,"updated":1567793085}}'} + headers: {cache-control: no-cache, content-length: '341', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd1371366.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":1567793085,"updated":1567793085}}'} + headers: {cache-control: no-cache, content-length: '343', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vaultd1371366.vault.azure.net/certificates/issuers/issuer","provider":"Test"},{"id":"https://vaultd1371366.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '214', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd1371366.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":1567793085,"updated":1567793085}}'} + headers: {cache-control: no-cache, content-length: '341', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.vault.azure.net/certificates/issuers/issuer?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd1371366.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":1567793085,"updated":1567793085}}'} + headers: {cache-control: no-cache, content-length: '341', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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://vaultd1371366.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultd1371366.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..be7abc2cd8bf --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_crud_operations.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://vault22ac150f.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: 'Fri, 06 Sep 2019 18:04:43 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCkh+cWXfhnEhjEPA4bBxRKkxht9IW2NiaCDEUH6u225IwVXpAhbIkHgxwElg9hSkZyTlshbmg0n0qtFL5e9Ebl18McEk6sJSFjpbSyxi5ThdDO1ahZVB/aGq+z6vdk6hwglJurrCK3AYTPTubv3JlPiZxts/bPkWCchCszAmObI+cIijqoJHTxPhClCG+TP7t01L4sIy4M2S1OXgZV1ZAbrb0CA2n8Xryem7BleoQUdAMbmFlQ2fWnWoUrJC9r/esUfqzWCB74Suz7A9xAdWrSlKtnE5mkVLSaCFvj8u57tFFUs+cae6sC84aEpzP0plENiC/ahZ/kDkm5aCO/D7ob","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":"dcacd9ebe34c48f39afa00d6a88baa23"}'} + headers: + cache-control: no-cache + content-length: '1291' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:44 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', d, c, a, c, d, '9', e, b, e, '3', + '4', c, '4', '8', f, '3', '9', a, f, a, '0', '0', d, '6', a, '8', '8', b, + a, a, '2', '3'] + 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCkh+cWXfhnEhjEPA4bBxRKkxht9IW2NiaCDEUH6u225IwVXpAhbIkHgxwElg9hSkZyTlshbmg0n0qtFL5e9Ebl18McEk6sJSFjpbSyxi5ThdDO1ahZVB/aGq+z6vdk6hwglJurrCK3AYTPTubv3JlPiZxts/bPkWCchCszAmObI+cIijqoJHTxPhClCG+TP7t01L4sIy4M2S1OXgZV1ZAbrb0CA2n8Xryem7BleoQUdAMbmFlQ2fWnWoUrJC9r/esUfqzWCB74Suz7A9xAdWrSlKtnE5mkVLSaCFvj8u57tFFUs+cae6sC84aEpzP0plENiC/ahZ/kDkm5aCO/D7ob","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":"dcacd9ebe34c48f39afa00d6a88baa23"}'} + headers: {cache-control: no-cache, content-length: '1291', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:44 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCkh+cWXfhnEhjEPA4bBxRKkxht9IW2NiaCDEUH6u225IwVXpAhbIkHgxwElg9hSkZyTlshbmg0n0qtFL5e9Ebl18McEk6sJSFjpbSyxi5ThdDO1ahZVB/aGq+z6vdk6hwglJurrCK3AYTPTubv3JlPiZxts/bPkWCchCszAmObI+cIijqoJHTxPhClCG+TP7t01L4sIy4M2S1OXgZV1ZAbrb0CA2n8Xryem7BleoQUdAMbmFlQ2fWnWoUrJC9r/esUfqzWCB74Suz7A9xAdWrSlKtnE5mkVLSaCFvj8u57tFFUs+cae6sC84aEpzP0plENiC/ahZ/kDkm5aCO/D7ob","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":"dcacd9ebe34c48f39afa00d6a88baa23"}'} + headers: {cache-control: no-cache, content-length: '1291', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:55 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCkh+cWXfhnEhjEPA4bBxRKkxht9IW2NiaCDEUH6u225IwVXpAhbIkHgxwElg9hSkZyTlshbmg0n0qtFL5e9Ebl18McEk6sJSFjpbSyxi5ThdDO1ahZVB/aGq+z6vdk6hwglJurrCK3AYTPTubv3JlPiZxts/bPkWCchCszAmObI+cIijqoJHTxPhClCG+TP7t01L4sIy4M2S1OXgZV1ZAbrb0CA2n8Xryem7BleoQUdAMbmFlQ2fWnWoUrJC9r/esUfqzWCB74Suz7A9xAdWrSlKtnE5mkVLSaCFvj8u57tFFUs+cae6sC84aEpzP0plENiC/ahZ/kDkm5aCO/D7ob","cancellation_requested":false,"status":"completed","target":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f","request_id":"dcacd9ebe34c48f39afa00d6a88baa23"}'} + headers: {cache-control: no-cache, content-length: '1201', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgG+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCkh+cWXfhnEhjEPA4bBxRKkxht9IW2NiaCDEUH6u225IwVXpAhbIkHgxwElg9hSkZyTlshbmg0n0qtFL5e9Ebl18McEk6sJSFjpbSyxi5ThdDO1ahZVB/aGq+z6vdk6hwglJurrCK3AYTPTubv3JlPiZxts/bPkWCchCszAmObI+cIijqoJHTxPhClCG+TP7t01L4sIy4M2S1OXgZV1ZAbrb0CA2n8Xryem7BleoQUdAMbmFlQ2fWnWoUrJC9r/esUfqzWCB74Suz7A9xAdWrSlKtnE5mkVLSaCFvj8u57tFFUs+cae6sC84aEpzP0plENiC/ahZ/kDkm5aCO/D7ob","cancellation_requested":false,"status":"completed","target":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f","request_id":"dcacd9ebe34c48f39afa00d6a88baa23"}'} + headers: {cache-control: no-cache, content-length: '1201', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","kid":"https://vault22ac150f.vault.azure.net/keys/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","sid":"https://vault22ac150f.vault.azure.net/secrets/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","x5t":"I8ICLxTV8vTN7qOj67bqp7tLjFc","cer":"MIIDNjCCAh6gAwIBAgIQWmCpSjX4R4yzy8b72AMGLzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTUwMVoXDTIwMDkwNjE4MDUwMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFJ0uk5zpXdA8EgdPwFVO5FKjSR39MB0GA1UdDgQWBBSdLpOc6V3QPBIHT8BVTuRSo0kd/TANBgkqhkiG9w0BAQsFAAOCAQEAFZ8Ws55Ts/HhuUAFtPnmzsrR3rs7iQihqvzSudQ8UM8Dqid6ZFkY9L40eS1lNspK23IHbzj8CU4AmdawhHSvgayVROxievvVY8UdM2d1BdpBC2wNO3e+ZGk6Y3b6fSIwSt3V4Lr//bPOUuh+W/n/IiPflQAGltzU07okBGN7M0G6hi+0Cci4DYr1vkFPmOsBymwUaSXZKCAP5i2ggz/NL9Nenxv3KpIw4Nq3jGeN3sDEXjGBeQJoujlGCJwYAV7qELGvo6KsPTRVF2DWdVrOcTY+7iEjB+gORCEGGkEJvzzI1qz80f30RxmJxhzvwewDHAYQ6HA3q9rbomk9Ft1OPQ==","attributes":{"enabled":true,"nbf":1567792501,"exp":1599415501,"created":1567793101,"updated":1567793101,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault22ac150f.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":1567793085,"updated":1567793085}},"pending":{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2355', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","kid":"https://vault22ac150f.vault.azure.net/keys/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","sid":"https://vault22ac150f.vault.azure.net/secrets/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","x5t":"I8ICLxTV8vTN7qOj67bqp7tLjFc","cer":"MIIDNjCCAh6gAwIBAgIQWmCpSjX4R4yzy8b72AMGLzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTUwMVoXDTIwMDkwNjE4MDUwMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFJ0uk5zpXdA8EgdPwFVO5FKjSR39MB0GA1UdDgQWBBSdLpOc6V3QPBIHT8BVTuRSo0kd/TANBgkqhkiG9w0BAQsFAAOCAQEAFZ8Ws55Ts/HhuUAFtPnmzsrR3rs7iQihqvzSudQ8UM8Dqid6ZFkY9L40eS1lNspK23IHbzj8CU4AmdawhHSvgayVROxievvVY8UdM2d1BdpBC2wNO3e+ZGk6Y3b6fSIwSt3V4Lr//bPOUuh+W/n/IiPflQAGltzU07okBGN7M0G6hi+0Cci4DYr1vkFPmOsBymwUaSXZKCAP5i2ggz/NL9Nenxv3KpIw4Nq3jGeN3sDEXjGBeQJoujlGCJwYAV7qELGvo6KsPTRVF2DWdVrOcTY+7iEjB+gORCEGGkEJvzzI1qz80f30RxmJxhzvwewDHAYQ6HA3q9rbomk9Ft1OPQ==","attributes":{"enabled":true,"nbf":1567792501,"exp":1599415501,"created":1567793101,"updated":1567793111,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault22ac150f.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":1567793085,"updated":1567793085}},"pending":{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2388', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f?api-version=7.0 + response: + body: {string: '{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","kid":"https://vault22ac150f.vault.azure.net/keys/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","sid":"https://vault22ac150f.vault.azure.net/secrets/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a","x5t":"I8ICLxTV8vTN7qOj67bqp7tLjFc","cer":"MIIDNjCCAh6gAwIBAgIQWmCpSjX4R4yzy8b72AMGLzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTE5MDkwNjE3NTUwMVoXDTIwMDkwNjE4MDUwMVowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOMhNy1C9nxT+G2OIlbzbpfy5YUkCj3wnzDqQV9eCekNbAQACGPppR0WNQarw2qrKeo4INPgTyaeXOySFXNgL+Fqy7dsx2BOqnWjOIE1Nprjrv+ZKlQrxmkG6RjqifilX1vVliu+tEci34tBEXPN0C6tGZiE6RGK+QbbPn/UYr+i3kdHZNh3eAwxcLxmHhSbGRLdfiNQ6dDA83a9Qjy7Qfy6gfPLWd1gUrmn+/oR4UFmPGJQMGUY6VNniSw+H7FABl9FaGL/jBHDTKP85zw+jnSl5Aara81QQMK0RTAFaZRTblbY34yj3SHUdrLGZGU5oI9yGhu9rHeiXxwFGbd/zLsCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgG+MAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFJ0uk5zpXdA8EgdPwFVO5FKjSR39MB0GA1UdDgQWBBSdLpOc6V3QPBIHT8BVTuRSo0kd/TANBgkqhkiG9w0BAQsFAAOCAQEAFZ8Ws55Ts/HhuUAFtPnmzsrR3rs7iQihqvzSudQ8UM8Dqid6ZFkY9L40eS1lNspK23IHbzj8CU4AmdawhHSvgayVROxievvVY8UdM2d1BdpBC2wNO3e+ZGk6Y3b6fSIwSt3V4Lr//bPOUuh+W/n/IiPflQAGltzU07okBGN7M0G6hi+0Cci4DYr1vkFPmOsBymwUaSXZKCAP5i2ggz/NL9Nenxv3KpIw4Nq3jGeN3sDEXjGBeQJoujlGCJwYAV7qELGvo6KsPTRVF2DWdVrOcTY+7iEjB+gORCEGGkEJvzzI1qz80f30RxmJxhzvwewDHAYQ6HA3q9rbomk9Ft1OPQ==","attributes":{"enabled":true,"nbf":1567792501,"exp":1599415501,"created":1567793101,"updated":1567793111,"recoveryLevel":"Purgeable"},"tags":{"tag1":"updated_value1"},"policy":{"id":"https://vault22ac150f.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":1567793085,"updated":1567793085}},"pending":{"id":"https://vault22ac150f.vault.azure.net/certificates/cert22ac150f/pending"}}'} + headers: {cache-control: no-cache, content-length: '2388', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05:11 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.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://vault22ac150f.vault.azure.net/certificates/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a?api-version=7.0 + response: + body: {string: '{"error":{"code":"CertificateNotFound","message":"Certificate + not found: cert22ac150f/versions/86b254c2bbc44e40b3f1b662ef0b608a"}}'} + headers: {cache-control: no-cache, content-length: '130', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05:11 GMT', expires: '-1', pragma: no-cache, + server: Microsoft-IIS/10.0, strict-transport-security: max-age=31536000;includeSubDomains, + x-aspnet-version: 4.0.30319, x-content-type-options: nosniff, x-ms-keyvault-network-info: addr=131.107.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault22ac150f.vault.azure.net, + /certificates/cert22ac150f/86b254c2bbc44e40b3f1b662ef0b608a, 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..170641279c9c --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_get_pending_certificate_signing_request.yaml @@ -0,0 +1,188 @@ +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://vault91f91eda.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=","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":"af9473492cfa4d2e83c30499ef9c0c40"}'} + headers: + cache-control: no-cache + content-length: '1340' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:23 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, f, '9', '4', '7', '3', '4', + '9', '2', c, f, a, '4', d, '2', e, '8', '3', c, '3', '0', '4', '9', '9', e, + f, '9', c, '0', c, '4', '0'] + 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=","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":"af9473492cfa4d2e83c30499ef9c0c40"}'} + headers: {cache-control: no-cache, content-length: '1340', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:23 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=","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":"af9473492cfa4d2e83c30499ef9c0c40"}'} + headers: {cache-control: no-cache, content-length: '1340', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:33 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=","cancellation_requested":false,"status":"completed","target":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert","request_id":"af9473492cfa4d2e83c30499ef9c0c40"}'} + headers: {cache-control: no-cache, content-length: '1255', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=} + headers: {cache-control: no-cache, content-length: '956', content-type: application/pkcs10; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxGD4GWvCYOcBWf58RhTI5dGkBPlfeV5x/TqrU1CkwrjYQP/Qp/+J+CgU9MLRNT9F9ujy4imtbrnipRd38k2636hzIwoYNJ2HYC6PIESDY+ki8SxVf2ykjds73hjZt6DFM69hBv4c+aYGyAuFxfqGf3NPAkXtQTedhELqedvCywTZ+FSA/xHkiYNdzu6dZRH9g+EXNEmUiSnrelMfswukeXdfkLaC42jviEQWfG4zygRaQOpvW9vEn5pL0My1Z4ymk8pJ+0jhILvqHGRl+w9mW1C4swIiOml7dzqbEEKabyLW1nPgl9at2X4EL9pCDwG4FRcpBwEj+lafM8u0IKMXnwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIlXT3MCtDSMWBs3aZNkhw0wFM0xrd1JDtJLBnFwEuABilBjOKLz0K0jE4QE8EGz1SoYXJkUl9R8ynN8Ykv7j+k5HupJoWNRkExeeyEY5KzzEl/hgVLQ8z0Rc1Me44T5Bv80srW9EOVjFas5+PJE5XoKeBNAp5ekaUV/khwhzGqxAIYZAJwUEvAMt6cgUJXatnLv7UqVFTOvWSmZnY8eqDnPRCYSXlzFXHlxGST3I9kWT5Y5Iz+f9/VDfCPM545o2dRg05A+2wt7x5/ZccbkQDweVtiF2SY5Zaz4J8nZtZW9jXcGA/q7QStIFHGqdfqy46SMwbV+dDCg55cGuXZcEAk=","cancellation_requested":false,"status":"completed","target":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert","request_id":"af9473492cfa4d2e83c30499ef9c0c40"}'} + headers: {cache-control: no-cache, content-length: '1255', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert?api-version=7.0 + response: + body: {string: '{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/462cc4e190f9490db0da7281ba7c42b6","kid":"https://vault91f91eda.vault.azure.net/keys/unknownIssuerCert/462cc4e190f9490db0da7281ba7c42b6","sid":"https://vault91f91eda.vault.azure.net/secrets/unknownIssuerCert/462cc4e190f9490db0da7281ba7c42b6","x5t":"GF6gOGVu4Z1a6JaeJ52aped5mYY","cer":"MIIDWjCCAkKgAwIBAgIQau7lrwqgQ5yXU7GM4KwrOjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NDM4WhcNMjEwOTA2MTgwNDM4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDEYPgZa8Jg5wFZ/nxGFMjl0aQE+V95XnH9OqtTUKTCuNhA/9Cn/4n4KBT0wtE1P0X26PLiKa1uueKlF3fyTbrfqHMjChg0nYdgLo8gRINj6SLxLFV/bKSN2zveGNm3oMUzr2EG/hz5pgbIC4XF+oZ/c08CRe1BN52EQup528LLBNn4VID/EeSJg13O7p1lEf2D4Rc0SZSJKet6Ux+zC6R5d1+QtoLjaO+IRBZ8bjPKBFpA6m9b28SfmkvQzLVnjKaTykn7SOEgu+ocZGX7D2ZbULizAiI6aXt3OpsQQppvItbWc+CX1q3ZfgQv2kIPAbgVFykHASP6Vp8zy7QgoxefAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFKDTssCpxwx32w4zYGYVIGQzPYtqMB0GA1UdDgQWBBSg07LAqccMd9sOM2BmFSBkMz2LajANBgkqhkiG9w0BAQsFAAOCAQEAZmYXWCY99nqK+2a8pMKIoPFXT+xhxQtTruJRroS8dNSDB6OmS+ebImFX+41WUAEpvUP1p/ks+fn5tA2JkQN77jst7tarkvwbFqk+8qO1FMv/pz1ajzrlEolXPvTsudUfAzxPLGom24yUsyCx+NFxTTvUssLA4EBgg8SiqskhxJw+tHMmTICEgvb5/A505w+cnwAhG44i1pga0ThQa3JJqEtKAUxaPlQvSB6ignL2bTfwt96x4+WAdP9pklY10wC/Cw6vNVDYYuQKVj/+bJpLyCJ75c0dUdp8BCKTGLcgivVVZGSzhi7rY3XkKHWHJrBJAhyMjWoB0njKcK9ILFowZQ==","attributes":{"enabled":true,"nbf":1567792478,"exp":1630951478,"created":1567793079,"updated":1567793079,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault91f91eda.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":1567793063,"updated":1567793063}},"pending":{"id":"https://vault91f91eda.vault.azure.net/certificates/unknownIssuerCert/pending"}}'} + headers: {cache-control: no-cache, content-length: '2407', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault91f91eda.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..fb3d4a4bb55c --- /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://vault52a3107a.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert052a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert052a3107a/05b5c9eb2b5849aaa3dc34126132f554","kid":"https://vault52a3107a.vault.azure.net/keys/cert052a3107a/05b5c9eb2b5849aaa3dc34126132f554","sid":"https://vault52a3107a.vault.azure.net/secrets/cert052a3107a/05b5c9eb2b5849aaa3dc34126132f554","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":1567793056,"updated":1567793056,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793056,"updated":1567793056}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert152a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert152a3107a/1c65d4cacf324657aabec39b52c89d5c","kid":"https://vault52a3107a.vault.azure.net/keys/cert152a3107a/1c65d4cacf324657aabec39b52c89d5c","sid":"https://vault52a3107a.vault.azure.net/secrets/cert152a3107a/1c65d4cacf324657aabec39b52c89d5c","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":1567793057,"updated":1567793057,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793057,"updated":1567793057}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert252a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert252a3107a/7db3dae1ce4b44459a2f328d5150b5ed","kid":"https://vault52a3107a.vault.azure.net/keys/cert252a3107a/7db3dae1ce4b44459a2f328d5150b5ed","sid":"https://vault52a3107a.vault.azure.net/secrets/cert252a3107a/7db3dae1ce4b44459a2f328d5150b5ed","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":1567793057,"updated":1567793057,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793057,"updated":1567793057}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert352a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert352a3107a/195efe4d70224506b1a3ea8864cf4e4b","kid":"https://vault52a3107a.vault.azure.net/keys/cert352a3107a/195efe4d70224506b1a3ea8864cf4e4b","sid":"https://vault52a3107a.vault.azure.net/secrets/cert352a3107a/195efe4d70224506b1a3ea8864cf4e4b","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":1567793058,"updated":1567793058,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793058,"updated":1567793058}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert452a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert452a3107a/550df9fdc91e43ba8f6149c7a7c6070e","kid":"https://vault52a3107a.vault.azure.net/keys/cert452a3107a/550df9fdc91e43ba8f6149c7a7c6070e","sid":"https://vault52a3107a.vault.azure.net/secrets/cert452a3107a/550df9fdc91e43ba8f6149c7a7c6070e","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":1567793058,"updated":1567793058,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793058,"updated":1567793058}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates/cert552a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert552a3107a/22a95637adb34aa28c4a7601024c4e8e","kid":"https://vault52a3107a.vault.azure.net/keys/cert552a3107a/22a95637adb34aa28c4a7601024c4e8e","sid":"https://vault52a3107a.vault.azure.net/secrets/cert552a3107a/22a95637adb34aa28c4a7601024c4e8e","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":1567793058,"updated":1567793058,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793058,"updated":1567793058}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.vault.azure.net, + /certificates/cert552a3107a/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://vault52a3107a.vault.azure.net/certificates/cert652a3107a/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault52a3107a.vault.azure.net/certificates/cert652a3107a/8c99654420024ee697a326197574c4bc","kid":"https://vault52a3107a.vault.azure.net/keys/cert652a3107a/8c99654420024ee697a326197574c4bc","sid":"https://vault52a3107a.vault.azure.net/secrets/cert652a3107a/8c99654420024ee697a326197574c4bc","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":1567793059,"updated":1567793059,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault52a3107a.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":1567793059,"updated":1567793059}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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://vault52a3107a.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault52a3107a.vault.azure.net/certificates/cert052a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793056,"updated":1567793056},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert152a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793057,"updated":1567793057},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert252a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793057,"updated":1567793057},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert352a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793058,"updated":1567793058},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert452a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793058,"updated":1567793058},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert552a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793058,"updated":1567793058},"subject":""},{"id":"https://vault52a3107a.vault.azure.net/certificates/cert652a3107a","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793059,"updated":1567793059},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '1630', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault52a3107a.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..779004ec14ff --- /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://vaultb3f1934.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: 'Fri, 06 Sep 2019 18:04:46 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/b15f48cf268445e69d83ea3228065516","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/b15f48cf268445e69d83ea3228065516","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/b15f48cf268445e69d83ea3228065516","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":1567793086,"updated":1567793086,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793086}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/1b5d27735acd484aae2f29b9b841b7fe","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/1b5d27735acd484aae2f29b9b841b7fe","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/1b5d27735acd484aae2f29b9b841b7fe","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":1567793087,"updated":1567793087,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793087}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/ee77186b6893445db1ccad122758cb86","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/ee77186b6893445db1ccad122758cb86","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/ee77186b6893445db1ccad122758cb86","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":1567793087,"updated":1567793087,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793087}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/96ddbd9b2c8e45f098a2c72d09ada315","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/96ddbd9b2c8e45f098a2c72d09ada315","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/96ddbd9b2c8e45f098a2c72d09ada315","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":1567793088,"updated":1567793088,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793088}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/ce65a3661d7a4b378cb3ecaba2e8e582","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/ce65a3661d7a4b378cb3ecaba2e8e582","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/ce65a3661d7a4b378cb3ecaba2e8e582","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":1567793088,"updated":1567793088,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793088}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/606ff505102149f4a200124b8bfa3148","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/606ff505102149f4a200124b8bfa3148","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/606ff505102149f4a200124b8bfa3148","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":1567793088,"updated":1567793088,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793088}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.vault.azure.net, + /certificates/certverb3f1934/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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/import?api-version=7.0 + response: + body: {string: '{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/10624ded09ba447ca50f95e36ac7f2e5","kid":"https://vaultb3f1934.vault.azure.net/keys/certverb3f1934/10624ded09ba447ca50f95e36ac7f2e5","sid":"https://vaultb3f1934.vault.azure.net/secrets/certverb3f1934/10624ded09ba447ca50f95e36ac7f2e5","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":1567793089,"updated":1567793089,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vaultb3f1934.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":1567793086,"updated":1567793089}}}'} + headers: {cache-control: no-cache, content-length: '1794', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/versions?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/10624ded09ba447ca50f95e36ac7f2e5","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793089,"updated":1567793089},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/1b5d27735acd484aae2f29b9b841b7fe","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793087,"updated":1567793087},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/606ff505102149f4a200124b8bfa3148","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793088,"updated":1567793088},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/96ddbd9b2c8e45f098a2c72d09ada315","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793088,"updated":1567793088},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/b15f48cf268445e69d83ea3228065516","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793086,"updated":1567793086},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/ce65a3661d7a4b378cb3ecaba2e8e582","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793088,"updated":1567793088},"subject":""},{"id":"https://vaultb3f1934.vault.azure.net/certificates/certverb3f1934/ee77186b6893445db1ccad122758cb86","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793087,"updated":1567793087},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '1861', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vaultb3f1934.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..1492f4120e12 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_certificates_client_async.test_merge_certificate.yaml @@ -0,0 +1,182 @@ +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://vault4ca615b0.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: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4ca615b0.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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5ODB+67uSteO00MqVdK/TTieRnKXObENhDTixCimyDiPeMB7pSK5f+JOP2Ejb4EgAprRq486Ji8hloMKBCbAYEXuX3mBEuGXLh880CJxAssPhpiHDHv3BkWiDlee+EmOFasJ4xOR1C6N53VR4k+KbO9xEUxh5XfXCIxn0XW/CoY+opx8By0hsqYkeA4X/pOfNC5RI/su1Yq+YAon65OrlaI9nmg+Snjh9Ra0eRIu/MgK9QJs3KqnL2UaONwYube5FU4E7wiqDMN7pKHsKy6g5t28YjXflLdoiEWa0YipFgudqy2LdM2QKIVQqbmOpQqPQdLUQAP/4KfK1PiuRv0PQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABs8x2hb3DPaqajo0zzpnnHl9PP30WDzMZYvEetVWC10DSr0Z2W/OplvpG62j0TuETYsIMsAjTWaYb/UP3+YO7BqXC+5nOQsMsgJ3SSJk3HlnJY6x4L+uBRKzwguo2axtIWbGFyFnx0XoC+qwWiw4SGNIRuBOuo8rdzNJrLGTyg4L9UnNfRfltpoithoGrS8Ay/CrZ3InpnL9QmCF6qAzOTVttm0UW0nttAyv//U2WcnaI27rArFa4k4l27iK1Y7iRLENso4WDNB6aoQsCVpjd3Rz/z9KWMvpkqjx+RlXk14/OYDUbyTgPdlj2Cw7qORbSTUboY+SNAgMeEQy0f57LA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"75d2c81b64b74ff8a70af9e2e4072dd0"}'} + headers: + cache-control: no-cache + content-length: '1220' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:16 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '7', '5', d, '2', c, '8', '1', + b, '6', '4', b, '7', '4', f, f, '8', a, '7', '0', a, f, '9', e, '2', e, '4', + '0', '7', '2', d, d, '0'] + 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault4ca615b0.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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5ODB+67uSteO00MqVdK/TTieRnKXObENhDTixCimyDiPeMB7pSK5f+JOP2Ejb4EgAprRq486Ji8hloMKBCbAYEXuX3mBEuGXLh880CJxAssPhpiHDHv3BkWiDlee+EmOFasJ4xOR1C6N53VR4k+KbO9xEUxh5XfXCIxn0XW/CoY+opx8By0hsqYkeA4X/pOfNC5RI/su1Yq+YAon65OrlaI9nmg+Snjh9Ra0eRIu/MgK9QJs3KqnL2UaONwYube5FU4E7wiqDMN7pKHsKy6g5t28YjXflLdoiEWa0YipFgudqy2LdM2QKIVQqbmOpQqPQdLUQAP/4KfK1PiuRv0PQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABs8x2hb3DPaqajo0zzpnnHl9PP30WDzMZYvEetVWC10DSr0Z2W/OplvpG62j0TuETYsIMsAjTWaYb/UP3+YO7BqXC+5nOQsMsgJ3SSJk3HlnJY6x4L+uBRKzwguo2axtIWbGFyFnx0XoC+qwWiw4SGNIRuBOuo8rdzNJrLGTyg4L9UnNfRfltpoithoGrS8Ay/CrZ3InpnL9QmCF6qAzOTVttm0UW0nttAyv//U2WcnaI27rArFa4k4l27iK1Y7iRLENso4WDNB6aoQsCVpjd3Rz/z9KWMvpkqjx+RlXk14/OYDUbyTgPdlj2Cw7qORbSTUboY+SNAgMeEQy0f57LA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"75d2c81b64b74ff8a70af9e2e4072dd0"}'} + headers: {cache-control: no-cache, content-length: '1220', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04:16 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4ca615b0.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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5ODB+67uSteO00MqVdK/TTieRnKXObENhDTixCimyDiPeMB7pSK5f+JOP2Ejb4EgAprRq486Ji8hloMKBCbAYEXuX3mBEuGXLh880CJxAssPhpiHDHv3BkWiDlee+EmOFasJ4xOR1C6N53VR4k+KbO9xEUxh5XfXCIxn0XW/CoY+opx8By0hsqYkeA4X/pOfNC5RI/su1Yq+YAon65OrlaI9nmg+Snjh9Ra0eRIu/MgK9QJs3KqnL2UaONwYube5FU4E7wiqDMN7pKHsKy6g5t28YjXflLdoiEWa0YipFgudqy2LdM2QKIVQqbmOpQqPQdLUQAP/4KfK1PiuRv0PQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABs8x2hb3DPaqajo0zzpnnHl9PP30WDzMZYvEetVWC10DSr0Z2W/OplvpG62j0TuETYsIMsAjTWaYb/UP3+YO7BqXC+5nOQsMsgJ3SSJk3HlnJY6x4L+uBRKzwguo2axtIWbGFyFnx0XoC+qwWiw4SGNIRuBOuo8rdzNJrLGTyg4L9UnNfRfltpoithoGrS8Ay/CrZ3InpnL9QmCF6qAzOTVttm0UW0nttAyv//U2WcnaI27rArFa4k4l27iK1Y7iRLENso4WDNB6aoQsCVpjd3Rz/z9KWMvpkqjx+RlXk14/OYDUbyTgPdlj2Cw7qORbSTUboY+SNAgMeEQy0f57LA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"75d2c81b64b74ff8a70af9e2e4072dd0"}'} + headers: {cache-control: no-cache, content-length: '1220', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4ca615b0.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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5ODB+67uSteO00MqVdK/TTieRnKXObENhDTixCimyDiPeMB7pSK5f+JOP2Ejb4EgAprRq486Ji8hloMKBCbAYEXuX3mBEuGXLh880CJxAssPhpiHDHv3BkWiDlee+EmOFasJ4xOR1C6N53VR4k+KbO9xEUxh5XfXCIxn0XW/CoY+opx8By0hsqYkeA4X/pOfNC5RI/su1Yq+YAon65OrlaI9nmg+Snjh9Ra0eRIu/MgK9QJs3KqnL2UaONwYube5FU4E7wiqDMN7pKHsKy6g5t28YjXflLdoiEWa0YipFgudqy2LdM2QKIVQqbmOpQqPQdLUQAP/4KfK1PiuRv0PQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABs8x2hb3DPaqajo0zzpnnHl9PP30WDzMZYvEetVWC10DSr0Z2W/OplvpG62j0TuETYsIMsAjTWaYb/UP3+YO7BqXC+5nOQsMsgJ3SSJk3HlnJY6x4L+uBRKzwguo2axtIWbGFyFnx0XoC+qwWiw4SGNIRuBOuo8rdzNJrLGTyg4L9UnNfRfltpoithoGrS8Ay/CrZ3InpnL9QmCF6qAzOTVttm0UW0nttAyv//U2WcnaI27rArFa4k4l27iK1Y7iRLENso4WDNB6aoQsCVpjd3Rz/z9KWMvpkqjx+RlXk14/OYDUbyTgPdlj2Cw7qORbSTUboY+SNAgMeEQy0f57LA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"75d2c81b64b74ff8a70af9e2e4072dd0"}'} + headers: {cache-control: no-cache, content-length: '1220', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4ca615b0.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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending","issuer":{"name":"Unknown"},"csr":"MIICoTCCAYkCAQAwETEPMA0GA1UEAxMGTXlDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5ODB+67uSteO00MqVdK/TTieRnKXObENhDTixCimyDiPeMB7pSK5f+JOP2Ejb4EgAprRq486Ji8hloMKBCbAYEXuX3mBEuGXLh880CJxAssPhpiHDHv3BkWiDlee+EmOFasJ4xOR1C6N53VR4k+KbO9xEUxh5XfXCIxn0XW/CoY+opx8By0hsqYkeA4X/pOfNC5RI/su1Yq+YAon65OrlaI9nmg+Snjh9Ra0eRIu/MgK9QJs3KqnL2UaONwYube5FU4E7wiqDMN7pKHsKy6g5t28YjXflLdoiEWa0YipFgudqy2LdM2QKIVQqbmOpQqPQdLUQAP/4KfK1PiuRv0PQIDAQABoEswSQYJKoZIhvcNAQkOMTwwOjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABs8x2hb3DPaqajo0zzpnnHl9PP30WDzMZYvEetVWC10DSr0Z2W/OplvpG62j0TuETYsIMsAjTWaYb/UP3+YO7BqXC+5nOQsMsgJ3SSJk3HlnJY6x4L+uBRKzwguo2axtIWbGFyFnx0XoC+qwWiw4SGNIRuBOuo8rdzNJrLGTyg4L9UnNfRfltpoithoGrS8Ay/CrZ3InpnL9QmCF6qAzOTVttm0UW0nttAyv//U2WcnaI27rArFa4k4l27iK1Y7iRLENso4WDNB6aoQsCVpjd3Rz/z9KWMvpkqjx+RlXk14/OYDUbyTgPdlj2Cw7qORbSTUboY+SNAgMeEQy0f57LA=","cancellation_requested":false,"status":"inProgress","status_details":"Pending + certificate created. Please Perform Merge to complete the request.","request_id":"75d2c81b64b74ff8a70af9e2e4072dd0"}'} + headers: {cache-control: no-cache, content-length: '1220', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4ca615b0.vault.azure.net, + /certificates/mergeCertificate/pending, api-version=7.0, ''] +- request: + body: '{"x5c": ["TUlJQ3lqQ0NBYklDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREFlRncweE9UQTVNRFl4T0RBME5EaGFGdzB4T1RBNU1EWXhPREExTkRoYU1CRXhEekFOQmdOVkJBTVRCazE1UTJWeWREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxPVGd3ZnV1N2tyWGp0TkRLbFhTdjAwNG5rWnlsem14RFlRMDRzUW9wc2c0ajNqQWU2VWl1WC9pVGo5aEkyK0JJQUthMGF1UE9pWXZJWmFEQ2dRbXdHQkY3bDk1Z1JMaGx5NGZQTkFpY1FMTEQ0YVlod3g3OXdaRm9nNVhudmhKamhXckNlTVRrZFF1amVkMVVlSlBpbXp2Y1JGTVllVjMxd2lNWjlGMXZ3cUdQcUtjZkFjdEliS21KSGdPRi82VG56UXVVU1A3THRXS3ZtQUtKK3VUcTVXaVBaNW9Qa3A0NGZVV3RIa1NMdnpJQ3ZVQ2JOeXFweTlsR2pqY0dMbTN1UlZPQk84SXFnekRlNlNoN0NzdW9PYmR2R0kxMzVTM2FJaEZtdEdJcVJZTG5hc3RpM1ROa0NpRlVLbTVqcVVLajBIUzFFQUQvK0NueXRUNHJrYjlEMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWJkYXRzQ3Q1Ky9LNUQyK3AzMHZDTGZHaExXTkdBVUFFcTNjdTVsaHR6YzEyVERiMVgzTW5UZmhyQWNqTEVxWmpYRXVWek1tdHhwV1V4NllxdjA3RHZkWmlFNVJmaTI0bzRDMS9OcGJZdjhKRThkWTh4NWw3N3lDd2RMSUZML2cxMytPYWxHMmFWYTlIL0xhanJkZUVKT0praXpSMVYvZTA1THJKZ1ZiMDJBQWtSREVETmUwMFBjc2I5ME5QcjR5cGUzTllDbW1VU202UDZBY21Jdkh0YmJFNTVlRjFMeTRTK2FORlFaUTh3ZE8wWGFIV2xsRHRqT2lYSi93K2doYzhUVUlPbGNzb0lsY09tQkI2ekxGSnVKU1oyY1haZGRpL2pERm55RnBMeWNHcTZCMDRsa3pZN1JpakNzRGRKd1puR2p1bUszaFBuVEJRbnY4OHFjbzIwdz09"]}' + 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://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending/merge?api-version=7.0 + response: + body: {string: '{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/08e3e93d1aa34ed0bd261e37c7c61205","kid":"https://vault4ca615b0.vault.azure.net/keys/mergeCertificate/08e3e93d1aa34ed0bd261e37c7c61205","sid":"https://vault4ca615b0.vault.azure.net/secrets/mergeCertificate/08e3e93d1aa34ed0bd261e37c7c61205","x5t":"nhb67vThhJOMZs_Ere3pxJ558Rc","cer":"MIICyjCCAbICAQEwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MDYxODA0NDhaFw0xOTA5MDYxODA1NDhaMBExDzANBgNVBAMTBk15Q2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALOTgwfuu7krXjtNDKlXSv004nkZylzmxDYQ04sQopsg4j3jAe6UiuX/iTj9hI2+BIAKa0auPOiYvIZaDCgQmwGBF7l95gRLhly4fPNAicQLLD4aYhwx79wZFog5XnvhJjhWrCeMTkdQujed1UeJPimzvcRFMYeV31wiMZ9F1vwqGPqKcfActIbKmJHgOF/6TnzQuUSP7LtWKvmAKJ+uTq5WiPZ5oPkp44fUWtHkSLvzICvUCbNyqpy9lGjjcGLm3uRVOBO8IqgzDe6Sh7CsuoObdvGI135S3aIhFmtGIqRYLnasti3TNkCiFUKm5jqUKj0HS1EAD/+CnytT4rkb9D0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAbdatsCt5+/K5D2+p30vCLfGhLWNGAUAEq3cu5lhtzc12TDb1X3MnTfhrAcjLEqZjXEuVzMmtxpWUx6Yqv07DvdZiE5Rfi24o4C1/NpbYv8JE8dY8x5l77yCwdLIFL/g13+OalG2aVa9H/LajrdeEJOJkizR1V/e05LrJgVb02AAkRDEDNe00Pcsb90NPr4ype3NYCmmUSm6P6AcmIvHtbbE55eF1Ly4S+aNFQZQ8wdO0XaHWllDtjOiXJ/w+ghc8TUIOlcsoIlcOmBB6zLFJuJSZ2cXZddi/jDFnyFpLycGq6B04lkzY7RijCsDdJwZnGjumK3hPnTBQnv88qco20w==","attributes":{"enabled":true,"nbf":1567793088,"exp":1567793148,"created":1567793088,"updated":1567793088,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault4ca615b0.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":1567793057,"updated":1567793057}},"pending":{"id":"https://vault4ca615b0.vault.azure.net/certificates/mergeCertificate/pending"}}'} + headers: + cache-control: no-cache + content-length: '2201' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:04:48 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault4ca615b0.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..fb7053f228ba --- /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://vault74cf114e.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: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault74cf114e.vault.azure.net, + /certificates/policyCertificate/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://vault74cf114e.vault.azure.net/certificates/policyCertificate/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault74cf114e.vault.azure.net/certificates/policyCertificate/6e6c8abbc60649cab397d933501064bb","kid":"https://vault74cf114e.vault.azure.net/keys/policyCertificate/6e6c8abbc60649cab397d933501064bb","sid":"https://vault74cf114e.vault.azure.net/secrets/policyCertificate/6e6c8abbc60649cab397d933501064bb","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":1567793119,"updated":1567793119,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault74cf114e.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":1567793119,"updated":1567793119}}}'} + headers: {cache-control: no-cache, content-length: '1810', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault74cf114e.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://vault74cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault74cf114e.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":1567793119,"updated":1567793119}}'} + headers: {cache-control: no-cache, content-length: '540', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault74cf114e.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://vault74cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault74cf114e.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":1567793119,"updated":1567793120}}'} + headers: {cache-control: no-cache, content-length: '537', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault74cf114e.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://vault74cf114e.vault.azure.net/certificates/policyCertificate/policy?api-version=7.0 + response: + body: {string: '{"id":"https://vault74cf114e.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":1567793119,"updated":1567793120}}'} + headers: {cache-control: no-cache, content-length: '537', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault74cf114e.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..5635e4cb2f4b --- /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://vault4d8615c8.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: 'Fri, 06 Sep 2019 18:04:53 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","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":1567793093,"updated":1567793093,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793093,"updated":1567793093}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg04d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg14d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.vault.azure.net, + /certificates/certprg14d8615c8/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://vault4d8615c8.vault.azure.net/certificates/certprg24d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","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":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793097,"updated":1567793097}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.vault.azure.net, + /certificates/certprg24d8615c8/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://vault4d8615c8.vault.azure.net/certificates/certprg34d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg34d8615c8/a2db7247b37542828248dff127680dde","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg34d8615c8/a2db7247b37542828248dff127680dde","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg34d8615c8/a2db7247b37542828248dff127680dde","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":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793097,"updated":1567793097}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.vault.azure.net, + /certificates/certprg34d8615c8/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://vault4d8615c8.vault.azure.net/certificates/certprg44d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg54d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg54d8615c8/30231c450f7442099672d21edacd93b6","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg54d8615c8/30231c450f7442099672d21edacd93b6","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg54d8615c8/30231c450f7442099672d21edacd93b6","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.vault.azure.net, + /certificates/certprg54d8615c8/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://vault4d8615c8.vault.azure.net/certificates/certprg64d8615c8/import?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","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":1567793093,"updated":1567793093,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793093,"updated":1567793093}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg04d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg04d8615c8/ac9a421039114dc7a964e53e51545fb0","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg14d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg14d8615c8/7b84948332444cfa9b49de02c42e79f9","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg24d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg24d8615c8/e0916ed914e54c2cb47d295027b2f229","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":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793097,"updated":1567793097}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg34d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg34d8615c8/a2db7247b37542828248dff127680dde","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg34d8615c8/a2db7247b37542828248dff127680dde","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg34d8615c8/a2db7247b37542828248dff127680dde","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":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793097,"updated":1567793097}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg44d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg44d8615c8/a09ec8f9c18a4479a31c9f15fae898c2","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg54d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg54d8615c8/30231c450f7442099672d21edacd93b6","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg54d8615c8/30231c450f7442099672d21edacd93b6","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg54d8615c8/30231c450f7442099672d21edacd93b6","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certprg64d8615c8?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","kid":"https://vault4d8615c8.vault.azure.net/keys/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","sid":"https://vault4d8615c8.vault.azure.net/secrets/certprg64d8615c8/c19f4f38d5984ab580e967079b29507f","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":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793098,"updated":1567793098}}}'} + headers: {cache-control: no-cache, content-length: '1965', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:04: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates?api-version=7.0 + response: + body: {string: '{"value":[{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg04d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg14d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg24d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg34d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793097,"updated":1567793097,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg44d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg54d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8","deletedDate":1567793100,"scheduledPurgeDate":1575569100,"id":"https://vault4d8615c8.vault.azure.net/certificates/certprg64d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793098,"updated":1567793098,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793093,"updated":1567793093,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"}},{"recoveryId":"https://vault4d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8","deletedDate":1567793099,"scheduledPurgeDate":1575569099,"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8","x5t":"fLi3U52HunIVNXubkEnf8tP6Wbo","attributes":{"enabled":true,"nbf":1430344421,"exp":2208988799,"created":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"}}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '5711', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec04d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","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":1567793093,"updated":1567793093,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793093,"updated":1567793093}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec14d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec24d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec34d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec44d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec54d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certrec64d8615c8/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg04d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg14d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg24d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg34d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg44d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg54d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/deletedcertificates/certprg64d8615c8?api-version=7.0 + response: + body: {string: ''} + headers: {cache-control: no-cache, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.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: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec04d8615c8/52a2f4e5bee64933ad00ff0f2688cfb3","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":1567793093,"updated":1567793093,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793093,"updated":1567793093}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec14d8615c8/8d8d4be9e43f4afb90a36b89ebbcc070","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec24d8615c8/e5ff6c4e98f54ac19cf6fc0f8006d5eb","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":1567793094,"updated":1567793094,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793094,"updated":1567793094}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec34d8615c8/4cb4700e9f334d17b25d02a4fd6069ca","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec44d8615c8/1e1cabb89a144d6b87d07cfb10af6690","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec54d8615c8/7385abc86d964ca08b74f12c7cecdda7","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":1567793095,"updated":1567793095,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793095,"updated":1567793095}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/?api-version=7.0 + response: + body: {string: '{"id":"https://vault4d8615c8.vault.azure.net/certificates/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","kid":"https://vault4d8615c8.vault.azure.net/keys/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","sid":"https://vault4d8615c8.vault.azure.net/secrets/certrec64d8615c8/e39411d0bdde493ea8ffc75adc00d63d","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":1567793096,"updated":1567793096,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault4d8615c8.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":1567793096,"updated":1567793096}}}'} + headers: {cache-control: no-cache, content-length: '1818', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault4d8615c8.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..2cefe0a97d1e --- /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://vault8e271b27.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: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArt/7fe+CUKCornDOkD6xewF8rAocc0N/dTB7Z5TiHhIAOoBwzUYvrD9GU3WKKeSYjPk9OW0/Y9y/F7sJ2f9+XKi4vSmwWodToHJoA3PtbUURIEG6/Un8r8DJCPMVFRT9YchhuohFkRzHLbJFmB0AOJgNcKfNw2pHjFwjHJUvDqA2lUge8elA50MEXz2tTuu4jmEzwtum/IqAhuTEqJst5eP3xxJ7ObYT/71BiDu6QReCGbkh57RRvTJC45chxXw9Lk+chSYQs1C+fkp7YTgzJ2isiduqDbYN1c+kY40KgTdzQddYf+ldFf3WMrIq+0VXZSfJaT6MtpqqHRnFo+2LwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKzeZPkV61nfZ2dQW7KhHrYgYEiEaef8ms2n9cATIB8ms9d1j4HNOdX0d5g/HQgFv68h35YKqlbqWTGKu86nSkZN6QYwTEXSmi//N/3XTUFst2g9pcIVLK4juqMWkZST7x32KgJ7cXXw4e2DwTTG6TWrUxWEEveVKQ17vW9lIdWzsyv+n5RZCjumgRmM1tlIwLTFBSVvkjpGLybIvyraZHJNnbp7mDfU0OqGILn94f2rCTM3TjmMF4/jPloYhBZIxVekFp56OPAB4sUwM8uM49VmrJ414pq8wiGV/JhmLCt9PTXnmRzMZ3NCov3E312IIqqNHBbiz2kykn4FUho49CU=","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":"2fb80b7ac25c481582075cfae206d48b"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05:30 GMT'] + expires: ['-1'] + location: ['https://vault8e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=2fb80b7ac25c481582075cfae206d48b'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArt/7fe+CUKCornDOkD6xewF8rAocc0N/dTB7Z5TiHhIAOoBwzUYvrD9GU3WKKeSYjPk9OW0/Y9y/F7sJ2f9+XKi4vSmwWodToHJoA3PtbUURIEG6/Un8r8DJCPMVFRT9YchhuohFkRzHLbJFmB0AOJgNcKfNw2pHjFwjHJUvDqA2lUge8elA50MEXz2tTuu4jmEzwtum/IqAhuTEqJst5eP3xxJ7ObYT/71BiDu6QReCGbkh57RRvTJC45chxXw9Lk+chSYQs1C+fkp7YTgzJ2isiduqDbYN1c+kY40KgTdzQddYf+ldFf3WMrIq+0VXZSfJaT6MtpqqHRnFo+2LwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKzeZPkV61nfZ2dQW7KhHrYgYEiEaef8ms2n9cATIB8ms9d1j4HNOdX0d5g/HQgFv68h35YKqlbqWTGKu86nSkZN6QYwTEXSmi//N/3XTUFst2g9pcIVLK4juqMWkZST7x32KgJ7cXXw4e2DwTTG6TWrUxWEEveVKQ17vW9lIdWzsyv+n5RZCjumgRmM1tlIwLTFBSVvkjpGLybIvyraZHJNnbp7mDfU0OqGILn94f2rCTM3TjmMF4/jPloYhBZIxVekFp56OPAB4sUwM8uM49VmrJ414pq8wiGV/JhmLCt9PTXnmRzMZ3NCov3E312IIqqNHBbiz2kykn4FUho49CU=","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":"2fb80b7ac25c481582075cfae206d48b"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArt/7fe+CUKCornDOkD6xewF8rAocc0N/dTB7Z5TiHhIAOoBwzUYvrD9GU3WKKeSYjPk9OW0/Y9y/F7sJ2f9+XKi4vSmwWodToHJoA3PtbUURIEG6/Un8r8DJCPMVFRT9YchhuohFkRzHLbJFmB0AOJgNcKfNw2pHjFwjHJUvDqA2lUge8elA50MEXz2tTuu4jmEzwtum/IqAhuTEqJst5eP3xxJ7ObYT/71BiDu6QReCGbkh57RRvTJC45chxXw9Lk+chSYQs1C+fkp7YTgzJ2isiduqDbYN1c+kY40KgTdzQddYf+ldFf3WMrIq+0VXZSfJaT6MtpqqHRnFo+2LwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKzeZPkV61nfZ2dQW7KhHrYgYEiEaef8ms2n9cATIB8ms9d1j4HNOdX0d5g/HQgFv68h35YKqlbqWTGKu86nSkZN6QYwTEXSmi//N/3XTUFst2g9pcIVLK4juqMWkZST7x32KgJ7cXXw4e2DwTTG6TWrUxWEEveVKQ17vW9lIdWzsyv+n5RZCjumgRmM1tlIwLTFBSVvkjpGLybIvyraZHJNnbp7mDfU0OqGILn94f2rCTM3TjmMF4/jPloYhBZIxVekFp56OPAB4sUwM8uM49VmrJ414pq8wiGV/JhmLCt9PTXnmRzMZ3NCov3E312IIqqNHBbiz2kykn4FUho49CU=","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":"2fb80b7ac25c481582075cfae206d48b"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArt/7fe+CUKCornDOkD6xewF8rAocc0N/dTB7Z5TiHhIAOoBwzUYvrD9GU3WKKeSYjPk9OW0/Y9y/F7sJ2f9+XKi4vSmwWodToHJoA3PtbUURIEG6/Un8r8DJCPMVFRT9YchhuohFkRzHLbJFmB0AOJgNcKfNw2pHjFwjHJUvDqA2lUge8elA50MEXz2tTuu4jmEzwtum/IqAhuTEqJst5eP3xxJ7ObYT/71BiDu6QReCGbkh57RRvTJC45chxXw9Lk+chSYQs1C+fkp7YTgzJ2isiduqDbYN1c+kY40KgTdzQddYf+ldFf3WMrIq+0VXZSfJaT6MtpqqHRnFo+2LwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKzeZPkV61nfZ2dQW7KhHrYgYEiEaef8ms2n9cATIB8ms9d1j4HNOdX0d5g/HQgFv68h35YKqlbqWTGKu86nSkZN6QYwTEXSmi//N/3XTUFst2g9pcIVLK4juqMWkZST7x32KgJ7cXXw4e2DwTTG6TWrUxWEEveVKQ17vW9lIdWzsyv+n5RZCjumgRmM1tlIwLTFBSVvkjpGLybIvyraZHJNnbp7mDfU0OqGILn94f2rCTM3TjmMF4/jPloYhBZIxVekFp56OPAB4sUwM8uM49VmrJ414pq8wiGV/JhmLCt9PTXnmRzMZ3NCov3E312IIqqNHBbiz2kykn4FUho49CU=","cancellation_requested":false,"status":"completed","target":"https://vault8e271b27.vault.azure.net/certificates/cert-name","request_id":"2fb80b7ac25c481582075cfae206d48b"}'} + headers: + cache-control: [no-cache] + content-length: ['1239'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnBpWUtoQmpuR2s1UURwUFk1XzdXb1NBMWIwS0J2RHlfRjlfaldtd0V4RVBsMmZ6NFRjXzY5VUYxN0xGM0wxanN6MnlPS3Z1dmQxWHJXcFNpSWNlNDVxNG9sOTd1RmVjR3dmU2JSeW5NSXUzbjk4cGkzYkk5NlFWLUVJUUhHOFl6Y0s4bDJDM0ZhMXdMVlAxel9QZzgxRDZaNkcxUHc2TldCR29rLWpxczRQejlxTWtNYU9Ndmd2VTNBYUc3M3JNUzJweTRiT2NPOHpSc21yQXFySEpTdmdXbHpJSDJhOW5Wb1Y3aXVyVDA5SHVOQ1Jla1NtVkc2UDU4SDg1Rlo1YzlEX0lEY28yZ01yRmU3NXlrbTNjQnEzMXdsQ1F3emVUUkxvQXYtQVBpLVp6Wll0TnFaT3lhT1oyRFI1Yy1teXhaaGFXMUY3MkpKYXZEdnFtcGFheFBvQS5tb1VJWXpkcHZHWnI4UXdnTmdYZFN3Lmg0akhBanMzeFZ1Q3BaOFZiTEowU0Mxb1ZRMldwY2l6Q2JjVWtRVHBYTGQ1VS1kUW5Ka0F0YkVtQVVwMWxkbmRpWEswVG5obzFtRWlqVXBnUHVrR2U4Mi13aldLaHVybW9oRkoyUmNncGx3NmRvT3hnMUlKSVp6Z3dxY1QwLUw3OEl2c25nS3JUaUprZmJmMFpRRVJ4NlEzbTB3MGl1Q0lYZXlPMUxJQlBZTjZkYUV4TWI2dkxrRlVDQ1h3S18yaG4xdjdQNjZWQTg3ZWlHMDdjY2lmQ3RLQWQ5emZyT1RBaHo2M3NxLUhoUHdSQUlXQ0dFblFOLTc0aklHU1dHWUZmczNEQVVjNmxiWVJLUThhcVVSX0g2VDAxeFBUb1FvVXEyazFQbUh0aThxQWN2T2MtRWplQmtlT1kwaWJPV2hNQkJJTnJ6eXVNangxc09WMWtDbk5WYm5BemVuSmlmYlhKQ3A5MkFEaG5Jc3QtMUNOMVUwWFMxMW9LSVJ0blYxWVdFNzEwVXhkYnNVQjdWNW8tdV9kNzdVVkdQTG5zdXA1d1dLUTZRS2V6dVRjVF9EX04tMnhjTUxoX0dwZDJtUXpOSE5zbm5ldzNjUFY2R0VVVF9zT3lJREx5WnBvdDVIcE5mUkJuaVZMYlpFLWxSNGJRaDhITVA5d0MxS2FwajdRYU9yOWJIUmRvcmpSV295V0ZSRkVydWJFNmQ0VVdtTmZlazlLQ0lXbE44VjdLRlNNMjJNZUItMldUT3ppSnJlOEJkMERCYVRVN3J6QlRzdkhwUjQ5ckczOUlOQW5MSWhfMXJZMTZSUWNUTm5WUzhTaHB2blozOUkxZHgyQVp5VEhRQ1dVbnJXam9DOEE1OWYtVlRQNm53NHRXRUZPbXJ5LTNHUjJNX2h1X25wR0xSeVlNRUtDUU9UckRSNkhDTk9la245aGhtNWtRelN2UXhKWmxpaEI0THN4V0g1WFJ0R2N0Q1otU3A2Znlnc1l0WDZyNXYyU29iR01KdUFvT2lwVkZGQWRIWDE2ai16ZF93QUNZQ2l5TDkxOGZpS0NZbHdfcDBVT2VnRDNtdE55dlJEbWJ6dU5DZ21lNTVKaDE3RUF4dkkwcFZxNVVCc254M091eG44SDFwc0JMWWtxSUFiVHZocTlFcEVyQVRUVGVrTi16R3ViUnFQM3hNOU1kVWRhQjhiZXkyc2ZxMFlsNWJVdkdIUDl1ZTNzbUNldlFHWjdCeWpUXzlRM0E4aTQyVzVaUFNOakZxM3N3Y3l2N1J2bDVNNDRuRFNlMVAydTB4MUt0Qnc3bGtWSzlVd3VwTjdyZzNPdEN3bDJuWERraF91b290Ul9vRXFRcTZWWUo1QjhMaWtsQXFGOTNBX2MxUDVkZEZXSVYwTnBUQ1NOdmxZRll0czBZZHlXU1lpb25Ic2Q1RGVXNktkQkRfWTZwVXJ4LUpPcW90TV8yc0ROUW1kNHMwZDBHeEtPSlZVaFczaTVWRGt0NUJsdGFsRlB4czd4bTFaNE9QTVdfS1A5V0xlRUZ5c2l5YlR5MVNUelpLOVpfa2JsSEFCbjlVYUdhejdnT3BSdTBrcExiVzE2bmxvSWF2ejlKS2hqN3VVa3lVYlpkSlRfOVAxM0VlUTNHUjlrUUtiMFlLSGFHMGY1S3pOT2Q4V3hvT0p4cjh5c0JzaF9pcVFkOHNaeGczeHZsZmdOZHF2NDV5UUh3eGtOeFRlMklHcDUybmotZmpVOG50WVpZS3dVV01yT2NOVFQ3MzFnZ3hNSFQxLUVFSXU0c3hOZldUYnRaTU1ROTEtOEFJeXhPQjh0ZnoyeHJrZ2RqZ1ZXdE5oVWlxWEhuaWdmZ0dQcnMtLVJLem9zUk90a294Q2dHYjJsdGxhbkdyM2dnV2FHNl9lOHZwNjFBMV9qa0h3UGxVUWZHcGhKMTZTSW13SEtEU2M3c1l5NGVTTDFLWDRMbzBPckVzcVRLcU4xVzF2ZXNMSnVrbXlYQ0wzU2lYdXZzcElXWUpVM3VRMGdYZGhuckgwaXRHNXFWaUs0OC12WEpIcTdheFR2T2c4ZWxpRXhCVS11YjF2OEhRdXBISDYxVmVUcVhCU1g0RlJYSEpZUVpVQjdfc2xCclFGd2JOMUZFRXBiY1BhWXZzenF5SE5QV2RyNlBURE9iUFduc05IVzk4RDlpQU9nZGFJX3BZMDAwYlU4X0dzUC0ydWkwM0pJX3lGSDhsMGQ3c3dmajBxaTNvNDVZRTNDVXR5VTNsQm0wQzY5TGJyY0V0VFNXdXJPYzRxZEdaWl9Sa3NIU2NieXN3bWZNTHp0eGRvdHR0Qm42RWdKUGNxMzByTnBQa25YV0FTWUJsN1BKdVo4dUlKN21OWVhZYjdLNjZENUJGeXB0blJNdjQ4d3ZaZ2E1Z29Lbjh4NlRwTVhGV090N2FvUGJFTjlmaVE2TE5GRXloeklTRWZLUzA1THVhbEZGTV9KVWVSQUwwUGZaNmNac21JclUyTEpxSEhtMG1MLVRaaWM5aXh5NkJDM3R0N3RTM2ZVd01BeUE4azlLUnRDbl83TEhZY2xtNW4tSmc3aG1nZkE3Z1BRam1WYWNHZFVib004UHJVNEVsck5HMVN5WEo2WEEyUEx0ZGgxYzQ5SEV1bmMxeDFFWUpHRV9XcFFJVVdnejVBd2x1allHT0ZuaV9FUlpxT3dEWklEdmJ1RlZXMFFIU1QzRHhReUF6OTFDbm5mcy1lRHNUWkdHTTQtMkVKWm1rMGdnVkxZQ0g5N1U5UHl6V3ZlcGxxZGNyV25SMGliS1VZaUF3MDU3eWlJbjE4Zy1MdlBoMFhYbU9FUjNSbjlhQTN6LTRPUWx4cFZMTVd0TU1ibENnMmpLT1dSQUk0aFJYV3ItblhnUEhRQmZmR1p3ZGdqZl9WdUM4Z2hieVp4T1JHeTBDNXY4cmJ6STdZalFsY1RjVldvajI3YUMtM0p0UzhfVFVPWGVtdWJwU3VrZmU2TlhoVVdKc0luWHZrdy1UeXRTWGl6LTJfdFlrekZiNWk2b0QyVXU5RERYbG9FeEQyT3JTOFpFZm9ST0dpbjZMMFJxNEJXU195RWl4d2ZIMU5DYzN2WTRndlczVWlGLVBDdUQ1aDZpOHJ6eUxOZ2JYYnMxb2FySHpCSjZWVXBwbGdIcTZhVWFjWWczbTYxMldkWmpmVW5JRFpWdnhxTHVjbFZtUE5EVDc4WnVkcmlMX1JNc3drSkstSUlGdEtQRmFoYXppeVdwVnFEVlpqRE92TEdUVHB0UDRoR2Ytc3lpVWdINzFuNUF2XzNndS1WYlB4S1lXUmJmMDlibldyY3BZWXdqVnpsVnN5RlJHZ3BWUFNJZHBwaXgtcHlOdV9oY3ZYRkN2clY4UU8wNUZvanR3MmlXRTRDbEk2X0J6aWVmUXlqWENiRV9KalpiOV9fZUtaVnpuVzM0RlBZb3hDTEZ4NDFlNEdYbW9NdU4tV215Um9XeHVmcVZnRnZhR2RwSWxaOWNiRGkwUzNBc2VTajVJTnNCTmJJd2F6MDhPa2hCbllzd04tRUNrVHdnQnpJdkpUckprdk1uQmY3alVPNHZESlBxOWQzZ2llT3lzLTRBTjdTTjhpZVZLUkNtM2tqd1lRMjYtZkdGa0JHY2RRTGtic3h3XzIzRzl1U2lrUklKODNRZGVLZHE1R0Uyejdmcjd4WUNTemhIemJ5LWFWSjV3ZVdSZWZjcjdrQ2lqM3VGQmpnTkphc2RyOTdybzBWQmhhNFppRGlIelNUZ3pRemUtVFM3RkJsVjdMUVl6OFlPeTZsVXRpY2RRQWtCRWJnTUNKWFpJb1FhNmc1QTc1Qk9DTjJndGpGdk5kb2M5bEpoYW9xaTZjNGNPVVVqMzN5WU4tM2oyVnBEX04wdFp3RUhzMTdheTVja25lNGpUMG5sSmtCNHRRN0g3QUxzOWxUdS1fSUFuNm83anB5ajE2VzhhbUtEVlNBSkJJbnVmV0llMjZFQkNiVC10aVFjdDFJSzYyYk1kZW04aXd0dWJZS1Z0aXRrUklhTEFlU1pmVXVJMFVCVEc1NTZXN0ZpaG9FRGNKR0FiVXU0RE5WamVfSjVYSTNFQzVTcUxYZ3Nwal9ySHNaR3oxLTB2NFU3bGl3YlV4elJGN2pKdFFKTF9zV29UMkNzWU1HTU52MlhyN0lrQTFDdWdJemZUTFRtaEN1dFN4V3lYYmZFUDlZSHBFWm9VWENlenhaTE54NkowX1ZXZFhVdk84Sjk5VHNzTENTbWZncGx4QWtnOHZJSG9YdDk1ckltYnhMcExfVVc4cGtqeGUteXF0Mkd1eHRBZGhqSWhHNWVYM0szX0hCRWluQVJjLUFnVkI5b1lUbTEwUXVkeGdVUmd4bWtCZFh1b1picE1XNUxqUEFYcGREbVY4VlpYZTl3eHJMZFUyXzZFWGpnN00yOTRsSFYzd0dfRVlGampLWnFCZ2dyNTZaRjJSYVpGZ1cxb09nMkZhdVNBSzNqdGNPSkxQckdQWEIySWJIZWkyMFlYTnRJR0ZTNnc4bDBtWExRNi0xRnJUUzBnR2JrWEdGWURjRGRlMkx3cnFzOXlkMFZyaDRwUXl1R0VmQWxvLTRUNmZlVDVnaDNJUEUwNmtOeHlKVGxVMzE5ejM0Uk1KUm9JR1kyeG40cDhzVDRVeEk0bXVBcDZGRDFYbXd4dEU2VmUwVjN0UmJRSUFSU2JzX1hKcXpRX0lnRFpBVkRXT3lyb081TXNJVmZDVGhXODhIU0hheXlRVnZaWDhiQzRUU2JyUUQxc0dnRFMtQm5iOWNMSUVvT1lNWF9EcWNIOExSVkRYM0FRdVYwMGo5bWZlakpKZV9CZXZLel9fT2pqUXhTSlAxMTYxVTVPekJiOHY1cmN0ZjViNzUtWUtkNVhPd3F5WGhEbjlnd3pyY1NOSjlyOUl5WXB1eVkxUHVFVWdzSFRPVlh6ZENsSFRVY0NROEszOW14SnRYREMxZkZCeWpIRTdKam05SG55UG1NUF92OWR4OFBMekpocXNhdzhWYW5sQ25yd09kbmpQbTgyVFBPZ1FuRVRtT04tMDNoUmd4WVlDYS1IOFRuSVExMGxwMGpxRmk4cTlSVmVtMGlQVzFzeVkxSEY0RTNrWm1hNnNFRjVnX1RFc2xvcEhyV2V6TmEyTk42T0J1cWRCS21XcWVUb0J3NGxPVXB4Q2NNSUktbk1LdkZjVF9OczNyT0RUZDBhRDRZXzlaaHh1NjJnR01tWmN2ZHNkNHJQcExNMy1RWUdQR2IwaUd1N3E5bzZNZkhQUk5nQVpQTlRkajNiT3EwMjhPcWVWUHNVUG5tRGxYUnFpanhIX0dZMmZGOVI3OENjekNPM21IVG1xTEhURUFSVERZT2YtRkRWVFFiNzR2OGhQdmF0c2pPVjh4U0lid3ZMbGVPUTBPYXplbldrQnZ3NmRaTXAyS1V3c0hDMTQ4ZnlUd3NsaGxyWjBRU0h3dFI1TFNyWGdpaHExQmpPR09pNV84RzVkN09mSWZUMFNFUG5PbU8wX1lMVjIxQnFULU0xemdETTVRd2hlXzZxUzlIR2luZklNVFhpc3lrdVo3STVGZFJGZUMxTnhMS3BuZElnamVPY2g4d0J6MDQzQlVjeUxscHRrLXJIQTJwVDZRektqRms0TWFtT3ZacmV1X252SmUtNzloNmNYdEhxWF9mb2pGbEFoOGk4cnBoTEZCXzFET196ZkFPOUJCZkJaUkw2TktiY2lReDlIWkxnaDA3STJ6bnBVMDVfbk1XS0NrNTNJM1lnalZxU2tEcURNY0JaSUIyRTJUZUtQcTQ4QXlyYjdBZENYU1FqQlRyd1ctWDU3eHhpTHF4a2s2LXM1UEo0cGZFZjg4dlZoUGV0Rk9TXzNtdlQtYXdINy1EX0Z4a2FNVWZzb3BnVk9jRVR0b0poN2pvZ2xya2dyWXRJTHM3TWZBcTVINmc5WTlWY3R0LUZ1UTlzN01EUG91VXFhYzFDUWk1V0NFbTc1N04wTXR4aElaMTFzMTRmNExsckQ2X21LVzdlbnRfNzl1S19rVWFFUnZaVVBDaFgxX04zNnJtc0dSSDNHLXdPczJrbEUxSXhZYjZZZnRvVG11SkRJbTNIcmVraU9kUko5dDVLYm5QTnJoQ2hGYlZRUDhveW0tMTRsR3pyRnBwdWhPSlp4WFJEM2NRcGZVdW9HdXhRVkJvLU4zS3lHaWV5czZsWW10MWtWUGFQNjVFM2hXYTd3ZW1yeU82bnR4M2tNcmhhdUV3b3JmOWF3QlRzSlc4U1JqekhTTHUwWEpVV09Vbm9PcXplazdSUjRDTU9GWFJwX0sxUFFSU0MwbElrVW80cC1ObTQ4cTdJbUI4dktvZDdEc0t5RWY3c0JTQ1ZzYjZfRXBKU2lUaVpjZ2tEMElIZTU2YkFKYmxxM1lXa0hhUFhINEFZZFZSVC1MNzNlVTJPbWJQZlB6MFdWNkk1bUpEWHVDaXI4QjlaYWNQaUNqc29MSTMtUEZBSjZzZWFvamxYdkJrSTZBS0NldWJSUE9UYlRNSEdZVzVZS2pkT1lVWGpJY0NNMGkyRE9mYmZ0NHUzdWloeDJManVHLXN3NFVLVUdvX1M0cDBrNlB6Y1RTYjAzNTZJQWJ5VGRXTGdWWHdvZXQ4dW1VSEczYzB1VU9NcndyTkVud21Ia25hOFRJMFphZDF4dzdHZUZVS1VyVzZtak41X0VWa3RHNXFfdWxGOWlITG5oc0VHeEpfZ1A5ME9VZ0ZiXzlwcWlCd21TWnZyT09zUmVzQ3NtQUFZakxaUExaNkI2OXZ2ZVhvVlhsOUNoOXNjMmpxRUFKNE54QnNIN0lYWGxlNkZIeEkxLU83Ym5sSW9TT19tMmVUZXVtMGN5RVFrWFVGSU0tQ3pKNGp5bkFSd1E4ZUtwQVFUX2NTbmNldWRDbEE0TkgyZ0F6a0hYclJxX0xCYmdPWl9FdGU0MGxoaGY4SEhXRE83Yk5ySDdmMm95MDlJWXN0bmpIWDJDOV9XMmNhV1VsakJfZUxoRDFsOWxBR2xKY2NzWXhGRHVXWHd5LXlVdmhDM2lGejZxd0t3Wmc5YlRNUHhEVlVTZlcteUpURzFxdnBqUm9zN3FpNEEyVGh5SmJhbjh3R0owWTFCUkwydmhSVTNtX2hZVEpsYWpGQUhPN3JZeG4zTEgyRkxINzNMV2I5OExnRHF5WlRoV19aS0pQYnhTR2lLRVVmY3pDSEMxSTg0cXh0Vjg1ZVczOTFhZ1V1djRYbWlLME5QdEpkcHZ5NnJnVklXODRZZUJmX0RvYWFWRmFwY1g1eVpNZ2lTNnplMXhxalREN3RZMmtRMTUwS2pIaEI3VmZkc2xtNDVzeHRhRHc5eWlXWkEzdDF4djJUd1VmeE93R1d6WlBic0ZNTk03Q2h3d05DVHRkMlpYVG1QNXI4Yl9IYUZMbmw1OGd0eFNfR3FFdndRNGhHYUV3SFZwZzVEMnhFTmM2VnU2emtHbzJkaUJjLXFyejZBV0g0Q3ZhWnZJamRUdU1OTVAzOThDUGdTc3JIX1BmeWNQM2VpQVVnMUFFejF6dm41N25FV3E0dUF5U1NjS2FlSEdzQnNBUXpWM3RCSXNSSlBKdy02cTk0UFNZOTF3cl9vZ1ltYXVXbWZhSE5rcFA4ZmdfS2lrOEszUE5sc0FaTGZuY19lWkU3bURabDcwbXZfelBwN0pUU1FTM2R1eXpCaElReS1SUXh0ZkdxOXNCX0kwM2VtQ2tDc2djZXJpTy1aOTVQcGpmOFRMSjVpUVhfZnQ1MzZ3S3A3bXp2ZEgzeldETjliQ3NyMTlsek5XakxILWNZYWM1ZGUzTnV3R2RFa3FKWF91dGF3Zk5ZODZVUG8wWTk4Y0sySzJiUFdyMlo4V0ppWlIzV05rZnY3VDVfZGZ4VkhrQ0ZnbHVuV3hpUjFQTGRyNmlzT3ZxalhPS3F1RTRrOVliMXlvbkVCVDV0UXFPU0d0NWROYS1yMTV2VFRIWHMzYUxENm9CY3FQdS1zaUo3eUtmRTJ5dzdfQk5qQnRZT00yY0taOE8yVG5JNEdIcklpZ0EzTGF1V0R0Q2hOb3lLdEJKQ2MybHZ0bEd6ZlZxWTFDR2hyQ184R2QyWXcyYWtTY2s0NUtlWUc2dEdxRHF4aFpudlJuUWNoY2ZMT3I0WC1nLWhxdXNCV0tQTTQwVC1VY21Bc0JCLWtoUGNVNlloNXQzOGpCODRpN2FKNFlXeTNuX0xXWGN5SWJLNXRSc1hfRmN3RDRpRlA4WGc0QzhpNlFPdTZqZHVJUFFRWnF1MExQV2pjNS1FU0h5WVREUzF5a1VXZ1VtLUxCcjBGVTlRWnhsbWExd3dFQVc3QjI1UE0wbkltT2JMeUVjclczUFJ2eXVfa2FVNC13bnc2TjVzRHlEZ1Y5MUc4UUp4WkJkTGJScnRCZkpUcXZmU0tvVVU0SUVkRUpWODZ1bTNKODloNllXbll2SEkzM1ZxM2JlbGMzTWNBRmt1ZkJtRHN1cWMzdmNWNUVZNHpvNEhQZ1RRbE15SnZ3RVVPQXFwZHRoRENCRzJrUDdlckRrbWtHc1pQU2JsMkZOMEd0VFdJYTJ4SUdWN0hiU2FXZlprUllZeHo3VlR3TWJzOFpOYjluQmRpb3JFV1dDRFpyQThJRWdiUFpnZnlmUGZLVmtlUGNWd1dmZVNHWUFxV2padVFYaWZLQ3NqMnFkLXgwV2ZOeHlsRWc3bkdnRVVuaEhseU05NlJiTEpZLXhGaElRMTVMZlljM2hkdmlNQUxVZWRtOGZrRE9YTGd4VzRaNjZ2ZnlmX2F1Y1pkR2xWanVfZ1poVUpJbnFIX0NtYUVCWXJnNTFUUlBsREtrUXFjTExuX0RPZ3hmZlF1OXFKOVVTUHNVTXRLLW5DaE8xM29wSlJ3SUtQNExHNldvVnFBUVV0amlXMGRiTG96NnRqODNHeWlwbkFGblFfZjJJM1ctQXRCVlNWUkQtN0o0WEZUaE55eHl3LVltTGhzUWV0LU1TQmh1VVQ1TjZ1NDdfN3E5bVdJU05kUlN6WnNYOW5ZdDVfak9LdzJzOHcxMk92eGo1eU5JM18yQVQzZ2VsSEt5Zi1Xa293ck9DVm9vSDhDTzNCWTVrY291YWxxTmV5eF9yMXBzNXM3cEhJNE9nUVJPTkpoM3dqNHljelUtVmxiRmx1MXB2U1lWcEllNzB3VWY0c0dzZzNRdUdMRFBydk5RZEpoeWJLN2Rsb18wcng5R1Rkcl9kTjVRVGE4YnVQOTRodDdOcEZlejJuYXFuek1mRjNCS1d6TlR5SjhfU1BpY1FWdEU1ZE5vUmwxcUc1dC1mUlY3d1liN1p3QkpzbXdUbGpGYy1hamp1SWNHMUtZR2M4MzU3ODQxOTRwTkJLc3p1emRJd19SeV84RVluLWJLcFI2WExkc3o2bERlWVc3cXdveTlEcTFxMG9aVHZsN3BXdDFnOTNFV1NNYzNzb0szMzBxS0h5VFppUUpKQzVDM3AwR0VXZ1RQZGtJNkhtVzA5Vmx0TklNT3FWN2NYYi0zOGc4QWFqNVd4djhqZkpsYnpwVXJ6MjlJWkd6Y0lmV29pbUhOcVFkdFB2QzJNcktnX29Xcld2N1dsN1o3WGYyeENoQWdoS1lTVDF0S3F2NEZHVkNCamd1SExWZFpyNVVBUDB6MUdScGw2OXF4a1hPRERHbFhVcjdQYm5OZUxoVk9WR0VrOGltUFROekJUeUx3clUtLUdRaTY3VktQY0FiajZLOU5qdnphQ0hkYmtFbU5Ud2FreFlaMUMwem42cUcwVDR5M1FDa05ZV09TVlo4dWo2YktSUkR6VE9BTExnbXB4V3ltTEx0TXMyNXp6YVVZM2xSbENNMl9sX0d3RjBIOE9FdG1fREU0VnlyOFBZX2k1dTE2ekFHWkRVVmNiamhncVo0S1VCWlJueTJEaTRKaklYOENWVkQ2NjRKWEtNMUdoOVRVTHFyQ29QeGdjdHdOTmx0cUgzWHdERGc2V3B0dkdfYWEtb3FQY3VQa3o0YlJFcG8yQXdHeWdQY3FhQ2NKeW1NeTV2SjU0TlNhN1BNQTNGV2NaZFRNdEdXNThQQXpiVmZ1VlNUMC10clNCRzlVRlVWWG02a0EzT2xwZ09aMGtCemk3Rklwc0sxa3FobUNrTVRRdGlLWThpUmpmOEhnQjhWNkM2M2lGcVJmdXdSR0w2X2wzOGY5X3FydlBXTlZCTkh1ZUJkT1NacGhyaEhveEpvb01YdUlrTGh5TWdvVmNjb1FDdnN4Z09OdDVGTGYwMUxMM01PczAzamppV0g0TW1IR2ltWVp0MGdsMFJ2bVBUSjF2TVp0dEZiaklXa19nR2d6VlJ6WmZhMC1IVkZ3OW51TndyMnVUM0JQTUtORHRCclZXU3VoQzMzSF9MWXlPV09fZnRhdGZzNk15NlVSb0RFVUZUcHB5bURyd0xYdFl5c25qbE1mWGFrTHktd3dVVy1QUS1oS0FXMXR5b1N1eW9oamYzdGR4eFN2RzZ3ZW1HMFJMUHdaUWw1THZ5alZzV2VYd2ZURFd1b2tZZ0QzLXJWdXB6V2xDSS1JYm5YWkRSU3JIZnc3d0p4TzRRY3FrSlRVZXRoSzN1U1ZMSElvdnFZaGFxazRHc0t2MUJtZjJwU3QzVUxQdUQwdk1lc1Rhc0hZZ29sZFhxRG4xMWRGZmtXNkgyajBFZElYQlhrLWJ1dThOYUVUWXFmbkVHZ01mTFczd3p4azZrekRqajZNaHUxTDFkdXRCeFZZQ2hGZm9TVVlXWldPOTJETERvLXNqeUU5RHp0WmJsNUkzZWF5VGN6ZlQ2ZW9EYkpSa1Q0VHNwQUstSW1hM0hWbk1jbkFfaDBCdDZBVDhsWndVbXdBZS1TOUo5aXg2ajJKTzBocVJhT0J5ZW5rMDQ1aFh0TWhMTl9idnY2UHNsTjZWS1NIZm1CNC04dTRacE5UZC1hZjhqWWpxaXBocFJLVlNXQjhoYlcycmo3NUxRUG9acEJHM2MxTWFBU3l0T05aQTRBbm9VWldEYVV6QTBwVXZLLWduOXlvRzlZUjBNUXp2MnV4YV9oVU96VjdGS1dzRlViWFpBUGpfV1ZZSGhaZHl0eXRIWUh5V21FWXJkYmdScC0xRmloRGtpZTNNOFM4OXBacWtBMjZuNlhMQ0tXVUE2MkczV2pfZDRMaXB4aGx4SkY3cVhxTGx6Y1diXzZlZFhsVi1qSlRILVVid3ZueE5lX3d5WDZpNVhYS1ctcnctU24yTFRQSUppNXl0ZzFUa25FT0gyejVDUXd2dHFkVW82aHlJYlRJZmEta2RKVXJGQXVyNG8wQWxITGN2S093aGdrQ0IxYVRRZjlfSHgtbjBNc3Q4OGZMejJINGJJN1l4R2puSWc5ZXVuZFZMTFYwclJqVW1vclhmTVBYTy1FTUJIdDZrSlpOM2lKNUVjU3p5UzBDRU1fUU5oZ3FxLWxWMk5xdXB0emFzaFNsQ1JiS0NmcFBxRGNCUXJER1ZVSjZLMWNaQjZhWEFiUnlKVVNVb1pHYmRpaW53Y3h3Y1ZPT3hDZ0dyd0JiQUh2Vkp4ZW96bUp3RWhoQmRmREZVc3FYUHRVRk9XampaTVk5RWFGQXhEd3FwTEJPTzRTTVpPUzkwVndNaVdweWdPSXNsMHUwRUwxbnMwNkFVZ0VpLS1fcnV0b19TNjl6RDhMaWR3bjl4R2ZzaVgxc003dUp5eTRRLU9va1dteE82ZEkybDhVMFJ5R1NWek9mbmhZbHFVU3ZvRk82ek5helVlcXdhc2dlcDlPYVJrVFhGZ01RYnctSDBQTHdmTmhLT1Y4NEJkZkhPdks2X0tETW9hSEFxOWZrNWc2LXhIWVhKQ3ZDcDhZa1ZZTGdwRHlxTjZFVmlxMzAzSnktZnhlMEFNS0VTcVN4amR4MnpnNlZ4aGxuMDV6dWY5QVlvd1AwR0t0YU1rMkpqdnlPS1V4RWt3ZWx0Ukw2MkFpZno3VkJOWFBhV0lfU3BZRDZXN2h0dWVxbThGVUo2TTFOOG9Rc2NhOFFROG0wdXpMd013cG01em1SZHUtcTg5Vkw5VkNuTzlXdTBxc1JKSDFmNFk0NU1QZXYzbVVDQTI1dzZUNUI0QmlVV1dJVEQ2S21Yb2tmV1ZwVHVEMXdmT0JSY0Yzd3FIOE45QXBfbHJMbW5UWnYzVkx2cW5qNndWYVNQWlNKeW1KcGhwdDJxdld1M1d4VWRkM3RIaV9VRGlJZnNrTk9SaVRvSVE2bzBUSVI5Z2JVNGVVTDNWeVVwTzQwN0lTdXo2X2N4SjlNVTlRREdSaHJXd0ZBQUFIelY3amtXUE9FOHhsQ2s2ajlxaGIzN0ZES04wZkFweHRPQ25MSWlxcFVSd2ozNmMzd0F1aHVBOE12bFRZWWUzWmx6WTlLWmpBZm1WeFdqWEJOTWcyd3NPNGhCWGU1dHRteVBJTGtlN2l1bERrNWMzY0wwVzFneDJGUUpmOUdDSnNuUDB4QTJNd3FpazNSZC1JaXVfNU5lRDB5M3N0RmktVVRHaGtySjEtcXFxWkc4OU1ySWQ3Qk5TcTEtckZjSDMySmctZkFVTS1KbS1sUkxJdHVZUFBjWFpZeUQ3MGhBbjRXVlViYi1haXBnWWoyb2FWMC1OaVhmRWVxYlpJME1TWnctTnRDX3IwSV9faDNJc0xlbVhuR2ZvbVJNbTZ5SW51Q0wwdXdOeV9BRGx4YzJlclBKS2Z6MW9STmhJaVFOMnRMeGdJVE0ycUppeFY1aTJFTVhaeFNmby1TZFQ3X0NvVE80bWc0VDhhZ082V1dFa1NPQ01YeFRHUGEwamtfTzhBRUtzNUFSMGJfZVkyNW1YeXphbDViVlVlcmhfY2pKRnlTQjZXY0hHcTZ2MC1LOU8yUy0zOXp2SkQ5RlpLVXNrM3VJYl9VZDBSTFA5RFhXLUgtWEpFNWJPY2VvazU4QWtQU01SQ29wVVp5amhvdmxnV1hWNVVJWmY3RFQxTWlNdUVWS2lDWmFyME93eEVvcWhHNjBhWkduTkRRWlV4TXdhQ3k2eC1ZV2p2aUxvbkU0N1hwMkI1U0xBTkVXeC12a1hJQWFvLTU5V0lsTS1Ja24xblZyWU1wQmdsX0JUM2pjMnFFRVpuVWlIb1lfM2wwZ0MwUTZLVVBub09iYXVkTHdNYjNOZEctNjE1ZDRhYUo3dlg1LThnS1NDSVExcEFXXzNPYUJIVlRtZlBJTnNUVnlWaEJUR2staXhLcWJaTWp4QUVlcmRQQjJ2NlZ3R2VfdGZCUFdtM3VMV09Zdi1PRm9MWUZQTTdCS1hmUkVCYmdqWVhuY2JDTzAzQ1ZsdDRLNDFJQnVlbVQ4YmpFTF9YUzVRa004YlhjNUE2ZHFETER1NTBQSm1QLWM5MkV0Y0hqX0thcGxaTkFqRzVmM3l5MVlIM1AzeFZXSjl2SkRGamg1V3ZWRm55LXkwYm5PaUU2SE04ekQzT1pkaXE2bFR6WjlHNHV1ZGc1NFR3dDZ3RC1MYjBGenRpUUVTZDRpdjlvbXFDZEZjbDl5eXcwaFkwaTlTdVREMlRUeEkxMjJscHZ6dlRQZ3BobGpxVGxCRVMtWVlzZmE3WXY0T2tOYnNYVXJVUUZVQUxXVGFHanZqcUltcFlkcVNsMkViM3ZWRlZGOERTNXdZUmhJREpfRkRqY0V6TlVkQ200ZFh6RS1jRzJLTkpSRm1JTW5XNEgzN1pqVEthVkppcVBxN0dESnZCY3E0SlBySmtkU2s1emR4THVNaEtHMU9QTXdMcUZTS3dUeHdXQUMxdXUybE10NkRnYnZrZUJKTThta3ZCa1RUSEJDRnZ2RF9IMDRPaWNVT3NhNlVDaHpocnBQdl9fOXdzU19sRFlqdUpGSERrRkZTNWFnSVNKdjN5R3dReWtVNHR0RWd6aS1Pay1wMTQtcVJETGtfLXg2ZHhWMmdGcDhCUGVYR0RaZ0ZnS1haYUxPczZzTlV1MGFkWHd2TGlnS1JmSE9DWUlMSWd3bjlEdjRrLXpfekZQeWg1al9TM3pPb2hhMXVYSFFNV2F6UTh3YU1nWTlJNjctSHJ5SVRtOVlzb3JHTHdhZnR1cG5NOHppNnpmSWx0Qi13dzBhMzRFdzZFZlQzdWh3V1V4dnJ2Ml9IaWxCVHFVUHYtT0N4MlpvSVZnMEJLMi12SDFZSDJEMTEyTTNiWDZGdUdmUmwzQktSc0xrRnVPdm1IUW1VVFl3U19ONVVDZXFCbTJ5Q0w2SlZZUDE2Ry1uMFBkOVlOUk4tcUFyWEpZV3Q4clhFS3RjQkFfMWJWVl9ISXNrV2Fwd3RwQnFmb1hMSXN3UHBBblduWnRLY1VhcXpTS1hVSWdpR29MYTJZOGxUTkxqdkh4dTNYSkktbjJ4Y3VWaU9GUlVYZVB1bHNWNkFzQjhTWHFOUGhfSlFRR1o1NWMxQmdPYi1JTVZIWG5MVUxjNUZMN2VzaWNRcXJXSVFTeUJCakFZaVZfb3BOV2xFZEt4ZGZOX183dy0zaExubDRwZF82QmNyVHVUTzlQT01YR3RjcjY1MUNwZmREYW42bWczQ2RtUlJEUE11YWJuNjNvQjNMdGJpcktHRnJuV3Y4TnVKaThUb3RiaXdKWjItU1RMSklna1dJdzFXMkxRLWRCYkVoQ01ZcXU5V2wya3pCbS1NdGRGRVdsSzhmTHBXUERNSExoRHAxOGJGT1NvM3E3elRLazlhUW91bXU3dmZPUGhWQUdGYndrT0xEazNVRDJkT3RxX2hJbFh4OW5NN2FyWkRRRUwxTkxPeUZEUktWTVpBNWxBSk96cVhTR2UtYmdsQmI0bmRWajM3cnM4cjZiNTBfU0hwd3JzM2JPbkZfaEVTWkhXYnE3a19Hb0FBc3g1SHB4cGctR0JxVDBQZFZwOXZkZlRTeGI0eWtCUm5EWU03WjZITlFiZWFRZURPSHFRMmtSUFUyWlZmcHBQRF9RY3Y0X2hlcG5uV2xqVklVaWJHaWxHdHNaOUU3a0ZCMDFsVUtUTFFCMTB3Und2cTFBbGFXMmlMN19aVHh5eW9iNHFhbE1Fa2NNR3J6Uy1EY2RKVEF0MEcwYXV3VnlVTmFDRlpKUDFEWWdfckVHSHI1bDFEMkxhcjFwc1hRLW1sQ2NtZkk0ckVCZlNtVnRMQWp0dFBIZ1F3VGlON2hpR3FJMmRUZzJHZ3VjRjR2T1dFTzl3dkdCMkZDSGFENm52Mlc5aDFKcFFKQUxQdVA0VVVYNHBvSmpfem05MkZueHB6clk4TGlrMzk4NW9wNjA0cjhBYW5STnhPUjM2Tnlhc0ctX08tRG5jcmVJb2NCVWxhVjJNTExENE9Fejdja0RsaC1UbGdIa1lMVHRyTmVHS0t4cGdfMllpendsWXQ0WmFuanhJRDVPT0F0VFVqTDZ5eXRwTnNtS050VlVrLVdUYTdpU29XVDN3N2REWHJGQnlQMGstSWZteGpMVUdXcXdlRzcwbnhmNmx2S3kxOXlsSmJyYk56OVRWOXhMZEJlZTVvWERQaWFNcTNIR3lIQm5uUXpiNmluR0NmN21heE5yNVE3SVN4Z0JRZVA3OVM0bjRRX0RWUVE3ZU1qbHh3N2ItZ1NSTXktaGFaXzMzTmJfOFZ0SUFOc1oyTHFlbWdINEJTdzBLWDZpZkpDQVJsNVNNTE9na2hnTElzRE5qVnM2UGh5OFBDSnU1Wmx6azlsVE95cUZSM1BLRlFaWXoyZzFaMXdFVzFTZ1IzUEZZZGJkQlNPOVdXQTYwZXFlaUh3c2RRSDBPZUEzRE1zemlsVkVITDRTZHhWNnl4eDZlSnJ6LXhiVmpqRDNBc3dOelZ4SDZQZEgwSWZlQ2xJc0NsbkFlaXczRGFxODEwTnBxWEpOaldES0pjcDNLakYxcGlqRDRxWlBTM3E0ZnpPRUF6ZHZsTmU5dF9QRThpZkRxSnlLVUFJNmZDVGhxZVA4RzBGLXJSTEIydDh4TTJQeVM4dkpUa0hoWU11RDFQckxkRWwxdEV5ZVc4NktMakJrdzZxcUU2MWVQNFpJM3pmaUpSZENzQ3I0V3FQbHk5THgyYkNZSzJiTF9HVURTMDMxRGRlUF9JV01aX1JucFNqVGUzWWh0UmpyUEFwSzZ2bmxJVXhveXU0M2NpNDJSdmtsQ0N6NGtmS0JfbnhMZFREVEtpeDhZT0JSb1c5b2NvOVpvYUxoY0JQVml3SWxsd1pKRXFMOXRHMnJSTktuOERzNld0eXJlSlZWcGIzZFJwOThyb3JZUkw1cGk3UDllenRLbTV0TjFrOXlrU3BYRnhCNFpkZVlWUHNGTHEzQk1qS0RfVF9XT0RZekhqaG5FXzYxUm1tLUZ6Nlh1ZWMwSDlqb0VxbDZ0dVdhaldyT2FYXzA1MjZCYTRzTDgwOUJtUkN1UUR0c2pXY19TV09qTzZSSm1ydTFtYUhEOENsRWRVNUFHZFZfS0JvdUIteWZ0N1BCenduMjM4MDBtUmJMWlZrejRUM3Y0SW4tdVZFVHdIWEpHWG5tMHJ2T28tS1A2VFgxdmNfR1ppRHNtQlhWbS01aHVYWWd1OEVXRG1HeEVjaFlIQ3BYc0VtcTl1MW9tWGRqaGR3V2l5SWozTWQ0YldCVTV1U2cxWEdZckVlblJJNm1DRVM1Q2xqMHAtdTNwRlJEOHlkNkowdi1qb3hNWmo2RDlBbFhVdzlFcFhjdnZUQlZ5eW1ybnB4VkF5dkV3S2pjXzExcDBkQ3hCdFdIR0t5Zm85QUNzRHFsaU9BMDBTQTQ5QW01aHk0alhseU1vV3RXc2lUZGFscElPMHZGRllXSEFrcElzMVlIektEUmNsUUJUVlFaVHVIUzdpQ1NqZmlyek44cng3TWZqdGd1cjdFS21wM2Z6azN2aDFRZVpvQmlZTmExYVJidGpsU25IWHNjZ2tNeGc3UTloZWdYeThyRUFNaVd3SW1QSFlna2wyY0NxM3dEazVaRFBPWUFTMmZueEV3b1I2cE9MWVZTX3BlLUM2WTI4X0NLVm5OVmdrN1dwZEJqRVhzU0ZfZ2pUN1FCcnBtSjNraUVGME9UQmc0eGlqMExOaG8welhaUzBlQ21wM0E5ZXdYLU12QnVmb2RzZllMNk9QUHpEb2VPRnctbGRQdU9mbkRsUnpwc0VZMEVVam16am1kUHROY1FsRVhJRVV0M1l5X0tkeGdkS1JzRktXX3d0d21rWnFoajdiRGl0ZkVIcVc1VVFjZ19LWEExNVN4YkJuQnZ4NHdCcEtFTERFMW80dG0wTVBNTnFsejl3Q0FBWXpGSFBud2YzaFVNVUdBSUUySDFFVzFqam9yakVNdDN4amloblhIVXFOOUFoRi1VcktVQzd4OXJDTVBKRWw5Y1RwWW5xTnNyR2JnajZLaC1qV1QycThrOUhaMzZqNmZCOEhISmF4UEwwVW0zQ1Ata2ZOR1M3TU41Y2h3ZWZ2UTZVcHJVMVluLTFoWldDeU1Dd1E4bWZXRXd4Z1M3bmJIMFNlSWVaZ05OVHdwZVM1R0FNLUFBUlU5enJFOGN3eGRGTDRHcGh5Q3V5ZXMyd0Uxc0h0dEFLMFd4LVR2dGVTdUltbm1VTDNWaWJuVzlWNE9veFlac0tVVlRzMjNLR21Xd2R0eU13ak5XZVNWSUFyeVRoclBBZEJWaWRNOExVTUxlcEo0Y1lUTF9fQ3Vhc2oxUVo1RWF0NW83NXBzbExQZ3pKQndhaUF5b1JMWW9ZZzhlM1VzekNGTnBLX0pkYzhiSTN3TGNQMmtSNlhMMTJoMnJRMy1JUi1QUEUweHBVQkt3TW5DZHFPWHRQY0FqWmpCSlYyVWlId3lOcXVNRWpoeVNkVHNuNWlnNEFmanFSUmpMSjFDX09PajYwUTJ4T25YQThzWnlJRE84NW5jazNOVDRNY3Z0bm9McEF2NURIOS02dUZNaUE4YjZKbzcwSEtLNTNXQmhKb1pmYmJtaXZZZ3QzYkhsdG9nWVhzcW9oZUFtTzktZmFUN2lrN1NXMGJDdk1lZHM5cjJrM1k5TEphWkVZSFZJSHFoVDlzTnoza2k4aTVSN2JaUXVudDBLVnRNNl9nZDlMMWdrVFd4UGFfNmhlc2F1dVA5M29TcVRMaFVHbHZUUDUzQW1ZazJVTm00dUFCSkdXY2JQVC01R0tWemx2N3JFQ2tnVlpENnNGS1V4ZHhBSkVIeXVPOG5MaG1ISWtLbEh3TTlsbjl3UEQxZEtKdUxiUFdIeXMxd1BCcjVBMm1GM1lBR0lDQnpvRDltck1mVXVjaHoxNGZCM1R3WEtQejA0TTRSdlk2bmhQMjJsZnB3MEgzV3F2Si1TN1JnMmdFckQxdEFPeWs4TG5TbVB2U1U0YnJLRWdQN2lPWDdjUThrbjFZSUoweS1VUzgxaDh6M00wVHdEclVVTUFiQzRDVVkzUi1CUVpvUVRoZ3UxTGpvdXUxTUhmbEs2S21LM1B1QjJPaU5XRHZxbzhaU25yZ3BNOGthUUJBOERZUWR1ZVBtMGNIbVhuYy1sZllUMWs4XzdWeE5uNGxvUlVQQmFEZzlzQTJOLThKWVFiNnpVcmIzY3Y1aTExY3pOWl96T1JoQUd3T1FxRzM0MXNxR3p5N1JGUFkwTW04YTNqS3FrWm5PSGJMTWFvUEdMN3I2ekVJR0tCajU3UWFfU3RheTlVRG9VajhkYzM5QkVYYzZnOWZDenc1SWs0bFNjOGZrRlpxblhYVWRIc0p6WE5MYnI4Vk9yd05EMnFDSzcxb1lQdVR0NFZqZXlUQ1N1Smk0cEI3c01YakJkRDRSMm82bUFRbnlObFRGU2Q2b3NiOHdqcG9nSDBTNllRSDFaai01bEtKZERWWWxDQnVvNldMcmRyeFlEdzhDbHVNUW5QQUM1US13TlctUnBhWmtZcEt1aTgzem13WkktVFJoRm9mZVJEWVhITFdlY00yV0FrbE5Rbl8xeFItXzlDNmJuMWROM1hCcVI5cFZjOGNzV3Qyc1NsQ2RkdkpVcVJadW9TMVE2YzJSbTBWYWZNcUEwZE14eXNzQmloYTQzWnNuaklheUwtYnQtcFl0NnlRX2ZSVk5aQjBrRVppdFdZNll1X2ZqQVZuYWc1RXJTdk5leFdSWHVvOW9valY5c09QZHFSQUxfaDZjWG93RFg2TmpabDUxN0JVc2JvWUplcU1nZmRhbGZKUTdISGNpU3ZaSnVrcndoSlJDSDdncFhtQ2pBOEExVUNtQUpwVGNlOHJJZFBhb2Y2OFQ1aElCaEtldmhwZzI2enpzQ3M4b1VxWGdmdDVTei13U2l6emhUZWhJSmNoREhhdk9xRUZBZlVMRWlEOC0zOTUyZXAxTU1CLUdJTnpDb1NuVHJZSzg0bXVEUzQzaDZva3pJc09nQ0Z1SnFfX3d3ckx3TWdMMGNFTmxjaVdmbDQtdGduWjNMb04yVXlJbFRkQm5BTzZJNTYtS3RCbm01dktNWnJ2cnJ1YlpXRGJaYTVoNldXRmxKQkhlNkNjOURwcXdVcVRDTXZMZWxHRzI2RlpBYXhIRTBSQTV6ZFYxdXUtTTlYNGhNd3V1V1NVS1BES2RsSEtXT19naHFnZlY4M3B5Q2JNQnY3eWt6SUdWVkJ6LXltcHI2WmVoSjNDenhkck9Ka0tKSGszblluTWh4UXFVLUFQS3pUaHgtMlBWTG1WblQ5UE40RG9PYzdMamxrdU9rVzZLWUVyRGdQdVBQdTYzVHRPWmdRejZjRjJfUzh1VU1WN1pIbVhlczlpY2pTRG1DUFc1SGN5cGoxT3lxakZHc3htblNJeTE2M0NILWdRREw1M3ZVT3k2ZHdTdWdfRHFTdDc2ZmNGVVplbFdCWDhkal9OT3B3NXF2eGlSZFRYTGw1QmR3bUJnaHhNUGtzNlFBalFaR3l4YXZKbFg1SklfWHVGZkxsVFVxS045MHd5b2RUUUkwdTUtR19ieEhUei1lZUVCYXluQVdzc0FSRnRYMFgxR1M1TzVaSHMzTURSY3NkcUNQWkRCakxySy1TTTZJNF82cXRHaFRXekRnS3RwTVZKWDVDMG5yZ1AzTG5TUzhIWVNSU0VPdmpkM2w1MmxyTVBLRk8zSW1lbFFYbW40V2xDMDdzanVjWlBtdlJRNWdxNjdvOEVZMm52NmdpZURibnlubGFsRS1teDZFWVVLWUhuV053cmllVDc2d3dqaG1QVmhaQVZLNmNFeG9DMHRyVDVmYWhVQ2dsMkdHZkMzQncwMUo2YVRWMVFCUTRTSGItY25Cdm9DZTlQSmZmSUlQQUhZb1dIa1kxa0dKNlRUUGJEQVBUd1Q5THZOS3p2OURqQ2xGTjRMNkhzTEhJRU51VWF4c08wdmRCdTJhdUxQenMtWTBTQy15SHk4elZpN0pJR3pjVUVReUpvTXFaQjllR0E2V0ZCQnJHTkhNYXRSYnNwUmthb1VSeEFOa3VuQ20wNy1Uel9pekoxaVcwci1Zc3BTMGw3OXg4TG1EeTNvWmpzUGpiOHdna0FMMlBlVm9hLXZVVzQwZkp4aXVHWFg0bk5mb0ZVYTlyMHhQRW1zZTllYWVsTU0zbmg4RHpBTDdLOUZQelJfM01wTDllN2pVa0pjYUxKUmR0bktfVzhvdE5MdUF4cVR5Rk9RTnNLNFNVcllkT1d0UlZDWm1janVVNzBHOGRJbFZSVncteHE3WVlMakJiZmpWQ3Q3QTZFVVRObUdmU2lPMkpUbFR1RWhGY2JUVnVyM1BlY3Awa3g5dmVFaGNqMjlXZUtJeTUwSENPekVxU1gxWnV6cnA4RGgzd1haSGpna1EzTjRDYW5MYUVYbnNzSHJWUnpYR2RiUHI4R1FWWTZ6OUhjMVd6MVZ1ajhCVWR4bUhZYWE2T2hXWEN2bWt5eFFfYUhjSWh1UXY5Y0c2U0J0VUplTkhSQ0VkR2U2X0tfaHR3cFZjaXJJWW1pbjdpbExNWXBDQ05CSVp2R2tvdTdOMjNDVU4xQ1llZVp1MjBVTjRnVWdjTlp1VDlIcmJ1Wk1HUldpaERyV21fRjZ1dEp5cnc5LUJlbVFycHNhSGlmQVBTbEJ5WmNJZ1NTZkZyU01qV2xrMkFRRGtZR1E2Z25fQm1oZHItcF9BTEd4M2FFR2NqUW9Bakc0Z0tzQlVZTkdFbzNxTXM2TWIzUnFUYU1XWGlIQ2FoYmd5bG9qSGVONk0zQ2lzdGllM09LVEY1NGlBd2xET0FfSlRkRWYyaF9hd3lYMUljNGRZY1ZSRk9USEZkTnJQZTF4b2l0Yk9GLWR3T1piUms1YUZlNVFwSVkzWTZUYnR2emc2MmlMQ2RLU2taaGwyWWszZ0ZUcHl3ZmdPRV8xWEs2MGRpZkpmMl94WDRxQTdleG1ULUFHWnFBSHpLeGhJRVhrYU5pRHY4Y0t5X1JzcWRod3k3enpkYWozb2tQN2VhcThRakNBY3JWcFB6SU9KWVlnNzdiSzFoQVFvNG1lOW4wY0tXbjRJU2hzWVc5eGZ5YzBYTVNQd3luLUtLZ1daYTlxLXJXTzNYb2cxaEZsbWhWS3ZZZXozTlFQOUt3WGJDdXl3X3F5SEQ2LXhDamVOX1RrM3hoUzJIcEIzMmxfcFU3X3dNNG1SVmpGVV92bFM5UFdnVGJ5NHd5YjVRM0RtbVpYOC03aTFCdEJsZ1BnUkppUDR0WWlPUUd2MTZJUHFWYUZjWWNlQlZoVkJhSW5fb25CenRERUJ5Zmh0SGdOdmw0R3ZuSGFadjBuMTJldXdsdmVQUFU4X0gzeWtrYlB0MUNQQldJLTJrdnoxc3hmbjdvZk1ndnVoWjN5V00wTGdnMUZjM1VTYjlzeUtXOGRUUlMyZF9CendPbVFvNlk2cmVzYzMxMU9HMUl2a1BXR0ZpbDhNWms4WkVOQ0NhZ0M3S1Iza1gtMm02NXY3R0tLVjhrSjYyMEUxaUFhYU9LTmdXZjRJN3FEZmt1cDUtVDF0UnRPX0l1X0l3M3M1dzluQW1YUWs3UWFyWkFVMDhWMi1Ia0dHRVhYYVhPbWd2RFdCMzVPeUVLUU1nYUh0YWxqNGYyVUpSSjFJYnd4djVTRExRMzJSUlpJMG9vVjRQTmtfTW0wSmJzY3ItTkotZHh1V3BxUUNTRExQcGZsZDlyQWZId1JnOXIwX0g1QzJQMFd5QnVTbWlvbnVVUkdhSXpjRVFZYS1CRWw1SFY0RjhTeXZVYUJUa3RHTG80NXlxU2hzVlF4a3hkOHVkYjliaXdDTWFGUlNVSUkzdG5CV3VadnpqLVhFMFdhQm5lTE1IRU9UT0hTYmRTVWI3Z3RWQVhvakVCOHNLRFRVRTBXOHAtdkFuYVlYVkxFZ3FNem1FaVhDMGVobWQzTi02eEJUTGt5MGptNHhyVlZmN2swbGtMeDQwSVNScVprWVhBNThyMmtJYTVLcjVmLVNaaEtxZVFPbVB0MmpCd1c3ckM4aFNqS01hdE9VZHlEY3Q2NHp4dm4wR0JMZHZxTFVJR3NGeTVNRGNYSUZkRl9vbHlfOHJPVUZEV0xtVy1EMDZzS1NPQjhlbTM0SW1KWTFPalpyd3RxRVU3OE9LZVVxYW4zN2RjUENHZ1drYkhSTUdFc3JsLUs3Qm50ZFFGcDRkVWxXVEkzcjkzS21ZbGpmTUJ4dDlERHBJVXhnQlhvb2ZwYm1GUk1vcS1WYWtRN2RTVWRCQU5FcFFrazFnSVF6VS1FdE4xbW5RMUNFOEZ6TDY2SXFMV1dsaERiSzlUWjh5ZTFJbFZQcmYzOC00cHpkVjRVWi1ab09xUGtnOGRpRjZCMWI2QklDVUdSQzV1a3hscVhYNGNLaEdlU2daeTMtRm1YdFR1VXBtSmFON0M4Um9aZlh1YUdTUWhFejJfRnhmZktOQ2tJcGVSWGRhWUNoRk93QVc4cWZ2NXR4NHh6aWVfTHFoX0ZlS2ktT2xwMGhBZXlDNC0tS0lxalA4bnh0T2QzaEhuYk1IVUxGN1ZvT1B5YUZITWlFbG1LQUlwV3FuRDdKdTkwanZ0dWVyV1JWT0hSRktaUzRtY1BoSWFudk4tRlZjZlVMUjFNNVFvZlVaMzI0NnVfMXJ3RnhTN1FheFBncHdrMFJRamxGSjZUaER0S01RZGdSNkNEeFpNc2htc2F2VEVVOGtJWGtBNzQ5ckEwWkdBVGZHVEx2RGJjeV9HSmVTT0NyS0k0VFVkNm9TM3M3bXIzZFpiXzlad2tsNVpyTGF1UlZMNnZoamJDR1ZuX3lGYS0tYk1qbVoyN2xoVlFKVk5qV0xjVEpHSjZKMjA4YTl6T19OSzdSdXNoS0FYN1RvTElUTEZHTldmOXMwREFlM0F2QmNsRmpQVW81ekRPNUFaUWpuNG96LXNPZ3hyOEVPVzR6S2paWWN2elhjUFM1OEV4QTlLLXZ6bjdqVXpsaUlHYTdEZ01CS21Wa1d0eEJiMHlpT2ZJOEROR1dmMXdIY19RMkJ4eElSWDFXZDF6SkJEZWN4dEtQLWRCckRldlRvc2w3MU1aVEdJTHdnVTh4cUo4amhja2FpMmhkNVQ3UG9pVUNjOFoyakQ0WkI0dUFTWks1bkJJUkxGcC1scm1vUjRpSzRnbzFLY1ZBbzdUZ0JvQUJIWnN6RmFlRUZ1T0VXb0lwS1pOOEdEOXdicnVWUzU0T3FwRWJsdkNWOHZ3T0hST2hFNW14cktKVzNjWHVOZjV0b2h6VVc3R3BzMlJBRkVxQjRZS3FLVE5CRkJVTHpFRkdWSWI5bFNzVEg3WTJBYmJTZFI4Zy1OWjUzOUxMN2lxd3NLbFBoTVpMQXNjX1ZRdGJnaWdQRDJjMzk4UXczY1NRYnhfa0p3cm51M01UU0RYUng0QTJ1ekxGWllhSDRSQWpnald2T3d1dGI4MzM3N3gtVmMyTFd0SENQSHdJY2xCRDkwQXpHdmJ4Nkg2WnVyUlc5aVdzODdyRzM0cHJIYXRNdEtFTG51ZmFwQVJPY0RLZ1UzWEJhOHdkUVFZbHpLaWFldWtmY2xUUmFiRXpYV1lFR2JMdWJfOE5uV1FRZ3NyM3lObVYyT1d4SFZnTWdxa0dLa2d0bHRmZlpETkY4YXZzTkg2c216UFNyYUxJXzdXVVlIU3o1UTBjSGk0SVR2TlNjUkdIbGxiMmtYWVhvbXVjNkZGWXU2VnFTemFXT2VxTUZfbk1FNGQwaDZITXByN1pCNWwxQjhXX2w2SkdrM2V3UkJHY0p5RXJFYzlidGFrLU9Xb2JXNVkwYzVCYm12b2tZdUpxVEd4UW5xQVo3MFRtRF9icjY4aUo5X0cxLXlLRG02X0JKYjZFeFVpMUFldU1xbDNFdnN3Zkxaa2RlVktLUEh3NzJHTjU4TlA4bEdFTUhpR0J6U3Z1MlAxaWVkaWNmd0M2VTR2aTNSdkExUlo3emRXQXVzMjFkTDBDQkFfNE5QOENzd2Y1NWVHLU1FN0xXcXBaUnZUb1daOXJiWGRBNGhhakdyUFBBZkVWY01pWkx6OTBlaFF5aE9xYk9mZkYzM0ZaY1gwTHFVcmtKbC1xVVBUb1hYWWtmb0VLRHVUN0J3WEhidTBLRlJmbUtaWHVQd0o3dV9HN1NmUTJKU1c3cWVJdFhBYkpLbnNueHYycFFZU3U3WE5CVTBxWFVyM1diX2I2UEJLeEpCWUVaM1FDVXdEbnQ4clJSUGhYWnpOS3dzX0d1SEhRUHV1WWM0UklvbUx0NTBaWUtpOXNiSUdQMUxxOWhKSTVPbzVhOENhSzJpR0FYcjBfY3B4WTJXaTFhLUI4S0d0OWNlMU1oSUM1T3AtcnRNSzFOSU5zRFdWT3pwa243MnlPbTJYNEFfdERET0JiLVJoRV95WXhXRWhMNHNTRmR3NTBmeWpPNGdVaW5vVl9LQlZubVZtQ3NaYndHdkVwOWx0MDhwUEt6dmhYSkgzdEtWcmxIa2xCWTBPdnNFSDRoVlVqeXVWMlNiRGdYbzctMFdQYi1sSDdobW15YWtBZ3dFVlFOb0lwemMzNjEzc09MSk1HV1Fjd2JCVHUwdG1oZmc3MExYOElKNkNnZ0lmbTJ6UldIaWs2YzRIRkdwZk9CektESFItT3VJY1Z0aDVTRWNXOHJaTlVfZzAybFZtTlFCU1pVYUU4XzZxNy15cTBwRENsVzd5ekxpYVN1TVJsNmNwcVhCNEw0TVZuZ2ItWFBQWW5DaWdlamwxakVKUDdZWGNfTTJBX0pkU1RPMWRsUUpfcW8zQlNjeTJ0OGI3ektpbERDOTFhQ0hTSHRSZTh6UWpTREJfTWJKVWJqVWl3QnQ5SmFuVy13Vm9WTmdKQmZaLUZ0T3dzR3Q0S3FKWTd2VTFxTnZYc216ZkNSWklxa0Z0R1FneU00V3FtQkljNWtvUS1FNFRsS0loaHlPd3VDNHh0M1NPOW01UVhDbkNVOFRodXdCbExZcFVtOTBmcDlqalNGUkc4MU5UZVRyU25lX2dYR0Z4dDR4MGh0MjFxZTIyRjR0SmxZdTNUbjRhSkQxSzRxZHE4UHdnTnYxSEdUc19Kd2xrbU9Na0RORDBwTXlmVHI0dll2TDV0S0xNdTZjT1NzSEpvQk5yNEF2REVXVFZJNTBidzE4WVRpTlJxeFBFemZCWjB4ZmVmZFBYeUlodmtxaW1JVjhJTHlNMDhoc0lhVVAxb3lTXzFOY2hucGVOd0hKZVFZVDBCYzU5OFROeDFBdnpiZHlWSWFxMW9kZWRzN2d6MjhiRjRnMVBPUjBSQkJCMDA3bVY1eG13MzJRc2dWbDhTSjQ3cE9xSlIzaWpha3Y2U1ItaDZjYlJScHdlNjMtZlUzQkF6b0pvRjdyc3k3QmU2WjZRTllEY1ZidFYxR28tSzJtdzdMWkh0TXE2czlubDQ5dmxjaXB2YUxraC1NVnFZMnZTcVBFVzdkcjBHazFBN2xjZ0ZjUVlnbDZaY2VsYUd5RDcxcDNCZ1pZU1BhT0REMEt2WGFFTTlvaUN3RDhSSWpXWkJKVGxXdDBPdGlubjR0OXV0Y1lnUWNaZmtCRGhQckJsTDE2bDlsYzlZQ1AtclE0Qlh3WXRtZnVTa0RyY25oV1haZ05OZmtjQlJoU0RyOVhoX2FRRG5aMUg3bnhzc25Mdld3el83SUlUb01WaWtmWFJEeXdfbnRtajBfLXM5dW1DY19pX0daMzE0VXNkZlMyOTBLRUE5a21VQWdPdHh0YUVDVGM5dVRKVzlQTWcwbFlabWlPUnhSUTduZzRmOW92eDd6RVNVNmtsb09rWm9DaERWdF9sdnFFRHdxMWpRTmxYZUdmUG9nMEdUdU56NjdjbmROb1kweEdVUG5yb2U1TVRzMXR4NGtZVVVDazR1ejlvVHk2S0Yza01XblA5aVVqZXdQcTJHX2JRZWxhbzBTaHJoYmx0bi1ETWlaQUwtSHFvNzJkd0liN1dzb3JvSWpKZGhJZU5rV01mRTZXSXNQUHNVczJaOGVKY1lWOHVWTmtpMnRnWkQ0MGFoSXR2X091QzdmdXZ4bWQyd0ZJdzdfZDQ2VmxTaWJiY256OTFnRlJvT2MybnlweHlaMEFFR3hvZGY2cHhtYVFianR1dTJTQlV4RmhXdEdrUUZPT0dkNEtYd2lBZHNEYzYzYlBDZkdWV0xtNzdsU0l0NTNDMGVIVVhLUE1YTmtxdFJiV0NscklvdlVtUThhMDIxT0Y5NnJYbV80TlJ0a0pwSUwwN0R6aEYzZnFrQWs5R2VmalpGV1pEUWFxRUpNYXpvMzZzSkNiWXJEZHRqU0VTS0VyYlBsSHY3bGZ3dEpsS2JZYk1ySUdVelFrOUpVREZVS2NNV3JtcEkydVVOTXUxV1pMN2lGQ1BGU081QlkyZDl1WWp4dHVfVDhpSnl4MTNsYUw1cW10M0tYX3lrdEg0TU50RTBhcFEyR2NsemMzZTl1dVFFVFozSDROZElxd2FRUGlwa2Y2QzZrLXpSZzJpeExYV01jak9xOFZ2S1VjRFFXcGw4QXNtVzU4YXdWSFRJOENZWmRtTml6YXZYaTJodWdETnYyQjk1MWJQbXh3MzBHSXl5emRDMEJGMG80ckY3cXdqdm5VZWVRMnZieTEzTldMc2hoSzJEdUx0b0ZMdktTNTh3YmxCVjhOVWVUdUxDMXZ5bFJrYjNzdjJGY2wtSXZBQjNUd0RQdFB5R1JFS0xYakxxWUJQRlF5YkVHNmR0Vi0wTUZoZ0QyUnhsemd1RE52cTVfS3pCa2p3aWxLazRJM09mMm5IUGtLOTIwRW5yeGJBSkJUQkxCaExNZHBqcHBJaUhyXzJsOUd1dGMwblV3eVFkTUFvZ25PVEFoMkpyTkhnZWpYb252T2Z6U0JVUm1OOVNLMi1BczNNWE9SeWZFTmYyM2dxUENHOWNkekpDOHE0ajFHYzdfOU5xMkdLTGpOd2k4bHVESUJnekk1Y2RSRy1CVXlFZnphUndUV2RUR1Jud1RhVm9Cc0pJVEhhY01IdFJlTFIxTnFkRTNFRk9VeHB1X254SllUZFRrMENLeTFrMFU2QmtMeVY5c0ZnWjQ2dXFiSl9pQU54cUVnaUlDUWdtWEpobU9paDA1dnpPRkR5QjlGZWlheC1za1NxZnl4U0ZTdmlxNm1jeEFEcF9TSTFQWEJfVVVMS2loNjkzM2NGTlh6TFY5MjVXQVgyaDJKRHZwMXR2NzlROHJfSnR1MXE3UHczN1d3am41UDBDZXU4MGRVOVowQWpodjAxTHZwcU1wamV1ZlREeGI5Ynl2X2N2UnJNVnpnamxwWWt3bUFtNEFZSDJsb3h3UkFlMEZZbzZmNlJNN1ZqNmNlR0FyeUF3RDcxREwzOVhTekJvRWN5VDhJQ3R3M1loVXExeHo2Yi1hMEVnSjRxZFRnaXdWMG5ZUUFLVDhsa1EybGNzY1c2dkFEV0JKNERTUXdUT3E1Wlk2TEVFRjRnQUhlSGt1Mkc5Vl9DTUx0ZllqdXVUaFdzMjZBTHNJZ1NTNS1WYmFnd0NTalpiazhMdnBoYUJ0ZWhhNTdhR2hGdHFrMTE1T2N0LW9UaXFNMkVMTDF0dDdPYUVHdGV3NTVQVHktR0I1R2hJQnEzNDdMVXpWOGxkQ0N0c0xESnU4NDhDN2J5RDRnaDFDUTl0dkJlcDRZdi1ZSzNwZGZHV01UWW10blRSZlU1VjNOZUx4ckQ1eUlGUHVJX3JQd2NaazBIeXMwSEZjM0VILWFDaEJnZkUxLUFWRkJLZ1VtdjNyMDZzVFhNY2ZiSXZhTl83dW93azFjQXR6cXYwRVhuLUQ2bG1FenhmbEYwbHVvM3k2RXFEcXdrZ0ptN0RTNnlBa1JGdk90dlp0bWVWZWNXWnJ6NTBnMW1NX29FdldNRFJURF9DYUVCcE9PY1lSY1l6cW5RSnczVFAyR1ZOdU8ybVZWb1l6YlBDSGZkQnhIbEZTdWpBSFhuRjdpUUYtNGdUbVpWS0piTGdsSUtQOW1YZHBEdzNUTHlJQ1dnQjFacjF5OVBDUzRnT2dpckFLelBNVmdRYUM5UzR3RWJ2bzcwYWphUVVqWE8wTzZDVDBQR0k4WE9iZ0ZVXzFTbng4c3RPeWpyMmI1cEN3RFphVU5RWGFWX3ItVUJmQ1FsWkY0TENpQUpmRkREZ1hjNFdORDVNUWhvWHZkZjAzNUJQcUpsQkxCcVJQN213M0FJV2V4MGQ0bjlNMEFNUnNEblFEZ1B6RXdCbDhFejlDVG4xZ0IwOTFWVDh3MXpiZlRvQ1ZwZ0dwcDBGMG9wZzRyTHpkMW9lalpIclhPa0dDRVNnSWxuRFotRlNfNDlUQ1FSSEpZWVBJY3lOVlhZRmotNnlka0FWaEcteW04Y1JsMTBOY2V3Vm1NTDRlRWdoMWdjUFVqdmVmM1BkSUpnRE45LWZhM0lyaUhyY04tRWpKMlV4V3A4S05RZUw3ejJGeWxsTnpIeE5jMUtxV2wwaFlxaGhyejJMUHRfNTQ1dDkxa3JWU05IUE5PT1RBakZyQ2FQaGxSQTl5RENjallzcjhwQWdTVUI1YU8zbW1PZm1nNDFkQWZyX1FhTXlySFpydGNXWHpETFQyUjFTYl9laDN1SDhuLURGOUdXZUhnY3IzR3l4UTlKRk9NamhoZk8xTGdFRmVXTG1QU0pyRkdvdnBqd1Q1TUh5VzExSTI3M0NfR00teGFvWU1wVWg5ZlRqaVVJaHFVRm13Q0FENHozejBIMUd2eVR2dGdwbm1sSGRUbTVrWURnQzhlYkFPeDBBekV1YXNWQWtJS3VjSnhNc1pmMTJYOTBia3FiNjVuQ2NPQnpDX1g2cFk5cHZDZ0NGWGhlWS05WTdLcWY4UnBuQzFoS1h1NF9nd1B3V19YM2FyVjk4ZGw0UVlIRjJ3X1FFbHJZcG1JZGJUM01Na0Y1MVlnczh6X2dacUxWRm1SdGlEeGx1SXVpWXZRTnhwUVVIbmxEQWR6WTZkeXlzNzdLSTNKNWhZZ3VIWHljXzd4WnhYVGY4LUZSeGdQREw5UGpaTXRoWWQ3LXJxTE9SendWOUU1ZDFuaTlaV01oTmprR0RJWFhKRVMtRE1aalJMRUpkMjF6Yk9WLXNDN3ZnaGIxTjREeDdxLWMwODd2MWdic1VmNVlqOFJmdnA5SjREbGtaUUxaQzNFMkFhemFVYjBzOXNJa0F1REl0NjNQc1hqMEJSelRqZVNKOVBUaFItUUJSb2M0c2p5VDg2UUNJTzA5WkROak9GbXZfckdkTTZWdU9oMXdzLW41MGp3cmtxbTVrRUZycXBVZmZRa2FBUVhvOU12eDF1VXNrRmh3SlpGckFCRHM3WXRhby1zUzE5QTV2bVg4d3B5Z01zTk81VGszdmFORTU4dVZyaTVWY1BHRVBUZ0dURUw5d3VjWTV3Uk9qYVlaMXg5MXpSc05GUWJOY0x3R1JYZWpWRnNibGNFZTJSNTdhYkFqUThJQlpnQkpCYVRVazZGbzNkTmNFbnlTNm40R1B3MjFwdHd0UHlWQ2JjSVdaeXNPc3FKRWFsNnAzSE1pczJtdHY5Sm1EcENqMFFpVFRSUFVoZ3lqT01qOW5scDdYeExpbDBTTFE3RFJEU09iVzRzRmdDS0NZSUN0M29JUkdpWlB4TTFMU3RCNkJBbkNHQjNQX29hWFluSG8yLW02cnpVcU5hUXVhbG81NXNiWW1xZnhka2ktenNuaXVkYjhTOHNrMVh4dWwzS0toNWNUWHFRTnFWdlhVSF9BZzRYV0Y5NnVyS0Q3RTZtYmVjMUFGZDhISU5oWVZMLWREUllHYVEwVmtROUJpRjFNNXVFR3lwN2VhOFhGTUtsUndRZE5GUkpKdlllMjhFU2oybFAzMTZXSmVlRHV4MkRMa3lWWDRLcUdSb3h2djVleHY2cDA3cG5USUJNbEJva1BNNzllTE83dGRfR0dZcFZfelR1OURyX1RDNWJ3LVM1U1RNdzU0YU9aVTlrWEEtc2ZDOW9GcW9kUGdLUklycHpQb2JYZEtMalJsRzZjb0ZuVk05Z092WWdHelBFRDRvbVhQSGx6cUZXZDNHUENnOEV6WmUwSGJtVndsSDdVTTdiWl9Bc09KLUo2LTB3WnJSWnpiR3JxcVF5S0h0NFZxdXotRUZEX21ReWlmcU15ejlNRGdGdjZpQ1BhYWR6anpWX3hTTG9ZUWVrN2xhV2xUWkUtREJxM2pOcld0MGlnaXZIRWM4cG8yTnVBYk43WUpNT2dSZEEzYzNnUXAzakxXZHVOdEMtQlFzdXA1alAzQ3NuYVBiQzV6djRlazgxZnVsZUJZcGF5bzByLUp0OUJkSnhTdG94RWgxZ0QxQUNJMWROUUZack1SQV9tUktrSkRBeHI4amw5UWtRa0NnS0xZdmhxX1hBZjVwXzdsSUdRbWVGQTh3aE13RGExWlVWUi1aZmZDUkhhX3d1RUhST09DdFhXcHJVNmViakhsc210aE1xdTNoUTh2V1E5ZGd5TEt5bkRpMGwzZUZLZUhjbXVmbGl5U18zdTRfdmtjRmptMk9GTERaQUw5SE1CUWdMSGdoNmRDOWMtb2RYZEd5RGV4XzNOOFpKdlZlcG5ZWnpNZ2VNWFZpOGdwazQ1OU1UQy1SNXpXU0xRUndaNV9zdFdHMGJNdTRfZ3FGU0VpNHRoM090QktkZkxTOVcxOEpNLTVaZEpMUHpycU9QU3RUX3RtSkZGMkhXTE1RMjVTV19NdzB1TzRKY1NlaURTdWI5dmI2MXU3bWdsS1ozRDMwMlYwdm5naW1UR1dkdExEQzdZMUJGbkVNUzRRWTAtOHNsY3QzQ1p1djZaTnVwZFlTZ091ZnpzYkpURTNyenZtN0JWRUNBQkFINDNnTDFza1J5UkttZWtjSlJ5a081S2NQb1NjUWtnNEx3ZnJ6ZmlOZlVyMG90VTJ4UWNyenZFRGlmY19vTjNCdmg0UlVMZF9lYUFCcjQxTWdtcDlpQTRnYWwya19RSl9VU3Z4Ui1TTjhzcm5LbEtndm5hZXIwZVZWZ2hmSC1pdk9lVndSQ3A0LUlnUlo1Uk1ZSUowbUlYX1RqR1BvbTJZNmp5STA5Nld2alVmSWRxZXpMdWxKcmhtR0w1VHpEem9mME43eGFVQU5VcTIxZTM2aDloSkY5YjJtYUxxcnJUSU5CR1FVd0l5MkE3Vzk4aE9wSWdtX2ZiYVhNUHI1SVlNbzZVQWNyNEczQUQxZHM1eDZuNUNUYllzS2swRExUY2lyTUZLNUVIaVozMXBzaUVzX1N3azZGX0dJdE5icklmU2JPbzJjcGxROEpUMllVQjZyNUlxSTZYOG9YRFdrOENWNlhHWWtkZWtWbUg2aTJYTXZLTDlkQWhVTnlnRWtGUHltS1JRYnVDZVI2WnVXVG43QlN1eTBZNVhWS1h3cEl0elpzcFprcy1zOWs4dEJHZ0xtYjlZVzNuNlY0S2N1OVkzS19VU2tQS1pMOVN1OGtkdmtRVmVkc3ZOOFZBNnFQaDFYOHhSQ3huYzJDeDJxN1l3Q0V2cVpsd2dDbGVRbXJwWm42bnZuRU9nQjBTaVB4bVdrOHlMdEMyWGV1ZnE0OVNEcEdDeGRJNy1RVVV0UVZ6TF9IbFljUWtRZEFGZWZLOGtMX1pDZFhMbFgxWVRGXzlMZG5OdHQ5NVU4Wmo5WUZqRzVjUXZyVkphVHdlT2xveXNhQjlJSlRkUXBSWS1mUDJjd2dRQlcyblFZODlWUEs3elRRMGRtV3Y4cmNhMnJwVGdodlBnY1RrR25OQU5jelZ2emh3VERDVHB4MVhnV3FzQ09KYWFyUkNuUmRqdUJoN25ZYi1NZFpMR01sdThWNW1qMmFSakZXMVBUNVZJb3N3N0NYemVQYkRnc016RzlWWjBDbjE0cnpvYTVtMXhfczl6M2pMcTdZZGZmTXdWSWs5LXEyTDltRE94ZHVrVGlJamI4RDFFTG5WR2JJNUlfNi1vQ293UU54QkdiVHVBOENfVU9JU1piMHNFVW1aNENvdjMzSWs0eUFHeWx5V2FuSzhDR3JkNFZBdXlsNDhDSWpTQTVIR2Y5ZWxYWnE5SkdNX3JDZXRBN0NUbHFTZUZRc0p0OTlsai1WeGtLLUtjSFAzNU9hTjMydDRYb19wZWtCR2pEaGZXM2Roa2loOXZhejBfLS1HU1pfdlZFbk5TYzV2bnNOM19HRnc4a3hJMzJKNml4QUJoWUFGQWZYU09iQXNiZEJXZlZhMUtyYnA3R2VJa2FyODV4RGxOWnI4V1NZd2ZfWlNJUWZiYWNUVnZSMGJjMXUtVjdTZmllTXB6VllNWEdYVnhRSnJ5ajRZMTFRbjdqbGQyZ2FVLWhVSVRfN3gxellteGJudFVKMUF1UlkxTnpHcnVvRjRLSC1iVjF5LTRiZEF4eDVyVlRJODUybnV5eGtvZVpFRFAwNHBOcFAwazRnZ01hZ1pQUFFGMkFmNHdvd1Y4ZmlndWRyUDRsX0NWSTVURE9qNFZ6R1MzUVhKYVBwcWx0dmMzTFpEVFZHVW5oM0lKbzA3a0lKZWZScXB3d1NBUDNyM2RySW4zRlJjOWNjS2ROdVdHMXdSMmRFMld5Qm4wR1lCbUVvclBkTU5ob0RVTXpKcnpYUlNrZEtoTFYyUVdlTDNoUUlIQWlNMm5FVmtNOHZscG9CY1dpOUpBWHBGU1hkYWRINk9oSkxUd1NEZWlYdlJPNHM3SkRTUmYtUHcxaWxDMUtKLV9idi0xUE8tUC1EQWdHanNtVG5aZ3U0dHhEWi1OUGhwRUhEbUhiNjQxOG1pTVVBMmMzQkltS3QwWWw5RDNtclJvWnVEOVJCZ1ZJTTdfb3dtaXFhdmdFczE2V3IwR0JacFY4SG00NE52TXJubEpJXzZlUEhKZUV6SUlXLXU0cHVVenppa2xQOUdxZG42T2NBSWZiaWdUNVVZLWNETXZ5WlZ0ellyVk1Sbkx4UTFyaGx2dXczeFhhb0lnOVNJV2s4SjIzM3ltLV9KOUpOUE9hVVFaOVUzaS0wSC1mWDhsR0dZa1NCeDVDNjQ5WlN0U0VySkJJYUpfY0VSZVpqSFFFQW45czc4ZGM0a0dfbl83cUxHUWd5MXVUR2dVTTFXWHNBZ2FSVVdkOV9xaXc3SERaamdaSW0xQkxzSWlONmFKWm5VRzVFbTBEV0Z2S3ZDaDNhNFdtZDRXa0h6dkwyOXIzTUZqSFNhX05oRVNRVndTalRhV0JFUzFHS1llY25uTUt5TmRXWWRQU2QyTnN1c1F4Tzc3bWE2Unp5Qk1jTHkyaFZPbmpXSGVoQ09Ha2hXaWVWd0xtVFBQd0hHWUl1aVhLUHAtb3lVeE8zSDZzc2R5ZlhGN254VmVUdmJlMlFzVTYyMFZnV1dQMncxYUcwSWo1bWM1M0xVcEY4U3Q4VHBZU1htX1FjblNIWFhsRGh1TC1FX281eVFqX0Zmb1lsaHFGaTlrVF9SQ1E3R0Y4cDdVci1sRjNwTjJsZkQ2UGVETXliU001UVY4R24xSjFjTkFaMXJKUmpGdVpDS2M5RDFaeFBkTzNDWE5Ycnl4R0JUbkVUWHBQV3RHb3BtMFV2UTRkZFBDY0hCS1FKTnZsN1ZaaExHRHpKUEw2a3pJSTNQUGk1bnFqYTRtbUJWU2FiNFhOMHg0VEJFS1I2VW1oU2hXZnhfQnpULW81aEtuZXozWUZBM2lRRXpKd0JOcXF0X3lXbEhKRl96ZWRldS1MeWJRbFJnc3lQVHdzZ285aHEwdUZBY0tBSkphNUtVNnZfdksyZG5QMVFlMVpVbGhvMmFFLVV4WTVnb1gyNFB2Rzl3cXQxUk1aUUgzRktORGcwZFhDRHVTOWFmdUlqczlaY3RERG1kZXhhV0xuRS1KM2F2dkU0T0RWSFR3Tms1YXBGQzZxdDBjNHpxV0FnQk1weExJMWE4NWp1Z0E3QmZydkw2Y0hBZjhxbmhFdmNyUjltdlFDTHQxc3kxY1phbHZvc2cxZ3pYVmZpTHRpVnlCeFVURVdXanZfMWJEVU5hMzNHUXZFSG5EWFAtMzZnRUNFaFZXVXpTQW1xMFN1RFBLR05hdjJWM2l2bF92b1VuRUxNeDhFcHNnMnhqUF9zLXQ4bVRJcGt0SzFXRG55c2FKVGVxZ2syRE56TlBKZElaUHFQdmxzeHI1TTZidUEzUkpmaGk5Y0hiU0pGV2poeEhzXzNmY2tvdzNINThJek0xLTBJX3Q2enRJT0hFOTUxNVdwenZiOXBzd3lBc3RTaEpLbG9Pb3B0b200ZkhEQTU5eXB3YlhSbTNnT0VGdmN0NWEyOG9sa1M0T3h2V3g2N2VtUUtDZGhKMnZkMTQwM2FVYm1TVEJNcVZzbGw5MmFKdlpaeGNtaHcyX3JTY3J4V0p2U2ZMSjJLWjNsYnZHRTZJOWY3ZTE3REhhZll3dFBZRWJuWi1iVFRZajVYNUEyaTlwMEltZ1AzVVJyaktJOHZNb3BHdXlDbTBfV0FWbjg0LW5wd3pJLVNTbjV4cDdIRmgwT2puVlJ2aFpsYmhoMzdFajBPZ2VLTGQ4WWJEelp5ZzFzVUZlNmU1NVkySTVpVW9tckc1bU9WV0Myc2c1SVprbjlnZXpVVDFxUmNfY1Q0amRwTU9NZ3Bza2tCeGFEU3JDMFZfSEpPVU1NOWFPb2FpS3dnV0l0WEs2YzFOT1NIV29RaEVHTF9DeWNFOElObG53QlRsdnJRVjVIY3h6RjhjNkZ3eDFSMGRrMjZ4MU42ZlNjc1VEVlVyVjQwd0tJbVdDYmcxN3Izd3VQV3IzZ2xvOG45MGlZeVJFbE5qZmQtdzExS2FUd2lKcHNITkc5a3NJczBCYVNNbTc4NVZVTFFjSWVOVDliRjBnamhxTm8zcDltTjFjSnk3cG4yaE5QRFppTVh3QWUtRzJFeEpzWlgwR05hUUtIRGh2M2tfYTd4dDNDakRDYmxFZnQyMGxJc3NUXzhESFpsSGM1Njh3X29FQ29QbzM4bGMtSi1VVkMwRFREaWNKVFo2VlpEWm1yM3RNM1RDT1NjMTloZDIxMUZ3NlRZSzkwOWJINFpONHBVaW5XV09CT3FxZEhSbkV1Y2JBdjlDUTlzREtKbUtkQV9lcmkwYmdHSHBndWY5ZHVBMlZIV0gwMkE0TDdmaE5FbkxPbzVieERRVk5JOGpVYVpGcEFWYkVyTG1iQjB1VnVEeHhDOFBsYlBMZjd2Zy1wR2JEajI2ZzhqbkNUTno3YW92WWxPVUY1WkFtZkdoVTRJalVoVnFjVmhJZDlLWVI5SGpGN0RqZVlKTDBfTF9sMklJU0FpY0pjQUIxMFpZMkREUTVTTWduQ1VCdTZvNGd5czNMQURWS2d3YnQ5eGtucWlkWGJ0d2h1U18xVWxkb3VxNGlJcVRRTW8wd0JZREpDcGRpQ1M5V2NNOFJaSmtkbG5YQm5Id2p6RkphZkNUbFRRR0VLcWJnbDNBOTAzTjlaMElfZi1PVThZdElnUGNfeXpxUzVLVXV0ODd5SFA2UHZpVFZ1YTl0Q2U4SXlZcmhKUE1PTG9uX1hxM2FEbmFsX1MwSTk4Q2JBX243U1Viei1kLTNhMk9QbzNxQmxRdmRPdXRPeXJJS0ZiWkNiX3pOV1FWbl9BY1prT1RrX3J2M3NIWHlBOU82Q0ZjVndfYU5PeVlQU2c3WlRuMG9uTzJMUElrUjJuMTFXSGpaR1gyUjJqSm9XUFQ0VFB4WVloMlZYYzVKSkVhLWEwVURFdHh5NUNwUW5DaHAyTEdwMDhGVThlLWkyWTczQXZBZWJ2Y3dfRnN6bHo3Z3ZzTUp5TUM4dkwtbFZQNHNVeG1taFZfUGRmTWhTU1ZJV1ZoUjhvN29vSlExcFJCaXVjM2hnb1N1aTBtZ1ByYUNxZHJibllLbHFLV0RObjFBTmV0cmRmUkwyX184M2xmc1BydDJIN1Y2QmxQbE1rWHE5bl9YSnRsNVNpS1J5MVRfNTltTDdUTUdESUdnZmg1QXJ6cndKc28wakxwSHduWWI4dHFEM0g0VkdjbUdlcEkzMjk4QXFVeG5NNHI3ekVlb1c1allfNGRmMEZhTTRFSW4tNmFZVndFMk55XzhRSV9WMGpEMGhlV1RFRGpUZjNLOU16ajdEcG96UHNwZTIyakpjWTBodDk2aE9SZ3dtX3dadlJPdWQ4dnUwZGY4RXVrNnIwUXNkam5yVXlNSzV5WkZLT2dCOE1LOU93cVNxaEhSZk1JazFOWjZ5MWNrSTFyTkh4ZTBLRWxwZ1NOVHdxbjdrTFZKSDFuMHZQaEpYQkh5UEMxaldraWdMWUpvaTA5MDJYcEw5UzBJaU1PaldPVy1LNm5ZWmEydXE4RGo1MlpRdVhXUk5pSXI1Q2pxU1FfQ0hoMkdPVS1qNDlELWsyMy1XU2xiV29BX3JzWGN3eU9ZelU4ZGM3TS1XT2hwSF9qakRZRXl1cGpNTWhfRlBGR3dvQ0RvcTB2MG1oemJyWHR6VHpjMnNJdjNqVWZ2X1JzNWZaNGlwT0p2WTY0anpvUGtsMmh2T09Ya1JmVExobHY5T3A3czdCOEJVSWY1cWZKQWJKVm9uRmRKbjhjT3FKMHp3U01CV0FNWXR4MGNsSkJGZnNhanc4NlprREFraDFkMFM4THBHYWpZWkx2dlFDSDJBX0ZPNVEtbVZLbmhUWm51R19PcUlUSkVMNVNOVjBiWHFyaXJNSW5nUU9DTzlSQ093cHR3bFJqZ2FjYm1SLXphaHZ0YjdBTXlvOFNDNkVycG5QTjc0U1ZwenhrX09DX0N6OEJkRDlmY1p2dGVMbktRc1dNVUtQVDB1S253M05qMjRTSUNaYmZ2amtmclpwOUg4LXVudmZGTlRNdFFmNnpkMDctSW5ETUoyeGJuZS1zdS1VZWFHRDFrZzBJOVVFWTBCMGg1c2syTTh5Nl9RU3gwUHNJMFhBYVdtc1VxT1F1MHQzX2F6ZGliQXVhRmR3MFBJaUdRMktxTTRXRzhVNW9scXl5YVZBc0dhWHdhdFNSa1JaVktqMHFINzBTRW9VeGtISTVOOHV0enhYd1NLUTU1SmtsSmt0UEdueElDSC11MTFRS2ltX1hKdTlVY1hsLUQyX0FWdDMtS3VtdEhuczF2NGwyOVRSSWFJMU9TSEFDd2FsS3lER0FSaGFLdHJJa3UtU1l0MzZ3WWRlZHFRTFdQWG9IdXp2VUw4ellTckJaQUVGNzBwemVBOXVRRnVJekR5cU13UFhyd05UZXVQcHpNM1VoVjNRTGNPcG9DT2tKS01lbnpRWl9xQ05mWWNRSjR3am1LMVlkYmpYb3JJeHlFT3RxeHFmTDREM0ttZUdsU01OWUwtUFRoa19LdnFrS25wWWViVXl3WWZxMGY2Y0tBeFJTMWlxUlNkYXlUb18yYkkyaEVIOFV1THNWZTN6MTNpcEFRajk3SWoxYWFYUjlKSXh6VTlpZjduVXJwNS1MLWFhZlJzbFVNejFGSVFsX0dZbHhVYVlDSW12M3FXdzFzS2dNMmpnQTNrczJvM25mdGhIMjlCVm5NckFpcFBPSjBNSnM5V2JGYk43Q2RJT0lMZExaRkU0UlVOcHMzMGJIYjRNQ1k1ME5uNTlEb3d5NFpIQmF2ZEllcTJLdlBqaklNdkZyOWdYOFVWcVRrblRXd3dpQXpkNGw5Q3U0emh6ZFBUcmtkdmxyNUotV3JIZGdQaDY5UWZaT2FtSVNkYUJRR1JGbUdHMjR3aFZhMDRYMm5TOWNES2k0djM1MHFUc1JFVGdram9vLXpkTDJ1OHhzV19WWnMyalJQeGwzaWtDU01MSEFjcGlpa1RaRks0WGdmRzEtX0xCSGl4bEw3azlSSkRaS253T291dC01SThjTF9QRW5TOFFZY05xOWdWaEZmZEJPQUhWd2IxQU1MQ1AzSVliUUpUU3ZPRHJ6czdfMWd1V3oybGNiTUY0YlJmbl9GZGVVa0c3bjlNSVBLcXRDa0dFbjlpTmdRczRQb2J5M2dQVnowQmJIcTE3M0dUdmltWW0zVkxIZnl2TFdZZ0gzdVplZ3pOaHR1R25sU1ZIS1NxRWV1WUZaZTVHV0lmV2NBQW9iWXdPb1oyZHNQbTlRSlp5V3VIZDRld3Z1TjQxcEUwUmFZUEtZTjNyYXVsVVhjMHIwc1pseC1KM2oyajFSb3JNLVFURjZiTmNRTWlMcXQ4Y043VFh1R0VBU1UtRllRQWUxOVNqSUd1V0Nud3Q2UmU1aDNJOU50ekoyaWZZazBKVUt1elAwSGs1S0NLQkdiT2VLVEhLWnMwZEJoR0VGbHFtOTFrUmVhT2Z3VS1VRUIzd29hYWZDLXJMRFRiNE5kSDFiQ0ZtUUlaeXE4bllFbzg4WC1LWUZZMDh6QmY5OFhFekZTTEJWeG12bVR1V2FHeXc5VTU3cVRhZjJfZEp0RHlobnJnN0FZMGp3Vml1YVlONFNCTmFmOGloaTg4UFFhVE80bXZDOExKbzlmUFE1SXpZQV9wcVJmNXY4TGo3MXpsUDJRczc2ckVucmtVY0RUdEVSMS1qQmNTc2ZqOVBSLUtZM0xUZTFQN1JyUURQOGt4ckhkZVhUOWxldHYxNGwwOVc2Znp6QjhVMENqVmdQdkxrSUNjVUNMa0RQNTZkWUhJWWZta1BNX2NzdW9YLXo0QnVQVFplQjQ5eDF0US1ITzRJcWFhOUJaWFA1UmtnOGFjTUxtWm92T3E2UjE5RXdPb09jRFN0Q21sbGpySlp2M1lScmVXcEhBUDhCaEFLNXFBM1FWbWFyNURUbTBYTmxiS0hjWW1XWTVvVVlYWDhZU0lLeTJBV2hfUHhaVlFKdENpZllxdUROMm1lS1hwVDg0d3VoWW1mblN5QlZycDBxWVhrbHFmQXFWSjJhUTZBOU5WNWRwdVBFRHB4OTRsdkF1TGcwaEZNck01Vmk1LXhGbm1XWnlKYWFCRmFzV0NpTXpkbDE5MXRRSTNHOHR6X0hHbExYSXRZQWxjS0ZtanFudUF6QU1UcG83d2V5aGJUTDAwNTNYczJKRmpMcGVXbWZ3cWxBelhXdFg5MW1BTXVRTFZ4VVZzS0EwZHRrbWkwZERfS2hHcHcteXA4azhJbWRZVzBYbXZ6MGkycGtpWXBiVnNqMUJDYmJFYWRDdGNkeExHR0NrclVXSGtacWpQSkdwckdnUWRsaEtyOFJ1clk0cnJ6UFAzTGsydXptejBqNVJYd0FhQlYwd1JYU1ZORG9uSGtKckNiUnlxa3pleUJKRkswRkNCanZWeFJGSmFLZGtlbmNHd19LN0JOcy1RcTJnVDMwVDk3NnBWVV9FQl83RlF4eF9GX2hwMmR6cDZtMGlOZlprMkhIY0NzdDRwQzdOajZLQU52UzNzX09TREd4cVFveXd1dWNzQXlIYmE1ZHUwM1ZIbUxYTEtuUzd4d3VWSVpjQUZPUTZNZmpRRTNQbXd2WGhzbWk0SXgzNGc1Q3ZZc18zdWl6czBrMkRpc1JvQ2NLRS03Q0ROMVRxVURCRXUwWWJzRk1HTXo0Nk9jSGZXVWM2Y2tRV09NVV9tTko4QXM0TkhobUszUmVydWRVVUUzMHRfNTRzNm9tY01takFHenF4S0FtM001ejVjV3ZBaE1RU1BRc1ktY2tIV1FRMHlPZC1Cdm5Rc3B0ajJxb2hQZUVwVUFLSzd4S1p3MUpNN1U4TXZtNDRXTGVSSmx0M2JVZnk1MDFWWENDdDk0ckVqZFVrSEpjQ0Q2WDFUN1NhV1RlRUNXY2w2Z2doVHZ5YkROUl9COFNHby00NENHSUdOYVpMYURFX1Y5T3RKR0xYT2NraHRUdWFDcnFXRlZRWUdNZTVDQ0p3M0lRcERwd1ZjdTlraEY4d0RmRGVZRko3WGNjNDZwLWIyd3RsUWVBN0M2NHRvQmFTUVQ0TkRxZHpydFlHTkFZeU5IalJLbGxtSF8tdFlNWEpCdUJaSEZZMkNIcDF0cmZKMlFBbEc2ZUNZNDRNRHBRckthc0Fkd1gwTHNnd21zcGtHZnNRU25PZHNnVjhkT1JBcFMwT3hYY1pXZVFORE9reDVNV2JhbjBVY3FubWF1YVJTTFpBajN5MjBjRFYyaE1hWE91V3A2ZzVoT3A4WGo4U016SmVwQlplNUlmZ2lnWWJWMVYxeTlYX1NNRTRIclVUVnpIYTBHQk54dEpXcDJEVER1S0lMekZuUmhNQmJ5aV9oNk5zSUdiLU5Qak5DVndsYW9oN3JMT2RSLUpqOU1pa3k3REFrM2N5cWRrTlg3Umg1aHk1YnE2MkdlamZLSWRsd2JMVDIzQ2Y1bGkySnRTa1dCcktHcHdOTlY5c1RGcVlxa0dWR2swZlR6MzlETUVmUUd1UmRIemtNMkZ0bkZLU05VaTlQbFlKS0o5VWV3cm1IaHMxTjFXYmFXLUhkYzlUaVFIbXpRYlpqN3ZRQS1NZVRuOVhjem9IZjlqZGNyaGVIWjdqSUp6WlFYTEE0ZXFwYzBSUC14a1NJQTFvXzVRdDJYSlBSWWE0QnNDWGtKWXJYM1YyTElPOG0wVTVpOWI4Y21DdlZCOElXVWlraF9hYngtcFZFbzFRWW55OUltRkpsanUyV1J5aF9CYzQwdkpmWllzdkZmcFZTeHJTMGFnNjU0R0NFVEJvMjFwUVVDWGRmYjhIYTc5eHhMMjcxd1VTQnRVZ2VxVlBtNXptOG91TzdxQlBuMDV1Zy04QzR2LUZBWV9tNl9VT2taYVQyRlVTaWNEZGdBVjktZHRkalNqYzFrNHpVSm02RjdPUThwNHRSU3NmVjBSMjVyU1BYSGhQdEtEZDUzaWpBNlNMYzZKaUQ1M1BsdnZzUmhqU0hTMU5QMUg5QURzWTBUbTN6OHdGT3N4VjBhU2JEaFhGWDlKaWwyTnRjQ1FXd0kyV1F6ZmdneVgtMDZqaVFuamhtMWNWaTFCZlUtVjlKZ0FVN0RLVDNwMkowR1Y1Vk1GQmtGUFVZcWFRUnYyVVRwWjdQQWZzYmVSc3VhblVHYlJTUjc4bGZ6ZXM5NjBOb0QxQlN2cm01a2RxR096UHdDOHJZSWZhSExwUlh6Sk8tXzJFVUsyRGlna0FtSm9sWlo3Q3p2V3JJSTcxWWxmeXVBT1VCMGJvWmZ3YnBUWHJPNldlOTFpaW5tZEZhLWtTWVJuUTBDZ1B3bVVMYVNCZDZkd2VNR3NPWTM4YURRMUpoLXBBS2NFSkdwVDFyLVFXWWtuYWs0dHFxQXhMRzRmS2pLVUNJY194VXNBbWMwRER6aWVCTmhPY2xQYU5FN3U5RFZJTTNhaWFFc2NjMlM1TnJQMXB5QzdIYVlvbnliWkNfNVNRakFNSVlYM1dzNnZKanNXcm9vZER5Nzl0Yi1md2pUS0VwUTh4UUYtd1dUcW1aQnpZc3ZTdjNEdUVQd1ZqT3BNMUJFVWFSOVd1WHk5ZmFCVGJfVWx4aV9lQUFJc2VTcFBQc2pUX2lsdTM5aUt4UEFFei1kaHZRaWs5Ym1aQklDQjlORXBtTVpMRlRJdWtha2hjNDdjLVpoS1ZqeFJtX0UxT19ZMTBTcXhrdDJqUHFoZ0lZMDRfenRHX1k0ZkREcjNLdkFvOWU4Y3lFQWMtNmdjSldidk55bUtQLTZ3dTB2bFBFa21NTGZjM0pEbkFwVTh6N3pCVjNFVzdHazlNaFZWdmwtRXZhaUI1Uk1EQ1cxdy5tTnVVdFN2aFh5YTktNEM1RXoxazd3"}'} + headers: + cache-control: [no-cache] + content-length: ['42920'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vault8e271b27.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/bf1619a0e0674c4382438c0bf7ba9328","kid":"https://vault8e271b27.vault.azure.net/keys/cert-name/bf1619a0e0674c4382438c0bf7ba9328","sid":"https://vault8e271b27.vault.azure.net/secrets/cert-name/bf1619a0e0674c4382438c0bf7ba9328","x5t":"rm26Eb01x02Xu-yR3c-iFfSXfvg","cer":"MIIDWjCCAkKgAwIBAgIQduSWYjkWTYGMFLljIscc7jANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NTQ4WhcNMjEwOTA2MTgwNTQ4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu3/t974JQoKiucM6QPrF7AXysChxzQ391MHtnlOIeEgA6gHDNRi+sP0ZTdYop5JiM+T05bT9j3L8XuwnZ/35cqLi9KbBah1OgcmgDc+1tRREgQbr9SfyvwMkI8xUVFP1hyGG6iEWRHMctskWYHQA4mA1wp83DakeMXCMclS8OoDaVSB7x6UDnQwRfPa1O67iOYTPC26b8ioCG5MSomy3l4/fHEns5thP/vUGIO7pBF4IZuSHntFG9MkLjlyHFfD0uT5yFJhCzUL5+SnthODMnaKyJ26oNtg3Vz6RjjQqBN3NB11h/6V0V/dYysir7RVdlJ8lpPoy2mqodGcWj7YvBAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDwTsh0l30yKQm7oH8eiw8DPtv6/MB0GA1UdDgQWBBQ8E7IdJd9MikJu6B/HosPAz7b+vzANBgkqhkiG9w0BAQsFAAOCAQEAXpDmdWkq2cEF2JAuPBv5xFx4aaFhATLAAZddkPPJvavKid1EaBbyxSmTQsoPcxljKucW4o5rFAHUyGgivBK7xUz04qCKALbfTVrtgsIRyd5WxZqGyH+/MAzRfVQi4a6ya9eYTVj3Z2HAA6tjOzeQSeSfRUAt+f2XrAm3jyt0H9fRxg/pQOEwOi4Mq4vwyEoXzAEn6vbgVIh5xYyc6F1lTVi3HHXIxZsKNvyaKsV5L43SpHRpWUVHtCqCrTLpZ6JRCJZp2pUm6w1ejmTGFotBmx4ikdNSdK7Il+K7OoepEUvTdp9TI5+HWJwhN0w+y30Pkq29yhWT2+7yMiuKFWnJQQ==","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault8e271b27.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":1567793130,"updated":1567793130}},"pending":{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2367'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLnBpWUtoQmpuR2s1UURwUFk1XzdXb1NBMWIwS0J2RHlfRjlfaldtd0V4RVBsMmZ6NFRjXzY5VUYxN0xGM0wxanN6MnlPS3Z1dmQxWHJXcFNpSWNlNDVxNG9sOTd1RmVjR3dmU2JSeW5NSXUzbjk4cGkzYkk5NlFWLUVJUUhHOFl6Y0s4bDJDM0ZhMXdMVlAxel9QZzgxRDZaNkcxUHc2TldCR29rLWpxczRQejlxTWtNYU9Ndmd2VTNBYUc3M3JNUzJweTRiT2NPOHpSc21yQXFySEpTdmdXbHpJSDJhOW5Wb1Y3aXVyVDA5SHVOQ1Jla1NtVkc2UDU4SDg1Rlo1YzlEX0lEY28yZ01yRmU3NXlrbTNjQnEzMXdsQ1F3emVUUkxvQXYtQVBpLVp6Wll0TnFaT3lhT1oyRFI1Yy1teXhaaGFXMUY3MkpKYXZEdnFtcGFheFBvQS5tb1VJWXpkcHZHWnI4UXdnTmdYZFN3Lmg0akhBanMzeFZ1Q3BaOFZiTEowU0Mxb1ZRMldwY2l6Q2JjVWtRVHBYTGQ1VS1kUW5Ka0F0YkVtQVVwMWxkbmRpWEswVG5obzFtRWlqVXBnUHVrR2U4Mi13aldLaHVybW9oRkoyUmNncGx3NmRvT3hnMUlKSVp6Z3dxY1QwLUw3OEl2c25nS3JUaUprZmJmMFpRRVJ4NlEzbTB3MGl1Q0lYZXlPMUxJQlBZTjZkYUV4TWI2dkxrRlVDQ1h3S18yaG4xdjdQNjZWQTg3ZWlHMDdjY2lmQ3RLQWQ5emZyT1RBaHo2M3NxLUhoUHdSQUlXQ0dFblFOLTc0aklHU1dHWUZmczNEQVVjNmxiWVJLUThhcVVSX0g2VDAxeFBUb1FvVXEyazFQbUh0aThxQWN2T2MtRWplQmtlT1kwaWJPV2hNQkJJTnJ6eXVNangxc09WMWtDbk5WYm5BemVuSmlmYlhKQ3A5MkFEaG5Jc3QtMUNOMVUwWFMxMW9LSVJ0blYxWVdFNzEwVXhkYnNVQjdWNW8tdV9kNzdVVkdQTG5zdXA1d1dLUTZRS2V6dVRjVF9EX04tMnhjTUxoX0dwZDJtUXpOSE5zbm5ldzNjUFY2R0VVVF9zT3lJREx5WnBvdDVIcE5mUkJuaVZMYlpFLWxSNGJRaDhITVA5d0MxS2FwajdRYU9yOWJIUmRvcmpSV295V0ZSRkVydWJFNmQ0VVdtTmZlazlLQ0lXbE44VjdLRlNNMjJNZUItMldUT3ppSnJlOEJkMERCYVRVN3J6QlRzdkhwUjQ5ckczOUlOQW5MSWhfMXJZMTZSUWNUTm5WUzhTaHB2blozOUkxZHgyQVp5VEhRQ1dVbnJXam9DOEE1OWYtVlRQNm53NHRXRUZPbXJ5LTNHUjJNX2h1X25wR0xSeVlNRUtDUU9UckRSNkhDTk9la245aGhtNWtRelN2UXhKWmxpaEI0THN4V0g1WFJ0R2N0Q1otU3A2Znlnc1l0WDZyNXYyU29iR01KdUFvT2lwVkZGQWRIWDE2ai16ZF93QUNZQ2l5TDkxOGZpS0NZbHdfcDBVT2VnRDNtdE55dlJEbWJ6dU5DZ21lNTVKaDE3RUF4dkkwcFZxNVVCc254M091eG44SDFwc0JMWWtxSUFiVHZocTlFcEVyQVRUVGVrTi16R3ViUnFQM3hNOU1kVWRhQjhiZXkyc2ZxMFlsNWJVdkdIUDl1ZTNzbUNldlFHWjdCeWpUXzlRM0E4aTQyVzVaUFNOakZxM3N3Y3l2N1J2bDVNNDRuRFNlMVAydTB4MUt0Qnc3bGtWSzlVd3VwTjdyZzNPdEN3bDJuWERraF91b290Ul9vRXFRcTZWWUo1QjhMaWtsQXFGOTNBX2MxUDVkZEZXSVYwTnBUQ1NOdmxZRll0czBZZHlXU1lpb25Ic2Q1RGVXNktkQkRfWTZwVXJ4LUpPcW90TV8yc0ROUW1kNHMwZDBHeEtPSlZVaFczaTVWRGt0NUJsdGFsRlB4czd4bTFaNE9QTVdfS1A5V0xlRUZ5c2l5YlR5MVNUelpLOVpfa2JsSEFCbjlVYUdhejdnT3BSdTBrcExiVzE2bmxvSWF2ejlKS2hqN3VVa3lVYlpkSlRfOVAxM0VlUTNHUjlrUUtiMFlLSGFHMGY1S3pOT2Q4V3hvT0p4cjh5c0JzaF9pcVFkOHNaeGczeHZsZmdOZHF2NDV5UUh3eGtOeFRlMklHcDUybmotZmpVOG50WVpZS3dVV01yT2NOVFQ3MzFnZ3hNSFQxLUVFSXU0c3hOZldUYnRaTU1ROTEtOEFJeXhPQjh0ZnoyeHJrZ2RqZ1ZXdE5oVWlxWEhuaWdmZ0dQcnMtLVJLem9zUk90a294Q2dHYjJsdGxhbkdyM2dnV2FHNl9lOHZwNjFBMV9qa0h3UGxVUWZHcGhKMTZTSW13SEtEU2M3c1l5NGVTTDFLWDRMbzBPckVzcVRLcU4xVzF2ZXNMSnVrbXlYQ0wzU2lYdXZzcElXWUpVM3VRMGdYZGhuckgwaXRHNXFWaUs0OC12WEpIcTdheFR2T2c4ZWxpRXhCVS11YjF2OEhRdXBISDYxVmVUcVhCU1g0RlJYSEpZUVpVQjdfc2xCclFGd2JOMUZFRXBiY1BhWXZzenF5SE5QV2RyNlBURE9iUFduc05IVzk4RDlpQU9nZGFJX3BZMDAwYlU4X0dzUC0ydWkwM0pJX3lGSDhsMGQ3c3dmajBxaTNvNDVZRTNDVXR5VTNsQm0wQzY5TGJyY0V0VFNXdXJPYzRxZEdaWl9Sa3NIU2NieXN3bWZNTHp0eGRvdHR0Qm42RWdKUGNxMzByTnBQa25YV0FTWUJsN1BKdVo4dUlKN21OWVhZYjdLNjZENUJGeXB0blJNdjQ4d3ZaZ2E1Z29Lbjh4NlRwTVhGV090N2FvUGJFTjlmaVE2TE5GRXloeklTRWZLUzA1THVhbEZGTV9KVWVSQUwwUGZaNmNac21JclUyTEpxSEhtMG1MLVRaaWM5aXh5NkJDM3R0N3RTM2ZVd01BeUE4azlLUnRDbl83TEhZY2xtNW4tSmc3aG1nZkE3Z1BRam1WYWNHZFVib004UHJVNEVsck5HMVN5WEo2WEEyUEx0ZGgxYzQ5SEV1bmMxeDFFWUpHRV9XcFFJVVdnejVBd2x1allHT0ZuaV9FUlpxT3dEWklEdmJ1RlZXMFFIU1QzRHhReUF6OTFDbm5mcy1lRHNUWkdHTTQtMkVKWm1rMGdnVkxZQ0g5N1U5UHl6V3ZlcGxxZGNyV25SMGliS1VZaUF3MDU3eWlJbjE4Zy1MdlBoMFhYbU9FUjNSbjlhQTN6LTRPUWx4cFZMTVd0TU1ibENnMmpLT1dSQUk0aFJYV3ItblhnUEhRQmZmR1p3ZGdqZl9WdUM4Z2hieVp4T1JHeTBDNXY4cmJ6STdZalFsY1RjVldvajI3YUMtM0p0UzhfVFVPWGVtdWJwU3VrZmU2TlhoVVdKc0luWHZrdy1UeXRTWGl6LTJfdFlrekZiNWk2b0QyVXU5RERYbG9FeEQyT3JTOFpFZm9ST0dpbjZMMFJxNEJXU195RWl4d2ZIMU5DYzN2WTRndlczVWlGLVBDdUQ1aDZpOHJ6eUxOZ2JYYnMxb2FySHpCSjZWVXBwbGdIcTZhVWFjWWczbTYxMldkWmpmVW5JRFpWdnhxTHVjbFZtUE5EVDc4WnVkcmlMX1JNc3drSkstSUlGdEtQRmFoYXppeVdwVnFEVlpqRE92TEdUVHB0UDRoR2Ytc3lpVWdINzFuNUF2XzNndS1WYlB4S1lXUmJmMDlibldyY3BZWXdqVnpsVnN5RlJHZ3BWUFNJZHBwaXgtcHlOdV9oY3ZYRkN2clY4UU8wNUZvanR3MmlXRTRDbEk2X0J6aWVmUXlqWENiRV9KalpiOV9fZUtaVnpuVzM0RlBZb3hDTEZ4NDFlNEdYbW9NdU4tV215Um9XeHVmcVZnRnZhR2RwSWxaOWNiRGkwUzNBc2VTajVJTnNCTmJJd2F6MDhPa2hCbllzd04tRUNrVHdnQnpJdkpUckprdk1uQmY3alVPNHZESlBxOWQzZ2llT3lzLTRBTjdTTjhpZVZLUkNtM2tqd1lRMjYtZkdGa0JHY2RRTGtic3h3XzIzRzl1U2lrUklKODNRZGVLZHE1R0Uyejdmcjd4WUNTemhIemJ5LWFWSjV3ZVdSZWZjcjdrQ2lqM3VGQmpnTkphc2RyOTdybzBWQmhhNFppRGlIelNUZ3pRemUtVFM3RkJsVjdMUVl6OFlPeTZsVXRpY2RRQWtCRWJnTUNKWFpJb1FhNmc1QTc1Qk9DTjJndGpGdk5kb2M5bEpoYW9xaTZjNGNPVVVqMzN5WU4tM2oyVnBEX04wdFp3RUhzMTdheTVja25lNGpUMG5sSmtCNHRRN0g3QUxzOWxUdS1fSUFuNm83anB5ajE2VzhhbUtEVlNBSkJJbnVmV0llMjZFQkNiVC10aVFjdDFJSzYyYk1kZW04aXd0dWJZS1Z0aXRrUklhTEFlU1pmVXVJMFVCVEc1NTZXN0ZpaG9FRGNKR0FiVXU0RE5WamVfSjVYSTNFQzVTcUxYZ3Nwal9ySHNaR3oxLTB2NFU3bGl3YlV4elJGN2pKdFFKTF9zV29UMkNzWU1HTU52MlhyN0lrQTFDdWdJemZUTFRtaEN1dFN4V3lYYmZFUDlZSHBFWm9VWENlenhaTE54NkowX1ZXZFhVdk84Sjk5VHNzTENTbWZncGx4QWtnOHZJSG9YdDk1ckltYnhMcExfVVc4cGtqeGUteXF0Mkd1eHRBZGhqSWhHNWVYM0szX0hCRWluQVJjLUFnVkI5b1lUbTEwUXVkeGdVUmd4bWtCZFh1b1picE1XNUxqUEFYcGREbVY4VlpYZTl3eHJMZFUyXzZFWGpnN00yOTRsSFYzd0dfRVlGampLWnFCZ2dyNTZaRjJSYVpGZ1cxb09nMkZhdVNBSzNqdGNPSkxQckdQWEIySWJIZWkyMFlYTnRJR0ZTNnc4bDBtWExRNi0xRnJUUzBnR2JrWEdGWURjRGRlMkx3cnFzOXlkMFZyaDRwUXl1R0VmQWxvLTRUNmZlVDVnaDNJUEUwNmtOeHlKVGxVMzE5ejM0Uk1KUm9JR1kyeG40cDhzVDRVeEk0bXVBcDZGRDFYbXd4dEU2VmUwVjN0UmJRSUFSU2JzX1hKcXpRX0lnRFpBVkRXT3lyb081TXNJVmZDVGhXODhIU0hheXlRVnZaWDhiQzRUU2JyUUQxc0dnRFMtQm5iOWNMSUVvT1lNWF9EcWNIOExSVkRYM0FRdVYwMGo5bWZlakpKZV9CZXZLel9fT2pqUXhTSlAxMTYxVTVPekJiOHY1cmN0ZjViNzUtWUtkNVhPd3F5WGhEbjlnd3pyY1NOSjlyOUl5WXB1eVkxUHVFVWdzSFRPVlh6ZENsSFRVY0NROEszOW14SnRYREMxZkZCeWpIRTdKam05SG55UG1NUF92OWR4OFBMekpocXNhdzhWYW5sQ25yd09kbmpQbTgyVFBPZ1FuRVRtT04tMDNoUmd4WVlDYS1IOFRuSVExMGxwMGpxRmk4cTlSVmVtMGlQVzFzeVkxSEY0RTNrWm1hNnNFRjVnX1RFc2xvcEhyV2V6TmEyTk42T0J1cWRCS21XcWVUb0J3NGxPVXB4Q2NNSUktbk1LdkZjVF9OczNyT0RUZDBhRDRZXzlaaHh1NjJnR01tWmN2ZHNkNHJQcExNMy1RWUdQR2IwaUd1N3E5bzZNZkhQUk5nQVpQTlRkajNiT3EwMjhPcWVWUHNVUG5tRGxYUnFpanhIX0dZMmZGOVI3OENjekNPM21IVG1xTEhURUFSVERZT2YtRkRWVFFiNzR2OGhQdmF0c2pPVjh4U0lid3ZMbGVPUTBPYXplbldrQnZ3NmRaTXAyS1V3c0hDMTQ4ZnlUd3NsaGxyWjBRU0h3dFI1TFNyWGdpaHExQmpPR09pNV84RzVkN09mSWZUMFNFUG5PbU8wX1lMVjIxQnFULU0xemdETTVRd2hlXzZxUzlIR2luZklNVFhpc3lrdVo3STVGZFJGZUMxTnhMS3BuZElnamVPY2g4d0J6MDQzQlVjeUxscHRrLXJIQTJwVDZRektqRms0TWFtT3ZacmV1X252SmUtNzloNmNYdEhxWF9mb2pGbEFoOGk4cnBoTEZCXzFET196ZkFPOUJCZkJaUkw2TktiY2lReDlIWkxnaDA3STJ6bnBVMDVfbk1XS0NrNTNJM1lnalZxU2tEcURNY0JaSUIyRTJUZUtQcTQ4QXlyYjdBZENYU1FqQlRyd1ctWDU3eHhpTHF4a2s2LXM1UEo0cGZFZjg4dlZoUGV0Rk9TXzNtdlQtYXdINy1EX0Z4a2FNVWZzb3BnVk9jRVR0b0poN2pvZ2xya2dyWXRJTHM3TWZBcTVINmc5WTlWY3R0LUZ1UTlzN01EUG91VXFhYzFDUWk1V0NFbTc1N04wTXR4aElaMTFzMTRmNExsckQ2X21LVzdlbnRfNzl1S19rVWFFUnZaVVBDaFgxX04zNnJtc0dSSDNHLXdPczJrbEUxSXhZYjZZZnRvVG11SkRJbTNIcmVraU9kUko5dDVLYm5QTnJoQ2hGYlZRUDhveW0tMTRsR3pyRnBwdWhPSlp4WFJEM2NRcGZVdW9HdXhRVkJvLU4zS3lHaWV5czZsWW10MWtWUGFQNjVFM2hXYTd3ZW1yeU82bnR4M2tNcmhhdUV3b3JmOWF3QlRzSlc4U1JqekhTTHUwWEpVV09Vbm9PcXplazdSUjRDTU9GWFJwX0sxUFFSU0MwbElrVW80cC1ObTQ4cTdJbUI4dktvZDdEc0t5RWY3c0JTQ1ZzYjZfRXBKU2lUaVpjZ2tEMElIZTU2YkFKYmxxM1lXa0hhUFhINEFZZFZSVC1MNzNlVTJPbWJQZlB6MFdWNkk1bUpEWHVDaXI4QjlaYWNQaUNqc29MSTMtUEZBSjZzZWFvamxYdkJrSTZBS0NldWJSUE9UYlRNSEdZVzVZS2pkT1lVWGpJY0NNMGkyRE9mYmZ0NHUzdWloeDJManVHLXN3NFVLVUdvX1M0cDBrNlB6Y1RTYjAzNTZJQWJ5VGRXTGdWWHdvZXQ4dW1VSEczYzB1VU9NcndyTkVud21Ia25hOFRJMFphZDF4dzdHZUZVS1VyVzZtak41X0VWa3RHNXFfdWxGOWlITG5oc0VHeEpfZ1A5ME9VZ0ZiXzlwcWlCd21TWnZyT09zUmVzQ3NtQUFZakxaUExaNkI2OXZ2ZVhvVlhsOUNoOXNjMmpxRUFKNE54QnNIN0lYWGxlNkZIeEkxLU83Ym5sSW9TT19tMmVUZXVtMGN5RVFrWFVGSU0tQ3pKNGp5bkFSd1E4ZUtwQVFUX2NTbmNldWRDbEE0TkgyZ0F6a0hYclJxX0xCYmdPWl9FdGU0MGxoaGY4SEhXRE83Yk5ySDdmMm95MDlJWXN0bmpIWDJDOV9XMmNhV1VsakJfZUxoRDFsOWxBR2xKY2NzWXhGRHVXWHd5LXlVdmhDM2lGejZxd0t3Wmc5YlRNUHhEVlVTZlcteUpURzFxdnBqUm9zN3FpNEEyVGh5SmJhbjh3R0owWTFCUkwydmhSVTNtX2hZVEpsYWpGQUhPN3JZeG4zTEgyRkxINzNMV2I5OExnRHF5WlRoV19aS0pQYnhTR2lLRVVmY3pDSEMxSTg0cXh0Vjg1ZVczOTFhZ1V1djRYbWlLME5QdEpkcHZ5NnJnVklXODRZZUJmX0RvYWFWRmFwY1g1eVpNZ2lTNnplMXhxalREN3RZMmtRMTUwS2pIaEI3VmZkc2xtNDVzeHRhRHc5eWlXWkEzdDF4djJUd1VmeE93R1d6WlBic0ZNTk03Q2h3d05DVHRkMlpYVG1QNXI4Yl9IYUZMbmw1OGd0eFNfR3FFdndRNGhHYUV3SFZwZzVEMnhFTmM2VnU2emtHbzJkaUJjLXFyejZBV0g0Q3ZhWnZJamRUdU1OTVAzOThDUGdTc3JIX1BmeWNQM2VpQVVnMUFFejF6dm41N25FV3E0dUF5U1NjS2FlSEdzQnNBUXpWM3RCSXNSSlBKdy02cTk0UFNZOTF3cl9vZ1ltYXVXbWZhSE5rcFA4ZmdfS2lrOEszUE5sc0FaTGZuY19lWkU3bURabDcwbXZfelBwN0pUU1FTM2R1eXpCaElReS1SUXh0ZkdxOXNCX0kwM2VtQ2tDc2djZXJpTy1aOTVQcGpmOFRMSjVpUVhfZnQ1MzZ3S3A3bXp2ZEgzeldETjliQ3NyMTlsek5XakxILWNZYWM1ZGUzTnV3R2RFa3FKWF91dGF3Zk5ZODZVUG8wWTk4Y0sySzJiUFdyMlo4V0ppWlIzV05rZnY3VDVfZGZ4VkhrQ0ZnbHVuV3hpUjFQTGRyNmlzT3ZxalhPS3F1RTRrOVliMXlvbkVCVDV0UXFPU0d0NWROYS1yMTV2VFRIWHMzYUxENm9CY3FQdS1zaUo3eUtmRTJ5dzdfQk5qQnRZT00yY0taOE8yVG5JNEdIcklpZ0EzTGF1V0R0Q2hOb3lLdEJKQ2MybHZ0bEd6ZlZxWTFDR2hyQ184R2QyWXcyYWtTY2s0NUtlWUc2dEdxRHF4aFpudlJuUWNoY2ZMT3I0WC1nLWhxdXNCV0tQTTQwVC1VY21Bc0JCLWtoUGNVNlloNXQzOGpCODRpN2FKNFlXeTNuX0xXWGN5SWJLNXRSc1hfRmN3RDRpRlA4WGc0QzhpNlFPdTZqZHVJUFFRWnF1MExQV2pjNS1FU0h5WVREUzF5a1VXZ1VtLUxCcjBGVTlRWnhsbWExd3dFQVc3QjI1UE0wbkltT2JMeUVjclczUFJ2eXVfa2FVNC13bnc2TjVzRHlEZ1Y5MUc4UUp4WkJkTGJScnRCZkpUcXZmU0tvVVU0SUVkRUpWODZ1bTNKODloNllXbll2SEkzM1ZxM2JlbGMzTWNBRmt1ZkJtRHN1cWMzdmNWNUVZNHpvNEhQZ1RRbE15SnZ3RVVPQXFwZHRoRENCRzJrUDdlckRrbWtHc1pQU2JsMkZOMEd0VFdJYTJ4SUdWN0hiU2FXZlprUllZeHo3VlR3TWJzOFpOYjluQmRpb3JFV1dDRFpyQThJRWdiUFpnZnlmUGZLVmtlUGNWd1dmZVNHWUFxV2padVFYaWZLQ3NqMnFkLXgwV2ZOeHlsRWc3bkdnRVVuaEhseU05NlJiTEpZLXhGaElRMTVMZlljM2hkdmlNQUxVZWRtOGZrRE9YTGd4VzRaNjZ2ZnlmX2F1Y1pkR2xWanVfZ1poVUpJbnFIX0NtYUVCWXJnNTFUUlBsREtrUXFjTExuX0RPZ3hmZlF1OXFKOVVTUHNVTXRLLW5DaE8xM29wSlJ3SUtQNExHNldvVnFBUVV0amlXMGRiTG96NnRqODNHeWlwbkFGblFfZjJJM1ctQXRCVlNWUkQtN0o0WEZUaE55eHl3LVltTGhzUWV0LU1TQmh1VVQ1TjZ1NDdfN3E5bVdJU05kUlN6WnNYOW5ZdDVfak9LdzJzOHcxMk92eGo1eU5JM18yQVQzZ2VsSEt5Zi1Xa293ck9DVm9vSDhDTzNCWTVrY291YWxxTmV5eF9yMXBzNXM3cEhJNE9nUVJPTkpoM3dqNHljelUtVmxiRmx1MXB2U1lWcEllNzB3VWY0c0dzZzNRdUdMRFBydk5RZEpoeWJLN2Rsb18wcng5R1Rkcl9kTjVRVGE4YnVQOTRodDdOcEZlejJuYXFuek1mRjNCS1d6TlR5SjhfU1BpY1FWdEU1ZE5vUmwxcUc1dC1mUlY3d1liN1p3QkpzbXdUbGpGYy1hamp1SWNHMUtZR2M4MzU3ODQxOTRwTkJLc3p1emRJd19SeV84RVluLWJLcFI2WExkc3o2bERlWVc3cXdveTlEcTFxMG9aVHZsN3BXdDFnOTNFV1NNYzNzb0szMzBxS0h5VFppUUpKQzVDM3AwR0VXZ1RQZGtJNkhtVzA5Vmx0TklNT3FWN2NYYi0zOGc4QWFqNVd4djhqZkpsYnpwVXJ6MjlJWkd6Y0lmV29pbUhOcVFkdFB2QzJNcktnX29Xcld2N1dsN1o3WGYyeENoQWdoS1lTVDF0S3F2NEZHVkNCamd1SExWZFpyNVVBUDB6MUdScGw2OXF4a1hPRERHbFhVcjdQYm5OZUxoVk9WR0VrOGltUFROekJUeUx3clUtLUdRaTY3VktQY0FiajZLOU5qdnphQ0hkYmtFbU5Ud2FreFlaMUMwem42cUcwVDR5M1FDa05ZV09TVlo4dWo2YktSUkR6VE9BTExnbXB4V3ltTEx0TXMyNXp6YVVZM2xSbENNMl9sX0d3RjBIOE9FdG1fREU0VnlyOFBZX2k1dTE2ekFHWkRVVmNiamhncVo0S1VCWlJueTJEaTRKaklYOENWVkQ2NjRKWEtNMUdoOVRVTHFyQ29QeGdjdHdOTmx0cUgzWHdERGc2V3B0dkdfYWEtb3FQY3VQa3o0YlJFcG8yQXdHeWdQY3FhQ2NKeW1NeTV2SjU0TlNhN1BNQTNGV2NaZFRNdEdXNThQQXpiVmZ1VlNUMC10clNCRzlVRlVWWG02a0EzT2xwZ09aMGtCemk3Rklwc0sxa3FobUNrTVRRdGlLWThpUmpmOEhnQjhWNkM2M2lGcVJmdXdSR0w2X2wzOGY5X3FydlBXTlZCTkh1ZUJkT1NacGhyaEhveEpvb01YdUlrTGh5TWdvVmNjb1FDdnN4Z09OdDVGTGYwMUxMM01PczAzamppV0g0TW1IR2ltWVp0MGdsMFJ2bVBUSjF2TVp0dEZiaklXa19nR2d6VlJ6WmZhMC1IVkZ3OW51TndyMnVUM0JQTUtORHRCclZXU3VoQzMzSF9MWXlPV09fZnRhdGZzNk15NlVSb0RFVUZUcHB5bURyd0xYdFl5c25qbE1mWGFrTHktd3dVVy1QUS1oS0FXMXR5b1N1eW9oamYzdGR4eFN2RzZ3ZW1HMFJMUHdaUWw1THZ5alZzV2VYd2ZURFd1b2tZZ0QzLXJWdXB6V2xDSS1JYm5YWkRSU3JIZnc3d0p4TzRRY3FrSlRVZXRoSzN1U1ZMSElvdnFZaGFxazRHc0t2MUJtZjJwU3QzVUxQdUQwdk1lc1Rhc0hZZ29sZFhxRG4xMWRGZmtXNkgyajBFZElYQlhrLWJ1dThOYUVUWXFmbkVHZ01mTFczd3p4azZrekRqajZNaHUxTDFkdXRCeFZZQ2hGZm9TVVlXWldPOTJETERvLXNqeUU5RHp0WmJsNUkzZWF5VGN6ZlQ2ZW9EYkpSa1Q0VHNwQUstSW1hM0hWbk1jbkFfaDBCdDZBVDhsWndVbXdBZS1TOUo5aXg2ajJKTzBocVJhT0J5ZW5rMDQ1aFh0TWhMTl9idnY2UHNsTjZWS1NIZm1CNC04dTRacE5UZC1hZjhqWWpxaXBocFJLVlNXQjhoYlcycmo3NUxRUG9acEJHM2MxTWFBU3l0T05aQTRBbm9VWldEYVV6QTBwVXZLLWduOXlvRzlZUjBNUXp2MnV4YV9oVU96VjdGS1dzRlViWFpBUGpfV1ZZSGhaZHl0eXRIWUh5V21FWXJkYmdScC0xRmloRGtpZTNNOFM4OXBacWtBMjZuNlhMQ0tXVUE2MkczV2pfZDRMaXB4aGx4SkY3cVhxTGx6Y1diXzZlZFhsVi1qSlRILVVid3ZueE5lX3d5WDZpNVhYS1ctcnctU24yTFRQSUppNXl0ZzFUa25FT0gyejVDUXd2dHFkVW82aHlJYlRJZmEta2RKVXJGQXVyNG8wQWxITGN2S093aGdrQ0IxYVRRZjlfSHgtbjBNc3Q4OGZMejJINGJJN1l4R2puSWc5ZXVuZFZMTFYwclJqVW1vclhmTVBYTy1FTUJIdDZrSlpOM2lKNUVjU3p5UzBDRU1fUU5oZ3FxLWxWMk5xdXB0emFzaFNsQ1JiS0NmcFBxRGNCUXJER1ZVSjZLMWNaQjZhWEFiUnlKVVNVb1pHYmRpaW53Y3h3Y1ZPT3hDZ0dyd0JiQUh2Vkp4ZW96bUp3RWhoQmRmREZVc3FYUHRVRk9XampaTVk5RWFGQXhEd3FwTEJPTzRTTVpPUzkwVndNaVdweWdPSXNsMHUwRUwxbnMwNkFVZ0VpLS1fcnV0b19TNjl6RDhMaWR3bjl4R2ZzaVgxc003dUp5eTRRLU9va1dteE82ZEkybDhVMFJ5R1NWek9mbmhZbHFVU3ZvRk82ek5helVlcXdhc2dlcDlPYVJrVFhGZ01RYnctSDBQTHdmTmhLT1Y4NEJkZkhPdks2X0tETW9hSEFxOWZrNWc2LXhIWVhKQ3ZDcDhZa1ZZTGdwRHlxTjZFVmlxMzAzSnktZnhlMEFNS0VTcVN4amR4MnpnNlZ4aGxuMDV6dWY5QVlvd1AwR0t0YU1rMkpqdnlPS1V4RWt3ZWx0Ukw2MkFpZno3VkJOWFBhV0lfU3BZRDZXN2h0dWVxbThGVUo2TTFOOG9Rc2NhOFFROG0wdXpMd013cG01em1SZHUtcTg5Vkw5VkNuTzlXdTBxc1JKSDFmNFk0NU1QZXYzbVVDQTI1dzZUNUI0QmlVV1dJVEQ2S21Yb2tmV1ZwVHVEMXdmT0JSY0Yzd3FIOE45QXBfbHJMbW5UWnYzVkx2cW5qNndWYVNQWlNKeW1KcGhwdDJxdld1M1d4VWRkM3RIaV9VRGlJZnNrTk9SaVRvSVE2bzBUSVI5Z2JVNGVVTDNWeVVwTzQwN0lTdXo2X2N4SjlNVTlRREdSaHJXd0ZBQUFIelY3amtXUE9FOHhsQ2s2ajlxaGIzN0ZES04wZkFweHRPQ25MSWlxcFVSd2ozNmMzd0F1aHVBOE12bFRZWWUzWmx6WTlLWmpBZm1WeFdqWEJOTWcyd3NPNGhCWGU1dHRteVBJTGtlN2l1bERrNWMzY0wwVzFneDJGUUpmOUdDSnNuUDB4QTJNd3FpazNSZC1JaXVfNU5lRDB5M3N0RmktVVRHaGtySjEtcXFxWkc4OU1ySWQ3Qk5TcTEtckZjSDMySmctZkFVTS1KbS1sUkxJdHVZUFBjWFpZeUQ3MGhBbjRXVlViYi1haXBnWWoyb2FWMC1OaVhmRWVxYlpJME1TWnctTnRDX3IwSV9faDNJc0xlbVhuR2ZvbVJNbTZ5SW51Q0wwdXdOeV9BRGx4YzJlclBKS2Z6MW9STmhJaVFOMnRMeGdJVE0ycUppeFY1aTJFTVhaeFNmby1TZFQ3X0NvVE80bWc0VDhhZ082V1dFa1NPQ01YeFRHUGEwamtfTzhBRUtzNUFSMGJfZVkyNW1YeXphbDViVlVlcmhfY2pKRnlTQjZXY0hHcTZ2MC1LOU8yUy0zOXp2SkQ5RlpLVXNrM3VJYl9VZDBSTFA5RFhXLUgtWEpFNWJPY2VvazU4QWtQU01SQ29wVVp5amhvdmxnV1hWNVVJWmY3RFQxTWlNdUVWS2lDWmFyME93eEVvcWhHNjBhWkduTkRRWlV4TXdhQ3k2eC1ZV2p2aUxvbkU0N1hwMkI1U0xBTkVXeC12a1hJQWFvLTU5V0lsTS1Ja24xblZyWU1wQmdsX0JUM2pjMnFFRVpuVWlIb1lfM2wwZ0MwUTZLVVBub09iYXVkTHdNYjNOZEctNjE1ZDRhYUo3dlg1LThnS1NDSVExcEFXXzNPYUJIVlRtZlBJTnNUVnlWaEJUR2staXhLcWJaTWp4QUVlcmRQQjJ2NlZ3R2VfdGZCUFdtM3VMV09Zdi1PRm9MWUZQTTdCS1hmUkVCYmdqWVhuY2JDTzAzQ1ZsdDRLNDFJQnVlbVQ4YmpFTF9YUzVRa004YlhjNUE2ZHFETER1NTBQSm1QLWM5MkV0Y0hqX0thcGxaTkFqRzVmM3l5MVlIM1AzeFZXSjl2SkRGamg1V3ZWRm55LXkwYm5PaUU2SE04ekQzT1pkaXE2bFR6WjlHNHV1ZGc1NFR3dDZ3RC1MYjBGenRpUUVTZDRpdjlvbXFDZEZjbDl5eXcwaFkwaTlTdVREMlRUeEkxMjJscHZ6dlRQZ3BobGpxVGxCRVMtWVlzZmE3WXY0T2tOYnNYVXJVUUZVQUxXVGFHanZqcUltcFlkcVNsMkViM3ZWRlZGOERTNXdZUmhJREpfRkRqY0V6TlVkQ200ZFh6RS1jRzJLTkpSRm1JTW5XNEgzN1pqVEthVkppcVBxN0dESnZCY3E0SlBySmtkU2s1emR4THVNaEtHMU9QTXdMcUZTS3dUeHdXQUMxdXUybE10NkRnYnZrZUJKTThta3ZCa1RUSEJDRnZ2RF9IMDRPaWNVT3NhNlVDaHpocnBQdl9fOXdzU19sRFlqdUpGSERrRkZTNWFnSVNKdjN5R3dReWtVNHR0RWd6aS1Pay1wMTQtcVJETGtfLXg2ZHhWMmdGcDhCUGVYR0RaZ0ZnS1haYUxPczZzTlV1MGFkWHd2TGlnS1JmSE9DWUlMSWd3bjlEdjRrLXpfekZQeWg1al9TM3pPb2hhMXVYSFFNV2F6UTh3YU1nWTlJNjctSHJ5SVRtOVlzb3JHTHdhZnR1cG5NOHppNnpmSWx0Qi13dzBhMzRFdzZFZlQzdWh3V1V4dnJ2Ml9IaWxCVHFVUHYtT0N4MlpvSVZnMEJLMi12SDFZSDJEMTEyTTNiWDZGdUdmUmwzQktSc0xrRnVPdm1IUW1VVFl3U19ONVVDZXFCbTJ5Q0w2SlZZUDE2Ry1uMFBkOVlOUk4tcUFyWEpZV3Q4clhFS3RjQkFfMWJWVl9ISXNrV2Fwd3RwQnFmb1hMSXN3UHBBblduWnRLY1VhcXpTS1hVSWdpR29MYTJZOGxUTkxqdkh4dTNYSkktbjJ4Y3VWaU9GUlVYZVB1bHNWNkFzQjhTWHFOUGhfSlFRR1o1NWMxQmdPYi1JTVZIWG5MVUxjNUZMN2VzaWNRcXJXSVFTeUJCakFZaVZfb3BOV2xFZEt4ZGZOX183dy0zaExubDRwZF82QmNyVHVUTzlQT01YR3RjcjY1MUNwZmREYW42bWczQ2RtUlJEUE11YWJuNjNvQjNMdGJpcktHRnJuV3Y4TnVKaThUb3RiaXdKWjItU1RMSklna1dJdzFXMkxRLWRCYkVoQ01ZcXU5V2wya3pCbS1NdGRGRVdsSzhmTHBXUERNSExoRHAxOGJGT1NvM3E3elRLazlhUW91bXU3dmZPUGhWQUdGYndrT0xEazNVRDJkT3RxX2hJbFh4OW5NN2FyWkRRRUwxTkxPeUZEUktWTVpBNWxBSk96cVhTR2UtYmdsQmI0bmRWajM3cnM4cjZiNTBfU0hwd3JzM2JPbkZfaEVTWkhXYnE3a19Hb0FBc3g1SHB4cGctR0JxVDBQZFZwOXZkZlRTeGI0eWtCUm5EWU03WjZITlFiZWFRZURPSHFRMmtSUFUyWlZmcHBQRF9RY3Y0X2hlcG5uV2xqVklVaWJHaWxHdHNaOUU3a0ZCMDFsVUtUTFFCMTB3Und2cTFBbGFXMmlMN19aVHh5eW9iNHFhbE1Fa2NNR3J6Uy1EY2RKVEF0MEcwYXV3VnlVTmFDRlpKUDFEWWdfckVHSHI1bDFEMkxhcjFwc1hRLW1sQ2NtZkk0ckVCZlNtVnRMQWp0dFBIZ1F3VGlON2hpR3FJMmRUZzJHZ3VjRjR2T1dFTzl3dkdCMkZDSGFENm52Mlc5aDFKcFFKQUxQdVA0VVVYNHBvSmpfem05MkZueHB6clk4TGlrMzk4NW9wNjA0cjhBYW5STnhPUjM2Tnlhc0ctX08tRG5jcmVJb2NCVWxhVjJNTExENE9Fejdja0RsaC1UbGdIa1lMVHRyTmVHS0t4cGdfMllpendsWXQ0WmFuanhJRDVPT0F0VFVqTDZ5eXRwTnNtS050VlVrLVdUYTdpU29XVDN3N2REWHJGQnlQMGstSWZteGpMVUdXcXdlRzcwbnhmNmx2S3kxOXlsSmJyYk56OVRWOXhMZEJlZTVvWERQaWFNcTNIR3lIQm5uUXpiNmluR0NmN21heE5yNVE3SVN4Z0JRZVA3OVM0bjRRX0RWUVE3ZU1qbHh3N2ItZ1NSTXktaGFaXzMzTmJfOFZ0SUFOc1oyTHFlbWdINEJTdzBLWDZpZkpDQVJsNVNNTE9na2hnTElzRE5qVnM2UGh5OFBDSnU1Wmx6azlsVE95cUZSM1BLRlFaWXoyZzFaMXdFVzFTZ1IzUEZZZGJkQlNPOVdXQTYwZXFlaUh3c2RRSDBPZUEzRE1zemlsVkVITDRTZHhWNnl4eDZlSnJ6LXhiVmpqRDNBc3dOelZ4SDZQZEgwSWZlQ2xJc0NsbkFlaXczRGFxODEwTnBxWEpOaldES0pjcDNLakYxcGlqRDRxWlBTM3E0ZnpPRUF6ZHZsTmU5dF9QRThpZkRxSnlLVUFJNmZDVGhxZVA4RzBGLXJSTEIydDh4TTJQeVM4dkpUa0hoWU11RDFQckxkRWwxdEV5ZVc4NktMakJrdzZxcUU2MWVQNFpJM3pmaUpSZENzQ3I0V3FQbHk5THgyYkNZSzJiTF9HVURTMDMxRGRlUF9JV01aX1JucFNqVGUzWWh0UmpyUEFwSzZ2bmxJVXhveXU0M2NpNDJSdmtsQ0N6NGtmS0JfbnhMZFREVEtpeDhZT0JSb1c5b2NvOVpvYUxoY0JQVml3SWxsd1pKRXFMOXRHMnJSTktuOERzNld0eXJlSlZWcGIzZFJwOThyb3JZUkw1cGk3UDllenRLbTV0TjFrOXlrU3BYRnhCNFpkZVlWUHNGTHEzQk1qS0RfVF9XT0RZekhqaG5FXzYxUm1tLUZ6Nlh1ZWMwSDlqb0VxbDZ0dVdhaldyT2FYXzA1MjZCYTRzTDgwOUJtUkN1UUR0c2pXY19TV09qTzZSSm1ydTFtYUhEOENsRWRVNUFHZFZfS0JvdUIteWZ0N1BCenduMjM4MDBtUmJMWlZrejRUM3Y0SW4tdVZFVHdIWEpHWG5tMHJ2T28tS1A2VFgxdmNfR1ppRHNtQlhWbS01aHVYWWd1OEVXRG1HeEVjaFlIQ3BYc0VtcTl1MW9tWGRqaGR3V2l5SWozTWQ0YldCVTV1U2cxWEdZckVlblJJNm1DRVM1Q2xqMHAtdTNwRlJEOHlkNkowdi1qb3hNWmo2RDlBbFhVdzlFcFhjdnZUQlZ5eW1ybnB4VkF5dkV3S2pjXzExcDBkQ3hCdFdIR0t5Zm85QUNzRHFsaU9BMDBTQTQ5QW01aHk0alhseU1vV3RXc2lUZGFscElPMHZGRllXSEFrcElzMVlIektEUmNsUUJUVlFaVHVIUzdpQ1NqZmlyek44cng3TWZqdGd1cjdFS21wM2Z6azN2aDFRZVpvQmlZTmExYVJidGpsU25IWHNjZ2tNeGc3UTloZWdYeThyRUFNaVd3SW1QSFlna2wyY0NxM3dEazVaRFBPWUFTMmZueEV3b1I2cE9MWVZTX3BlLUM2WTI4X0NLVm5OVmdrN1dwZEJqRVhzU0ZfZ2pUN1FCcnBtSjNraUVGME9UQmc0eGlqMExOaG8welhaUzBlQ21wM0E5ZXdYLU12QnVmb2RzZllMNk9QUHpEb2VPRnctbGRQdU9mbkRsUnpwc0VZMEVVam16am1kUHROY1FsRVhJRVV0M1l5X0tkeGdkS1JzRktXX3d0d21rWnFoajdiRGl0ZkVIcVc1VVFjZ19LWEExNVN4YkJuQnZ4NHdCcEtFTERFMW80dG0wTVBNTnFsejl3Q0FBWXpGSFBud2YzaFVNVUdBSUUySDFFVzFqam9yakVNdDN4amloblhIVXFOOUFoRi1VcktVQzd4OXJDTVBKRWw5Y1RwWW5xTnNyR2JnajZLaC1qV1QycThrOUhaMzZqNmZCOEhISmF4UEwwVW0zQ1Ata2ZOR1M3TU41Y2h3ZWZ2UTZVcHJVMVluLTFoWldDeU1Dd1E4bWZXRXd4Z1M3bmJIMFNlSWVaZ05OVHdwZVM1R0FNLUFBUlU5enJFOGN3eGRGTDRHcGh5Q3V5ZXMyd0Uxc0h0dEFLMFd4LVR2dGVTdUltbm1VTDNWaWJuVzlWNE9veFlac0tVVlRzMjNLR21Xd2R0eU13ak5XZVNWSUFyeVRoclBBZEJWaWRNOExVTUxlcEo0Y1lUTF9fQ3Vhc2oxUVo1RWF0NW83NXBzbExQZ3pKQndhaUF5b1JMWW9ZZzhlM1VzekNGTnBLX0pkYzhiSTN3TGNQMmtSNlhMMTJoMnJRMy1JUi1QUEUweHBVQkt3TW5DZHFPWHRQY0FqWmpCSlYyVWlId3lOcXVNRWpoeVNkVHNuNWlnNEFmanFSUmpMSjFDX09PajYwUTJ4T25YQThzWnlJRE84NW5jazNOVDRNY3Z0bm9McEF2NURIOS02dUZNaUE4YjZKbzcwSEtLNTNXQmhKb1pmYmJtaXZZZ3QzYkhsdG9nWVhzcW9oZUFtTzktZmFUN2lrN1NXMGJDdk1lZHM5cjJrM1k5TEphWkVZSFZJSHFoVDlzTnoza2k4aTVSN2JaUXVudDBLVnRNNl9nZDlMMWdrVFd4UGFfNmhlc2F1dVA5M29TcVRMaFVHbHZUUDUzQW1ZazJVTm00dUFCSkdXY2JQVC01R0tWemx2N3JFQ2tnVlpENnNGS1V4ZHhBSkVIeXVPOG5MaG1ISWtLbEh3TTlsbjl3UEQxZEtKdUxiUFdIeXMxd1BCcjVBMm1GM1lBR0lDQnpvRDltck1mVXVjaHoxNGZCM1R3WEtQejA0TTRSdlk2bmhQMjJsZnB3MEgzV3F2Si1TN1JnMmdFckQxdEFPeWs4TG5TbVB2U1U0YnJLRWdQN2lPWDdjUThrbjFZSUoweS1VUzgxaDh6M00wVHdEclVVTUFiQzRDVVkzUi1CUVpvUVRoZ3UxTGpvdXUxTUhmbEs2S21LM1B1QjJPaU5XRHZxbzhaU25yZ3BNOGthUUJBOERZUWR1ZVBtMGNIbVhuYy1sZllUMWs4XzdWeE5uNGxvUlVQQmFEZzlzQTJOLThKWVFiNnpVcmIzY3Y1aTExY3pOWl96T1JoQUd3T1FxRzM0MXNxR3p5N1JGUFkwTW04YTNqS3FrWm5PSGJMTWFvUEdMN3I2ekVJR0tCajU3UWFfU3RheTlVRG9VajhkYzM5QkVYYzZnOWZDenc1SWs0bFNjOGZrRlpxblhYVWRIc0p6WE5MYnI4Vk9yd05EMnFDSzcxb1lQdVR0NFZqZXlUQ1N1Smk0cEI3c01YakJkRDRSMm82bUFRbnlObFRGU2Q2b3NiOHdqcG9nSDBTNllRSDFaai01bEtKZERWWWxDQnVvNldMcmRyeFlEdzhDbHVNUW5QQUM1US13TlctUnBhWmtZcEt1aTgzem13WkktVFJoRm9mZVJEWVhITFdlY00yV0FrbE5Rbl8xeFItXzlDNmJuMWROM1hCcVI5cFZjOGNzV3Qyc1NsQ2RkdkpVcVJadW9TMVE2YzJSbTBWYWZNcUEwZE14eXNzQmloYTQzWnNuaklheUwtYnQtcFl0NnlRX2ZSVk5aQjBrRVppdFdZNll1X2ZqQVZuYWc1RXJTdk5leFdSWHVvOW9valY5c09QZHFSQUxfaDZjWG93RFg2TmpabDUxN0JVc2JvWUplcU1nZmRhbGZKUTdISGNpU3ZaSnVrcndoSlJDSDdncFhtQ2pBOEExVUNtQUpwVGNlOHJJZFBhb2Y2OFQ1aElCaEtldmhwZzI2enpzQ3M4b1VxWGdmdDVTei13U2l6emhUZWhJSmNoREhhdk9xRUZBZlVMRWlEOC0zOTUyZXAxTU1CLUdJTnpDb1NuVHJZSzg0bXVEUzQzaDZva3pJc09nQ0Z1SnFfX3d3ckx3TWdMMGNFTmxjaVdmbDQtdGduWjNMb04yVXlJbFRkQm5BTzZJNTYtS3RCbm01dktNWnJ2cnJ1YlpXRGJaYTVoNldXRmxKQkhlNkNjOURwcXdVcVRDTXZMZWxHRzI2RlpBYXhIRTBSQTV6ZFYxdXUtTTlYNGhNd3V1V1NVS1BES2RsSEtXT19naHFnZlY4M3B5Q2JNQnY3eWt6SUdWVkJ6LXltcHI2WmVoSjNDenhkck9Ka0tKSGszblluTWh4UXFVLUFQS3pUaHgtMlBWTG1WblQ5UE40RG9PYzdMamxrdU9rVzZLWUVyRGdQdVBQdTYzVHRPWmdRejZjRjJfUzh1VU1WN1pIbVhlczlpY2pTRG1DUFc1SGN5cGoxT3lxakZHc3htblNJeTE2M0NILWdRREw1M3ZVT3k2ZHdTdWdfRHFTdDc2ZmNGVVplbFdCWDhkal9OT3B3NXF2eGlSZFRYTGw1QmR3bUJnaHhNUGtzNlFBalFaR3l4YXZKbFg1SklfWHVGZkxsVFVxS045MHd5b2RUUUkwdTUtR19ieEhUei1lZUVCYXluQVdzc0FSRnRYMFgxR1M1TzVaSHMzTURSY3NkcUNQWkRCakxySy1TTTZJNF82cXRHaFRXekRnS3RwTVZKWDVDMG5yZ1AzTG5TUzhIWVNSU0VPdmpkM2w1MmxyTVBLRk8zSW1lbFFYbW40V2xDMDdzanVjWlBtdlJRNWdxNjdvOEVZMm52NmdpZURibnlubGFsRS1teDZFWVVLWUhuV053cmllVDc2d3dqaG1QVmhaQVZLNmNFeG9DMHRyVDVmYWhVQ2dsMkdHZkMzQncwMUo2YVRWMVFCUTRTSGItY25Cdm9DZTlQSmZmSUlQQUhZb1dIa1kxa0dKNlRUUGJEQVBUd1Q5THZOS3p2OURqQ2xGTjRMNkhzTEhJRU51VWF4c08wdmRCdTJhdUxQenMtWTBTQy15SHk4elZpN0pJR3pjVUVReUpvTXFaQjllR0E2V0ZCQnJHTkhNYXRSYnNwUmthb1VSeEFOa3VuQ20wNy1Uel9pekoxaVcwci1Zc3BTMGw3OXg4TG1EeTNvWmpzUGpiOHdna0FMMlBlVm9hLXZVVzQwZkp4aXVHWFg0bk5mb0ZVYTlyMHhQRW1zZTllYWVsTU0zbmg4RHpBTDdLOUZQelJfM01wTDllN2pVa0pjYUxKUmR0bktfVzhvdE5MdUF4cVR5Rk9RTnNLNFNVcllkT1d0UlZDWm1janVVNzBHOGRJbFZSVncteHE3WVlMakJiZmpWQ3Q3QTZFVVRObUdmU2lPMkpUbFR1RWhGY2JUVnVyM1BlY3Awa3g5dmVFaGNqMjlXZUtJeTUwSENPekVxU1gxWnV6cnA4RGgzd1haSGpna1EzTjRDYW5MYUVYbnNzSHJWUnpYR2RiUHI4R1FWWTZ6OUhjMVd6MVZ1ajhCVWR4bUhZYWE2T2hXWEN2bWt5eFFfYUhjSWh1UXY5Y0c2U0J0VUplTkhSQ0VkR2U2X0tfaHR3cFZjaXJJWW1pbjdpbExNWXBDQ05CSVp2R2tvdTdOMjNDVU4xQ1llZVp1MjBVTjRnVWdjTlp1VDlIcmJ1Wk1HUldpaERyV21fRjZ1dEp5cnc5LUJlbVFycHNhSGlmQVBTbEJ5WmNJZ1NTZkZyU01qV2xrMkFRRGtZR1E2Z25fQm1oZHItcF9BTEd4M2FFR2NqUW9Bakc0Z0tzQlVZTkdFbzNxTXM2TWIzUnFUYU1XWGlIQ2FoYmd5bG9qSGVONk0zQ2lzdGllM09LVEY1NGlBd2xET0FfSlRkRWYyaF9hd3lYMUljNGRZY1ZSRk9USEZkTnJQZTF4b2l0Yk9GLWR3T1piUms1YUZlNVFwSVkzWTZUYnR2emc2MmlMQ2RLU2taaGwyWWszZ0ZUcHl3ZmdPRV8xWEs2MGRpZkpmMl94WDRxQTdleG1ULUFHWnFBSHpLeGhJRVhrYU5pRHY4Y0t5X1JzcWRod3k3enpkYWozb2tQN2VhcThRakNBY3JWcFB6SU9KWVlnNzdiSzFoQVFvNG1lOW4wY0tXbjRJU2hzWVc5eGZ5YzBYTVNQd3luLUtLZ1daYTlxLXJXTzNYb2cxaEZsbWhWS3ZZZXozTlFQOUt3WGJDdXl3X3F5SEQ2LXhDamVOX1RrM3hoUzJIcEIzMmxfcFU3X3dNNG1SVmpGVV92bFM5UFdnVGJ5NHd5YjVRM0RtbVpYOC03aTFCdEJsZ1BnUkppUDR0WWlPUUd2MTZJUHFWYUZjWWNlQlZoVkJhSW5fb25CenRERUJ5Zmh0SGdOdmw0R3ZuSGFadjBuMTJldXdsdmVQUFU4X0gzeWtrYlB0MUNQQldJLTJrdnoxc3hmbjdvZk1ndnVoWjN5V00wTGdnMUZjM1VTYjlzeUtXOGRUUlMyZF9CendPbVFvNlk2cmVzYzMxMU9HMUl2a1BXR0ZpbDhNWms4WkVOQ0NhZ0M3S1Iza1gtMm02NXY3R0tLVjhrSjYyMEUxaUFhYU9LTmdXZjRJN3FEZmt1cDUtVDF0UnRPX0l1X0l3M3M1dzluQW1YUWs3UWFyWkFVMDhWMi1Ia0dHRVhYYVhPbWd2RFdCMzVPeUVLUU1nYUh0YWxqNGYyVUpSSjFJYnd4djVTRExRMzJSUlpJMG9vVjRQTmtfTW0wSmJzY3ItTkotZHh1V3BxUUNTRExQcGZsZDlyQWZId1JnOXIwX0g1QzJQMFd5QnVTbWlvbnVVUkdhSXpjRVFZYS1CRWw1SFY0RjhTeXZVYUJUa3RHTG80NXlxU2hzVlF4a3hkOHVkYjliaXdDTWFGUlNVSUkzdG5CV3VadnpqLVhFMFdhQm5lTE1IRU9UT0hTYmRTVWI3Z3RWQVhvakVCOHNLRFRVRTBXOHAtdkFuYVlYVkxFZ3FNem1FaVhDMGVobWQzTi02eEJUTGt5MGptNHhyVlZmN2swbGtMeDQwSVNScVprWVhBNThyMmtJYTVLcjVmLVNaaEtxZVFPbVB0MmpCd1c3ckM4aFNqS01hdE9VZHlEY3Q2NHp4dm4wR0JMZHZxTFVJR3NGeTVNRGNYSUZkRl9vbHlfOHJPVUZEV0xtVy1EMDZzS1NPQjhlbTM0SW1KWTFPalpyd3RxRVU3OE9LZVVxYW4zN2RjUENHZ1drYkhSTUdFc3JsLUs3Qm50ZFFGcDRkVWxXVEkzcjkzS21ZbGpmTUJ4dDlERHBJVXhnQlhvb2ZwYm1GUk1vcS1WYWtRN2RTVWRCQU5FcFFrazFnSVF6VS1FdE4xbW5RMUNFOEZ6TDY2SXFMV1dsaERiSzlUWjh5ZTFJbFZQcmYzOC00cHpkVjRVWi1ab09xUGtnOGRpRjZCMWI2QklDVUdSQzV1a3hscVhYNGNLaEdlU2daeTMtRm1YdFR1VXBtSmFON0M4Um9aZlh1YUdTUWhFejJfRnhmZktOQ2tJcGVSWGRhWUNoRk93QVc4cWZ2NXR4NHh6aWVfTHFoX0ZlS2ktT2xwMGhBZXlDNC0tS0lxalA4bnh0T2QzaEhuYk1IVUxGN1ZvT1B5YUZITWlFbG1LQUlwV3FuRDdKdTkwanZ0dWVyV1JWT0hSRktaUzRtY1BoSWFudk4tRlZjZlVMUjFNNVFvZlVaMzI0NnVfMXJ3RnhTN1FheFBncHdrMFJRamxGSjZUaER0S01RZGdSNkNEeFpNc2htc2F2VEVVOGtJWGtBNzQ5ckEwWkdBVGZHVEx2RGJjeV9HSmVTT0NyS0k0VFVkNm9TM3M3bXIzZFpiXzlad2tsNVpyTGF1UlZMNnZoamJDR1ZuX3lGYS0tYk1qbVoyN2xoVlFKVk5qV0xjVEpHSjZKMjA4YTl6T19OSzdSdXNoS0FYN1RvTElUTEZHTldmOXMwREFlM0F2QmNsRmpQVW81ekRPNUFaUWpuNG96LXNPZ3hyOEVPVzR6S2paWWN2elhjUFM1OEV4QTlLLXZ6bjdqVXpsaUlHYTdEZ01CS21Wa1d0eEJiMHlpT2ZJOEROR1dmMXdIY19RMkJ4eElSWDFXZDF6SkJEZWN4dEtQLWRCckRldlRvc2w3MU1aVEdJTHdnVTh4cUo4amhja2FpMmhkNVQ3UG9pVUNjOFoyakQ0WkI0dUFTWks1bkJJUkxGcC1scm1vUjRpSzRnbzFLY1ZBbzdUZ0JvQUJIWnN6RmFlRUZ1T0VXb0lwS1pOOEdEOXdicnVWUzU0T3FwRWJsdkNWOHZ3T0hST2hFNW14cktKVzNjWHVOZjV0b2h6VVc3R3BzMlJBRkVxQjRZS3FLVE5CRkJVTHpFRkdWSWI5bFNzVEg3WTJBYmJTZFI4Zy1OWjUzOUxMN2lxd3NLbFBoTVpMQXNjX1ZRdGJnaWdQRDJjMzk4UXczY1NRYnhfa0p3cm51M01UU0RYUng0QTJ1ekxGWllhSDRSQWpnald2T3d1dGI4MzM3N3gtVmMyTFd0SENQSHdJY2xCRDkwQXpHdmJ4Nkg2WnVyUlc5aVdzODdyRzM0cHJIYXRNdEtFTG51ZmFwQVJPY0RLZ1UzWEJhOHdkUVFZbHpLaWFldWtmY2xUUmFiRXpYV1lFR2JMdWJfOE5uV1FRZ3NyM3lObVYyT1d4SFZnTWdxa0dLa2d0bHRmZlpETkY4YXZzTkg2c216UFNyYUxJXzdXVVlIU3o1UTBjSGk0SVR2TlNjUkdIbGxiMmtYWVhvbXVjNkZGWXU2VnFTemFXT2VxTUZfbk1FNGQwaDZITXByN1pCNWwxQjhXX2w2SkdrM2V3UkJHY0p5RXJFYzlidGFrLU9Xb2JXNVkwYzVCYm12b2tZdUpxVEd4UW5xQVo3MFRtRF9icjY4aUo5X0cxLXlLRG02X0JKYjZFeFVpMUFldU1xbDNFdnN3Zkxaa2RlVktLUEh3NzJHTjU4TlA4bEdFTUhpR0J6U3Z1MlAxaWVkaWNmd0M2VTR2aTNSdkExUlo3emRXQXVzMjFkTDBDQkFfNE5QOENzd2Y1NWVHLU1FN0xXcXBaUnZUb1daOXJiWGRBNGhhakdyUFBBZkVWY01pWkx6OTBlaFF5aE9xYk9mZkYzM0ZaY1gwTHFVcmtKbC1xVVBUb1hYWWtmb0VLRHVUN0J3WEhidTBLRlJmbUtaWHVQd0o3dV9HN1NmUTJKU1c3cWVJdFhBYkpLbnNueHYycFFZU3U3WE5CVTBxWFVyM1diX2I2UEJLeEpCWUVaM1FDVXdEbnQ4clJSUGhYWnpOS3dzX0d1SEhRUHV1WWM0UklvbUx0NTBaWUtpOXNiSUdQMUxxOWhKSTVPbzVhOENhSzJpR0FYcjBfY3B4WTJXaTFhLUI4S0d0OWNlMU1oSUM1T3AtcnRNSzFOSU5zRFdWT3pwa243MnlPbTJYNEFfdERET0JiLVJoRV95WXhXRWhMNHNTRmR3NTBmeWpPNGdVaW5vVl9LQlZubVZtQ3NaYndHdkVwOWx0MDhwUEt6dmhYSkgzdEtWcmxIa2xCWTBPdnNFSDRoVlVqeXVWMlNiRGdYbzctMFdQYi1sSDdobW15YWtBZ3dFVlFOb0lwemMzNjEzc09MSk1HV1Fjd2JCVHUwdG1oZmc3MExYOElKNkNnZ0lmbTJ6UldIaWs2YzRIRkdwZk9CektESFItT3VJY1Z0aDVTRWNXOHJaTlVfZzAybFZtTlFCU1pVYUU4XzZxNy15cTBwRENsVzd5ekxpYVN1TVJsNmNwcVhCNEw0TVZuZ2ItWFBQWW5DaWdlamwxakVKUDdZWGNfTTJBX0pkU1RPMWRsUUpfcW8zQlNjeTJ0OGI3ektpbERDOTFhQ0hTSHRSZTh6UWpTREJfTWJKVWJqVWl3QnQ5SmFuVy13Vm9WTmdKQmZaLUZ0T3dzR3Q0S3FKWTd2VTFxTnZYc216ZkNSWklxa0Z0R1FneU00V3FtQkljNWtvUS1FNFRsS0loaHlPd3VDNHh0M1NPOW01UVhDbkNVOFRodXdCbExZcFVtOTBmcDlqalNGUkc4MU5UZVRyU25lX2dYR0Z4dDR4MGh0MjFxZTIyRjR0SmxZdTNUbjRhSkQxSzRxZHE4UHdnTnYxSEdUc19Kd2xrbU9Na0RORDBwTXlmVHI0dll2TDV0S0xNdTZjT1NzSEpvQk5yNEF2REVXVFZJNTBidzE4WVRpTlJxeFBFemZCWjB4ZmVmZFBYeUlodmtxaW1JVjhJTHlNMDhoc0lhVVAxb3lTXzFOY2hucGVOd0hKZVFZVDBCYzU5OFROeDFBdnpiZHlWSWFxMW9kZWRzN2d6MjhiRjRnMVBPUjBSQkJCMDA3bVY1eG13MzJRc2dWbDhTSjQ3cE9xSlIzaWpha3Y2U1ItaDZjYlJScHdlNjMtZlUzQkF6b0pvRjdyc3k3QmU2WjZRTllEY1ZidFYxR28tSzJtdzdMWkh0TXE2czlubDQ5dmxjaXB2YUxraC1NVnFZMnZTcVBFVzdkcjBHazFBN2xjZ0ZjUVlnbDZaY2VsYUd5RDcxcDNCZ1pZU1BhT0REMEt2WGFFTTlvaUN3RDhSSWpXWkJKVGxXdDBPdGlubjR0OXV0Y1lnUWNaZmtCRGhQckJsTDE2bDlsYzlZQ1AtclE0Qlh3WXRtZnVTa0RyY25oV1haZ05OZmtjQlJoU0RyOVhoX2FRRG5aMUg3bnhzc25Mdld3el83SUlUb01WaWtmWFJEeXdfbnRtajBfLXM5dW1DY19pX0daMzE0VXNkZlMyOTBLRUE5a21VQWdPdHh0YUVDVGM5dVRKVzlQTWcwbFlabWlPUnhSUTduZzRmOW92eDd6RVNVNmtsb09rWm9DaERWdF9sdnFFRHdxMWpRTmxYZUdmUG9nMEdUdU56NjdjbmROb1kweEdVUG5yb2U1TVRzMXR4NGtZVVVDazR1ejlvVHk2S0Yza01XblA5aVVqZXdQcTJHX2JRZWxhbzBTaHJoYmx0bi1ETWlaQUwtSHFvNzJkd0liN1dzb3JvSWpKZGhJZU5rV01mRTZXSXNQUHNVczJaOGVKY1lWOHVWTmtpMnRnWkQ0MGFoSXR2X091QzdmdXZ4bWQyd0ZJdzdfZDQ2VmxTaWJiY256OTFnRlJvT2MybnlweHlaMEFFR3hvZGY2cHhtYVFianR1dTJTQlV4RmhXdEdrUUZPT0dkNEtYd2lBZHNEYzYzYlBDZkdWV0xtNzdsU0l0NTNDMGVIVVhLUE1YTmtxdFJiV0NscklvdlVtUThhMDIxT0Y5NnJYbV80TlJ0a0pwSUwwN0R6aEYzZnFrQWs5R2VmalpGV1pEUWFxRUpNYXpvMzZzSkNiWXJEZHRqU0VTS0VyYlBsSHY3bGZ3dEpsS2JZYk1ySUdVelFrOUpVREZVS2NNV3JtcEkydVVOTXUxV1pMN2lGQ1BGU081QlkyZDl1WWp4dHVfVDhpSnl4MTNsYUw1cW10M0tYX3lrdEg0TU50RTBhcFEyR2NsemMzZTl1dVFFVFozSDROZElxd2FRUGlwa2Y2QzZrLXpSZzJpeExYV01jak9xOFZ2S1VjRFFXcGw4QXNtVzU4YXdWSFRJOENZWmRtTml6YXZYaTJodWdETnYyQjk1MWJQbXh3MzBHSXl5emRDMEJGMG80ckY3cXdqdm5VZWVRMnZieTEzTldMc2hoSzJEdUx0b0ZMdktTNTh3YmxCVjhOVWVUdUxDMXZ5bFJrYjNzdjJGY2wtSXZBQjNUd0RQdFB5R1JFS0xYakxxWUJQRlF5YkVHNmR0Vi0wTUZoZ0QyUnhsemd1RE52cTVfS3pCa2p3aWxLazRJM09mMm5IUGtLOTIwRW5yeGJBSkJUQkxCaExNZHBqcHBJaUhyXzJsOUd1dGMwblV3eVFkTUFvZ25PVEFoMkpyTkhnZWpYb252T2Z6U0JVUm1OOVNLMi1BczNNWE9SeWZFTmYyM2dxUENHOWNkekpDOHE0ajFHYzdfOU5xMkdLTGpOd2k4bHVESUJnekk1Y2RSRy1CVXlFZnphUndUV2RUR1Jud1RhVm9Cc0pJVEhhY01IdFJlTFIxTnFkRTNFRk9VeHB1X254SllUZFRrMENLeTFrMFU2QmtMeVY5c0ZnWjQ2dXFiSl9pQU54cUVnaUlDUWdtWEpobU9paDA1dnpPRkR5QjlGZWlheC1za1NxZnl4U0ZTdmlxNm1jeEFEcF9TSTFQWEJfVVVMS2loNjkzM2NGTlh6TFY5MjVXQVgyaDJKRHZwMXR2NzlROHJfSnR1MXE3UHczN1d3am41UDBDZXU4MGRVOVowQWpodjAxTHZwcU1wamV1ZlREeGI5Ynl2X2N2UnJNVnpnamxwWWt3bUFtNEFZSDJsb3h3UkFlMEZZbzZmNlJNN1ZqNmNlR0FyeUF3RDcxREwzOVhTekJvRWN5VDhJQ3R3M1loVXExeHo2Yi1hMEVnSjRxZFRnaXdWMG5ZUUFLVDhsa1EybGNzY1c2dkFEV0JKNERTUXdUT3E1Wlk2TEVFRjRnQUhlSGt1Mkc5Vl9DTUx0ZllqdXVUaFdzMjZBTHNJZ1NTNS1WYmFnd0NTalpiazhMdnBoYUJ0ZWhhNTdhR2hGdHFrMTE1T2N0LW9UaXFNMkVMTDF0dDdPYUVHdGV3NTVQVHktR0I1R2hJQnEzNDdMVXpWOGxkQ0N0c0xESnU4NDhDN2J5RDRnaDFDUTl0dkJlcDRZdi1ZSzNwZGZHV01UWW10blRSZlU1VjNOZUx4ckQ1eUlGUHVJX3JQd2NaazBIeXMwSEZjM0VILWFDaEJnZkUxLUFWRkJLZ1VtdjNyMDZzVFhNY2ZiSXZhTl83dW93azFjQXR6cXYwRVhuLUQ2bG1FenhmbEYwbHVvM3k2RXFEcXdrZ0ptN0RTNnlBa1JGdk90dlp0bWVWZWNXWnJ6NTBnMW1NX29FdldNRFJURF9DYUVCcE9PY1lSY1l6cW5RSnczVFAyR1ZOdU8ybVZWb1l6YlBDSGZkQnhIbEZTdWpBSFhuRjdpUUYtNGdUbVpWS0piTGdsSUtQOW1YZHBEdzNUTHlJQ1dnQjFacjF5OVBDUzRnT2dpckFLelBNVmdRYUM5UzR3RWJ2bzcwYWphUVVqWE8wTzZDVDBQR0k4WE9iZ0ZVXzFTbng4c3RPeWpyMmI1cEN3RFphVU5RWGFWX3ItVUJmQ1FsWkY0TENpQUpmRkREZ1hjNFdORDVNUWhvWHZkZjAzNUJQcUpsQkxCcVJQN213M0FJV2V4MGQ0bjlNMEFNUnNEblFEZ1B6RXdCbDhFejlDVG4xZ0IwOTFWVDh3MXpiZlRvQ1ZwZ0dwcDBGMG9wZzRyTHpkMW9lalpIclhPa0dDRVNnSWxuRFotRlNfNDlUQ1FSSEpZWVBJY3lOVlhZRmotNnlka0FWaEcteW04Y1JsMTBOY2V3Vm1NTDRlRWdoMWdjUFVqdmVmM1BkSUpnRE45LWZhM0lyaUhyY04tRWpKMlV4V3A4S05RZUw3ejJGeWxsTnpIeE5jMUtxV2wwaFlxaGhyejJMUHRfNTQ1dDkxa3JWU05IUE5PT1RBakZyQ2FQaGxSQTl5RENjallzcjhwQWdTVUI1YU8zbW1PZm1nNDFkQWZyX1FhTXlySFpydGNXWHpETFQyUjFTYl9laDN1SDhuLURGOUdXZUhnY3IzR3l4UTlKRk9NamhoZk8xTGdFRmVXTG1QU0pyRkdvdnBqd1Q1TUh5VzExSTI3M0NfR00teGFvWU1wVWg5ZlRqaVVJaHFVRm13Q0FENHozejBIMUd2eVR2dGdwbm1sSGRUbTVrWURnQzhlYkFPeDBBekV1YXNWQWtJS3VjSnhNc1pmMTJYOTBia3FiNjVuQ2NPQnpDX1g2cFk5cHZDZ0NGWGhlWS05WTdLcWY4UnBuQzFoS1h1NF9nd1B3V19YM2FyVjk4ZGw0UVlIRjJ3X1FFbHJZcG1JZGJUM01Na0Y1MVlnczh6X2dacUxWRm1SdGlEeGx1SXVpWXZRTnhwUVVIbmxEQWR6WTZkeXlzNzdLSTNKNWhZZ3VIWHljXzd4WnhYVGY4LUZSeGdQREw5UGpaTXRoWWQ3LXJxTE9SendWOUU1ZDFuaTlaV01oTmprR0RJWFhKRVMtRE1aalJMRUpkMjF6Yk9WLXNDN3ZnaGIxTjREeDdxLWMwODd2MWdic1VmNVlqOFJmdnA5SjREbGtaUUxaQzNFMkFhemFVYjBzOXNJa0F1REl0NjNQc1hqMEJSelRqZVNKOVBUaFItUUJSb2M0c2p5VDg2UUNJTzA5WkROak9GbXZfckdkTTZWdU9oMXdzLW41MGp3cmtxbTVrRUZycXBVZmZRa2FBUVhvOU12eDF1VXNrRmh3SlpGckFCRHM3WXRhby1zUzE5QTV2bVg4d3B5Z01zTk81VGszdmFORTU4dVZyaTVWY1BHRVBUZ0dURUw5d3VjWTV3Uk9qYVlaMXg5MXpSc05GUWJOY0x3R1JYZWpWRnNibGNFZTJSNTdhYkFqUThJQlpnQkpCYVRVazZGbzNkTmNFbnlTNm40R1B3MjFwdHd0UHlWQ2JjSVdaeXNPc3FKRWFsNnAzSE1pczJtdHY5Sm1EcENqMFFpVFRSUFVoZ3lqT01qOW5scDdYeExpbDBTTFE3RFJEU09iVzRzRmdDS0NZSUN0M29JUkdpWlB4TTFMU3RCNkJBbkNHQjNQX29hWFluSG8yLW02cnpVcU5hUXVhbG81NXNiWW1xZnhka2ktenNuaXVkYjhTOHNrMVh4dWwzS0toNWNUWHFRTnFWdlhVSF9BZzRYV0Y5NnVyS0Q3RTZtYmVjMUFGZDhISU5oWVZMLWREUllHYVEwVmtROUJpRjFNNXVFR3lwN2VhOFhGTUtsUndRZE5GUkpKdlllMjhFU2oybFAzMTZXSmVlRHV4MkRMa3lWWDRLcUdSb3h2djVleHY2cDA3cG5USUJNbEJva1BNNzllTE83dGRfR0dZcFZfelR1OURyX1RDNWJ3LVM1U1RNdzU0YU9aVTlrWEEtc2ZDOW9GcW9kUGdLUklycHpQb2JYZEtMalJsRzZjb0ZuVk05Z092WWdHelBFRDRvbVhQSGx6cUZXZDNHUENnOEV6WmUwSGJtVndsSDdVTTdiWl9Bc09KLUo2LTB3WnJSWnpiR3JxcVF5S0h0NFZxdXotRUZEX21ReWlmcU15ejlNRGdGdjZpQ1BhYWR6anpWX3hTTG9ZUWVrN2xhV2xUWkUtREJxM2pOcld0MGlnaXZIRWM4cG8yTnVBYk43WUpNT2dSZEEzYzNnUXAzakxXZHVOdEMtQlFzdXA1alAzQ3NuYVBiQzV6djRlazgxZnVsZUJZcGF5bzByLUp0OUJkSnhTdG94RWgxZ0QxQUNJMWROUUZack1SQV9tUktrSkRBeHI4amw5UWtRa0NnS0xZdmhxX1hBZjVwXzdsSUdRbWVGQTh3aE13RGExWlVWUi1aZmZDUkhhX3d1RUhST09DdFhXcHJVNmViakhsc210aE1xdTNoUTh2V1E5ZGd5TEt5bkRpMGwzZUZLZUhjbXVmbGl5U18zdTRfdmtjRmptMk9GTERaQUw5SE1CUWdMSGdoNmRDOWMtb2RYZEd5RGV4XzNOOFpKdlZlcG5ZWnpNZ2VNWFZpOGdwazQ1OU1UQy1SNXpXU0xRUndaNV9zdFdHMGJNdTRfZ3FGU0VpNHRoM090QktkZkxTOVcxOEpNLTVaZEpMUHpycU9QU3RUX3RtSkZGMkhXTE1RMjVTV19NdzB1TzRKY1NlaURTdWI5dmI2MXU3bWdsS1ozRDMwMlYwdm5naW1UR1dkdExEQzdZMUJGbkVNUzRRWTAtOHNsY3QzQ1p1djZaTnVwZFlTZ091ZnpzYkpURTNyenZtN0JWRUNBQkFINDNnTDFza1J5UkttZWtjSlJ5a081S2NQb1NjUWtnNEx3ZnJ6ZmlOZlVyMG90VTJ4UWNyenZFRGlmY19vTjNCdmg0UlVMZF9lYUFCcjQxTWdtcDlpQTRnYWwya19RSl9VU3Z4Ui1TTjhzcm5LbEtndm5hZXIwZVZWZ2hmSC1pdk9lVndSQ3A0LUlnUlo1Uk1ZSUowbUlYX1RqR1BvbTJZNmp5STA5Nld2alVmSWRxZXpMdWxKcmhtR0w1VHpEem9mME43eGFVQU5VcTIxZTM2aDloSkY5YjJtYUxxcnJUSU5CR1FVd0l5MkE3Vzk4aE9wSWdtX2ZiYVhNUHI1SVlNbzZVQWNyNEczQUQxZHM1eDZuNUNUYllzS2swRExUY2lyTUZLNUVIaVozMXBzaUVzX1N3azZGX0dJdE5icklmU2JPbzJjcGxROEpUMllVQjZyNUlxSTZYOG9YRFdrOENWNlhHWWtkZWtWbUg2aTJYTXZLTDlkQWhVTnlnRWtGUHltS1JRYnVDZVI2WnVXVG43QlN1eTBZNVhWS1h3cEl0elpzcFprcy1zOWs4dEJHZ0xtYjlZVzNuNlY0S2N1OVkzS19VU2tQS1pMOVN1OGtkdmtRVmVkc3ZOOFZBNnFQaDFYOHhSQ3huYzJDeDJxN1l3Q0V2cVpsd2dDbGVRbXJwWm42bnZuRU9nQjBTaVB4bVdrOHlMdEMyWGV1ZnE0OVNEcEdDeGRJNy1RVVV0UVZ6TF9IbFljUWtRZEFGZWZLOGtMX1pDZFhMbFgxWVRGXzlMZG5OdHQ5NVU4Wmo5WUZqRzVjUXZyVkphVHdlT2xveXNhQjlJSlRkUXBSWS1mUDJjd2dRQlcyblFZODlWUEs3elRRMGRtV3Y4cmNhMnJwVGdodlBnY1RrR25OQU5jelZ2emh3VERDVHB4MVhnV3FzQ09KYWFyUkNuUmRqdUJoN25ZYi1NZFpMR01sdThWNW1qMmFSakZXMVBUNVZJb3N3N0NYemVQYkRnc016RzlWWjBDbjE0cnpvYTVtMXhfczl6M2pMcTdZZGZmTXdWSWs5LXEyTDltRE94ZHVrVGlJamI4RDFFTG5WR2JJNUlfNi1vQ293UU54QkdiVHVBOENfVU9JU1piMHNFVW1aNENvdjMzSWs0eUFHeWx5V2FuSzhDR3JkNFZBdXlsNDhDSWpTQTVIR2Y5ZWxYWnE5SkdNX3JDZXRBN0NUbHFTZUZRc0p0OTlsai1WeGtLLUtjSFAzNU9hTjMydDRYb19wZWtCR2pEaGZXM2Roa2loOXZhejBfLS1HU1pfdlZFbk5TYzV2bnNOM19HRnc4a3hJMzJKNml4QUJoWUFGQWZYU09iQXNiZEJXZlZhMUtyYnA3R2VJa2FyODV4RGxOWnI4V1NZd2ZfWlNJUWZiYWNUVnZSMGJjMXUtVjdTZmllTXB6VllNWEdYVnhRSnJ5ajRZMTFRbjdqbGQyZ2FVLWhVSVRfN3gxellteGJudFVKMUF1UlkxTnpHcnVvRjRLSC1iVjF5LTRiZEF4eDVyVlRJODUybnV5eGtvZVpFRFAwNHBOcFAwazRnZ01hZ1pQUFFGMkFmNHdvd1Y4ZmlndWRyUDRsX0NWSTVURE9qNFZ6R1MzUVhKYVBwcWx0dmMzTFpEVFZHVW5oM0lKbzA3a0lKZWZScXB3d1NBUDNyM2RySW4zRlJjOWNjS2ROdVdHMXdSMmRFMld5Qm4wR1lCbUVvclBkTU5ob0RVTXpKcnpYUlNrZEtoTFYyUVdlTDNoUUlIQWlNMm5FVmtNOHZscG9CY1dpOUpBWHBGU1hkYWRINk9oSkxUd1NEZWlYdlJPNHM3SkRTUmYtUHcxaWxDMUtKLV9idi0xUE8tUC1EQWdHanNtVG5aZ3U0dHhEWi1OUGhwRUhEbUhiNjQxOG1pTVVBMmMzQkltS3QwWWw5RDNtclJvWnVEOVJCZ1ZJTTdfb3dtaXFhdmdFczE2V3IwR0JacFY4SG00NE52TXJubEpJXzZlUEhKZUV6SUlXLXU0cHVVenppa2xQOUdxZG42T2NBSWZiaWdUNVVZLWNETXZ5WlZ0ellyVk1Sbkx4UTFyaGx2dXczeFhhb0lnOVNJV2s4SjIzM3ltLV9KOUpOUE9hVVFaOVUzaS0wSC1mWDhsR0dZa1NCeDVDNjQ5WlN0U0VySkJJYUpfY0VSZVpqSFFFQW45czc4ZGM0a0dfbl83cUxHUWd5MXVUR2dVTTFXWHNBZ2FSVVdkOV9xaXc3SERaamdaSW0xQkxzSWlONmFKWm5VRzVFbTBEV0Z2S3ZDaDNhNFdtZDRXa0h6dkwyOXIzTUZqSFNhX05oRVNRVndTalRhV0JFUzFHS1llY25uTUt5TmRXWWRQU2QyTnN1c1F4Tzc3bWE2Unp5Qk1jTHkyaFZPbmpXSGVoQ09Ha2hXaWVWd0xtVFBQd0hHWUl1aVhLUHAtb3lVeE8zSDZzc2R5ZlhGN254VmVUdmJlMlFzVTYyMFZnV1dQMncxYUcwSWo1bWM1M0xVcEY4U3Q4VHBZU1htX1FjblNIWFhsRGh1TC1FX281eVFqX0Zmb1lsaHFGaTlrVF9SQ1E3R0Y4cDdVci1sRjNwTjJsZkQ2UGVETXliU001UVY4R24xSjFjTkFaMXJKUmpGdVpDS2M5RDFaeFBkTzNDWE5Ycnl4R0JUbkVUWHBQV3RHb3BtMFV2UTRkZFBDY0hCS1FKTnZsN1ZaaExHRHpKUEw2a3pJSTNQUGk1bnFqYTRtbUJWU2FiNFhOMHg0VEJFS1I2VW1oU2hXZnhfQnpULW81aEtuZXozWUZBM2lRRXpKd0JOcXF0X3lXbEhKRl96ZWRldS1MeWJRbFJnc3lQVHdzZ285aHEwdUZBY0tBSkphNUtVNnZfdksyZG5QMVFlMVpVbGhvMmFFLVV4WTVnb1gyNFB2Rzl3cXQxUk1aUUgzRktORGcwZFhDRHVTOWFmdUlqczlaY3RERG1kZXhhV0xuRS1KM2F2dkU0T0RWSFR3Tms1YXBGQzZxdDBjNHpxV0FnQk1weExJMWE4NWp1Z0E3QmZydkw2Y0hBZjhxbmhFdmNyUjltdlFDTHQxc3kxY1phbHZvc2cxZ3pYVmZpTHRpVnlCeFVURVdXanZfMWJEVU5hMzNHUXZFSG5EWFAtMzZnRUNFaFZXVXpTQW1xMFN1RFBLR05hdjJWM2l2bF92b1VuRUxNeDhFcHNnMnhqUF9zLXQ4bVRJcGt0SzFXRG55c2FKVGVxZ2syRE56TlBKZElaUHFQdmxzeHI1TTZidUEzUkpmaGk5Y0hiU0pGV2poeEhzXzNmY2tvdzNINThJek0xLTBJX3Q2enRJT0hFOTUxNVdwenZiOXBzd3lBc3RTaEpLbG9Pb3B0b200ZkhEQTU5eXB3YlhSbTNnT0VGdmN0NWEyOG9sa1M0T3h2V3g2N2VtUUtDZGhKMnZkMTQwM2FVYm1TVEJNcVZzbGw5MmFKdlpaeGNtaHcyX3JTY3J4V0p2U2ZMSjJLWjNsYnZHRTZJOWY3ZTE3REhhZll3dFBZRWJuWi1iVFRZajVYNUEyaTlwMEltZ1AzVVJyaktJOHZNb3BHdXlDbTBfV0FWbjg0LW5wd3pJLVNTbjV4cDdIRmgwT2puVlJ2aFpsYmhoMzdFajBPZ2VLTGQ4WWJEelp5ZzFzVUZlNmU1NVkySTVpVW9tckc1bU9WV0Myc2c1SVprbjlnZXpVVDFxUmNfY1Q0amRwTU9NZ3Bza2tCeGFEU3JDMFZfSEpPVU1NOWFPb2FpS3dnV0l0WEs2YzFOT1NIV29RaEVHTF9DeWNFOElObG53QlRsdnJRVjVIY3h6RjhjNkZ3eDFSMGRrMjZ4MU42ZlNjc1VEVlVyVjQwd0tJbVdDYmcxN3Izd3VQV3IzZ2xvOG45MGlZeVJFbE5qZmQtdzExS2FUd2lKcHNITkc5a3NJczBCYVNNbTc4NVZVTFFjSWVOVDliRjBnamhxTm8zcDltTjFjSnk3cG4yaE5QRFppTVh3QWUtRzJFeEpzWlgwR05hUUtIRGh2M2tfYTd4dDNDakRDYmxFZnQyMGxJc3NUXzhESFpsSGM1Njh3X29FQ29QbzM4bGMtSi1VVkMwRFREaWNKVFo2VlpEWm1yM3RNM1RDT1NjMTloZDIxMUZ3NlRZSzkwOWJINFpONHBVaW5XV09CT3FxZEhSbkV1Y2JBdjlDUTlzREtKbUtkQV9lcmkwYmdHSHBndWY5ZHVBMlZIV0gwMkE0TDdmaE5FbkxPbzVieERRVk5JOGpVYVpGcEFWYkVyTG1iQjB1VnVEeHhDOFBsYlBMZjd2Zy1wR2JEajI2ZzhqbkNUTno3YW92WWxPVUY1WkFtZkdoVTRJalVoVnFjVmhJZDlLWVI5SGpGN0RqZVlKTDBfTF9sMklJU0FpY0pjQUIxMFpZMkREUTVTTWduQ1VCdTZvNGd5czNMQURWS2d3YnQ5eGtucWlkWGJ0d2h1U18xVWxkb3VxNGlJcVRRTW8wd0JZREpDcGRpQ1M5V2NNOFJaSmtkbG5YQm5Id2p6RkphZkNUbFRRR0VLcWJnbDNBOTAzTjlaMElfZi1PVThZdElnUGNfeXpxUzVLVXV0ODd5SFA2UHZpVFZ1YTl0Q2U4SXlZcmhKUE1PTG9uX1hxM2FEbmFsX1MwSTk4Q2JBX243U1Viei1kLTNhMk9QbzNxQmxRdmRPdXRPeXJJS0ZiWkNiX3pOV1FWbl9BY1prT1RrX3J2M3NIWHlBOU82Q0ZjVndfYU5PeVlQU2c3WlRuMG9uTzJMUElrUjJuMTFXSGpaR1gyUjJqSm9XUFQ0VFB4WVloMlZYYzVKSkVhLWEwVURFdHh5NUNwUW5DaHAyTEdwMDhGVThlLWkyWTczQXZBZWJ2Y3dfRnN6bHo3Z3ZzTUp5TUM4dkwtbFZQNHNVeG1taFZfUGRmTWhTU1ZJV1ZoUjhvN29vSlExcFJCaXVjM2hnb1N1aTBtZ1ByYUNxZHJibllLbHFLV0RObjFBTmV0cmRmUkwyX184M2xmc1BydDJIN1Y2QmxQbE1rWHE5bl9YSnRsNVNpS1J5MVRfNTltTDdUTUdESUdnZmg1QXJ6cndKc28wakxwSHduWWI4dHFEM0g0VkdjbUdlcEkzMjk4QXFVeG5NNHI3ekVlb1c1allfNGRmMEZhTTRFSW4tNmFZVndFMk55XzhRSV9WMGpEMGhlV1RFRGpUZjNLOU16ajdEcG96UHNwZTIyakpjWTBodDk2aE9SZ3dtX3dadlJPdWQ4dnUwZGY4RXVrNnIwUXNkam5yVXlNSzV5WkZLT2dCOE1LOU93cVNxaEhSZk1JazFOWjZ5MWNrSTFyTkh4ZTBLRWxwZ1NOVHdxbjdrTFZKSDFuMHZQaEpYQkh5UEMxaldraWdMWUpvaTA5MDJYcEw5UzBJaU1PaldPVy1LNm5ZWmEydXE4RGo1MlpRdVhXUk5pSXI1Q2pxU1FfQ0hoMkdPVS1qNDlELWsyMy1XU2xiV29BX3JzWGN3eU9ZelU4ZGM3TS1XT2hwSF9qakRZRXl1cGpNTWhfRlBGR3dvQ0RvcTB2MG1oemJyWHR6VHpjMnNJdjNqVWZ2X1JzNWZaNGlwT0p2WTY0anpvUGtsMmh2T09Ya1JmVExobHY5T3A3czdCOEJVSWY1cWZKQWJKVm9uRmRKbjhjT3FKMHp3U01CV0FNWXR4MGNsSkJGZnNhanc4NlprREFraDFkMFM4THBHYWpZWkx2dlFDSDJBX0ZPNVEtbVZLbmhUWm51R19PcUlUSkVMNVNOVjBiWHFyaXJNSW5nUU9DTzlSQ093cHR3bFJqZ2FjYm1SLXphaHZ0YjdBTXlvOFNDNkVycG5QTjc0U1ZwenhrX09DX0N6OEJkRDlmY1p2dGVMbktRc1dNVUtQVDB1S253M05qMjRTSUNaYmZ2amtmclpwOUg4LXVudmZGTlRNdFFmNnpkMDctSW5ETUoyeGJuZS1zdS1VZWFHRDFrZzBJOVVFWTBCMGg1c2syTTh5Nl9RU3gwUHNJMFhBYVdtc1VxT1F1MHQzX2F6ZGliQXVhRmR3MFBJaUdRMktxTTRXRzhVNW9scXl5YVZBc0dhWHdhdFNSa1JaVktqMHFINzBTRW9VeGtISTVOOHV0enhYd1NLUTU1SmtsSmt0UEdueElDSC11MTFRS2ltX1hKdTlVY1hsLUQyX0FWdDMtS3VtdEhuczF2NGwyOVRSSWFJMU9TSEFDd2FsS3lER0FSaGFLdHJJa3UtU1l0MzZ3WWRlZHFRTFdQWG9IdXp2VUw4ellTckJaQUVGNzBwemVBOXVRRnVJekR5cU13UFhyd05UZXVQcHpNM1VoVjNRTGNPcG9DT2tKS01lbnpRWl9xQ05mWWNRSjR3am1LMVlkYmpYb3JJeHlFT3RxeHFmTDREM0ttZUdsU01OWUwtUFRoa19LdnFrS25wWWViVXl3WWZxMGY2Y0tBeFJTMWlxUlNkYXlUb18yYkkyaEVIOFV1THNWZTN6MTNpcEFRajk3SWoxYWFYUjlKSXh6VTlpZjduVXJwNS1MLWFhZlJzbFVNejFGSVFsX0dZbHhVYVlDSW12M3FXdzFzS2dNMmpnQTNrczJvM25mdGhIMjlCVm5NckFpcFBPSjBNSnM5V2JGYk43Q2RJT0lMZExaRkU0UlVOcHMzMGJIYjRNQ1k1ME5uNTlEb3d5NFpIQmF2ZEllcTJLdlBqaklNdkZyOWdYOFVWcVRrblRXd3dpQXpkNGw5Q3U0emh6ZFBUcmtkdmxyNUotV3JIZGdQaDY5UWZaT2FtSVNkYUJRR1JGbUdHMjR3aFZhMDRYMm5TOWNES2k0djM1MHFUc1JFVGdram9vLXpkTDJ1OHhzV19WWnMyalJQeGwzaWtDU01MSEFjcGlpa1RaRks0WGdmRzEtX0xCSGl4bEw3azlSSkRaS253T291dC01SThjTF9QRW5TOFFZY05xOWdWaEZmZEJPQUhWd2IxQU1MQ1AzSVliUUpUU3ZPRHJ6czdfMWd1V3oybGNiTUY0YlJmbl9GZGVVa0c3bjlNSVBLcXRDa0dFbjlpTmdRczRQb2J5M2dQVnowQmJIcTE3M0dUdmltWW0zVkxIZnl2TFdZZ0gzdVplZ3pOaHR1R25sU1ZIS1NxRWV1WUZaZTVHV0lmV2NBQW9iWXdPb1oyZHNQbTlRSlp5V3VIZDRld3Z1TjQxcEUwUmFZUEtZTjNyYXVsVVhjMHIwc1pseC1KM2oyajFSb3JNLVFURjZiTmNRTWlMcXQ4Y043VFh1R0VBU1UtRllRQWUxOVNqSUd1V0Nud3Q2UmU1aDNJOU50ekoyaWZZazBKVUt1elAwSGs1S0NLQkdiT2VLVEhLWnMwZEJoR0VGbHFtOTFrUmVhT2Z3VS1VRUIzd29hYWZDLXJMRFRiNE5kSDFiQ0ZtUUlaeXE4bllFbzg4WC1LWUZZMDh6QmY5OFhFekZTTEJWeG12bVR1V2FHeXc5VTU3cVRhZjJfZEp0RHlobnJnN0FZMGp3Vml1YVlONFNCTmFmOGloaTg4UFFhVE80bXZDOExKbzlmUFE1SXpZQV9wcVJmNXY4TGo3MXpsUDJRczc2ckVucmtVY0RUdEVSMS1qQmNTc2ZqOVBSLUtZM0xUZTFQN1JyUURQOGt4ckhkZVhUOWxldHYxNGwwOVc2Znp6QjhVMENqVmdQdkxrSUNjVUNMa0RQNTZkWUhJWWZta1BNX2NzdW9YLXo0QnVQVFplQjQ5eDF0US1ITzRJcWFhOUJaWFA1UmtnOGFjTUxtWm92T3E2UjE5RXdPb09jRFN0Q21sbGpySlp2M1lScmVXcEhBUDhCaEFLNXFBM1FWbWFyNURUbTBYTmxiS0hjWW1XWTVvVVlYWDhZU0lLeTJBV2hfUHhaVlFKdENpZllxdUROMm1lS1hwVDg0d3VoWW1mblN5QlZycDBxWVhrbHFmQXFWSjJhUTZBOU5WNWRwdVBFRHB4OTRsdkF1TGcwaEZNck01Vmk1LXhGbm1XWnlKYWFCRmFzV0NpTXpkbDE5MXRRSTNHOHR6X0hHbExYSXRZQWxjS0ZtanFudUF6QU1UcG83d2V5aGJUTDAwNTNYczJKRmpMcGVXbWZ3cWxBelhXdFg5MW1BTXVRTFZ4VVZzS0EwZHRrbWkwZERfS2hHcHcteXA4azhJbWRZVzBYbXZ6MGkycGtpWXBiVnNqMUJDYmJFYWRDdGNkeExHR0NrclVXSGtacWpQSkdwckdnUWRsaEtyOFJ1clk0cnJ6UFAzTGsydXptejBqNVJYd0FhQlYwd1JYU1ZORG9uSGtKckNiUnlxa3pleUJKRkswRkNCanZWeFJGSmFLZGtlbmNHd19LN0JOcy1RcTJnVDMwVDk3NnBWVV9FQl83RlF4eF9GX2hwMmR6cDZtMGlOZlprMkhIY0NzdDRwQzdOajZLQU52UzNzX09TREd4cVFveXd1dWNzQXlIYmE1ZHUwM1ZIbUxYTEtuUzd4d3VWSVpjQUZPUTZNZmpRRTNQbXd2WGhzbWk0SXgzNGc1Q3ZZc18zdWl6czBrMkRpc1JvQ2NLRS03Q0ROMVRxVURCRXUwWWJzRk1HTXo0Nk9jSGZXVWM2Y2tRV09NVV9tTko4QXM0TkhobUszUmVydWRVVUUzMHRfNTRzNm9tY01takFHenF4S0FtM001ejVjV3ZBaE1RU1BRc1ktY2tIV1FRMHlPZC1Cdm5Rc3B0ajJxb2hQZUVwVUFLSzd4S1p3MUpNN1U4TXZtNDRXTGVSSmx0M2JVZnk1MDFWWENDdDk0ckVqZFVrSEpjQ0Q2WDFUN1NhV1RlRUNXY2w2Z2doVHZ5YkROUl9COFNHby00NENHSUdOYVpMYURFX1Y5T3RKR0xYT2NraHRUdWFDcnFXRlZRWUdNZTVDQ0p3M0lRcERwd1ZjdTlraEY4d0RmRGVZRko3WGNjNDZwLWIyd3RsUWVBN0M2NHRvQmFTUVQ0TkRxZHpydFlHTkFZeU5IalJLbGxtSF8tdFlNWEpCdUJaSEZZMkNIcDF0cmZKMlFBbEc2ZUNZNDRNRHBRckthc0Fkd1gwTHNnd21zcGtHZnNRU25PZHNnVjhkT1JBcFMwT3hYY1pXZVFORE9reDVNV2JhbjBVY3FubWF1YVJTTFpBajN5MjBjRFYyaE1hWE91V3A2ZzVoT3A4WGo4U016SmVwQlplNUlmZ2lnWWJWMVYxeTlYX1NNRTRIclVUVnpIYTBHQk54dEpXcDJEVER1S0lMekZuUmhNQmJ5aV9oNk5zSUdiLU5Qak5DVndsYW9oN3JMT2RSLUpqOU1pa3k3REFrM2N5cWRrTlg3Umg1aHk1YnE2MkdlamZLSWRsd2JMVDIzQ2Y1bGkySnRTa1dCcktHcHdOTlY5c1RGcVlxa0dWR2swZlR6MzlETUVmUUd1UmRIemtNMkZ0bkZLU05VaTlQbFlKS0o5VWV3cm1IaHMxTjFXYmFXLUhkYzlUaVFIbXpRYlpqN3ZRQS1NZVRuOVhjem9IZjlqZGNyaGVIWjdqSUp6WlFYTEE0ZXFwYzBSUC14a1NJQTFvXzVRdDJYSlBSWWE0QnNDWGtKWXJYM1YyTElPOG0wVTVpOWI4Y21DdlZCOElXVWlraF9hYngtcFZFbzFRWW55OUltRkpsanUyV1J5aF9CYzQwdkpmWllzdkZmcFZTeHJTMGFnNjU0R0NFVEJvMjFwUVVDWGRmYjhIYTc5eHhMMjcxd1VTQnRVZ2VxVlBtNXptOG91TzdxQlBuMDV1Zy04QzR2LUZBWV9tNl9VT2taYVQyRlVTaWNEZGdBVjktZHRkalNqYzFrNHpVSm02RjdPUThwNHRSU3NmVjBSMjVyU1BYSGhQdEtEZDUzaWpBNlNMYzZKaUQ1M1BsdnZzUmhqU0hTMU5QMUg5QURzWTBUbTN6OHdGT3N4VjBhU2JEaFhGWDlKaWwyTnRjQ1FXd0kyV1F6ZmdneVgtMDZqaVFuamhtMWNWaTFCZlUtVjlKZ0FVN0RLVDNwMkowR1Y1Vk1GQmtGUFVZcWFRUnYyVVRwWjdQQWZzYmVSc3VhblVHYlJTUjc4bGZ6ZXM5NjBOb0QxQlN2cm01a2RxR096UHdDOHJZSWZhSExwUlh6Sk8tXzJFVUsyRGlna0FtSm9sWlo3Q3p2V3JJSTcxWWxmeXVBT1VCMGJvWmZ3YnBUWHJPNldlOTFpaW5tZEZhLWtTWVJuUTBDZ1B3bVVMYVNCZDZkd2VNR3NPWTM4YURRMUpoLXBBS2NFSkdwVDFyLVFXWWtuYWs0dHFxQXhMRzRmS2pLVUNJY194VXNBbWMwRER6aWVCTmhPY2xQYU5FN3U5RFZJTTNhaWFFc2NjMlM1TnJQMXB5QzdIYVlvbnliWkNfNVNRakFNSVlYM1dzNnZKanNXcm9vZER5Nzl0Yi1md2pUS0VwUTh4UUYtd1dUcW1aQnpZc3ZTdjNEdUVQd1ZqT3BNMUJFVWFSOVd1WHk5ZmFCVGJfVWx4aV9lQUFJc2VTcFBQc2pUX2lsdTM5aUt4UEFFei1kaHZRaWs5Ym1aQklDQjlORXBtTVpMRlRJdWtha2hjNDdjLVpoS1ZqeFJtX0UxT19ZMTBTcXhrdDJqUHFoZ0lZMDRfenRHX1k0ZkREcjNLdkFvOWU4Y3lFQWMtNmdjSldidk55bUtQLTZ3dTB2bFBFa21NTGZjM0pEbkFwVTh6N3pCVjNFVzdHazlNaFZWdmwtRXZhaUI1Uk1EQ1cxdy5tTnVVdFN2aFh5YTktNEM1RXoxazd3"}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['42921'] + 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://vault8e271b27.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault8e271b27.vault.azure.net/certificates/cert-name/bf1619a0e0674c4382438c0bf7ba9328","kid":"https://vault8e271b27.vault.azure.net/keys/cert-name/bf1619a0e0674c4382438c0bf7ba9328","sid":"https://vault8e271b27.vault.azure.net/secrets/cert-name/bf1619a0e0674c4382438c0bf7ba9328","x5t":"rm26Eb01x02Xu-yR3c-iFfSXfvg","cer":"MIIDWjCCAkKgAwIBAgIQduSWYjkWTYGMFLljIscc7jANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NTQ4WhcNMjEwOTA2MTgwNTQ4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu3/t974JQoKiucM6QPrF7AXysChxzQ391MHtnlOIeEgA6gHDNRi+sP0ZTdYop5JiM+T05bT9j3L8XuwnZ/35cqLi9KbBah1OgcmgDc+1tRREgQbr9SfyvwMkI8xUVFP1hyGG6iEWRHMctskWYHQA4mA1wp83DakeMXCMclS8OoDaVSB7x6UDnQwRfPa1O67iOYTPC26b8ioCG5MSomy3l4/fHEns5thP/vUGIO7pBF4IZuSHntFG9MkLjlyHFfD0uT5yFJhCzUL5+SnthODMnaKyJ26oNtg3Vz6RjjQqBN3NB11h/6V0V/dYysir7RVdlJ8lpPoy2mqodGcWj7YvBAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFDwTsh0l30yKQm7oH8eiw8DPtv6/MB0GA1UdDgQWBBQ8E7IdJd9MikJu6B/HosPAz7b+vzANBgkqhkiG9w0BAQsFAAOCAQEAXpDmdWkq2cEF2JAuPBv5xFx4aaFhATLAAZddkPPJvavKid1EaBbyxSmTQsoPcxljKucW4o5rFAHUyGgivBK7xUz04qCKALbfTVrtgsIRyd5WxZqGyH+/MAzRfVQi4a6ya9eYTVj3Z2HAA6tjOzeQSeSfRUAt+f2XrAm3jyt0H9fRxg/pQOEwOi4Mq4vwyEoXzAEn6vbgVIh5xYyc6F1lTVi3HHXIxZsKNvyaKsV5L43SpHRpWUVHtCqCrTLpZ6JRCJZp2pUm6w1ejmTGFotBmx4ikdNSdK7Il+K7OoepEUvTdp9TI5+HWJwhN0w+y30Pkq29yhWT2+7yMiuKFWnJQQ==","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault8e271b27.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":1567793130,"updated":1567793130}}}'} + headers: + cache-control: [no-cache] + content-length: ['2236'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..b2656da68424 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_crud_operations.yaml @@ -0,0 +1,211 @@ +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://vaultaa691b9f.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: ['Fri, 06 Sep 2019 18:07:00 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmelIQ5AZzguTmSvU8x/Z4NLdeNOxvij7+QGIX8jSjb3qLD8DfUr13ueNUq1rbRavKK5cAVwSQJmknvC14b0sXvujMIwaFdHECYeyaMOChqGnYCB1P4pk50vZTcfPe+YJqnLkLkO6JhwMRELzYuXVstprb080eX64NFbocYWNCkIj1dI5d7bAAuxpty/8yy0bigw+eqjfeqoMJHRSHCfmT5KQpFKwdkFQc/4KfrwGyzIyv2SkL2Y4QPuMJugtUfQBvCGkvTDW5ijhPPfJW//uf2Tolprd28JrHQuZgBIIH0ljpeqfF8OgHrByQLL6CTeznNi7Yu16UHxh4mXwZjaV2QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHUYN48kkiPoOsWvTV2XFsfTP/w/GwnYz3mwK6P4zjXhP+htIYgYzm3UX8CuCfYh05S3t3rkmMjb+Ua7Y7+jl3dfoNnzLpJg8qxv43IxjRrBTaWbrlTIBJlfzTxPD8mcPvypb0bt4Wjlasa+EZlv2vvoGA52wDOc2RMZ4+BIV9C93wNRT2YAYSSlWHu9BgwY1k0G+GpPE47OKN+rrR9rpO0vxYR0ZUxdsKKbaurAUb6/gSyL/Dg/izFyWzmeAqsG849PuSjGAnQAQJrK2GEMeyO6EZykZur9JCA8FYxWwvFxrXFZeCrQx/8dPO7j9qn1lmcqv7tGdOffmwwZeOnPC0k=","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":"add119eddc6c4803b73e2433b00496f5"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07:01 GMT'] + expires: ['-1'] + location: ['https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=add119eddc6c4803b73e2433b00496f5'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmelIQ5AZzguTmSvU8x/Z4NLdeNOxvij7+QGIX8jSjb3qLD8DfUr13ueNUq1rbRavKK5cAVwSQJmknvC14b0sXvujMIwaFdHECYeyaMOChqGnYCB1P4pk50vZTcfPe+YJqnLkLkO6JhwMRELzYuXVstprb080eX64NFbocYWNCkIj1dI5d7bAAuxpty/8yy0bigw+eqjfeqoMJHRSHCfmT5KQpFKwdkFQc/4KfrwGyzIyv2SkL2Y4QPuMJugtUfQBvCGkvTDW5ijhPPfJW//uf2Tolprd28JrHQuZgBIIH0ljpeqfF8OgHrByQLL6CTeznNi7Yu16UHxh4mXwZjaV2QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHUYN48kkiPoOsWvTV2XFsfTP/w/GwnYz3mwK6P4zjXhP+htIYgYzm3UX8CuCfYh05S3t3rkmMjb+Ua7Y7+jl3dfoNnzLpJg8qxv43IxjRrBTaWbrlTIBJlfzTxPD8mcPvypb0bt4Wjlasa+EZlv2vvoGA52wDOc2RMZ4+BIV9C93wNRT2YAYSSlWHu9BgwY1k0G+GpPE47OKN+rrR9rpO0vxYR0ZUxdsKKbaurAUb6/gSyL/Dg/izFyWzmeAqsG849PuSjGAnQAQJrK2GEMeyO6EZykZur9JCA8FYxWwvFxrXFZeCrQx/8dPO7j9qn1lmcqv7tGdOffmwwZeOnPC0k=","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":"add119eddc6c4803b73e2433b00496f5"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmelIQ5AZzguTmSvU8x/Z4NLdeNOxvij7+QGIX8jSjb3qLD8DfUr13ueNUq1rbRavKK5cAVwSQJmknvC14b0sXvujMIwaFdHECYeyaMOChqGnYCB1P4pk50vZTcfPe+YJqnLkLkO6JhwMRELzYuXVstprb080eX64NFbocYWNCkIj1dI5d7bAAuxpty/8yy0bigw+eqjfeqoMJHRSHCfmT5KQpFKwdkFQc/4KfrwGyzIyv2SkL2Y4QPuMJugtUfQBvCGkvTDW5ijhPPfJW//uf2Tolprd28JrHQuZgBIIH0ljpeqfF8OgHrByQLL6CTeznNi7Yu16UHxh4mXwZjaV2QIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHUYN48kkiPoOsWvTV2XFsfTP/w/GwnYz3mwK6P4zjXhP+htIYgYzm3UX8CuCfYh05S3t3rkmMjb+Ua7Y7+jl3dfoNnzLpJg8qxv43IxjRrBTaWbrlTIBJlfzTxPD8mcPvypb0bt4Wjlasa+EZlv2vvoGA52wDOc2RMZ4+BIV9C93wNRT2YAYSSlWHu9BgwY1k0G+GpPE47OKN+rrR9rpO0vxYR0ZUxdsKKbaurAUb6/gSyL/Dg/izFyWzmeAqsG849PuSjGAnQAQJrK2GEMeyO6EZykZur9JCA8FYxWwvFxrXFZeCrQx/8dPO7j9qn1lmcqv7tGdOffmwwZeOnPC0k=","cancellation_requested":false,"status":"completed","target":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name","request_id":"add119eddc6c4803b73e2433b00496f5"}'} + headers: + cache-control: [no-cache] + content-length: ['1239'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07:11 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/8927fb412e764a3996288bee773145c3","kid":"https://vaultaa691b9f.vault.azure.net/keys/cert-name/8927fb412e764a3996288bee773145c3","sid":"https://vaultaa691b9f.vault.azure.net/secrets/cert-name/8927fb412e764a3996288bee773145c3","x5t":"V36MDqZltxMgwv3n1g41wFlt5vk","cer":"MIIDWjCCAkKgAwIBAgIQTS7lw8UCQIaZHn2dBJh4QTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCZ6UhDkBnOC5OZK9TzH9ng0t1407G+KPv5AYhfyNKNveosPwN9SvXe541SrWttFq8orlwBXBJAmaSe8LXhvSxe+6MwjBoV0cQJh7Jow4KGoadgIHU/imTnS9lNx8975gmqcuQuQ7omHAxEQvNi5dWy2mtvTzR5frg0VuhxhY0KQiPV0jl3tsAC7Gm3L/zLLRuKDD56qN96qgwkdFIcJ+ZPkpCkUrB2QVBz/gp+vAbLMjK/ZKQvZjhA+4wm6C1R9AG8IaS9MNbmKOE898lb/+5/ZOiWmt3bwmsdC5mAEggfSWOl6p8Xw6AesHJAsvoJN7Oc2Lti7XpQfGHiZfBmNpXZAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFH9m0F/VIFSnK4gU/YckgkXH5v/WMB0GA1UdDgQWBBR/ZtBf1SBUpyuIFP2HJIJFx+b/1jANBgkqhkiG9w0BAQsFAAOCAQEADYsQa2vwVB841fButWe2OivbxH5mC5XNOAgm5DS7B1/BwYXlZon4SPgzYCfPJpG6yhICaqZIvMWPGCv8SrRHDoEbNvd3bCUPCPl+E8SpMAiVnfTzhHMqvrwHiVEf6qjOK49DEE0aK5zvY/lV11ODrfq3eKeNx0nrBeUq3k5HncuSW3Zj8oQyyuzTgssJZZk3nN+Q8EWXe7pB0EZpprUMpHCHo3f3tJUQWw+i/8nE7QA4Ljc4ZdnlZ4OfxunjavHpTAuEOjdC0zue9GDunCMshYwn7IeAi9z6660tUzDDqiZaPyS9Dc7WyvMj6io0DKbgIRnNmRbpwETtIycv9trc7Q==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793230,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultaa691b9f.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":1567793221,"updated":1567793221}},"pending":{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2379'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/8927fb412e764a3996288bee773145c3","kid":"https://vaultaa691b9f.vault.azure.net/keys/cert-name/8927fb412e764a3996288bee773145c3","sid":"https://vaultaa691b9f.vault.azure.net/secrets/cert-name/8927fb412e764a3996288bee773145c3","x5t":"V36MDqZltxMgwv3n1g41wFlt5vk","cer":"MIIDWjCCAkKgAwIBAgIQTS7lw8UCQIaZHn2dBJh4QTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCZ6UhDkBnOC5OZK9TzH9ng0t1407G+KPv5AYhfyNKNveosPwN9SvXe541SrWttFq8orlwBXBJAmaSe8LXhvSxe+6MwjBoV0cQJh7Jow4KGoadgIHU/imTnS9lNx8975gmqcuQuQ7omHAxEQvNi5dWy2mtvTzR5frg0VuhxhY0KQiPV0jl3tsAC7Gm3L/zLLRuKDD56qN96qgwkdFIcJ+ZPkpCkUrB2QVBz/gp+vAbLMjK/ZKQvZjhA+4wm6C1R9AG8IaS9MNbmKOE898lb/+5/ZOiWmt3bwmsdC5mAEggfSWOl6p8Xw6AesHJAsvoJN7Oc2Lti7XpQfGHiZfBmNpXZAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFH9m0F/VIFSnK4gU/YckgkXH5v/WMB0GA1UdDgQWBBR/ZtBf1SBUpyuIFP2HJIJFx+b/1jANBgkqhkiG9w0BAQsFAAOCAQEADYsQa2vwVB841fButWe2OivbxH5mC5XNOAgm5DS7B1/BwYXlZon4SPgzYCfPJpG6yhICaqZIvMWPGCv8SrRHDoEbNvd3bCUPCPl+E8SpMAiVnfTzhHMqvrwHiVEf6qjOK49DEE0aK5zvY/lV11ODrfq3eKeNx0nrBeUq3k5HncuSW3Zj8oQyyuzTgssJZZk3nN+Q8EWXe7pB0EZpprUMpHCHo3f3tJUQWw+i/8nE7QA4Ljc4ZdnlZ4OfxunjavHpTAuEOjdC0zue9GDunCMshYwn7IeAi9z6660tUzDDqiZaPyS9Dc7WyvMj6io0DKbgIRnNmRbpwETtIycv9trc7Q==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793237,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vaultaa691b9f.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":1567793221,"updated":1567793221}},"pending":{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2408'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultaa691b9f.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultaa691b9f.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793237,"scheduledPurgeDate":1575569237,"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/8927fb412e764a3996288bee773145c3","kid":"https://vaultaa691b9f.vault.azure.net/keys/cert-name/8927fb412e764a3996288bee773145c3","sid":"https://vaultaa691b9f.vault.azure.net/secrets/cert-name/8927fb412e764a3996288bee773145c3","x5t":"V36MDqZltxMgwv3n1g41wFlt5vk","cer":"MIIDWjCCAkKgAwIBAgIQTS7lw8UCQIaZHn2dBJh4QTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCZ6UhDkBnOC5OZK9TzH9ng0t1407G+KPv5AYhfyNKNveosPwN9SvXe541SrWttFq8orlwBXBJAmaSe8LXhvSxe+6MwjBoV0cQJh7Jow4KGoadgIHU/imTnS9lNx8975gmqcuQuQ7omHAxEQvNi5dWy2mtvTzR5frg0VuhxhY0KQiPV0jl3tsAC7Gm3L/zLLRuKDD56qN96qgwkdFIcJ+ZPkpCkUrB2QVBz/gp+vAbLMjK/ZKQvZjhA+4wm6C1R9AG8IaS9MNbmKOE898lb/+5/ZOiWmt3bwmsdC5mAEggfSWOl6p8Xw6AesHJAsvoJN7Oc2Lti7XpQfGHiZfBmNpXZAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFH9m0F/VIFSnK4gU/YckgkXH5v/WMB0GA1UdDgQWBBR/ZtBf1SBUpyuIFP2HJIJFx+b/1jANBgkqhkiG9w0BAQsFAAOCAQEADYsQa2vwVB841fButWe2OivbxH5mC5XNOAgm5DS7B1/BwYXlZon4SPgzYCfPJpG6yhICaqZIvMWPGCv8SrRHDoEbNvd3bCUPCPl+E8SpMAiVnfTzhHMqvrwHiVEf6qjOK49DEE0aK5zvY/lV11ODrfq3eKeNx0nrBeUq3k5HncuSW3Zj8oQyyuzTgssJZZk3nN+Q8EWXe7pB0EZpprUMpHCHo3f3tJUQWw+i/8nE7QA4Ljc4ZdnlZ4OfxunjavHpTAuEOjdC0zue9GDunCMshYwn7IeAi9z6660tUzDDqiZaPyS9Dc7WyvMj6io0DKbgIRnNmRbpwETtIycv9trc7Q==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793237,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vaultaa691b9f.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":1567793221,"updated":1567793221}},"pending":{"id":"https://vaultaa691b9f.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2548'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..3017b4a12dd6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_list_operations.yaml @@ -0,0 +1,508 @@ +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://vaultab181bad.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: ['Fri, 06 Sep 2019 18:04:59 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjhvBVVHd0o6JsCZ6li+g1IgYLmXbGxfceWsZa+c9CVsl3hQK20xx6XnN126CnqjVVG1+6HpI+Ewhsizge1qglJBXP/znnyt4KMCIex2AtH32YhTJ589+UuTfULd6uoViX27eSQtUz/LKmQWfgo/GuNqUUSjEWh+YEsRpBAbRHQt8PLpzs//1Rw+Xc2ZYQy9+RnbAMXfpT200hDet36F1OiDbq1JxvFw4DpNzSmK33W9ZzITAE+ea44J0P3MVmPMd24vNOvDpNE9zmXhHvBpkSR88rBu4L3I2ZcMleqpd/AIvnveHkc/ykrJ2At9vIcBQDswxukI3195COGHZpWUkuwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAU/2NgQDBpLSvOQ9FWKY2bTmo/BKlgGwaWW/4kyL6NRE8yr+3CIno3zkzUUkGfrpTbqzr5ZvS61xWLXNbb8pR2ViKto1ymw5u8rkpaMpZ+disgYHwmygTcI3eMBpYTfoX00kFM3nLsiREsVjpc8r6M5aJpE+Gkempt2MdIXf7AYOnxXYXEUEDLC+7rVE0RnR/X0BCYRQnS++F6QTOkhC2DQPWC7DSVvL2aTELHYeEm35q1alniMMTfRy4hXkL4iH00cLvOl1jQIYCnYzeCevrAcInTvjw3vWGc3EE9jLuDDZsqyFPnREX/T4b3ATBjen1F5IJcvAbUMflC70pNnI+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":"a83e0d34716b4b5490059e71f106603b"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05:00 GMT'] + expires: ['-1'] + location: ['https://vaultab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0&request_id=a83e0d34716b4b5490059e71f106603b'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjhvBVVHd0o6JsCZ6li+g1IgYLmXbGxfceWsZa+c9CVsl3hQK20xx6XnN126CnqjVVG1+6HpI+Ewhsizge1qglJBXP/znnyt4KMCIex2AtH32YhTJ589+UuTfULd6uoViX27eSQtUz/LKmQWfgo/GuNqUUSjEWh+YEsRpBAbRHQt8PLpzs//1Rw+Xc2ZYQy9+RnbAMXfpT200hDet36F1OiDbq1JxvFw4DpNzSmK33W9ZzITAE+ea44J0P3MVmPMd24vNOvDpNE9zmXhHvBpkSR88rBu4L3I2ZcMleqpd/AIvnveHkc/ykrJ2At9vIcBQDswxukI3195COGHZpWUkuwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAU/2NgQDBpLSvOQ9FWKY2bTmo/BKlgGwaWW/4kyL6NRE8yr+3CIno3zkzUUkGfrpTbqzr5ZvS61xWLXNbb8pR2ViKto1ymw5u8rkpaMpZ+disgYHwmygTcI3eMBpYTfoX00kFM3nLsiREsVjpc8r6M5aJpE+Gkempt2MdIXf7AYOnxXYXEUEDLC+7rVE0RnR/X0BCYRQnS++F6QTOkhC2DQPWC7DSVvL2aTELHYeEm35q1alniMMTfRy4hXkL4iH00cLvOl1jQIYCnYzeCevrAcInTvjw3vWGc3EE9jLuDDZsqyFPnREX/T4b3ATBjen1F5IJcvAbUMflC70pNnI+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":"a83e0d34716b4b5490059e71f106603b"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjhvBVVHd0o6JsCZ6li+g1IgYLmXbGxfceWsZa+c9CVsl3hQK20xx6XnN126CnqjVVG1+6HpI+Ewhsizge1qglJBXP/znnyt4KMCIex2AtH32YhTJ589+UuTfULd6uoViX27eSQtUz/LKmQWfgo/GuNqUUSjEWh+YEsRpBAbRHQt8PLpzs//1Rw+Xc2ZYQy9+RnbAMXfpT200hDet36F1OiDbq1JxvFw4DpNzSmK33W9ZzITAE+ea44J0P3MVmPMd24vNOvDpNE9zmXhHvBpkSR88rBu4L3I2ZcMleqpd/AIvnveHkc/ykrJ2At9vIcBQDswxukI3195COGHZpWUkuwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAU/2NgQDBpLSvOQ9FWKY2bTmo/BKlgGwaWW/4kyL6NRE8yr+3CIno3zkzUUkGfrpTbqzr5ZvS61xWLXNbb8pR2ViKto1ymw5u8rkpaMpZ+disgYHwmygTcI3eMBpYTfoX00kFM3nLsiREsVjpc8r6M5aJpE+Gkempt2MdIXf7AYOnxXYXEUEDLC+7rVE0RnR/X0BCYRQnS++F6QTOkhC2DQPWC7DSVvL2aTELHYeEm35q1alniMMTfRy4hXkL4iH00cLvOl1jQIYCnYzeCevrAcInTvjw3vWGc3EE9jLuDDZsqyFPnREX/T4b3ATBjen1F5IJcvAbUMflC70pNnI+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":"a83e0d34716b4b5490059e71f106603b"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjhvBVVHd0o6JsCZ6li+g1IgYLmXbGxfceWsZa+c9CVsl3hQK20xx6XnN126CnqjVVG1+6HpI+Ewhsizge1qglJBXP/znnyt4KMCIex2AtH32YhTJ589+UuTfULd6uoViX27eSQtUz/LKmQWfgo/GuNqUUSjEWh+YEsRpBAbRHQt8PLpzs//1Rw+Xc2ZYQy9+RnbAMXfpT200hDet36F1OiDbq1JxvFw4DpNzSmK33W9ZzITAE+ea44J0P3MVmPMd24vNOvDpNE9zmXhHvBpkSR88rBu4L3I2ZcMleqpd/AIvnveHkc/ykrJ2At9vIcBQDswxukI3195COGHZpWUkuwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAU/2NgQDBpLSvOQ9FWKY2bTmo/BKlgGwaWW/4kyL6NRE8yr+3CIno3zkzUUkGfrpTbqzr5ZvS61xWLXNbb8pR2ViKto1ymw5u8rkpaMpZ+disgYHwmygTcI3eMBpYTfoX00kFM3nLsiREsVjpc8r6M5aJpE+Gkempt2MdIXf7AYOnxXYXEUEDLC+7rVE0RnR/X0BCYRQnS++F6QTOkhC2DQPWC7DSVvL2aTELHYeEm35q1alniMMTfRy4hXkL4iH00cLvOl1jQIYCnYzeCevrAcInTvjw3vWGc3EE9jLuDDZsqyFPnREX/T4b3ATBjen1F5IJcvAbUMflC70pNnI+o=","cancellation_requested":false,"status":"completed","target":"https://vaultab181bad.vault.azure.net/certificates/certificate0","request_id":"a83e0d34716b4b5490059e71f106603b"}'} + headers: + cache-control: [no-cache] + content-length: ['1245'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate1/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2FjbQTNn6PpXNp5o7NUKJqAwHYwyAzDw2yMskod76nxu2P8orVW+7dxvNn/+3y6EMPg+iEgU0C/KWYztFqtCBJD7hQSCe0m4mpSBQBI0gLeD2gkxhCmJRRglGtXrudTKG4WWr/Gx/G2pqWRSBcHUM+4fXlq98IDwpDzSy8WRUGGThn6ox5jvSB/YNnama7Uh2bCYpg3Kw0zghAU30ywIDqGKKM6SwTeQzE7ncL769ai1yJGAP9Z00QwdI5gqsybZ9M/y4FyuAD2tar4T0kw9a8TKn1Roup0DYw9wadTxPWh99LRjlYY7hKv0hqqjM1wyCtmJyK5We37sT94WQhgOCQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGknTkdAtA/1US7L8EQri/lyRMMm0DmfdxbpwBhAF7XyYfswY5ZdCyZan6P3QP8OCC9cOkZAsGyrlTnIwmOxUnyyou/Eo2X7XzwfaAXkfhMxXRaeSv9Ss1r41mQN50fX1osV9n4/isc+OYsSzCaEJOeyoQup9wkR0/xqA6Bp7ndhmAXbLhOKjgVFkKR1D+mMSEHz9pxTUY2CPxBuuvK0AdQzzRc4inSdnE5Nd7DpIq1jnGJJgNzgzHgJ6IJysd24YbAbd8Xjj5ZFTWb/ZBZ4VNv1Qkp337LNo8d5K39KhFp/Kv/ONeZSlMyNrarxvzMawURvIoEEZKrClpDwbssKmm4=","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":"1b96e949a7d24723a01601241757cbe7"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05:26 GMT'] + expires: ['-1'] + location: ['https://vaultab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0&request_id=1b96e949a7d24723a01601241757cbe7'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2FjbQTNn6PpXNp5o7NUKJqAwHYwyAzDw2yMskod76nxu2P8orVW+7dxvNn/+3y6EMPg+iEgU0C/KWYztFqtCBJD7hQSCe0m4mpSBQBI0gLeD2gkxhCmJRRglGtXrudTKG4WWr/Gx/G2pqWRSBcHUM+4fXlq98IDwpDzSy8WRUGGThn6ox5jvSB/YNnama7Uh2bCYpg3Kw0zghAU30ywIDqGKKM6SwTeQzE7ncL769ai1yJGAP9Z00QwdI5gqsybZ9M/y4FyuAD2tar4T0kw9a8TKn1Roup0DYw9wadTxPWh99LRjlYY7hKv0hqqjM1wyCtmJyK5We37sT94WQhgOCQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGknTkdAtA/1US7L8EQri/lyRMMm0DmfdxbpwBhAF7XyYfswY5ZdCyZan6P3QP8OCC9cOkZAsGyrlTnIwmOxUnyyou/Eo2X7XzwfaAXkfhMxXRaeSv9Ss1r41mQN50fX1osV9n4/isc+OYsSzCaEJOeyoQup9wkR0/xqA6Bp7ndhmAXbLhOKjgVFkKR1D+mMSEHz9pxTUY2CPxBuuvK0AdQzzRc4inSdnE5Nd7DpIq1jnGJJgNzgzHgJ6IJysd24YbAbd8Xjj5ZFTWb/ZBZ4VNv1Qkp337LNo8d5K39KhFp/Kv/ONeZSlMyNrarxvzMawURvIoEEZKrClpDwbssKmm4=","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":"1b96e949a7d24723a01601241757cbe7"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2FjbQTNn6PpXNp5o7NUKJqAwHYwyAzDw2yMskod76nxu2P8orVW+7dxvNn/+3y6EMPg+iEgU0C/KWYztFqtCBJD7hQSCe0m4mpSBQBI0gLeD2gkxhCmJRRglGtXrudTKG4WWr/Gx/G2pqWRSBcHUM+4fXlq98IDwpDzSy8WRUGGThn6ox5jvSB/YNnama7Uh2bCYpg3Kw0zghAU30ywIDqGKKM6SwTeQzE7ncL769ai1yJGAP9Z00QwdI5gqsybZ9M/y4FyuAD2tar4T0kw9a8TKn1Roup0DYw9wadTxPWh99LRjlYY7hKv0hqqjM1wyCtmJyK5We37sT94WQhgOCQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGknTkdAtA/1US7L8EQri/lyRMMm0DmfdxbpwBhAF7XyYfswY5ZdCyZan6P3QP8OCC9cOkZAsGyrlTnIwmOxUnyyou/Eo2X7XzwfaAXkfhMxXRaeSv9Ss1r41mQN50fX1osV9n4/isc+OYsSzCaEJOeyoQup9wkR0/xqA6Bp7ndhmAXbLhOKjgVFkKR1D+mMSEHz9pxTUY2CPxBuuvK0AdQzzRc4inSdnE5Nd7DpIq1jnGJJgNzgzHgJ6IJysd24YbAbd8Xjj5ZFTWb/ZBZ4VNv1Qkp337LNo8d5K39KhFp/Kv/ONeZSlMyNrarxvzMawURvIoEEZKrClpDwbssKmm4=","cancellation_requested":false,"status":"completed","target":"https://vaultab181bad.vault.azure.net/certificates/certificate1","request_id":"1b96e949a7d24723a01601241757cbe7"}'} + headers: + cache-control: [no-cache] + content-length: ['1245'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate2/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA212kewUJhKbJPWCLcl1dHY9qsnqerhjsUgzL2xOicrNzjhE+MwMYlarWMazLs5YDGgikWNrA4tC1Hdyfc0iEaT/ZFkZfKhWctojpzQm4XZUOSxwL36rtE5vtouYq5IkUray7iligexmQk9Y3IoT3d/cRDJ5VoYR4A93VOqulrG1OM/BE7fjBctmpCcUn59zZI4rPs/K+HQDpS9186WvYGrlaSGT6GfY4/8fLpqNKGEu5t23B74i6aRxAXfR7wLo7feEMPdGCrGu6SEZMjoiOES/dxnXFz23SQ6ZVK284WMOvbxJMJMdUvabvOFfDGKwyDXCNbSuRa7nQQYD9LmupwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGrTyKiJ5nf0LGwtw1AFVHqD5ZXjujHHIlU4Q7YnJ28xXUBgxlFHDflb64sgkG/x9GPcErFal0EqcQ1Vt+stmbmRuBmv0heUqp1zkQm2qsPmgxfuQ3akkro9NV6WTZ88ek9vZBlPKqMUElMMTf0lI06nUGRAdr4+1X967lDBFF6qA4pgd6FKxK0YXIftvO7mW7kPWeylNflKBMZIMH5MdKSTyPIobuGMRTNwd3KjLnK6yhtffsypcxL7ug2CcgtR8bESS0VmdOXjWHH6B8gGJ3TLHZoaLjjy8pw5ekev8lFLHLPBq1jpT5tZHANg+jVdKbxImX/bfnue99wXHavJf3c=","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":"b551507420bb4c78886d3ed015c9b06a"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05:41 GMT'] + expires: ['-1'] + location: ['https://vaultab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0&request_id=b551507420bb4c78886d3ed015c9b06a'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA212kewUJhKbJPWCLcl1dHY9qsnqerhjsUgzL2xOicrNzjhE+MwMYlarWMazLs5YDGgikWNrA4tC1Hdyfc0iEaT/ZFkZfKhWctojpzQm4XZUOSxwL36rtE5vtouYq5IkUray7iligexmQk9Y3IoT3d/cRDJ5VoYR4A93VOqulrG1OM/BE7fjBctmpCcUn59zZI4rPs/K+HQDpS9186WvYGrlaSGT6GfY4/8fLpqNKGEu5t23B74i6aRxAXfR7wLo7feEMPdGCrGu6SEZMjoiOES/dxnXFz23SQ6ZVK284WMOvbxJMJMdUvabvOFfDGKwyDXCNbSuRa7nQQYD9LmupwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGrTyKiJ5nf0LGwtw1AFVHqD5ZXjujHHIlU4Q7YnJ28xXUBgxlFHDflb64sgkG/x9GPcErFal0EqcQ1Vt+stmbmRuBmv0heUqp1zkQm2qsPmgxfuQ3akkro9NV6WTZ88ek9vZBlPKqMUElMMTf0lI06nUGRAdr4+1X967lDBFF6qA4pgd6FKxK0YXIftvO7mW7kPWeylNflKBMZIMH5MdKSTyPIobuGMRTNwd3KjLnK6yhtffsypcxL7ug2CcgtR8bESS0VmdOXjWHH6B8gGJ3TLHZoaLjjy8pw5ekev8lFLHLPBq1jpT5tZHANg+jVdKbxImX/bfnue99wXHavJf3c=","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":"b551507420bb4c78886d3ed015c9b06a"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA212kewUJhKbJPWCLcl1dHY9qsnqerhjsUgzL2xOicrNzjhE+MwMYlarWMazLs5YDGgikWNrA4tC1Hdyfc0iEaT/ZFkZfKhWctojpzQm4XZUOSxwL36rtE5vtouYq5IkUray7iligexmQk9Y3IoT3d/cRDJ5VoYR4A93VOqulrG1OM/BE7fjBctmpCcUn59zZI4rPs/K+HQDpS9186WvYGrlaSGT6GfY4/8fLpqNKGEu5t23B74i6aRxAXfR7wLo7feEMPdGCrGu6SEZMjoiOES/dxnXFz23SQ6ZVK284WMOvbxJMJMdUvabvOFfDGKwyDXCNbSuRa7nQQYD9LmupwQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAGrTyKiJ5nf0LGwtw1AFVHqD5ZXjujHHIlU4Q7YnJ28xXUBgxlFHDflb64sgkG/x9GPcErFal0EqcQ1Vt+stmbmRuBmv0heUqp1zkQm2qsPmgxfuQ3akkro9NV6WTZ88ek9vZBlPKqMUElMMTf0lI06nUGRAdr4+1X967lDBFF6qA4pgd6FKxK0YXIftvO7mW7kPWeylNflKBMZIMH5MdKSTyPIobuGMRTNwd3KjLnK6yhtffsypcxL7ug2CcgtR8bESS0VmdOXjWHH6B8gGJ3TLHZoaLjjy8pw5ekev8lFLHLPBq1jpT5tZHANg+jVdKbxImX/bfnue99wXHavJf3c=","cancellation_requested":false,"status":"completed","target":"https://vaultab181bad.vault.azure.net/certificates/certificate2","request_id":"b551507420bb4c78886d3ed015c9b06a"}'} + headers: + cache-control: [no-cache] + content-length: ['1245'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate3/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7dnXNOL7rbAS58YGnyiUwJd2edWUs1hJST6ivrl0Ukss5nBcZZp46nwq5TGqQE9OhrKV/z4/Ni9v6Fl4ZJYpMtmpX1B/qQ5PER6dCrKfna2l94at7qOQYlDGaqmxBqrdvVGdlNiCqyrv6nMST4tNxIMGtm6qQ5fk7djfal9z2pCDanFJvnZ+W0XibUsqi51P2hY/EOTx4eN+rv791nGw3AiCXRA7JLFEzBajPL9g8LAnTLkRJ7ltldD7jzGdtJxQSP1ToYiFZjV20fv7PYrZQ1UThg4tlJYOYx51f3ER7tt1tQCsJzCDna4BcVKGKygxm1MzgYG1JCZrDAWBfYvIAQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC/MyS6JW+ehpDwU8XF0oRPmHIIJ8ELTYpxAOz7jsHtmULtIV6CBQcMeHRJK6ULzTZHaFG8t+yGDcLA/m4xcNFFWXOB5LScMSikzeiGE3xhZzmVVejzCgpqypa1UMxxcThpZgQPnB7lY7ruUR57ED0/m9lVsriMVAORbA+X0SywRq8UDIEKs+yUkoU/JafJ1RGHNhjyd2YjyeltenT3FJAg24yAufymVWXW+1MGXJWYP09lHnZr22Be6vXuRrH+pBXqUx5CadgQfxzc2HpEm6i2JcthWeXYBD7ytim2hiM/J5vFk9vEj2Ld4Kb4kB1eEW2AeRU3v4Bja64QJmbOO9hg=","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":"a0e1a3ef9b3b47a49d7f118ed5be398b"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05:57 GMT'] + expires: ['-1'] + location: ['https://vaultab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0&request_id=a0e1a3ef9b3b47a49d7f118ed5be398b'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7dnXNOL7rbAS58YGnyiUwJd2edWUs1hJST6ivrl0Ukss5nBcZZp46nwq5TGqQE9OhrKV/z4/Ni9v6Fl4ZJYpMtmpX1B/qQ5PER6dCrKfna2l94at7qOQYlDGaqmxBqrdvVGdlNiCqyrv6nMST4tNxIMGtm6qQ5fk7djfal9z2pCDanFJvnZ+W0XibUsqi51P2hY/EOTx4eN+rv791nGw3AiCXRA7JLFEzBajPL9g8LAnTLkRJ7ltldD7jzGdtJxQSP1ToYiFZjV20fv7PYrZQ1UThg4tlJYOYx51f3ER7tt1tQCsJzCDna4BcVKGKygxm1MzgYG1JCZrDAWBfYvIAQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC/MyS6JW+ehpDwU8XF0oRPmHIIJ8ELTYpxAOz7jsHtmULtIV6CBQcMeHRJK6ULzTZHaFG8t+yGDcLA/m4xcNFFWXOB5LScMSikzeiGE3xhZzmVVejzCgpqypa1UMxxcThpZgQPnB7lY7ruUR57ED0/m9lVsriMVAORbA+X0SywRq8UDIEKs+yUkoU/JafJ1RGHNhjyd2YjyeltenT3FJAg24yAufymVWXW+1MGXJWYP09lHnZr22Be6vXuRrH+pBXqUx5CadgQfxzc2HpEm6i2JcthWeXYBD7ytim2hiM/J5vFk9vEj2Ld4Kb4kB1eEW2AeRU3v4Bja64QJmbOO9hg=","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":"a0e1a3ef9b3b47a49d7f118ed5be398b"}'} + headers: + cache-control: [no-cache] + content-length: ['1335'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7dnXNOL7rbAS58YGnyiUwJd2edWUs1hJST6ivrl0Ukss5nBcZZp46nwq5TGqQE9OhrKV/z4/Ni9v6Fl4ZJYpMtmpX1B/qQ5PER6dCrKfna2l94at7qOQYlDGaqmxBqrdvVGdlNiCqyrv6nMST4tNxIMGtm6qQ5fk7djfal9z2pCDanFJvnZ+W0XibUsqi51P2hY/EOTx4eN+rv791nGw3AiCXRA7JLFEzBajPL9g8LAnTLkRJ7ltldD7jzGdtJxQSP1ToYiFZjV20fv7PYrZQ1UThg4tlJYOYx51f3ER7tt1tQCsJzCDna4BcVKGKygxm1MzgYG1JCZrDAWBfYvIAQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC/MyS6JW+ehpDwU8XF0oRPmHIIJ8ELTYpxAOz7jsHtmULtIV6CBQcMeHRJK6ULzTZHaFG8t+yGDcLA/m4xcNFFWXOB5LScMSikzeiGE3xhZzmVVejzCgpqypa1UMxxcThpZgQPnB7lY7ruUR57ED0/m9lVsriMVAORbA+X0SywRq8UDIEKs+yUkoU/JafJ1RGHNhjyd2YjyeltenT3FJAg24yAufymVWXW+1MGXJWYP09lHnZr22Be6vXuRrH+pBXqUx5CadgQfxzc2HpEm6i2JcthWeXYBD7ytim2hiM/J5vFk9vEj2Ld4Kb4kB1eEW2AeRU3v4Bja64QJmbOO9hg=","cancellation_requested":false,"status":"completed","target":"https://vaultab181bad.vault.azure.net/certificates/certificate3","request_id":"a0e1a3ef9b3b47a49d7f118ed5be398b"}'} + headers: + cache-control: [no-cache] + content-length: ['1245'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate0","x5t":"0rvj30o5mt7v5OrZ5XcEMlcQLG0","attributes":{"enabled":true,"nbf":1567792517,"exp":1630951517,"created":1567793117,"updated":1567793117},"subject":""},{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate1","x5t":"8RLdumXeRj4EWqAZANCLYpkemGk","attributes":{"enabled":true,"nbf":1567792533,"exp":1630951533,"created":1567793133,"updated":1567793133},"subject":""},{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate2","x5t":"VOsLalvyy1iTYsmZlY4uunceH5Q","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148},"subject":""},{"id":"https://vaultab181bad.vault.azure.net/certificates/certificate3","x5t":"a4dmLljk9IW1KCPEa9riUAcG45s","attributes":{"enabled":true,"nbf":1567792563,"exp":1630951563,"created":1567793164,"updated":1567793164},"subject":""}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['939'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.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: ['Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultab181bad.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: ['Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..2d8aeb23634e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_certificate_recover.yaml @@ -0,0 +1,319 @@ +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://vaultd99a1844.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: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzT1eOAs+UPxo9IiI8aMr2mdAYRf6udmH8TYvgzkVWHTA+42eEaX4E2gdlkdDYvI4P4OaPDQlyKu9KfSdGeLReRTYCBhAXZzmokaOWaxJel6WtmG3o4T3pe4iKAwfDuC6F2n/Ty2xzgarX7pLdGRZAfywmVU8PFTJncn8uFqz0D0zR2jHisQinXtvEfa3rfUV3fSr3/cZtBzBIUVY9zSLnhcQJ1L1UcoOs7bx6fYgtWxN6Scro86EvVYLvjpuCyfFxHtAGbofZnA/DsTJ6xnNtwPjEcivi0N7iISO3WQqrGyt+K3H29n25GWrRTccNbDM66DOQKmRpEkOZ+uT2DV0mwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIUkf60IpChunV9S7hqrlTrFJWdF6V5XX+uqoJ9EkB8DcyW7NjxO0sfgdXRY9YRmtajk328QR1lIOs1EGA6X6Ec2n5LsiL2udgn60ONJPRK9ulD/bPWods6y07htcJuirHh/HcHWuqG+tYZ8/loYwcdUu/gBtAVxOz6MX+v6p2cvIgxNXailVxcFGpbUjZRQeo4pq1BV78Mhs9lSGLM6baZGyC3YGE05jLARCKQ2GoM8rqLat8j7es8bsYosciofNz+F5TqkqTjDGzeJxf38/aD3qoXdOyVhfasu9iJRwivkFo3Dsjovnegz5pqyCe0hGCMC4ySnwztGccIgV/54oRU=","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":"e75c3a5d3b7440358e10c8ae9e98bc4a"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07:03 GMT'] + expires: ['-1'] + location: ['https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0&request_id=e75c3a5d3b7440358e10c8ae9e98bc4a'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzT1eOAs+UPxo9IiI8aMr2mdAYRf6udmH8TYvgzkVWHTA+42eEaX4E2gdlkdDYvI4P4OaPDQlyKu9KfSdGeLReRTYCBhAXZzmokaOWaxJel6WtmG3o4T3pe4iKAwfDuC6F2n/Ty2xzgarX7pLdGRZAfywmVU8PFTJncn8uFqz0D0zR2jHisQinXtvEfa3rfUV3fSr3/cZtBzBIUVY9zSLnhcQJ1L1UcoOs7bx6fYgtWxN6Scro86EvVYLvjpuCyfFxHtAGbofZnA/DsTJ6xnNtwPjEcivi0N7iISO3WQqrGyt+K3H29n25GWrRTccNbDM66DOQKmRpEkOZ+uT2DV0mwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIUkf60IpChunV9S7hqrlTrFJWdF6V5XX+uqoJ9EkB8DcyW7NjxO0sfgdXRY9YRmtajk328QR1lIOs1EGA6X6Ec2n5LsiL2udgn60ONJPRK9ulD/bPWods6y07htcJuirHh/HcHWuqG+tYZ8/loYwcdUu/gBtAVxOz6MX+v6p2cvIgxNXailVxcFGpbUjZRQeo4pq1BV78Mhs9lSGLM6baZGyC3YGE05jLARCKQ2GoM8rqLat8j7es8bsYosciofNz+F5TqkqTjDGzeJxf38/aD3qoXdOyVhfasu9iJRwivkFo3Dsjovnegz5pqyCe0hGCMC4ySnwztGccIgV/54oRU=","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":"e75c3a5d3b7440358e10c8ae9e98bc4a"}'} + headers: + cache-control: [no-cache] + content-length: ['1332'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzT1eOAs+UPxo9IiI8aMr2mdAYRf6udmH8TYvgzkVWHTA+42eEaX4E2gdlkdDYvI4P4OaPDQlyKu9KfSdGeLReRTYCBhAXZzmokaOWaxJel6WtmG3o4T3pe4iKAwfDuC6F2n/Ty2xzgarX7pLdGRZAfywmVU8PFTJncn8uFqz0D0zR2jHisQinXtvEfa3rfUV3fSr3/cZtBzBIUVY9zSLnhcQJ1L1UcoOs7bx6fYgtWxN6Scro86EvVYLvjpuCyfFxHtAGbofZnA/DsTJ6xnNtwPjEcivi0N7iISO3WQqrGyt+K3H29n25GWrRTccNbDM66DOQKmRpEkOZ+uT2DV0mwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIUkf60IpChunV9S7hqrlTrFJWdF6V5XX+uqoJ9EkB8DcyW7NjxO0sfgdXRY9YRmtajk328QR1lIOs1EGA6X6Ec2n5LsiL2udgn60ONJPRK9ulD/bPWods6y07htcJuirHh/HcHWuqG+tYZ8/loYwcdUu/gBtAVxOz6MX+v6p2cvIgxNXailVxcFGpbUjZRQeo4pq1BV78Mhs9lSGLM6baZGyC3YGE05jLARCKQ2GoM8rqLat8j7es8bsYosciofNz+F5TqkqTjDGzeJxf38/aD3qoXdOyVhfasu9iJRwivkFo3Dsjovnegz5pqyCe0hGCMC4ySnwztGccIgV/54oRU=","cancellation_requested":false,"status":"completed","target":"https://vaultd99a1844.vault.azure.net/certificates/cert-name","request_id":"e75c3a5d3b7440358e10c8ae9e98bc4a"}'} + headers: + cache-control: [no-cache] + content-length: ['1239'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/bc831dc84dc4493f93ada54887cf61e5","kid":"https://vaultd99a1844.vault.azure.net/keys/cert-name/bc831dc84dc4493f93ada54887cf61e5","sid":"https://vaultd99a1844.vault.azure.net/secrets/cert-name/bc831dc84dc4493f93ada54887cf61e5","x5t":"pVz4Z5TntBhnGTtYlTQVWozeV-w","cer":"MIIDWjCCAkKgAwIBAgIQVbvLzsUkSIOtXIlCf1DYojANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNPV44Cz5Q/Gj0iIjxoyvaZ0BhF/q52YfxNi+DORVYdMD7jZ4RpfgTaB2WR0Ni8jg/g5o8NCXIq70p9J0Z4tF5FNgIGEBdnOaiRo5ZrEl6Xpa2YbejhPel7iIoDB8O4LoXaf9PLbHOBqtfukt0ZFkB/LCZVTw8VMmdyfy4WrPQPTNHaMeKxCKde28R9ret9RXd9Kvf9xm0HMEhRVj3NIueFxAnUvVRyg6ztvHp9iC1bE3pJyujzoS9Vgu+Om4LJ8XEe0AZuh9mcD8OxMnrGc23A+MRyK+LQ3uIhI7dZCqsbK34rcfb2fbkZatFNxw1sMzroM5AqZGkSQ5n65PYNXSbAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAifUb5yCsnQIyr8Cw91O/lGEkWJMB0GA1UdDgQWBBQIn1G+cgrJ0CMq/AsPdTv5RhJFiTANBgkqhkiG9w0BAQsFAAOCAQEAhER2R+0yOUlOa4juM8o1XmCy5rWAYdP+lWLNddZWeZw8p31kdykKkpyq70qRY0rhKBc2MsIpLWuulyor2E8+tjQ5eXjJOFThtBBkYMAe7JVwzUw9KTKRgtArD3Yu0EYOLSh9ilZZeg5JwcUKD6EqkwEr7khTxBU2s4PDCtKaxCtWql9gD1C6bzce0kgVQ5lEIzsk0Ok4imB4VIZlvaVaBVd2bXzhwNegKM4digPS31H5fFk6JcKNmYm2VxtkuXkyvJ5w7NX3zyRieOzHCXGL3H8/H/NiwC64/TvqsTIrx0Rn+9NKsUdDhRnWOluFwu6xaFb7QBf3qIBT97pkMwYsHQ==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793230,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultd99a1844.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2519'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.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: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.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: ['Fri, 06 Sep 2019 18:07:21 GMT'] + expires: ['-1'] + pragma: [no-cache] + server: [Microsoft-IIS/10.0] + strict-transport-security: [max-age=31536000;includeSubDomains] + x-aspnet-version: [4.0.30319] + x-content-type-options: [nosniff] + x-ms-keyvault-network-info: [addr=131.107.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.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: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/bc831dc84dc4493f93ada54887cf61e5","kid":"https://vaultd99a1844.vault.azure.net/keys/cert-name/bc831dc84dc4493f93ada54887cf61e5","sid":"https://vaultd99a1844.vault.azure.net/secrets/cert-name/bc831dc84dc4493f93ada54887cf61e5","x5t":"pVz4Z5TntBhnGTtYlTQVWozeV-w","cer":"MIIDWjCCAkKgAwIBAgIQVbvLzsUkSIOtXIlCf1DYojANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNPV44Cz5Q/Gj0iIjxoyvaZ0BhF/q52YfxNi+DORVYdMD7jZ4RpfgTaB2WR0Ni8jg/g5o8NCXIq70p9J0Z4tF5FNgIGEBdnOaiRo5ZrEl6Xpa2YbejhPel7iIoDB8O4LoXaf9PLbHOBqtfukt0ZFkB/LCZVTw8VMmdyfy4WrPQPTNHaMeKxCKde28R9ret9RXd9Kvf9xm0HMEhRVj3NIueFxAnUvVRyg6ztvHp9iC1bE3pJyujzoS9Vgu+Om4LJ8XEe0AZuh9mcD8OxMnrGc23A+MRyK+LQ3uIhI7dZCqsbK34rcfb2fbkZatFNxw1sMzroM5AqZGkSQ5n65PYNXSbAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAifUb5yCsnQIyr8Cw91O/lGEkWJMB0GA1UdDgQWBBQIn1G+cgrJ0CMq/AsPdTv5RhJFiTANBgkqhkiG9w0BAQsFAAOCAQEAhER2R+0yOUlOa4juM8o1XmCy5rWAYdP+lWLNddZWeZw8p31kdykKkpyq70qRY0rhKBc2MsIpLWuulyor2E8+tjQ5eXjJOFThtBBkYMAe7JVwzUw9KTKRgtArD3Yu0EYOLSh9ilZZeg5JwcUKD6EqkwEr7khTxBU2s4PDCtKaxCtWql9gD1C6bzce0kgVQ5lEIzsk0Ok4imB4VIZlvaVaBVd2bXzhwNegKM4digPS31H5fFk6JcKNmYm2VxtkuXkyvJ5w7NX3zyRieOzHCXGL3H8/H/NiwC64/TvqsTIrx0Rn+9NKsUdDhRnWOluFwu6xaFb7QBf3qIBT97pkMwYsHQ==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793230,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultd99a1844.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2519'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/bc831dc84dc4493f93ada54887cf61e5","kid":"https://vaultd99a1844.vault.azure.net/keys/cert-name/bc831dc84dc4493f93ada54887cf61e5","sid":"https://vaultd99a1844.vault.azure.net/secrets/cert-name/bc831dc84dc4493f93ada54887cf61e5","x5t":"pVz4Z5TntBhnGTtYlTQVWozeV-w","cer":"MIIDWjCCAkKgAwIBAgIQVbvLzsUkSIOtXIlCf1DYojANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNPV44Cz5Q/Gj0iIjxoyvaZ0BhF/q52YfxNi+DORVYdMD7jZ4RpfgTaB2WR0Ni8jg/g5o8NCXIq70p9J0Z4tF5FNgIGEBdnOaiRo5ZrEl6Xpa2YbejhPel7iIoDB8O4LoXaf9PLbHOBqtfukt0ZFkB/LCZVTw8VMmdyfy4WrPQPTNHaMeKxCKde28R9ret9RXd9Kvf9xm0HMEhRVj3NIueFxAnUvVRyg6ztvHp9iC1bE3pJyujzoS9Vgu+Om4LJ8XEe0AZuh9mcD8OxMnrGc23A+MRyK+LQ3uIhI7dZCqsbK34rcfb2fbkZatFNxw1sMzroM5AqZGkSQ5n65PYNXSbAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAifUb5yCsnQIyr8Cw91O/lGEkWJMB0GA1UdDgQWBBQIn1G+cgrJ0CMq/AsPdTv5RhJFiTANBgkqhkiG9w0BAQsFAAOCAQEAhER2R+0yOUlOa4juM8o1XmCy5rWAYdP+lWLNddZWeZw8p31kdykKkpyq70qRY0rhKBc2MsIpLWuulyor2E8+tjQ5eXjJOFThtBBkYMAe7JVwzUw9KTKRgtArD3Yu0EYOLSh9ilZZeg5JwcUKD6EqkwEr7khTxBU2s4PDCtKaxCtWql9gD1C6bzce0kgVQ5lEIzsk0Ok4imB4VIZlvaVaBVd2bXzhwNegKM4digPS31H5fFk6JcKNmYm2VxtkuXkyvJ5w7NX3zyRieOzHCXGL3H8/H/NiwC64/TvqsTIrx0Rn+9NKsUdDhRnWOluFwu6xaFb7QBf3qIBT97pkMwYsHQ==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793230,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultd99a1844.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2519'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd99a1844.vault.azure.net/deletedcertificates/cert-name/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/bc831dc84dc4493f93ada54887cf61e5","kid":"https://vaultd99a1844.vault.azure.net/keys/cert-name/bc831dc84dc4493f93ada54887cf61e5","sid":"https://vaultd99a1844.vault.azure.net/secrets/cert-name/bc831dc84dc4493f93ada54887cf61e5","x5t":"pVz4Z5TntBhnGTtYlTQVWozeV-w","cer":"MIIDWjCCAkKgAwIBAgIQVbvLzsUkSIOtXIlCf1DYojANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzEwWhcNMjEwOTA2MTgwNzEwWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNPV44Cz5Q/Gj0iIjxoyvaZ0BhF/q52YfxNi+DORVYdMD7jZ4RpfgTaB2WR0Ni8jg/g5o8NCXIq70p9J0Z4tF5FNgIGEBdnOaiRo5ZrEl6Xpa2YbejhPel7iIoDB8O4LoXaf9PLbHOBqtfukt0ZFkB/LCZVTw8VMmdyfy4WrPQPTNHaMeKxCKde28R9ret9RXd9Kvf9xm0HMEhRVj3NIueFxAnUvVRyg6ztvHp9iC1bE3pJyujzoS9Vgu+Om4LJ8XEe0AZuh9mcD8OxMnrGc23A+MRyK+LQ3uIhI7dZCqsbK34rcfb2fbkZatFNxw1sMzroM5AqZGkSQ5n65PYNXSbAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAifUb5yCsnQIyr8Cw91O/lGEkWJMB0GA1UdDgQWBBQIn1G+cgrJ0CMq/AsPdTv5RhJFiTANBgkqhkiG9w0BAQsFAAOCAQEAhER2R+0yOUlOa4juM8o1XmCy5rWAYdP+lWLNddZWeZw8p31kdykKkpyq70qRY0rhKBc2MsIpLWuulyor2E8+tjQ5eXjJOFThtBBkYMAe7JVwzUw9KTKRgtArD3Yu0EYOLSh9ilZZeg5JwcUKD6EqkwEr7khTxBU2s4PDCtKaxCtWql9gD1C6bzce0kgVQ5lEIzsk0Ok4imB4VIZlvaVaBVd2bXzhwNegKM4digPS31H5fFk6JcKNmYm2VxtkuXkyvJ5w7NX3zyRieOzHCXGL3H8/H/NiwC64/TvqsTIrx0Rn+9NKsUdDhRnWOluFwu6xaFb7QBf3qIBT97pkMwYsHQ==","attributes":{"enabled":true,"nbf":1567792630,"exp":1630951630,"created":1567793230,"updated":1567793230,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vaultd99a1844.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vaultd99a1844.vault.azure.net/certificates/cert-name/pending"}}'} + headers: + cache-control: [no-cache] + content-length: ['2379'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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_contacts.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_contacts.yaml new file mode 100644 index 000000000000..3335a602ce64 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_contacts.yaml @@ -0,0 +1,123 @@ +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://vaulte5f213cb.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: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte5f213cb.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte5f213cb.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte5f213cb.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte5f213cb.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaulte5f213cb.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vaulte5f213cb.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: ['221'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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_issuers.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_issuers.yaml new file mode 100644 index 000000000000..9f6c70b70e4d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates.test_example_issuers.yaml @@ -0,0 +1,177 @@ +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://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1?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: ['Fri, 06 Sep 2019 18:05:26 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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1","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":1567793126,"updated":1567793126}}'} + headers: + cache-control: [no-cache] + content-length: ['342'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1","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":1567793126,"updated":1567793126}}'} + headers: + cache-control: [no-cache] + content-length: ['342'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + x-powered-by: [ASP.NET] + status: {code: 200, message: OK} +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser"}, "attributes": + {"enabled": true}}' + headers: + Accept: [application/json] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Content-Length: ['100'] + 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://vaultd2af137a.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer2","provider":"Test","credentials":{"account_id":"keyvaultuser"},"attributes":{"enabled":true,"created":1567793126,"updated":1567793126}}'} + headers: + cache-control: [no-cache] + content-length: ['209'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd2af137a.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1","provider":"Test"},{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: + cache-control: [no-cache] + content-length: ['215'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vaultd2af137a.vault.azure.net/certificates/issuers/issuer1","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":1567793126,"updated":1567793126}}'} + headers: + cache-control: [no-cache] + content-length: ['342'] + content-type: [application/json; charset=utf-8] + date: ['Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;] + x-ms-keyvault-region: [westus] + x-ms-keyvault-service-version: [1.1.0.878] + 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..51c6e6699556 --- /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://vault3b4b1da4.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: 'Fri, 06 Sep 2019 18:05:26 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoj8+fmSggBhtCLQeIde6c83905fRkAEcz89FgcnuUhfiH0JDK1J3J4iQwSUZolXuDo0qYSUh14BJ2ZlnjfnUqFQWP5VtIfzRFmoNnhqhDvxxCyNt3YNyxeZ7Twgf9EJA2F6D1kLlaVCv7Mj8NagOuxYZffKSPc6z0kcYdzXNZqtd6Y2sGGYChkLK6vA8T8qdU6+OilzDAtMohv7gwLClJRvfRJpdtMUT0pIGxud8PnsUxBzduqrqPEMzRnUDzjtBIJshn+O2hnSfzmSLlEojd8xtAZp+A/gv5BEvmRiNwIicBrvV2VYtJmLvp0aMZNpdV4/AM19pQyouWwpiyy5eyQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACkOIzAFwO1vSI6qmmjPimc/mb2f3EDx1loyvvUDsTV6NTuXlexaSk8bmVmm/xdsi/Fa2LNrwmT81ff3xn9vcGiTbX7yyAfHH6lJtmYzp79rLtmkfeJ5c4ylz+L+wsz5Wkgboynxh29/kE5Ye7t1u0WfIwiRhXATxNBw1hKhQZbG6wgPFRamtFpP4Yeblu0d0v5h5pDDkH/qNEWKL9SGPkfX647bY7R8MXNlie2ib5B2W07lSId9ot2S0kmpZ3g1jzSHLkaDDfRV/GOj4/tC2mHSKh8B/GK24N0KZqS8sFntTm7U3Nu0D91d6GvQ2u094uc1eNCKdFcEgM/9NTO35KQ=","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":"586669cc4f724ca1bca0fc30f06f9e07"}'} + headers: + cache-control: no-cache + content-length: '1332' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:05:28 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '5', '8', '6', '6', '6', '9', c, c, '4', f, '7', + '2', '4', c, a, '1', b, c, a, '0', f, c, '3', '0', f, '0', '6', f, '9', e, + '0', '7'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoj8+fmSggBhtCLQeIde6c83905fRkAEcz89FgcnuUhfiH0JDK1J3J4iQwSUZolXuDo0qYSUh14BJ2ZlnjfnUqFQWP5VtIfzRFmoNnhqhDvxxCyNt3YNyxeZ7Twgf9EJA2F6D1kLlaVCv7Mj8NagOuxYZffKSPc6z0kcYdzXNZqtd6Y2sGGYChkLK6vA8T8qdU6+OilzDAtMohv7gwLClJRvfRJpdtMUT0pIGxud8PnsUxBzduqrqPEMzRnUDzjtBIJshn+O2hnSfzmSLlEojd8xtAZp+A/gv5BEvmRiNwIicBrvV2VYtJmLvp0aMZNpdV4/AM19pQyouWwpiyy5eyQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACkOIzAFwO1vSI6qmmjPimc/mb2f3EDx1loyvvUDsTV6NTuXlexaSk8bmVmm/xdsi/Fa2LNrwmT81ff3xn9vcGiTbX7yyAfHH6lJtmYzp79rLtmkfeJ5c4ylz+L+wsz5Wkgboynxh29/kE5Ye7t1u0WfIwiRhXATxNBw1hKhQZbG6wgPFRamtFpP4Yeblu0d0v5h5pDDkH/qNEWKL9SGPkfX647bY7R8MXNlie2ib5B2W07lSId9ot2S0kmpZ3g1jzSHLkaDDfRV/GOj4/tC2mHSKh8B/GK24N0KZqS8sFntTm7U3Nu0D91d6GvQ2u094uc1eNCKdFcEgM/9NTO35KQ=","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":"586669cc4f724ca1bca0fc30f06f9e07"}'} + headers: {cache-control: no-cache, content-length: '1332', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoj8+fmSggBhtCLQeIde6c83905fRkAEcz89FgcnuUhfiH0JDK1J3J4iQwSUZolXuDo0qYSUh14BJ2ZlnjfnUqFQWP5VtIfzRFmoNnhqhDvxxCyNt3YNyxeZ7Twgf9EJA2F6D1kLlaVCv7Mj8NagOuxYZffKSPc6z0kcYdzXNZqtd6Y2sGGYChkLK6vA8T8qdU6+OilzDAtMohv7gwLClJRvfRJpdtMUT0pIGxud8PnsUxBzduqrqPEMzRnUDzjtBIJshn+O2hnSfzmSLlEojd8xtAZp+A/gv5BEvmRiNwIicBrvV2VYtJmLvp0aMZNpdV4/AM19pQyouWwpiyy5eyQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACkOIzAFwO1vSI6qmmjPimc/mb2f3EDx1loyvvUDsTV6NTuXlexaSk8bmVmm/xdsi/Fa2LNrwmT81ff3xn9vcGiTbX7yyAfHH6lJtmYzp79rLtmkfeJ5c4ylz+L+wsz5Wkgboynxh29/kE5Ye7t1u0WfIwiRhXATxNBw1hKhQZbG6wgPFRamtFpP4Yeblu0d0v5h5pDDkH/qNEWKL9SGPkfX647bY7R8MXNlie2ib5B2W07lSId9ot2S0kmpZ3g1jzSHLkaDDfRV/GOj4/tC2mHSKh8B/GK24N0KZqS8sFntTm7U3Nu0D91d6GvQ2u094uc1eNCKdFcEgM/9NTO35KQ=","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":"586669cc4f724ca1bca0fc30f06f9e07"}'} + headers: {cache-control: no-cache, content-length: '1332', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoj8+fmSggBhtCLQeIde6c83905fRkAEcz89FgcnuUhfiH0JDK1J3J4iQwSUZolXuDo0qYSUh14BJ2ZlnjfnUqFQWP5VtIfzRFmoNnhqhDvxxCyNt3YNyxeZ7Twgf9EJA2F6D1kLlaVCv7Mj8NagOuxYZffKSPc6z0kcYdzXNZqtd6Y2sGGYChkLK6vA8T8qdU6+OilzDAtMohv7gwLClJRvfRJpdtMUT0pIGxud8PnsUxBzduqrqPEMzRnUDzjtBIJshn+O2hnSfzmSLlEojd8xtAZp+A/gv5BEvmRiNwIicBrvV2VYtJmLvp0aMZNpdV4/AM19pQyouWwpiyy5eyQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACkOIzAFwO1vSI6qmmjPimc/mb2f3EDx1loyvvUDsTV6NTuXlexaSk8bmVmm/xdsi/Fa2LNrwmT81ff3xn9vcGiTbX7yyAfHH6lJtmYzp79rLtmkfeJ5c4ylz+L+wsz5Wkgboynxh29/kE5Ye7t1u0WfIwiRhXATxNBw1hKhQZbG6wgPFRamtFpP4Yeblu0d0v5h5pDDkH/qNEWKL9SGPkfX647bY7R8MXNlie2ib5B2W07lSId9ot2S0kmpZ3g1jzSHLkaDDfRV/GOj4/tC2mHSKh8B/GK24N0KZqS8sFntTm7U3Nu0D91d6GvQ2u094uc1eNCKdFcEgM/9NTO35KQ=","cancellation_requested":false,"status":"completed","target":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name","request_id":"586669cc4f724ca1bca0fc30f06f9e07"}'} + headers: {cache-control: no-cache, content-length: '1239', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name/backup?api-version=7.0 + response: + body: {string: '{"value":"JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLmR5SmptM1g0bnhtbjZQOFlOWm80QkNpQURoZ0sxaTdWRWZqMEpPNGxvdldPYTJFR2h1bHpfN0ZmbzNHcXl5bUJBUkNxNm5fS1drdlBGakN6aWs2VENlVFNWUmx3dVR2aEdUWnR6b1NUT2ZXYUwtMEhfNXp3UGk0T2NYemNxNjZnUVZkcG96VVBEQXQ5Qy1BcjZMMUV4b2NvY3VjUTloWUJVNTRHMEpqeTdxQ1ZtdTJ1eG4tWERUbkM5aDRqcmxXSG1RT09rWnd3RXowbmFhSVdzQVh3eW42UFVLeWVrVWVxVUhPRmxvekNITzNvOGJFQWZhbXVLUWktbmRHNldTZGJFTUJkUk9va1pGd2NLTU9UZklwM0VXaDJxWDZMRzFpTlBFaTBQLWpkN1EtaE9qT2hhaFlrNnE0TUg0ejdYZkFNNFBSUUtfcmZuM2JiTUl4MXNJMTB3Zy5kUVpUSUtZUzdKbnBIOWl6bDJDa3R3LldabHNxZFlUZlRlTmdnYzhCTTdqZ0pKdmhwX1owZ2hMekdUQ3BCcW90LUJsaGR5Y05TQkg5ZHdGek91NGlSUDBxSlljZkZDeHlualBsQ1YtYVlDb2FibFdFM3VSM0ViSURGT2M4SWM0SDN4MThvOGdzSEt0T2d6Nk5CUVdMd2VYbVgtZTU2dXo3Zmk4aE5tX1JNLXIyNlpBQVJPTTVNaWJCdGRwMkRvRkhXckpjd0d4em9SbTB3SjNpS0xEXzZGMEpDenE2T0VKcVpaUjVpRDBLdF82M2Q5Q3JKT05mQXNiS1VQdEdpQTBxMUlsMW5EQ1YyMVg4RXdCUmgxRHowaXJuMEU2OHQ2NHQ4Z3QtWE80UUNYaHBhaUdBcGNtZXZ2eXV1STNzalZOTnROaUVkNERFN19yNjZaSzdtX0xhd2h2RURfTHYteXg5Nm5IWWtHcWlUa01qc1RrTVJPMEJ6OWlzRGtUQmFwNmI0ek1hRTZIY2VBWFhzTDdYZHJrMkFMbDJ6UEV2Yzh2Z2RuUXZ2d3R3akljSS1hZWFuYnlidnJudGsxeV9yeEg2MU0xOFVWTWlldVhLYXRtVDNqQnhtamRNd2E3QUN5YVF4OVZjMlQzdmhUdVNZWGZJRFlKdmdEd25YbjJ1UkoyV0JzMVlQTTloOGcxUTJnck5hXzNabEp1dEpMbFFFTzlyWE9sNjJNSmtFZnR0VVRtQ0tqOE9iUTJEQ3ZtZm9QQjE0NjRrTE1hdDFyZ2MxaVFMYlU3c0FLX3dZMHh4alMwQmJsZnRxYWROYnRVUGY2b19UVGlmQlc0M3lEWkdCWjEwOGhHd2xSM2dmWm5hMXB4VVZMZXFwdGF2aHRLM2pFTGR5SGNub0RnWGsyaTlzOWROS1lkR3dxUy15SHB3UTkxOHpWNW5ENUJQZHVOOG1qcHl0SzBOQTM3cDNqZHdLMUlLck1BQzJDTW5WX2V1eEltYUhsVmZVR2p0NEhjWWxJR1JkS29nWXJaSkx4VGEtdDBFR18tbGxDXzU5c0U0RTlNcG5ESEY3ZmM4ZjdkNlFfSUZoNUdWWEdla1FFdDJJUnpSZjJxbWg1VlIxNld0U3pzb0p3Vlk3c2ZEbFdJd3A3cy11c0JXNUtmMEg0SW1JVjBLMkkwM0RyandhVzZwYV8xRHZZeEF4aXZjREphNXZLSmVERU02YXlXazh5VUpNeHRVS0xEN2t6WC1pUE9aNDlDWlNxMVRtSmFuVFlBQzFWWl80RW9CV2R4Nzl0d1I3YkVyZTR6SzA5a21kMjBhY3Y2TmV4ZzZHUGRQbE82VE9HV3J3VTgtTFpuUkV0S2cwZmJWN2VkSy1XMzVuZ1RBSkd3ZjIzM3diZ0VRY21MaHNNRzdfcGxjZ0M5bVJSRU5KeHlqUEctR2F0UnhXbWI4SHlhcTJ3S09kZXFkbDdKN0FZT1FnbXFFeENRSW9UVFlKUDVvSllWUHFzTWhoUE1GZ3o5bUFEQ1BWLUJZMXc3dlpha0hpRnZfX3dvMUl4a0Rlb1EyS2VWazdaY2JLbzJVUEVZNmFiNktLTGRTa29xaU5EMHMtdW5rZi12azkwTklCVDRWNWRUU1JKVmw0bEtYN0I2VFlJYVBad3JoMGY4ZjNENDN5T2V0Y1U2b1ZIYmZiQ1lIdDZFOEFLQVdfZ1pZLW8zS2FNMmlpaV9HY2tETUtYbzdnN1BUZEtyMlA2VTF6Y3Nwb3EwV1JRQXFkNWU3U1RQTm0xa0x2aG5FazI4YmpTaTdUWV8xNXViUEdpWVdncWpLeURxS3BLSmcwZnhaUE8wTDAycVBTcV9LeTFaY0NrVEVsUXIxQlFmdDQ2c2l5S25IWjBkdWR0STdxVlhKM1EyRFBIU2ZzTFhyUHRodGctTFctSkpHc1dQQU5iYTVOTExZWVZSaXlTd240NHh2Z2QtQTJ6d0Nsd3BBX0lxWWFUS0Q4cVBQZnJOaVUyR2VxRVlpN1NXM05fc1VDRjRyUENJX2RLUUdDV3ZNeDZBV0tFWWh4MklWTnFxXzJpYVJPSWJOdF9Qc3BTZ3g5TlN1d1VsSmtUOGFFcHNsWkxadXpCYjQ2eEVVaFBIZmtRS3Bta3lOVzFDeFMyV3NCaXpUNnN5djdYbkliOEg2LTE1SnNicmtZUWRMOHlJbG9kZTBLTndCZEZEUldWeVpkMENZellVaUplTFhWdllLaE5PazBfWnljamM1cjFfQktRTzhsZlNCWXRLWTVrMm9vLXlJekxkS05wRXpjYy1WakRqQnVCUmdqelh5S1NWODhYZFV5cmRzTEt0VjNtajZkeDFKelZjVWJva21icWoxU1BQcTBrUHF1ckpiWUUzeFlEd1lTSm55UENRWDRtQ0Z0cGFFeE94TTRIdTJnRkY3UlZDdE1zbEc3SU5OazBpbzY2ZTFnd08xSFNmQzJKLWxyZWFxVjdkMV9lVWl3ZDBNdWNJSDhCbEhwUndlZ196Z0xNT0p5b01xZDAzQmJoY3ZOVzRyS05OVkk0VjVwUUllbDlYZ2llcnhnRzlIUzNOaHQyWVYtd3dEMHdFTDh5eVNrMGdZclhsdUdkVjgxM0tudVFjb1NkRVZ6WjZHOE83cUNxYXJzdFh1R2VGN0JJenJHMS1pZXlUeTRjTVdZM0YyY3hRYy1BT1pySktMWU90aVhXbnBzOGIyWDFfdm4ydERyQ08tczJGam9oRERkSFUtSkhqSVV1eWdmaUt3WmpBeF82cHFSUmpKNF9wTUtQLS1CbUk2SWR1ZDFBT19ZSWRTZ2xaOGQxTUVHXzBSNjJoOUNKUWN0UTItODNpd3ZSMDVMN0VLcU4zb2toWExxYWVFYURGWlJ3bTJKOU96bDVBbVB0cWZyRkN5U1pHQk5oWE1ra1hnSkRIWGw3MUNoVXJ4ZXZDb2lIOEpJeERMMGlRWG5YaDk4LVhXQVRhYTFsUkZOal9YSjNwY09lU2pnZy1jRHl2cDJ2RkhxX0NhQ2xRYVk4ekg2OC11OXFUaTlUYTNsUl85TlNpS1FPamZtMzdxYktCaUQ0ZFUtUFpnRHlLOVI4WkNrbVlhcURYalJ0Uy15LW5uYVBGa09XeEJid3B5VTdoWWVpT2dSeE4zaFZzMnRzTUVDZl9aN1BsYktaaG1TZXhKb0w1VVBDSVpJeXBpSzdOTkNqM3JZRXh0VVJJdjhTeWpfS3ZuNmtVY3FNTEh6S1FGX2MzNmxZS0RuWkJ4T04wYVZaZmxWR2RKeUNfZy1rdXJ6TGJybFZ0TmRkY1phX1RhUkNzTUlwT3dTWk1leWlzRDVsTzdWdWc3ZjlGNFRCNzgwT1B1d0hmSk5SVm9INW1hV0tmUG5tZ0tva0RuenlxZzVPckRNZTEtdWNjSnhvbkdmWGdkSnAyUElsY094UE9WNnk1RlpVWUpCMWtIVkE1VUF3N3R0NWZpcjh4NTFSWTVfN3RzenFXWml5amtpV3lLdW14Xy1aQlRIV0J1STFlVHRPU2laMVlMM1ZEa2lfUFJSMTRJcGozMGFyUVZLeHVwa1NlLXdOZDVNUU1yOUp0N2RhZkxfb3p6Zm9HMDF2OFVxVkppUnRGdUxGdmcxSHFxZ2hCaERWMFFMX1NRNjU0Y3ZZeGNPSDRrNGJDOVhPNTlWVlZRTWZjUWw2ZWs4OENBSW53bUdoeU5DQlRSNWk1TkZzMnpOdUhTVTI5UXQ2c1lzM1QwRWdiMkQwWFBldjllLXFDb3dEbERmZUh3SHBnTmVQakdmZVhKVDdsN3ppTzRRcmloenp5Z1JTSE9kSUdrYUl2Xy1LRGo3UHVvMDJ5V3R6V0d6NnlSRkd4TENKeDIwMVVXZ3hvRVRnLUtRbmFMVWV1X2pjcmdGR2ZPeUhfTUhhVXRPMUh6MUhqbFZFMjBUOS11ME9rYlBrUHdUSmEtV3VkMkpfWm9aSXZ2dVljWXdjNGNyeG9wNkhCV1ZuandxcUM5eTN1SXhpOGlCOTRXUlRGYVVYTVR6QXhzRVZQanZJc1E2Y0ZyRXBiZkxwRXBxTTJkWXk4bXZ3cEJpZ3hLcUFybnJ3eFFTbEN0LUg2OEY5cmdtcEphMEFvM2lyWmJuZWlKVTRxcEhTZU1BVlVjN2hMQWRQZDhrN0o1WHRnMEFycU1KR3NmR05wX0psSzk2d1VGSGNpVVZKZ2NvRUNtLUkxR3d0STZaU01oMnJOOEMtNXRidkFrSWFBYklMSXZ5ZTM2ZnZQSzVfU0djOEFRV2hYeUs1Mk1fa3cwZUZRZ2JDNkdQUmQzS2p1dFRzVjk5NFUxU3VQX0EtSVNpTWxJaDNlRVZfWThPQ05TcWpDa282MkF5Qi1UMFpoSHFydEhrTE9XeWtiODRVZzlwWWQyZUdlWFBFUF94TlZKZ2xxa0JCc1hNaWJUUDN4aGdTTWMxdkZKcDBkbTNHMTdxTnVhcG5FaFlhVURDSVpZY1V4QmdnZkZJRmhxVWc3bXg3amN1eTI4eXE2cnNCMXVSYW5YclNhMGlzOFNSTWFLdXg3ekZNVmxfVllhNGkwOFdQTkNNVUVxbU5ySkNJc1lXV3ZRb1lwbDdsWTJhbWM1UzR1aWZGRE9tSHlOT1kzU3BTWDFEOGRKTGIzZ2pWTmtyblRGb09fNDM1akM2enRFN3Q5SVlaYlNfMDBaSzQ2eTNOdXA3TkxvaVNYcGFQYi1ZeVkyb3BEUENBQkQtZmxpWDUzZTZOSFJVUmQ1T19KMk9BTkJmUVFpa0F0ZWdFRmE5TERxRlloZnNVbFFFei11dmFCYjNENTVGak5JZE9QQmw1Ri1ULUdza09kSy1GSHlxVGZYbTNCUFNhUnhOM0FnUkRRZmVoV2R4NVR5WTZzRzZ1RHZZeThlcEJFdm5pT3FWNlR5MEVOdXVTczNZUklXTWhlYlFtUTEzYkM5SWVHbkpQeTBKSWFYUkh6Rl9jeUxpVlhBWDlfTDVwWVJTN080M0NTWWZGSmVianZ3dFYxaGdxR1BTU2Z1a0Z0dW95YVU2cER1dmdaWDB1OUIyeVJfNkNORnB0RGZZSkFxOGhVS2dyTGtfblhaSnBVRE1ZNDYwa2Y2NEtjTnd0VzhKRktHWGdSdDMxNUU2Y0tNTGV4RDYtQzRHLXNCa3c0dXlBNFhfckhweXF3ZkROb1pUZkhXSnFIakFDbktRTXhaQWEyMnNPWTVqQVJ6UEczSzBJUjFYamFvREg5cXpYdUpjN2NOLUZOVkNkRUYtOE1Kb2N3M2Q2VExWN21QVVNNekp4dV9zM3hSMUdaWjExRjkxRWhPUUFSdU5DUHBVQnB3NnpPazFndUg5WnJ6b05lRFVuNF9rT1phOWZHRjJ5LXdPc1JrVXBPbl9MYjZkZXRLOW9nTGxzRU15NnFWSjlLRmJvTmJyUHk1aFBtRXRDN2JpWnRudDBoZjlqTW9lQzBUTXNVeUhqZENNLTRYOW02bmMtWF8wTTBuSmlHY0dnWW1FbHVCNjVLNVgzZzNXYzVHUnFQRV96cjkzRmZwenNNbTg3c0EwYlhqSFRuQU1tcnFkbGZaTEw3WGZSWXotVS13dkhEWjU3Y1U3MmJRRE9jR3J5T0EtSURET2c5S2ZDLW5KOUV1YUFsdDFfY2RXb3FDNW1nU0NlVEN4bDZLZ1dmV3dLd3RDcnVLSEZ3TDNLTVZxWVduVnVMY1o0RUxaa0hwd0pTRTZUdlVzVlkwMTNlVWVnLWQyX0U2VjZ2c3lDXzYzamllZ2dVMy1IVUEwYV8zTzlkVFVNV2RCaDQwcV83b2sxY205ZE5sM1dqbnlHbGdKNlhtNmxVYnBIY2hzUlZRb1R6Z3dEdkdMQ1VfUVBEaHFtaGhYR1BJVi1YYlVMakZSWmRsQUwwa0t5bE9sXzdHODNHRzc5UGt0ZldxTDhvTHBzbTBhVFo0RjZuWWg1ZDZGVTkxQ0JSWGxBd1NIWVpaTnZnU0F4Ylp0Z3RuVDA5UW1CS1lTMjAwbk0xOTZJbEFBTFdPeEZLSndXQlBUaE5sX3hjak1JX1JBdFp6RUZEUl9sam9lbjFPbGpoYThHN2lycVd0TUthQTVWNEtkNUdtVVl4ekt2RGhHaldUX0JxWGNzWHY0LWtnc1Ytc3lNUnQ5UDkzZFpyemlEWTUwZGQwWXhqTlgwYmwtbzZIUDdNUlJvei0zaFJFNzZFUVkzMlk2bFZVd2VoaXpLRTJxR2JqcXgydWlpNE1vNlRhQ29uTWUzRGNqanVzeDA1MjJReWR5TzFVbUtDU2s0YUNmbkd0QkNLb0dlamVOWmczYTNCcndBcmcyZzcxYVZBazZ5Vmx6TDhYRTdZS3FaYm45TGFjaGRHSElTUHh5ajI3QktIMmVKOHNEY0dYeGVMc1FLUTlyLWZyOGFsc2FRYnowV2JVQ2xrOWlDVXZsUlZkQ1JKZXhrOEJPZUQtQzVjQktRQnV3cE5DM0ctTEdRY2FEb2FuanM2UW1POGRqS3NIbGVSN2hlMXduMGxrS3VSREdPdW5QbTNhazJqb0NsQlRCa0R5NTNXMUgxcHRNZzMxTmczSXNnSXlDWkFsd09DSU9sX1BUaXIwcmNPNXY4cXJPaGw3eTh5a2VHbV9teGxoeHNqWlNzeVlZZEtnam1UMENINko0U0JtblhLOWRSRlFlWGZLMmtKQnRMYjRfT2loN3dDcGVZZ3pyY3RWR2JXYTRsYUxuSkc1c3dMZ0ZWMlBMVHM3WUltbTktdHU2b3d0ajROUzlsdzVaQTFKVE1PZjFXdGk5Wm9aNk1xM2c2ZE1rRzRzLXIzWHhsQnpSZkdtOG9mSEdRdERZaDNnSlc1OVVJYTI3cHJSQmRwWU5YT2VBeXlLMVdxSFhldnEtUmdYaE5ubnhyeFdjMUNWbVM2empWcWZpR24xTGppbkw4R2VxWml3U09xcUdFSE5TZWFCVzRwOE1oLUk5Z3BPc1cydC1SLUFndDN1YkVXSVp0REdtdGlNSFRyOWhLU05rSEVCSFN0dGNJa3h5VUtqVjdmaHpqMTl2RmpDdGJhaDJSU1BWeWd0QWVaZzdjZWRyc3ZMaEJYLUpEVWhzUkFJb1ZFOUNTVTA4NTNVeXBMSDFoQnpVdXpWOWp2M3M2NnVwNzhuUktBWGxkRkJfZU9YWmZtcWJDTk9XMXJrem1mdVUxeVBRb3Rpa3F5VGhLZEFFTnk0UmdHcVBQaWRJa2dHQzNTRjZpMUxOU0R6MjJiR0RpTW94aER4eGE3c1Jfc1l2QTZ2aXZzNVZNOGdmOFAwcFlva1pQZlotOVgtNW1XVklCTGdMR3ZOWUQwX2pMMHJuSHJJZ21KLUdOdWRFV3A5UWpQVnRzWTFnUzhJVnFqMTN6UUZKQ1BYRTJubFlTV2syXzQxckFZcmdTTWc3a05kZ3VJY3FxRm5zaTh3UWRsSjZOSFVVTXhZb0kza21ka0FfUURkM3hLY0VwTkY2Y1BTUkVRNFBfVkFobHdsYXV1c2NfVDV3bmJJMU9jUS1zLTVkc1BaM2ZWYTVpcHBHcGhxblk5THA5WE4za1Y5dHViYTVHRkpyMEtWSXFuZUpzalJZMjdCMHZObWFCVmRPZTk4R1AxaURReUFGZEdhd3Mtd3E2MmZvNzlLbUNRZ3NENUxYNXVjdVhuR3VaVzlTWjZhM0g0Uk8wWWtQdG5vXzlRcXpqVUMydG5TdGV1cnkzTU5YRFlSckFxTl9SQ2U4Qk5wNmVrQWQzMEtjcFNBeEhoZ3RVZjJEWk9XbVFpaHBEVnRxSW8tYnliMWFQWW9BcUluVjhnendOb1RYeVNlczJrV2dpOWxuamFnX2JEbGxGU1ZhMDNwcEh5T2xmSzhrLTFIOWVBQjlvQWNBWFdzTEpFanhOX19aU3hsOXdSOEtvVTYyOWU4RVlrVkdfeDBEVGdzR0hUbVJock9jN09tQVNxZHNRckZrdGRiU1lNUEU1eFQ2MkpzdW9IMGRwZUlSSXpRa3Zud3g3YWFJUGRJMVh5SVQ3MmxCRDVZQ0xHdlU3bEFobHJrc0hJVVZNLWMxZWlCNVctd3RHQ09Dc2NEaGNHeTVQcUdXYjc4NVBacDdVb281NkRvRTlPNEQ1LTJvemhkRm1HSFFOd054YndKZlFpNElPZ2VuTDEzR0U3OFBZeDZBalZmSTcwVHl2R0lyTExqcEhwTmtIYVYtQmZ5TkJ3eGpiX0xlWGdvakhzNmRQS040SU9jLWpoSE1LSE44RDRMZmItTkQwdXpjNzk5MGNteXQxeWhZaG44VG1PU0RlYnBEVnVVRnFyWjFxeFZzVWtPeVNWdHVVSldoM0VKYTVyaEt4dEwtdUV1VVVmQTdOVzhYZ1JZaGhaS0g0ZTV4TTY1eFVfMGxzNXhNTnF3cWhMb2xqaEl1XzJzbXRybGtYSkR0d0c4UmFSMG8xRlhEM2FlZXFOYVE4a1VqWDR3MjdqclF3bnVwSUVRQnhLRDR6em5GakVKVm0tTUhzeE45SWpHLVlGdW9xbVFUMnlFV0N5LW52djdXWXEySFJyWFhQemRtOUZvU3Y5aDlIenNrUXFjbENzV1lmTnh5dk10VjFRV094OXBsUzRUQk9DTmNmTEtvZkN2aFRLRmZ3MUt1eEZCMFg2YS1hUFVIVTF5WUozV3l6RUlTb3RTemFod25QRTdlbnhEQWZGd2VfTm5iSVVqM3JsR1Awd0czb2gyZU9TN0kyaEJMY2JlbVFHWUtXb3ROeWtrUkVnLUh0SnNINUFfbnVEZHF3Y1NHdnJQb1k3OFB5VnJESFl4eWNqeGp5di0wc3lrUXdLdElXWWRzODJOcnFjblJ4V1ljU1I1aUZMOXVhVFhqQTlab2dJbi1HRGdOVldwTFZEcHIzOWlLczVwRmczUFFDay1YME94MUYyUVJqTUhxWXlaaVlrTkFMRHhjMk9QaGM3S3BjT2hva09TWXVqN3c3U1VjZFN4TnpaUGhUQ0ZueVBrZzNHY3kxQXhudUpubThHWi1hNU43a0dSQkQ0YW91b3FvR0JMVndDbWpzTElXZkEta2c0NmI0ekpsSlZ0ZTZaakd1WlFCSTB6djlORDctTU5ZeUowVkxvallZNWhPMWx2cWZVRnl4YVYzWkJpLWNzMEFiaVFaYlFkbk05ZXR0YUNORTBLbzFwV1NUQTV1REhpbmRZMldGR2dFcDJDbG5sd0NfSzBNczc2S3hQYUMwdDlSSGRPOTllZndxX0syUEgyaDh5UnVfMTVWbUljemN4U3QzNHd4MFY2MWc4anlYX2lvdXU2Mm1nQ2QwTE9IaG1VME5SbmdTTFNyV2hUNnJzdlVFQURrRmZ2XzNSQWpleVVvLVJEYm9VSk1hRVFqTGtiVjNfUEJNcUlwaXFLR3U2VDJvLWlTOXh3VXVEWktKMDh3SThkUVpRUUY1WllNMjBscjNSUGpNR2E3aUZzN29JVHVTM1FmZnVkdFQzenZyOTBweGJyVXk1YUZ3YnFnQTlTNXg1bXlWWVhPUExqT3N2anJkMDc5SEFWWlVNSnZVWFY4UElVODZjZTBFQmNNN2lLX3BTM1oyZnNXOGF5YmJNS09aS3NTSWQyY1BnWGl2ZVpzSkRNNmZMcnVNTXQxV21paVBvMUZHT0JfNHpGdHRaMHJ3VXFZUkg3XzFqN251TnBzTFlwem9EbE9ydk9wcERYdGsxeFkxZGMydFlJaV9ndkJwNkFXeGstWGJGMlpJemt2WmVjYmFLam51eWNFeHloUUhCTVU0MmhYN1gyUldqM3YzTmtNeEJOR0Y4X1FKRy1SM3NMdEdjVTdBYnlsa1hzSjd2dmY0UUJCaVBXNmJMRFR0bS1ZUzVCQW9QT3Z2enJ0cFQycHg3OGRLems1OUJCbWJOaDFsQmpES0FsZ1BQWFl0RS1GckZCQkdNNHdlcHZpZWpYWDFwQTF4TkItWHVIcWRfSkowcS0zRno4dm9KbWVuY2lYN0lIYWhkVmFOeDFIcEQtN2ktQlhnck52VHUtcjMydmJwNjRxSDk4cHdSOW5mQ3JZdG01Rm1XZzdITGEyVEhXU1VVUV8zeGtEUkFwRWlMZ0l5VUNmRDZ1c2NtTE9TYnZZZDNYUFk0Q0ZTY1Y2U2l5d2tIcExQMVR5MUtjNkhpeFdUYlVLSHR1RVJXS2dURWVuSm1nZUhRQl8wanBRWjlqazFUYU05UHdRcEhnMUVnOVN0UXBqajZpTGVvYzFGd2FXejZoZTZHT1plVTFTYnFaZndJZmRISXcxSGdldldCU25LWGFYajlZZjJpQmZkQV9mc0piVEJBaW1OcU02dl9aUm9NMXZYTWNwa2lsREU3bUlSVFlBc04tSDQtc0N1Z3JMdWZEWWg4T3JTUkwxdjRkZHZnRjVQQ2h1RElvZ2phOU02b3pMOW51YkhhdEFUYUE3dXNGeHVsU1VZT250T25sa3I2SVdTRGhhTXJGZnd3d1lxUFRUUmNfQUdvSkdxQkx3aFJBb1dWTXdzVDFqRTBKMkRqVXk5VGtDcTVlb25IcEJtRndka2FyaFZoYlFTMXVsRlF1cEZ2V1RqTnVfYVg2SnE5SXRvRmpQdHd5NEs0cnQ5ZVRZR2JNUm90MTF1MW5UVjV2VlBmcTBDaUJIV2d1RTY5bVd0TmJFOXdZLXZJTjJUbnN3RFk1dVNSanl1YTZ0dlRkTWJEckhlS2hOZldkWTlLZHp5LTJfMExiQnlvRDk1bEpKVE1lRXNLNTFlOHdJbGo1MkNWN2I1cHlhV0cxbG9LUHNDSVBkVEt3YUNscC1tWldibFVoRjZjYy1HbkRzZ1pZVHNLQjRQY3l0eG1zNTRJUE5IZmVLV0xWdk4xSnozeGN2b2lBN2ltdnBmZHdMOFlLZEU3WHBLbzNEVGwwcDR2WElFSktxQUhYYjhuS1Z1Q3FoUXpFcF9McGVTWnN4Qkx4N2J3ak9qU0w2TmNwUklnSUYzTEVRWnZSLUk2NHplN0w2UHZXZUszSnFrUEFRYXlXUDlXQ3ptaldNWDI1MXhTQ01XSllpTE1ZNEtqMk4ycndZd2hWS0lBelFaV09xQ0NyYldFdHBaRDFFMmJMdlRDR2hvSmc3Z1E0bVNKUmdBZkdxdmhHQ25XR2ZEYVRBYVYtWHozV211NzdkTHhrZWFYZG5LYThHUkx4akhDSUNhLUctZjE1QkFsUU92eExBT2NXNFI4VHctS3JjcmdiNHF3d3FNei04UF8yS0lRZ0hBRVlNV2xjWVc0aGNzckR5T2hjekkybkpXcDFJYzlodFo5ZXFxY0pjWDJNS3I1bGw3X3NndzRBS2lWMVNoejAtcDRWMm5oREVmemZzX1hxX0V3SnROUmlwOWVsdWZaYzdVTFRjcW1MTWIydEVnWExKbDBJMnNiVlhESE5xLXZ0dmpSbDBYV2h1MVkwd3V2bnB1X2RJbUNDYzdkQ3lCb0ZsTktXTjJ3Und3V0JwaFFSNG1aNWpRYlllM19wU0hsMXhCMmNMM0RRSlhmeFJUSE9kdVIxVmdCcVVoYWh5YkFkcmUzc2hXa3l1UU93dkdMMGN1ZHVCTXowNjBHbFMzc1lpeDlPTnBmZzROQ3RhMXk4OFVnLXljWHFJVUNrbFVDREhGUWNkYXFxbVg3SHMzV29Ed0ZYYXZfZXVZWkQxLWVFdi1YSzNnUFk5U3ZRY2NnVkJsQk00azUyalNDTGQ5bkdpcF81ZFVUd2I5S3NlMmlLMUZWSDdTM2YwZHZNOTliLXloOGdwWnZFcEFmMm9jUXpjM0VydmQ0dGdrZkF2dGk1ZVQyVzFxNVBSMzByZlhVRnBuWG50QUd4anBmdnhRN25LQUNmT3VxOHZHempGbnlaVFpfRkRYakxBLWpQNEpoZndLMEsxbVFxZHVzaW44bmlJNm5IbVMzTVBxcU5jaGdHU3JfRGxkMFloMjZrcTZjdGdDU3BYcHE4ZmJBR3R6NElZT1dmel8yUG45c1QzRUZ5ajJySVNZNjYxanNNNi1TMDY2cEdKRnpkVVRtTHpCbmc3R1Nvc09CdGJMMlBKUmV0cno5M0prbG9YeldXQmpfQUpCeWpHU001MlRWYTNoQ1lBU1NZR2V1alhHTFFIMVowbUFQS2E4NEFkY3R3RC1MV3o3eHJpanJGc1Z0eUh3emhXd3Z5ajJWODRmaTctSnFIU29NenFLV0I4ZktONmFLY1gzSDdHSTZ2TXQ2aHJVdlc5M2duT3JJUHBYUkxObDlHYlRZTXhuSWRoTzZMTDNwa3RXU0lyWFF1OUNheXNlMXl1Q0pHWXVWUklXYjM2SURpdmZzMmlTWFRUWVBWYTBuRjZlY2hJUVFNQS1iZkhuNjFEVVlmMXVLUDB5a3haOEpvYVBwSUozRGpDenZUS3d0aFlfUHBSZ1J2d19OMi01akRxQTYxb0hOYWRfOHZvbjJTc2pIelF0ckI5WmxPRDZmTTgwVGdDaXRKajBuUFFPTTAtTHY4YTM4a3lwRmtJRmRpS3VGbnl5cUsxcVA4QTF1WExIaU5nVVNWMG02TXZEMVhfVHEzRnFGZXE3c1Zld2tOMmR3Qm5HemtYR1R2Z1k4aGNoR2VMeFVGWEdOTEw2U2NRRk50NncydDBuMkxvMllRdjNhanJkeHRTUG1iTHJXOWZNekFLZEtFejBMS2RFaDZITUs3Z1JxWDhzTlM3TGlIYzExUlFaY0swemVmR05HRDlTLV9vbWl5eWIwbnQ2SG5yZS0zWEFIZUFhelVWU25HSVA3eDYzOWxSMEJxQjV0blNpTHVJU0hMdTl3VmJiNFExQjh0aXZmNXRjalZuX2hVTkYzMEhoYmVvR0xFSVpsNWh0NlJmVzB3Ymc5dXJQZmlmc2hLajBXem1HTFlJV0hYbFdMWmRWYWFNZm05b2ZYVjY0RWxHa1JfWlg3akgxclMxd0hHT09RWF9MV2I1WWktOGU4QjdFVmFYeWJZMVlDME5rWWFJVnF2YVZpUzdjQlFWMk9YX1lyUWp3VTc4VktkTVNsNnBrWms3emdObkdfSEhLUzBCZzBSRjZQYjU1TlFJREZiUGQzM1RreW0zTHNqb2xybjZPV05Pc0NJX29lb1h0SWNMb2xJVElVTnpSaGM5WVdrRTFBNEVtbkx4MzZiaGU2Q0hyQUtJcWlNb2tOZkR3UjFRTUZDbVhfa2FyZ3RjMVozOUEteDRQN3JBWmRHR3NIaV9KQjdNczRUbjQ0Vld1VGxvVkZpZkREVTZHemloXy1EVThwWkJxQkxIeFpiZU9hOThKZF9pdVJJX3JhZm00MThLNExLVzF2Tkp4TVJMRktmZ2pMQ0RaS09NdUZCWTdsclNzdDZsWEpOdmctNzVMY3REc0s3U2hGcGNqWGhrVl9KZnRHbGF4LUVCNlBVYVZsbzdfRU14b2p6REw0MkV1SW5LYWlOcVVjb2xfTHoxQy11UlZyVEpiZV9iSzZQYUx5bEhYRXJXYV8wMlpvOFg3bEpfeUtQakY0X0dydElzaXRySE5rOVlXRk05OHJBVXdNZy1sTkJtNE9kdlZDMktXTEN5Ml9pTWEyY0Nad0lYZTIwZ0JFZHVkUm1YMEFtSjNaQXVFVVYxNlVwb3V0bU5JdGppbUJGYkZtSzVUb3BmSzAyTmtqeDNHWFJuc2ttRTFVcHoyRDBxWmVvanZCbndmdUNibm5rV1o0bG1NRktrYlNYa0ptOHZLVTBrdk5rRml4eVRsSjMyU21QUzJaYkZlUlBVd0lRcS1NYWh0d2dqZmxkUHAyUEo0ajJ3bzdZS09RSXRmUGtaSzc1aVhmY3ZNV2xPUDlndVRmU3MyRU1BcGxHUzZOQ0RWV1I0Q0MtSWZMQTNQdFZCb3pIV1N2eUU2WkNWS0FGOGhaRVBnVDZSTVNMUzZVOWxacXBDTXBfSFZGY2YxMzBCT3VfY3dDbDNqeG94ZmxCMmZDZ0hleURYWkV2NzVfaWVEdkdZeHhnU01ldkZiMXktMEZqODNYNWIyZzN4akUwLUo5OHVZZUh4YzlBSHZwY29ySFpyd204VUZDdTdGS08wZHJWZlhzMVUxVTlGajJuZ05oWW51S1FOd09vdWZ5THJ3R0lqLWZENVVwcFJSS1JSdU9DY19tcUxUT0k4Z0Z4SXdIUkZiTkhwZGg5NXZSOVNyRVQ2N3pxb2hvSl9XRXhFaTVZbFBvOVAtbUVRdXZ3T0I4OVMycHVIenV6Y2N6UEI4Q1c0RGRTSlRGZS1zMkFMVHl4OTNBdW4zWUlzcXFUajh4cGlBVGVjQ1JLOWpHVkxlalUzc2VJelNKRlRwcVVsNFMzcEphOUxCQWJEQlg2c28yRk91d1NfS2R3WS00UnB3MFJEN0o2aEEwTDNnbUI2VEdOOWtNbkE5aTJGQ0J1ZUxtYWdRWmZDaDMzRHpuQmpCVW5CMFNUazhOS0c3NV9ZRmI2VU1yenc2YkNZdVBZTUxZM19QNHlEZThxYURBVS14a1g0bzVrVUxyYnF3TDdhQzdlZng3Vy10ZW41aTB5cFdMT1M0QnFQSzJBRTlZQm1RRWNKblBKMHVsSnNnUDlHeV9ITHRUZHRXS25teEp1UklXVEtXVGZSdDNUUjYtSzFCSDh6UTZEaEx4NksyRjdrVmJnTTBUN0VwMldwTmFDd3JPdUlsaDNzUWVKU2JiQ2JSSjRfM3NFWVZqREQ2MExaQUJfbkFRMGpNMmlrc0JaUkFMTG5CWDE1MFFoQ1I5Q2ZmaWNXcFphdEVHSE9CbGVmdUUyaGVXSVJ6UDRXajZrU3RUamlHWF9MU3E2Y095RG54d25uajNXdHktMU14dEVwT1dpVFQ2VWlYazB5VnRabC1SUklyUkNlMjBSM0ZoSVZVLXdBeVRCRi1Ec3hLeTB6TmEwTWRQUTlJLTdtdnNTdXlSRldDalVOTDJQcDItYTFkZE0yQzZhTzJoVkxUM0dNaU00VU9YeFhpajl3aTI1eEllVkkwS2tzQ05WS2VJOHk5S1ZzVDZyV2JfbEp0ZGU4WmtpQmEyWlZhME53NElsZnVLV3VDbDVBaTlSQ0xfdUExM0ROeElUR2oxX3FqMC1MNTg2ZnZydmg5ZGpHSU5pM3ZCaG1BRl80SFdEWXhVdXRPblo2SE5VeFoweW1naDFINFAzbm94WXpZaXpYbFdmaFNMcTgyM3laWGFnc25JeXI1aDNxUU5sNUxQNG9Ebzk0MlNmZTRSVDVPU1l4MF9QV0IxSTZZMjhuQnItSnAtT05zZklMMGFhaFFhQWhTZXhKNlBKcFNvVnZnV0pUb1Vub0c3TGJqcWh6Z203SzgtajlkaHZCcjh0VGU3ajlRWDh0Qzlrc0NveDNMUnJCZGJXdEVQbktpVE5ESFJ0UGF6SGRIT05wQUpxVGdhbV9uSnY2bzBmN2lzaTdjVmhoeHR1Umo5UDdKeFMzbjlLWFFBVVBEZzdod1RNWVJ2b1FjbXptMlA5encyOUxNNWhyY2dtSUJjU01GX0prQ0c0VEExNFBvSHVUbjEzNFNKa3laWVBfU211Y0hCcTEtT1U3SlU4UmdJSmtzazVmR016RHk1LWVPc2JhMVlxcDB2M0VLaTM3S3ZHeTBoOWVtd1FJclpBTXN0VE5LS2NPZWJiMDhwV0pjLUpYZzE4MXhMZ3dYNnZ2TEo4VWw0Vk5Hb3c4enZRa1VCUUxlUnVRNFlmYWFrdkVRNkVLM2RVYlZVdmNDekZmMVdMYWdrNVJLRmcxbWd3emlrYlJocGFFaTVLVWcxR3ppV3BPRkRMbTJrWHdIN1o1Qmc0OWpBZUFYRWMxVXhfWVlqaDV1UlVIYnJsc0ZFM1laUDVrVmthSWxsOEhBODR3U1kzaGlkeWEwN1QxZDdZNVlWc3Zwa1JuOU5BNUhuU0RaR0phb0JJWEd3b09oQnoxYUpwUFJOTVotMi0yVmFxVFZTMDFheGRZWjlKMjZPOVVhdW9EUkM5OWNJU284Mjg2T210QkF6bDlhRUhZTVR5ekxMOWtRVG9fVFJQcjRqLWM2NkhUSE9EN3J6WXphWnNORTBWTXNldFU2VVZnN0Y1elRHekZPZ0hUdllicVlZcEdEVTRVbHpFNnRnRzVhY1FrQ3JsdURmZ29Yckg0WkVxbnhiQTlZdXc5UlV3NVhfNzdvUVQ4NXZJeFJySDlWaGs1ZUpkYWdMc3Qweks4dWc5ZUNOcTJfaW56ZkxJMGFjUE9jMXdkUTNlb0o5b044MlNzdHpOV0UwVnNCXzF4bWNYV2d3Nks4SkZmYVotX292V0xaV0Q3NHhud252SGNMUlVlSlBtbmFOZ3JaN01nbXk0ZUxobnpWM0I0WU1aLS02VF9oT3IyNEtCUUtISDhLc3dYTFdqSjRQaDJwNjdyVkljejRnV1lKYS1yY3FSdjZreWVJRDJ3TENvaVhJaG4wbThSanJGNWt6anFFTld2bF9EY0QxQnY4Z0NjTURrVVJzSzN3VHVvemxzSmFfWlFsQTNneEVGOE90dTFtQk5lTjRqUHM2Uk5pWkFhZlZyNnRuRjJ0bmtSNExVN0pYQ2JUOVM5d2pOcHdBREYyaThhdmFLdHpPY1BKcnJWRHBob3pJTnYwZktQQjcxVmRiYWU5SDFQVWI0cjFRMzlBVnJZeVdUOXJYbDRFVC1jVkl6M18tWXhsMzVHN1BvQkFaU2w1VWRjWUFJUFVrVXFYdnJ2RlV2UGZiTFBkX2VibEVkX2lhUWhQYXB6WnhGRUNsRk1TX01RQll2WFZRQzZvSlZqX0Q5WjhWNm56S05tbUg3OU9VeHVPNm1DTHJSZDlfdVRobGpwT2ZENEFMNVZDSjQ5bE45cXg5NFlaeGp3WGVDZDB4eUl3OEVDSm9PMk51NDhrakwxeFcwVHMxWmdocFpDM2hMZ05TT2QyVUFJSk16TGhhb2FaVERHRkhJTC12UGtjS1RFTGpMcG9VbHNYWWl6blMxRkMzQlpMWDVoQ1Z5aEd1UHBQaWl6YVVJUXJQWDlKSkQzdVl2U3d4V3h5eEJKR24yb3pSR0VTbVRhZml4TjM1SE1xWmtwd05RaEw3MmRpTlhFaFo2cGtVU2tsRnU4SF9fZlowY3ZqNkxzdUVfOTJZdTBnN2VsMmhmTUI1QlBIZDdEeE1aeDRKV2VYT0U0eUhCMXQtYmdNenZrdDcyby1qODJJZzhpd2Y1V1IyU1FxcUU1Zk9oSU5UUFZjRzRJbFVWaXNjRHh0N0xzQzc3QS1PVGVValVXWERnSjZrOUpRU0puT2lFOUFieHI4eGx4Zi1jZWdNQTlxaVVqaTBSb1ZrWlU1RFlLY05nOW10b3QzLXZwdkxfT3VmRHZ5MlZLdXlPR1Q1V0J1QWtCeGM1REtEUlpPZWd5UDFvbXl4d0dhMEhzdnlua3BfbW53Vk1OMmg4cU84YjNwUVZSd3NrSWE5NHBoRlJHNHBBOXIzeS1McTlnbGNwLTdoMzlEdjZJdU5KSjhVdDJYZnAyVW9vQkdZZ1RyeFBoSUUzRWtVcFZIVE9VQmZLc2N4aUZMRnZVR3RfX1NpTUhZV0JSamEzdlZ0cS1WS2JFMU5KS2s4c3JhbExTYWh3dkpQeTdxUVpfQmRza2pVdC1MTi1abThnRlY5VXVVSVNzNkY3UVdNTUY3TlI3eHpVQVFsblp6SXViYmJGTmZNRllwS1FfQ29Rdm43dlJSRURzeUxHakdpakk0bVVDX2YyYVFheERSNzZZVzJKcTRxbEZfaTZ5YUZuWkJGSVNmU2Z2eEhZM3dFUTFnLUFQUlFYb0tnT2diWkcteW5GbXQ1UkNTaDV2enJIUVhuemYxTlJMRW5ZaHVNc3lEMGtPN2dsOS1Gbmh6UUNVRnBmT1YtcFFzeGswaUVmdThVN1JyWjhMeU1oNzhGOEk3WWtsZjltMUIzRU5UNDAzaWthZ01zR3BNTXVfQWlMQ1MwVGFfMjZsOHp0WTNvSDlPVDN6dkdPaDFaYzFFZ25nNzF4Qk9qelR4VDJSLW9BNGFnck90dUc3d0JiM1V5ck5xZmJrSUt3bjhBdGt2Smk2QjVtaEQtazloVk1BaWVlQ0NDT1ZNRzhPR3FwcVpyTkllY25Ea1dnV0ozanhnd09SbFppcmpnU090MG9NRWdhNVpMdGhBREsycGlZSUtFSU50QndqWXB2R3BEelJIbUhoMndhSDdZLTRrNXVuaTFSVnFEZmhZRF9XUUZ5RUFUT0Q5ajRLSVZvRlFTSmpsQ3h2UVkyUHA3bGxud09mQmIydTc4bk1UVFpSd2tVdlhyLWdjck9wSHVnQ2VsOHowaklIdkxwOUxCOFBwaERxVWVhUGdnd3NvMklfem9LSTNhT3FUdUtDbFdWbUUxUkk5OUpBdHQtSHk5ZFU5Q09Tc21Dc29Pckgzck9zN3pFNWJtdzRvUmZoM2lXX0tUV3U0cWdGSGRqUlIwUWU4T3hXN29vX2piYnY2Q3R3c0ZkQWdGN2VOQXgtSEZJUFIzcC0tQjNBQ2pqTm9fLUNZdnNXWERpdXBpNER4SUJ2T0lnRjIxaEJWN3R6UHNxYUlCSDV4VzQ3MFluSWJLZXdZS21ITV9BYnB2bDRPODlDRnBFdVktVlA4LWhjMzM5S0JtM0NFSTJNU08tcnVlNlNFUlNwWWdPSVM0QWJ1djVxXzZwNDdOVzFhb0R2TVRXeHhEYjV3NWNiN3k1ZEJCd3NBOVFzODFwNEx0LUFTVkVqdU5QSU1JV1ZISXJJQUhnZEQ5Z3hvSWhUUjVZYXUxNTloYUNjWm9nUDUzalhCSURzRUpBTmM1bEo5MWtGTFQyV2xVSkVWUkJCZlF0a0lDb09hOHVaZkJCNmdBV2h2RUs3UHlIUzMtTmpKX0pNT1V0STNrZnFkZkMwWEtYVnpwVXRkZVVjZUh5M0dRQzlmYzFpc0pVbWpPV2YtNkUyR2ZMSTJKQk03WWVNbHNWTDBZeFVEb2xtZFJkR1p3Z0RGYlJkTGFRelZpYzdzTkJRQzNMZjBUaHFPVW1BMjFhOERrS0c4bFFkXzdLRVFHRDlhQ0RCamMzMzhEbHpYaFBCVXNqd2s5OFBhN3l4M1BjVXRnSzdraV9DOVR4SFlZUS05U2FyTFdJYjFNZnJaaTNQMnVFN0JjM2puV1g4b2loTktyVTV6T1czSGRFRTdUVDR4TGd3X3NLNUFCMkV4QnRINURWTUpoSGN4bnlWeS13XzRtVW1sTzl6TlBVVnJOSDN3SnRzalZXemNOV2EzZ1NFNlhoVWRsRzBhSmh0TXhjcWV0U0J6ZjVMTXJKWnNIYU9fV296d2dxcUhaeDhaS0ZwWjVKZkVlZF84UGFCck0yMFhTV2NmZkVHRm5ockVvY1NEbWxqSzk3ZXhNamJhVVVhZmU3QUczVzdyQUdKTmRUb0N2Rzg5cGNyaXA3T29iNllkajAtOTdoaWtKTHM2RmJrTlhOWnpGVk5Rb1lVdzVXSFRiX3kxNkpCTEhxNTBSX2czcV9SUDA0ZnYxSUJWNEI1dTlQbDFUZkpLYnlyM2RNVXEtX25PMFVnVndXNU9ObHUxNFV1enloaWdaLVZHOWltMVR0a0tFcllzNmNpSlc5SDJ1X3NDdFVRVjQyZVU2ck0tSnFvN2hxM1hkTFEtV0VDV0hQMVVHOGFTZVpIM0FhME5qSl96cHZkQ1FvaGYtMHNfRkFaTXVJUUplSDNnTzE4SXVVX09zWFFXckY3Njc0RnB6WTRINzV1MGtNR0NRcnB4d19hRmU5dm5KZ194TE9uUzlRcHlZalFVWG9mOW5CcGRveEpsOTZYUG0tTk1uWUJNUUdHdGlkcGhDVEllZGlWbHhzZUkwSHlJRkkwNDdLUExVekFsRktqaEpkSTRuYklxc3dpX3JvM0hpbWNfMk92ZUpoV1RUSVEzVWtWYjJvcy1Gczc2VmZ2Zk1sMF9PX3owbkNWZlltdWtvN0Y2Z3NXaDZ2cWx2U056bFJvSldnMGFBTzBvSWdHbVNKNHJIYmY4MUx0b0p6c3JvTy1USGdrY0lpa2tXeU9VXzhGa2RkS25HVmtfUmZJYXd5eTcwa052d0NFZkpoeEh3MjMzS21vR0liNi1mTWlnejhOSjRYclV4ZkhWQV9PVkN6OWlqNFVLRTFudnBjeU5rRk5Oc3NWc3ozLTlsVWxpWllOblQwWUMzQ2RVcngycFFZXzFlWW5JWVJ5cVREMmV2bXRhelFkblFqQlRVZmxaUDhfTHk2bHZxRHBsbjE4WEhuaHRxLUhJeHU1ZHFaV05wajd2ZV9tcS01eDNTX0l3aEFXUmZaSUxFZGtIaGRnY2pwVm0ySzlLRGdZc2FEWDlYd0tXMG9KTUg3OU02OGhwdVBaU2RETUNEbk1vZS1IS0RyMmp6V0h5RkJ2ZEtLaFdIRVp0UUFVVzZWcDQyclJraDVaOVM0TlcybTV0SmpLd0g5NDdJYXg3cTFVT3VEUXJ2NHJwZHBMdFVwS0xwQml3QnlJczlOdThEOHFqNDlNRHJpd3VEQzdoUHlzS2VOLTI0U0xXQm85MzB0aVF2Vzd0X040RXFKUDBXU0tuRkZHSVJGZXpyOW9xT01iM2ZuMzNteUJpdk1RQmZZV0JoVERJc1lwS2JYWmhrSmtXUEp0TzNZZUpMSHZ1RXM5cGJMRGVuaHF6bF9iX0pyYUNjMkVSbE1YWXNTTk1mYndoNl8wcHBGOGNCOXhuaU5NbjVJTi1tRlZ0VXFQUWxNRG5zTVVZczVFdU5YendEaVVBSnlGZVYwbl9nYlFSUWhzckRTTWxDOVlWSDJTN1o3UDdLdVhRRlRjRldFOEREVk84MVdTSWJSU2JYR1pSUVFiSEJMVmQzWUZPaDlSRS1VNFFZdXJubHh1UG10YmxmQkt4NTgxcGtZSkZyUTE4NXhpOUhpVjhObnc4MHF2RW9UX2pOa1NnSE9vQmlmODVGd1RUOTBPYS15Rm5nclkzMG95SWkwd3NDS25adWdQSk9La2pUN2pac2hEWFZ1dG5EODlGYUJpMTE1emt2ek9lT2R1eGZTdjRUSmp6WnhxT0RoX0EtdjUzQlJsTWxQWXpVTWxZSVBYR2RBM0lCTnFWNHhqQXE0cEtwcXhYOVlrMm5TOFVjMGJVMGxGeE5PanZTS0ZZU1l3M01tRVNDN1NEZ2ZWNUdGcHhCWHdNMWVlZTdJV0NzV3RjYjBCcG1rRVlSaFh6Z3lGU214WkJRQV8xVE54c2dER2hJZkQ5bkNCbWtJUW9tdVY5YWQyeUNfQU8wamhoNTl2Z1R3YnBJajdaY1dIVG9oWW9CY0NEVk9tVm4wZ2owbUtiNjhSMVBIVXhVS3pFSHV5dXVtVFdkQUlPaHdrOG5sZjlnUlpGY0hwZTZxdDQxdVY2X1ZZTHpVNzJ6dVBKUGM5alpsSVNMXzJZa3ZLMEZHZTdXREV1U0RrQWhZLURSaGdSdjhsNGVPdk80YWRPNk5OVm5jTVFNelRSSGFyOUg2dl95OUJHTnIxRFU4c3RaNGdOTnpnbHFveGZKUkYxbkpUeWRSWTB2MVNHZVM2cFBnaGt2VmtyaFlyWFhmZ2xFUEw3QjVsdHJwQ0hMMmdrcnZvNml3azdUMnVqSzJQV3ZNQ2IyeGFnb3lCQXk4NTlVTjhGR2UyY0EtZWRoVENFeWRjUVFrNzRuV1N2Z2hKS2VOUkNlV1A0UHJ1ZnkxWDNaNXVKTk96em9zWjdJdm1HTnNLTmxacHhqaVpkcU1MTEllS204aUZZTW83azJ0TVY4ZnhOVk5KNGtPZTIwRVFiQ3JZNkl5YU50QUhnRmJ5aVVOb3lwZ0FJampxZGpmeHVONXZLZzFJUDA2OWdOUmUxVlpyMVpocTk1dVM4RFFkbm92VkNvdEUwV2dWMFJxalhPNzVvN2dIVjdpQVN6V1VxY0xtdlg2dnl3Z2hxQ3lzb3NWb09IRnNUSThVS1FmYzFsaUIxRGNLaHFFTnA3ajcwbVVNU3RjQ0FqdG1GeU9DV2dqS2dWTnFZRGRjdl80X3BoeVU3d2R6U05DZTQ5U0k0ajMwLWQ0cE1kVHVBTC00cHIxakFOUGJrM3A2LUtGRU9wdFlsMlJOajctT29UQXpYdnlxeXdnMHFpdlJyMnRmS2w0Ri1PVThzVTZTLVlxYlV1eGV1Nm1venJsVFFpcS04Mlc2alBhSVFJX0NqdTZYb1EweWJwMDJuY0NHLUF1clV4NThUUzhHUEY2NWNteFd0eDdaTXplZnRfWkxPOFZYbkt2VzEwcjZQVFUyNnYtbXJfb2ZXalkwTk0zWDh0ZWcxcUJYNmU5Q2RsMFNTdTkybHEycmFIVDFUVzB1WWJXY2lhMWNEbGpEa1FJby0wZ2wtZDhvWVJmeFhKVXR2bzZhcDZqX1NJZloyZVNETTVZVGs5X1VubERBV1BmZjJubWNUR1VUeFJTZEhmaTJ1TldGYUE5MHBMTkhINnlhdFZHYTZDa3NBdzZFVnk4R3pYQmNyMjNVSGVnbDNGaDl1R3pjTmVZQTNSYkVrc0xyWkZ5Uks5S0QxaVU4a2JvbkZiQXk0NWdYSGlOdFRpelY5bWh2Vm5NTjJjSU1POVJVZ1A3dk9KQnlsZi1OTFpJYklFSVlZRVdYeV9rVHRKX0dBLTZVV09OaGVJNVRVUVQwX3JTd2ZndlVtbEVkRHFhdXY0VkFxOTFLMFNQMVExSFZPRm5JcmxKT1VJdG4tZDVVNVpPR1d5WGp6aHBKUlBBT2xmQ1dfQUVjUVlNUlVoQVRULXNraXdId1F6dGVpSERqdFdrdnE2dzQyeXJQUG94UGpQT1Z6YkVJbkN0eHRuZEVHcjBfdjNFWGdjNWJ6TTV5RHF3X2lSVm9qdEwyRDNLaHRiUGYtOTNqVnQzTWM3eEszMG91M1pWeFJpLTJraVVsWGRKRTRXVk01RUwyaVotODM5ajVSN3ZVZV8xOGw3eHYtbXB1OEdxdUVuQnkzNTdLV3J1NVZ2S01GOGtwMWxpZjhEX2VZR0ROOXVWRkVXUl82ZHB3LUJ4eExkZ1hzNUUtUm0zZ3ZzVjlfMU1aZ3BWZ21mOVZoYUJIU3NhQS12eHhJUkVhRGV6TnpjTmk2NW1wX3NvNVVQMk44V3MxbjNTN3lXVFhIdFpHZ0RKU3pXWmtWNW54NkMyTEFhb1pxc3UtaDRBNWZFSE1YNEFUNlgzNEhocndlZ09RSGdDai1rZUJtbGtyYnQ3ZU5qamx1U1JwVk9aNF9Kd0U5OHBtNjhUWnpTZ1NkRng1ZHJ4ZDVoRl84YVJTTnVqcmM2SWxpNFhEWm8xY2RFVXZTc0E0TmUzVUZ6QWZwaldUaVIwSnhqRWJCZHhnajUybWJHT29HOWwzMFlWYXZ1eW5iQUktTGJKTUgxUHUwb2cyVlpleWFFbFQ5OVplS2tCb3lGVURkX3Y5eTIwSGs0T1BqOFpfMkE4aGtBNFZTVEQ1d3dva1Y0TGZ6UmdIci0tWllGRFY2VGg1SGQxS2U4aVZmRExtWVZkbzFObzQzcjdSaTVBcXpzMWZBWEc3MFF1SzFnMjJFd3lhaGRVRjI4MHpWTmdxOU9mQUs4RENPa1dKOGNXeFFMcDhFanNLYV9xZlJDc0lQbVQxMTcwRWNHM19FRXpJU2VNSGlCLVZRSnBEVmdnZUwwM0JCOWZsX3k2RTFlQlFXanA4OHQ3Q05mRlNzdWJHSkNJTlNpUmcyRm44NVlZbkZ2V3BlRTlQdjRRcWxYNHE0NERSc2p0anJSU0RHcmFaZDd4bTFCX0RUbzNLUTdPbnBRa0xLWVhydlBOUjNORDJOX01UZWJRS0NiM2RJajdURUNYLWZKZ2RRWXFhZG5WeG9UWFhnYUNaa0xCX0ZNMkZUWnpEYVd1V3FnTHpTR2o5SWxpSDhhM1dXbVpkR3NrTmdrdzRpcVRYT01IT0hCZGtJcnViaTE4Q2laUWZ6eWQ3WEVwTk0xRXcyazhjNGhFOG1KWVVLdFpCN0tZSTZJT1Y2SFNBRW1Va0M2TnpqNlh6aWFZbkEyQ2Y2YUx0UjJ4eEJmYzRXb2ZGY1p3QUQ4OVFTRjY4VXdvWEo0QzNEWEtqWmZXMzJUeVg5aUNlVUNDRnRTUXp6TVlQNE5vbVhKTVdMaldBMWpibVRtaEdxX05QQV9RbEVOMDcyTUo5d0ZUbEFWV2F3WnNTelRfTVVGUXR4RWZEb0VtQjRFRmpWQVFCY2x1dktWZkJicXFKTnhIaGVzNHNaR0oyaWg3d1YyTzgxREJoai1ndnlFMUNrMThCelRqVV9VWFMzTUNKRV9XR2NaWGJvN1AtY3hwUjkyQlJzcnp1V3E5aWRqS0laMS1mMXNxZkVUZmlMSkg1aXVrR0RCRUdtNlJBNndSUnpCNkpUZGU4WU5TRDRtUVVIWjFYNTdqR0c0SjNFM0JtVVhKVnNJT1dnZHU1REpSdTJTSGRfMDUtQnlDSkdIOHRoQUhwem1sVzFKMTJiX0RWMEwwZHFwbFVNUmx3MlRycE8tTWFmR1hvVHpKUkxPdG5nYzVtZTNKbGtaMEZGVGpTTFYtaE1KcjNwRVZxQmtXRmJaUzVsRFZqa1ZUdzRyT3FwaXpBUzM4MjM4a1Q1TEZ3ZG9KbUg5XzgzV1FXMU56V1VxQm9QdUdUY3p3SmRRbThFdmhsZTlEMDhjSDNFWjZrZ0VjcWVyQVdzZklOU29JenBaODUtSXR2MktFWndKMng2a2M2MmtMV251MWVyNTgwc1BEVEdBMDQ2UUtySDJnQ3lmUkJYVG94eUk5QmhZQ3dwNl80N01DcWpLd0JrQS01dGRlbjlLbEdiMWk2UWhwSTRrUGw3d1ltZnlwRGZXRkg0bTJ2dGFjU3ZjUWhhNWFpRVIzWXNEWDV1ZGRRc2NFRVVQZzV2UnZHeDZZdnZTazdxcHA3OVhZVzAxN1pZZjJtaU1SeVRSejR2R1dnZ19LRXJ6SExDOWRsb0lTQ0pmelpuSEtIZzByY3lEQTUwdzVZT3BPblBWa01ZZHEzTll0SEpyQjk1bnQzZGFDZm80bkZBNzJFb2hTQmtMRVU1aFRJQTJxbjBFdjhHNVlhUEd3WnJ1MFJuMnRPaHJjVzdQWlF5eE5NaHZpRm5xclFLazNhRDVTUGlPbGJzNUdaQU5CZnFVMlJhdEh5WENkQjFxRjR4ZzRpYzdVZDNPbWZ3R214bmtKNi02TjJzVndONjdMb2tsZ3QyenFhVHZpTlpLTWttN2U0dzgyTlZUc2pJMEJacmlrLW5yWFNsdV9MdENqZHlPQXJ3My0zbjdUbWlIbXNiSUtHaWtnOXZOYlNQQ3Jmb012T0lEaWV3eDR2bkp2cVdWaWdrajRTdGtNTVJUZWl1dUMtLThyQ1ZQaE5teHRuN2Eyb0c5cmdIaHhqdDBwU1AzUkt6eVJrUjgwclAyWGdIUktsMlV0SUpqM3MzWXNQWjZMMVdFczBLN3pZX0FDTEVaV0hveDVmT0ZZVkdNdjU4bFdhblFBT1V1T29jSkduOGIwY2NhY01maHFOSkF4cVJHcWljX29VbzJfT3pVMm1kSV9ud25JNTVrc215eTZvaTRZbW13TmR1NDhmTldETHl1c3d2dGlmNm9hUXNWVVAwZXlUNjJwVlVaRGoyT1hvbWY3RldzR0wwOTdJb1duQXVaOTBMdU9kMzc2NFB6cUppU1lxWWlLQmJiZ3BqOW9rSXJQWXd1akhPbjI5cjN6Znd1MTlzOUNqVGxQRGttY01FUUdzeWQ2UGMxZkNhZ1B3VjJxWjZxRDE0U2N5MXhkZkM3aGVFYThRWHZTZmJ0MXFJM2pnb0R0UndSWTBzYnJfOGR2ZjY2djgycVhFTklCa1ljQW9lckp0NFdZTXA4dXZEeEttUFdMdE9vMEc4dWRuMVJsZmJRWEhMT3NESjBXSGx4UUliZ0JmUGE0Zkx3SkJ4M3NOVlk1SFBpQ2NwLW5sT1JjUElkRHdzSWhScDlSMzRkSmFRNDZpckNkS0NiVUFXdnRDOG5LVzR4UURMRGpfbE9WU09VU3d0R2FqNzE2UVhQd1d2MExvNEVMa1RMQmw4cmViS2tsMkNoNWhWSkpxMXJBQmxOeDhBUUFDZFVsU3E3WXFzaVhjMjltYWFVNGFza3U4MDF4dGFhZDlaenFKSDlOVDYwZ0xnS1YteXc4QVdXcUpCaklkQVYyb1ZFU19uVV9kRDZVVk5RMG42eE5pWkpEcXRobUtLeU9yaFJaMUJoYU0wMVBPdnQwNU5BRXNNbnJjeGZEUHdrdUhRRlF1anlKRjRlV1RzVHVzeUNqTXIyMWFaUnFzd3BBNlRjYXExSUt5Z1gyMERMVTdWX0ZhcXk4Rmd6YkNuV0s1OXhqeEtaYTNJekEtWFN6dkhQcXNxYzlTUkVVbE1CbTBQSHJfQWFIVlRDTEdKbVk0UFMySE1iMG9iVjJzRVpGMmsyU2M5bnFRNlozM1BYdTFWSHoyX2dzbTZVcVQ2WVE3UEFna0I5RnJsdE9yVHE3TDJRV01YcFJYdmNIc2VPdHM4Ukt5ZXNZX201U1dtcURuandxVVl5U1Y3T3NVaFFPdjBfVTJKWUt5Y19ZZFNaT0lndUJfa3RIeGx2RTZxbzdYaGh1cnFXLUtjWTNwRHQ3c3B1SUZjQzVWeE5Qck5xbWVYWl9tdU1PX1hjQkRSNGIyWDBXMXYxY1Q5VUdLMXVweENUY2o2ckZ4azJWNGx1UnN2S0lzTXhIVXBzWF9BQWd6X1k3MTFxTXF0V0tTSUlleE4ySkJrM3JiM2V3NU5tT21YUDdqZnlQY0lRUzdQY0FpMXUzY3ZaVThEQ2ZEbF9QQndETk9DVDBEX2paRU5xOFFZWWhzVXQ2VlhtSUJXZlU3R3oweW5JUEc1alVDN0FneVJqRFF1a2lKNWZxNVdZNFU5TEh6Zk1LLW5UaURYelRIR29zS1Eyd3VlWEkwQ3JIbE54OFRnYzFYbWdCcW0wRXhPd2FNMGtNUWw3UlhheEQ0NHR5VGdWX1NIMzFoN0dFQ1JreFZWTi1oekNBS05BLWhLZEF0QUZpaGg1M0lrRk5vWFd0MG02NTVJSnRBaDRaVzh5YjB2VUVWNlVnWGw5eUYtOEZrSnNZN0FvZzB1Vmh1Wkw0ekJmWkRGSjBiMHdvRThUNHVhNVVPbjZhQ3l2bkgzeDd5MDNBc282amFUb0RnRzk0WjhjSXhSSlZTeGxJSE5IaWZ1ekkzWlRiQmxXTlVYeU5wb2tTQmpEelRiS1RzN1pmbXpvWDlVV2ZISFc0RVFMSDZidzg3aldkT05NOFhkY3R0cEQ1WkkxTUtZOWMtQktRNmdPQXRWU3gyb0FucDh0NjhraEZwNnl0T2RmdVcwZVg3TnBtb0NldUFNblUwbXJPYkQ2czM0Q1IySDM3Q1VsNGpWR0ZERDRxM0xQZEUyYzhneHo1ekotS1E0N0J1TWV6YVB3TlozQjBnVDA3QWRQckZ1aTV1cWlOV3FMVnBWd2J6cC1WOGFudEVWQlh3NTcxM0NzZGp6Vng3UlNmbXRrQnFlNHZYcmpGZWZtRV8tN0hwNlg5WUZqZzdDSjZJQVlxdU9aYmVOWWRlNy1qeE1hRVFsUW1xTGtMVUJZcWhfMUgtNERYSC03Zm9HM2VsYmVYUk1OMDVSWEFtT3dTbHVBelV0UlFRVDJ6WHpxVm5kZmlMSWVQMHJUQWRIN1dEb2NVZXFlZklfd0x4TXBnN25uV1k0T3RMbEVka3FsUTdmQmtvUzZ6MkZ4LXAyNHFKT2lXNGxoT1N0c1B4V005VXlsMlVreU1weFNpSW9vQkZ6dUlvSFlGQXVFejBPWTFCREY3b3BISXJXS1JmWm9TVjdsNE5XUElteXVyMmxPSW1xMUJzSXo0LXd4aWh2UjFWejRDMUpaMUpWRV9HQjJWNWFCVk9kT3l5REQydzFQdEdIaWtRaFozZkZLYUpNaGhkejZQTUZhcTVsMHVkTVVGX2RRVW1PdjVFSlRZWUhXQmN2OUlRR1VzMTV5YkN5NEZNMVpRYnRob1FRVThlUnU1RHVWbnZiRUpJS0ZfZlMzbmJHRTU0THExd2NCVEEwMXl0NXFxbUM3SVllendXR0lTVGZzSEJMTkxTbjdXQWR0cU1IZ0lYM2pRMHlLRU45bm82Yk1vWEp3YzhJRnhpMjNRTnhiaEhDNmxPVGdCenRsOWVQRGJNTWlGWHpPd0pIOTdzclRZX3dIeVRSRGZzbVM4MlptOGhxNnc0Y3lKVGZ4Ni02a21ib0YwX2NENXZEYmNQNE1DWFIxZE54WjAxbng1ajFsdjFVZFFVM2I1UEZLa0lkMFczME16NmVYYW5VUTFPSHk1aUtVVjA5b3BtOXhWcjJ3S2diWUdrcTRiMFE0YU5UVzdoSVhmR0JSSmM4VU1KOXRmSTBZdDlmbTVxMkZUdFpTZ2tFb1I3OWE3VHd5OHRKb3JjX1FBWkZxZFpLZmJqeHBWWFJZaWxoM2RXbTZuMERPNWZaS1pJVFFCcUlUQ21LTWZ0WHlsN1JwQ2w5cWZ6T1hOS2NwWE9oLTFLUXdibVBoSENkR2pFVVFqZGJQSFhnVWRhZThfSFpCSWtHMWY5S2xlaUo5ZFJpZjAtTVFzV29JNUw5eUNwX0VCLXdwNlRXRTdIbUt5eGpBc29tYmRRZ1pLTThvb2xQbTBFa1lIbkRMSTh1MnhXWFFhRlc2VzR3bWxWb3pDR2owM3ZsQzFRWEFNSjVmN2U3SnpIRmstQ3lWRHRZb1RoT0lDd2dGSmNLUXcwVE16RFNqQ01iM2NCNnQ5enlGN0psVFRlQzBsYmoxdlBLSXA5TWRxZjZrTnI1N3dkU0dCLW05NnktanRqbnZTMUVBSzM0ZjlaaURuXzlZaHZwUWFEdTZOOFAwZnRaRjJFX1NoOXI4eFlIOGlEX2pzZzkzNC1JQ1hta1p5X0hTUUw4LUtFNXl6N2VUdW9LeFN6b0o3akRvT05vcTM3cTZfbVphUWFGaS1DcndWVGJLWEgyaGxfM0N2eEdQSWczM19Ja05WZUFOYU1lbEJvVUtoZFdZeDhZY0hLY0tnRU1GT1d0Q0lGUU9ZUTJnc2hNeW5BTlVFcDFEcWVJb0p1cThGdE9jbXVBYkJoNHdzREstWDdNeUdPeGpnRy1UR210S2VuN3Z3V3ZJcno2bU9pQVZFZDBaeWtCRkdVU3VlSGNYMlRMUEtSV0FsS2xINnZld2F2SXRzTGN1RGN4MVRBVm94dGVUN1FBaXRSM0NybWZCTG5RMVVER3ZOa2ZER0VHMmduaXJObjVCUllaNDlvUFBIUlFDdnd3WndTQ0pvWlZ4clg4aDBOQlVKSzRFdlZuVHB2OXJsaXBRT0JyQnUyalZIVkxySXFMLWFOeXRGQkptWmNoRERUMDJROVhFYUpURjh1NFRJbG94Vlc4S1E2bkxpQjN0Y1lrQzRCR1EtZmo3TEgtM3RMN3JsZER5bTEyaXF6eGZna2dVc3RXLWtwd0lsSVlYcW80c3p4WG40ckhOZXZXWXBiWlFjek9leUJEdlBvRVZIZ0FCY3JlUkNhblhHMlNtRVRCME5uT3FwanpGeHlfaVlVWXUwc1VKdEQwY1RaRXFRMzBDR2dETTNvQlc2aTY5TlFEQ2NMSDhSelQyUkNsaHZzeEpJZ2JlM05WMG5rQ1RRdWtJR20xOVYzVEtTSTFZejV3eWt0UDM1REFUaDJtWkRWc0pKQmZyZVFaSGI2UkxuUTRHbUxxOENlR3V0M19FTjhiWTNoN0NkbE5FSkdFYjBxN2ZBUVpaaHIzV1Vremk3cVlaNHNReHRYRkQ4YVFfSmtadk5kU3NjcmEyNHFHMWVuSVVzaWF5c1FlLUQ2WE1WOEhXV0MwYUdCcG0xaV9SVWZ5M0hQakVjaDlVNlhKVlFUTEFCZ1o3TW8zTnRhNWhWYzhrWTlwaHJKbnJWVHpKcDViQ3lJU1JIX2wtQmdBbkZodUtGZlVHampvTEJZU2dTOW9pSXluaFZXR21FeTM3OGF6MU5sc3dtcngzNmhPeUVMcUdCTUZJd3huSW0xc0JLa1B6aXFvYVMtcTZDZmxBcUdReVVEVFRiZmtBQzFXYjJGZFp6S3dkbDYwcUhmWlNQelIzYmVlUExqTFFXb1F4WTlNV29TdEFoNVdwSm5YUkY5U0VXODFiU1FpZmdwUVVDSllyalRWSXl4ZXlvNDAtTE04WG9MVWRTRFp2bzkzclN6WXRwVzZkUEJkS1hxb0xzN2JwdUl4bnp4VU4zRkVha3JiaDBJeW91WmZqQlUxeDV1MVN6djFzb0NJd0IyT2hTbUVCOThIY3FBXzYzdlEzd1lweVMtWGktVmpwZlM4MTA5TmZXNGJGWUtrMmp5MnBsbk53c2M4ejJZU2hSTFBtanVjYTBOS0dsVjE5RlFQMHZVVHp0M0pCNGdXVTlMV2t3VWloSmVydFd0a0RyQmJJY2JWWENtMzZRVUtFRzRhZWZodmZ6dGstSUNwbWR1dHVvcmhvRE8xQzJVWHhIeHV6OTh4OEcxSTAwUDFVSndLVm9hYnBZd1gzcHJ3aWR3VFkwa0NDTmFDeWNHTXd1djExQUh2WXNmcXRTd0phWWVUWXB4U1VTZkliUG4xSkVYQnNVSGcxWENUdnFCYlJkQm16eWtIZHFiOENOYXdhUm5ZRDZmZjBRcEx3SFU1ejFIWFRiekxEQ3dudDY2Wno2MDdmVjY4M056RU9yRDhQSjBGMnMxTkhIdm9xa05leEVRSUQ1Qmh5M3RudXpDTnJiVFZ4akVGVmlmV3h5Rmp1cml2VVhqOHlxXzcxTXNQek91RHN0Vk9WLW5DZHc0SmRBckVNbFU3blVxb0xzSDIxZ1ZmcHF3T1Q1Zmxxa1ktcG1CV2lYZlFSM1RYV0dva1pXdE93Y3h5ckVMOXhVanJjNzI4QXVhSmZ2SkVqWUJXaFhXRHFmZi16d1gtQ2UzVDdXd3NKSUx4RWUwdlpNNldyem1LYXpsU29zQ2c5SkUwUTZfRHVMaDNpMHlTd19vSFRvM21GaG9ZMDM0NkNHYmVUYy1feEsyQ2hmd3Mwd2xtbHN0WmFoQWJTcndLQTdVbDU4YlRVZTBOdkVjTWhFR2d2ZWtaNkhTcmNTVzFNTlFYcjNFM2pqbzBSb1BPY2RkMzktN2FNdVdIc1owMkVxaWY4NGZVVEc0VU9IcHU4UXF4Sk9WQ3VrR2pkU1VDc3E4b1duNVM1TmRWLUU4QVBQOXFuTW04TVhKOWdKT21fZUZjdm4zN0Q0MjUzSldXejRDd0NVSzFsTW5sSDhjRV84T1h4RGZSbktQSXlldEVjcjNMR2JDSVZIX2xWZTN1ZS1IckhySnFLLXQtY2Y2dHdjVmNDZkxrelBhR0FpYWNsbXFuRnpIOFNzM3FMOUxCOF9VbmJzS2hLVVhCT1JxOEkyYkxTU1VQQVlnZ2xQOHotRE81dmQtR3BKQzkxTDBCQ2RpdnVWU0FVY2VZaVc1V1I5bHZqVU1YajdfNFlIUGFINjJETUFBSDRTc01QTUVnczItYU52SEUzZEltU1QzZlh3YzloZHowRks1dnNHaDJFMS1EbXZxVm56LUpiZ3JQcnZXd1d6dkR1alNxcGJOZG1MeWh4WFlVNWpOcmVQVlFxbl9kckVqamhSWmVaWmxkcjlTdUFhUTRObEJqYkNjamRnSEJkbklvbWx0OURNZXNCUUo4QzJOeWRtaGQwTW1OQnBPQVhUYUd4NGpZM1hwOWhTb3BKVnhPMmVhQVpZVlo2MWFQZUVWb2c1WUhkZnJ4VkdUOGY4UlMydVI4S3pJYlFOSXBjell4ei1WUHdVbmxRSUhQUzBzOHJUaXowRzBDQXBtSE5GWmFhN1FzeVVzWElWUWdlaHZmYUhzRnUtNXJMcGhrZU9NME1kbzlIMnVSRjFwcDE2OEVySjhuZnd0WjIxRjVSMG1MSlBYSUxYbjVGZWN5a0pGaUNLaHI2TEJ4NUY2NDVoZzJGWEFzSFJZU1RIUjZnWkxOVVRRZ1dMLW02bXp4U3k2YnNibjJKOXlmMm1GSTE2STYyN2tXdUQwT0kwVUdJY3hDdUR5bE1SLVBsdUF4S3laRDJHS2NVM2dSS0luQy1hd004UTN5Q0JNQlFMNnBWRE82dW5TU1Njd3VuOTlpbmtiV2loOXBWamhyOF9xXzNZUU1CMUx2dVNmZjctalpibUY1YmQ5dk91ZGk4ZUJpUVk3RmROS1hnUk5VNGFuSmNqRnozbERXVS1GU2QzVUg2NkR2M3diZWYtVHBadi15c0MtSzZkUFhtZmFNOGkyODlvM1F5YjdIODFYWFV1TTFxUk0xaUNJNVNCeDYxZ25UNnV2UEstcDNWNkRtdFpXQ2JKd3lyMGdRTVNRVVNzY3c3S0dCMUlnX0JqOE5YZl9lMFZ3dG9GU3lDMXBYeExlODJRUkVxbWhDUUZpckRLVlh6NkJ6aGJKeUxwc2RnU3ZtYUFEaTlONWwta3lPTU5yNndhb3pLMi14amo5dVNodS1icXNSaWh6UHZRREV5b0szbVp3b2ZPaUFSQmdsWVlSeEFhWGJ5amZkSmgtRDhFYVYxcGQ3RkdHM3JGdU5ONkhPaldSOEY5Y0M2Qy1fdXNhOERBcENuOV9iZVludlhCM0o1QXJHcDhEZEJacEk3enRhT3NNWUQxdmFEelJ1Z20zZFpYNEJ5dk5ub0lSMjlkdFYzYlJzd0xNaERyUm9oOTRLenV4SmQ3YkhFOWpCMFNwUGNweGlCWU1NVThncmdGUnFzamQyRjhGVktPcXJ0OHV3MW5Ic1J4RkUxYzlBVTV6S2taaWRpYmViNkg3S3N3LUF1NGpZdTZJMWJnUm9GY1Z2bGdWb3IzREk5ZjRNTUdSTkY1VXZJTUprdVhXdGlXMjRqSjN4NFA5eWVoR2VUN0xleFpvZXV5SkF5YVRKVmlZcngtUFdqRUV5MmotYkdDQmhOMWtUUnFUTExwSGtXZldjOG56dXdvVjdjZ2ZqQ0hKMWJwNG5uZXh1bWZzbGN4V01Wb01TQmRNLW55V1J0MnZBdVdnNEl1RWVkNWNGMXVKOWxUYTQ4YnowSkpGWUdwbURzSTBidEV5V0ZkeXVaT0o1bW95OWJEdVdFWkVwNHR5cVhJaWpvWWc1RXVwV2FmYkNYSzV5WWQ5V25OWEYzUGJMOVZwRE1pZzJBS2cxQjhKTDJGMnNaaEVMQ1RZbEZDWEdkbzNhQWRwamk5MUtaVURHY2xuOFZ5WGkta3Z1aV9rLS1RNGpMdGhDQ2lKNnFsSGgxMUk2MXZPNGdRN0xXOWJOeF80TGpWUHB6WXJRd2F3aFJjekNiTHZsXzVyS0RNcnU0RDNQZTBNbUdCVjJjVi00RlVpU2ozeVNEVWJDRWNGSDRZallQOTRLc1FBN3E2aF9uMTViT0NkMlQ4b0pCTWNYekZMU0phTU8xZ090cGVPYzhGaVBJR3UwYTh5a3JDdGhCMWN2d3o3MVVPc3JWRG9uMDNFM3hZT2ZwZ25kczBCVkRDc0JEMEhNWTFDZW53WS1vT01uNjVoV24zak1LUTVHcGlnR0hVclMtaU81aFVFeU03VE1lcDl3bWZ4SGd3VmJiMkdPYWNMSkJid3FwQVg4bmlKeGhNMmhjbVB1YmZBaVlMemU5V2ZlLW1MSzNnTC1uNXVSZ2RlUEF1ZUdYRVVMVzRSb1lHdVVPcjFzT3lLdkxfUGRUckw0TEYxM1dPQldaUktHcTNSaC1qdHFRLWhHYldYM3dZeEd6TVJmWUZaMzFsZ0tDX3dZN0FNbjZQSGVXRUpmN2llWU5PdW1uTWV1OE51SDY1b2tqQlNLcGhxc2tZZkxRbm8yX04zOGlTRGRGNDBLaXotN2htUC1BNVY1aWZOYWZxeEFKZERxMms5UGQyX2FOYTR5VW5Zak5iYVpEbUFBdUNxWGFtODVGRWM5eU55elU4T3c5eVhPSm1kOEpoTFlBbmlsMlFfX0FybTNnTlBjTUs1Q0lWTUE2LTFTYUxpWU4ySEt6RktpeXA3TGpsWm9TNXFWYWxJOVFhZm85bHFsYThndUg5T0R2MFE2WnJZdFc2c2wxb29mYlBmOVI5NkhVanZMdWVkWkpCYVNsMkdLWFhsd2JuYkJwanc0TmxYRDlMTmdwbnZ0VVFCT0YxMjQwcnFseWY4cldrNDlaSXNBZ01vWm9lUXlkNnBmREQ3bDU3Unp2TWh2ajBYbDhGcDRUMWIwckhFVEkxMnZsdnNZZG5iclY4VnlCeXRRQ2R1R0hZbmMyMHFEQU5QTXFROUNvWlgxM0ZhaHpTNkN6a2NOdXI2ZGRTRy12UzBOWFRjelNrMENKaVl2SDN5bFBlQXpFSS0tNzlPNmVZcHZieGFiQ3RFeVMtUDdKNGxXOWNOTHZueTlJa1JpTy1jYmVFLWNKWXpyT2dZd085R0xqYjVzT1lnWEFGemhIV3I5bVlsSERFLU5ud2trS2UwMmpHelFseHdlLXh2d0lxbmlCamoyN3Fkam5meDNQaXdwdk9pTjl5QkJSZ1lpZ0NiUGJQTVg5dXlVYjlsY1hkWlVDQ3d2X1BOVDJGalR2Xy1IaUdxSkZoWkFKTzF1OW9BM0w3YklFaklpTHFxcGt0QW1uZExGRTZVeVY0RVU4TVRzTE5mRzlOUlAwaGt3V3p5Q3Bzb3hwUEg1QzM5NHhRSzlaWXJOUG5VS21oU3FYczNjOFR4eGhfNEJPX29WSHNFR1RNTGxYWFFETkU1cWtXa2FNRHNJVVJxQy1lM25FcHVCejViYnFLYjZhOEQ3eHhLbmcyRC1zSDY4YjNVOE5BandJUlFfTEEtVUhxQVl1RWlvek1vTHNkNVZYSHNWMGkzZG5RNUZNX2k1aVJqQVB5VVdsRzFPSTRYMnVPWGFOT1Bpc0hQU1lqTEpiWHE1bUlCcDBrWlJCTndzSzlITnAtV1lCcVh2WG1vakNIb2ZIZ0R2cGtGamIxclhNTnYtbDZVcng1ejBuaFA5VjdUQzRfZEhUT1ZYZEJJUC1ibVE0TFZFMlRadVJ2S19qX2UtcHpRWEpROXlKQXdqUTMyU0FLdUF1a2JGN0xKdTUxdnY3aTl2X1RTMmdfaHp3bEp3TjgzMDdjallsS2VBb1E0RkR1Y1M0M2ZnbVlCMWJZN05iY0lQOExlZUZiU2ItYURteHhKcGJ4cWVjdW5RRF9NY2lka3NfdzgtZUEwUEVMNFVNZklXQmp0M1hUbko5dDFMT0dFc21uOUpqRV9DUkp6LWFreVpJT1JKZ0RJZW05VXpUTXVvVUpULTZGaHdBcGUwSWczSXF1VURoZGNUMWlKM25pYlBFUTl6ZnQ0dzc2aEthN2FhdUVCa052Y0EyVFpfSy1VeS1YU3NZRWNvU0kyOC1EbGJsLWFiakJnWEVzcWhReDQ0UXJNbHFBV3ZzWVM0NjZFY2N1QjlsN2JWb29VWGtFM2JDYUFDbVZ0aDZldjlPbUM3LWNaaTVsN2plRmdzOWlYSFg4UzRzM1RNNjFCQnBSTHpJSjBneFkyVFFXNlloR3VTSFRUeUxLdEF5Mm96ZHJ2Q1c1MWFLajJWZHNvdUNXM3A4eHZYa2ZlQi1EQ0d4RDNpUU5CRm4yWjMwbXIyNU5ZZ05UZkNaTEZ1RlkzYXZHXzEzS19fYUFRaERWUEZhTGJoTThEOW9mV0lRbHRtRW9iMEE0UTJTS0FKX3R0VmlkRUlNZVhFczBLNS1feG4zMUxLcWw4cVNqRXhkLTJRMmJnbE4yUm81dmtwdVBMc1o4ZlVYNkg1WlZjcklZa21BVFM1cWdOM1JwZ3VaOWVSeGhuLWN3Q2lZOEVuaFNqLUkxbkItWWxJbXpHWm1jTFI5WU9CaWY2Y01SZ3FoMlZTTkc4d2YxRWhuQWc0QlVtRklKYkwwclhuWTF2UDRGQW9XOUZOSFZ2bGJWTDdHRlJFdGFiQmMzV2xNdzdIMzNtMXlRWXUzUzVwZ3h4Qkphdm5TZk5tdmk1SklMYlh1SWtsNzlHNWJvQm1vYWotNDB1VzhvRjR2TThEX1Vtako3RzYtTjE3dFZiQ1FwcmZZX3BsLU1oT0J1ZlhYZ2ZrbXN4YUU5U0QwV1FRZFNUdjRxSjR4a1lWZzZVdUdPQWgyZmVGYWtGUHJ0b0xNMUxRakRERUJqQVduR3Fvam5DR29fUEMycTFWOUJweXF1M0pKVmwwNFhGbG11R0FVNG1zMlRBMWVaQnE2dnRCZ2FmS2NSNWtwS211eU03Q3NLV0tOYW1iM3ZlNldmVFRUUDJMN2NYME1Ndm5Hbk5Lc0hkeTVVVEQ1eEpCVHplbTU5encyeDM2ODBPOTVyREl1MlZTVTlkX1paSlJ0MmtvUzJVOFp3UXhkOFFFcjNvNUhZeDJPbTlPeUw1YXczQThMT2t0RktFME9zOGRxNzNYNFhtY2dKZ212Ml9kY1ZuWmV4X01fb3FOSjlqc0FLWEVneUdBOWFlVER4Zkwza29RVGxMd3NqWDN1eG81Z3U2SzVSN1VUZmZQeFBzUHpCTHJ5LTFUWWpZUXROTFA1dmh6N2xLNmNKdG9wZVIzRXpjNmc4VE1Md090dVdTMGNSaUxYR1VWQjFfa3BRUV9Pa3Rwd2RPYmx0a0lXYWtSTXh3aV9waG1SQTdzT3BJNGVWWWJtYW9jTXdBSlVCUkFUUGNHY0kxZF9EcGRvSldwNVhOS0FoTGppVWhYZnVEOVdNbVAzdElROXI2UlhMX1dndjljeGlkbmZJZnU3WXBPMUNGU2Vwd29wTHl5TEMyX1dPanVqenpwdTlJVEdKaGV0RFktaVFIOTV2bjQwZmtEV3IyMW9NQ0QySkpHNlVON1VaYzJhSVIwdGFQNkRJNDZKS1N2SkxTN21NdVNNVEZCaFNRTUIyVnJiS3ZLcTZONDlZMEpMSHhHUjBwbWFQdHlWM3padlZVc0ZJdmNkdC0wT0YzRVc3dXZVZ18xeE5jOGZlWVRsSS1kaFZOeGQxbmFxcjR5N2NrSHVSbklDc0xNcnNvUmlMYThqd2NuY0ljX3BqZ2lScDFuTVJZMzhJOWtaOXBHYmZtU3RGSGdHNjRvNUVMTkZpVkktSERWV1E4S2hmSnpPU0VWV0pYcHVhaE1Oek55R0JscHBQd0pjQ09lWjdQMnROekVLSTJaVDlTYUNtbmxlMEJZMkJHNlFxelRoMGRLOHdpZVFUb0huM3JPT3VIZ2ZkRjlLemY1TVJHT2R3SDNENkZ0cHVGWTE1dzBRVlNmWUZJZGtGRXV1NkhFbnhuV2N1WHNfb2t1ZTJoQUFaNE4zdS1yVUVpNnFZME9SMTh2MlhvUjkzSEZaZUY4UlBBbldXWkZHc0U1alZLeFVqc21GQzRzeU9MSks5Y055LVBXMk04STV4LXFaa0pUWnhIbjhabXkySjd0RkUzdDg5NTRlUl9yb3ZMT1VUX1N0ZHA5WWJmT1JDblBsaFc4VEJwSW1JVEwwUnZyWlBaUVF3Y0NIekgteWRDRXFFNm1RQkxfQlVZNmxsa3J1VFFxYVBBYjdzaXJpTHNQSU1WOHFHM2ljM2NObjdfOTI2Zjlfem1PNU9JbmdkcnZHTVlWU3VHRkhkSE1oUFE4RHRKQnczTU1RZzlZaW1abDdzYzFabGtyTFBReFpEOW9oM3FQMG5CQUVkUVlkTlV3Ny1hek43YklrOXRTd1FDYWplWmJxQWUtWGtwVTM4bEdUbzhfSFV3bXB5bkFvVXZ6cEFHSnJ3QWdsRmRkWGpVWnYzQW9lbkQ2UVBIQXRRdTBtc2JpSWIxR0xZVVRfeGJJbFJidGJJS3FULUZqS1dITlR1OHMyUkY1dmZ3M2tXdnVpaU5RU3NDOWkwSFlnOVlUVU4yNnJobV9lemxyRlFsaG90cUZ1Ny1tR2k3UGhLWFYwQWczSjg4ZnJqM1h5Q3hPUlhQM01qbHBrQmtnOUZkY2o2RmN6Y090XzY4bjNiWkpSRUw5b0k4cDREZV9IbjJ2NEU1RG9JTXJITkR3RkQ1NldHRWZvd3dwSWhHdkdmMDdGTUN6bXRGa0wwbTVFQWpGNjRTRUVpVGNyRlFfVjZLVU5iM01ReFlQcFkzbERBS3RTWWs3bklBTVFGY2NQblZ4VWFTNEo1RHNPUVZVdkVjVVJhVHJxMzZhb1BiSkhyMy1MR1BYN2t2QmE5WlJiNmVUWkd3T1NwMUpnbDlrZEI0aWEyb2o4Z3JNOTFDamJzN2pJWDQ0WHNaZmU4VUJrZlFXeV9hV2N3TTBQZWlQUFlkMkYzR1FkdHc3cTJVeTZHT05KWEZaNlQ4WXRuVTFtM2Jkck9HNHhaM21OMTctYUk5WVBrWGRtM1NUY3gtblpUTzZ2a3JRQlZ2cTkwdU5UcmFFS24wdGQzSmFJcWtQNWtjbnU3cFFXMURBQVlaaVdTZ2htTGJwV1Jta0VXaWhHWmxQSXZHd3JaZjVjNlFMQ20yUm9DQ3ZxcjJ1U3ZLazlrcVA4NGxXbUFWU1A0Uzc4TjA4dS1obFpZbnVRS2tjSHlCRjYwV3BjT2FWNmxrVFNLbW5CM0o2ZklsQ2R3aHBBdG1yYlZmaXdaTFFXSjhwNU9RNENZMFhKWFZXaVp5R1RobHVaSmFMSkt0dUJYSVFJVkRHamRmVkFEcmk4R1MtMlBXdGdpdW1KYnRILWw0a2RRRFlIUThUUnZ2bmwybVFvaXNpOGZZcjZocWZNSkhjUlNSVVRlSld2bUtyWHZhOFRwX3ZOamVZcHRNN3VNMHo1THE0RzcxMUhWOG15UzE4Qlh2TGN2UmVuYkF6OE5mX3NSRElNSGxiXzl5QmQ1WWNkVUtDSFJYcXVSSU45UjgtS3Nnc0xnS09GRTVUb0tHcUQ4VW4xUzJYMEFSQ3NKNHczSVVrVnluRTYxMk4tZXZfT255YWlYcUtYa2w0SVRVTGtwRW9yS2x5TUh1eFE0WmZ4WDhZWkFra05ESV9ERmpVMm82dm5nOWl6RzNQRDVXdllPdUo2dVdLMUxpSkdxaEEtTjNEZWNvd2Z5WTk5bEdhMUpOc0RYVHJqM3liSEhNUXdfRnUwTG5Kc3Z0QU1BM0x2eThSR0JHWXZpSzc1aG4xOWdIelJCRzFwT2JLYzc2NllpaHlwZGVIOWZncEdBX1FnVDllY0Q5QzgzUGlNb05YdUFfS1FNdkV4RnNUaW5EWEI1b28wZUxGT3dDX3N6UlVaak1SOUY4UjBKSF9pODJEUVE0Ymo0eEh0bHVBWTYtdmEzd2F1bWY2Q1R4WjNmTEotX3AwdW1TcXhMcUEyS1Z2N1FlR1dxU2hwbEl1YmVzSFd2RmxfUEJHb2ZDTEs1NFNLdVpmLWpxX1BLTmhia2NZRUxubHZHNVV3N3ZGc0dKaFgzMUNDaXFyRklPNlZ1Sy1qMloxRzFnYkt5OHJkQTI4bmdWOEtpTU5qYkljMEM1eXB4ZXA1eEhDb3BYU0tjeGhPZEpGdXBxMHRIbmViVkZ0ZG9DU1M0RHZ5ZDdONkluQS1hWU5FYnNGUnBLSFVTbnZETkQ5b2FQNGlWWVU2amZZWk5jOEVFNkhFNGt4SEh4VnNaaFV6ejNfQ3Y1dWVEcUh5aHpGdXBrRkY4ZkN3bDFDbG42aXl0Ti0wbTRTNGdDdUdYZU9Yc0dqUFNUekgzQXJ4ZENyMTVxUXNvT1pTRGh6SFNPZDhVWW1vaG9xZlkwM0c4SVl0TzVDa2tvUDFGNU9sVmo3WVp0aW5oUmlWbUJxZnRET0t0OW0xMWtReEZXUG9SN2JjOHFLN2p1UW1TSGpQUG91YmlCN3hWa0s3T0tjRTVMWFpUNTBVWksxNk4xek9iZkFFek9seGpxUDZEaVRYYkJacEwwWWFDUHJLSXVQNTdrNVRlanlPZGFWZUZxcC10LW1QN3laM0lCTE9KSUhQUmhwRmMwMDZJYmp1S1NQRnFrTVVSYWd2R1owS045T0t0VXJTLWNhZDVhMExZbkVfVjN1NnVQTnJ0ZVFwTG5zYlZvbHR3VGc1RVlWeVJxbGxJSGM4WkJRRndPNXpCWGtnWU5YOHY5U0FFcHZYNUMzWC1Ja2luSWpBbGxMYnZQNWFISTAwcHdrM2UzeWNfZFp5bGZjV08xYWxfbm0yaVJYUVlqTmlOR293MU9XazVKRkZ4QTNFS3oxQTdVbUIyaHhBbExMOUJVYmlqdjlOMXJoejYzRThzVE1WbE1fSURIUndqOE9jOHp0Xy0zSWVOS2NnYkZKd3NtZTlGeUNENHFUWUJSdjBaNE1feXhoT0JQX3NpUGJUV05jckM5S05RdGY2VzEwVThuRzNFVmVGN1pLVE1xMmViX3ZZN1hOSjdZN2gzc2VJeFk0S2Q3X1lQVGgyY3BhMlBDZGJLcllsSGl3QVd3YXdQUDRwd3haRHJINnFJdWcyQnVIR0lKbXJLT1ZLeWZCczJKenFyUHIyam5OTzhmZU1SSVZneEdETUxDLUJacTMxaXhnZHd6Y1J2b3hOcm1QckxZbExZMXhBZDl0Y3JXWTA0N1V1WlA5N0NUSGU1c1ZzUEhfa2xJaV9KUTlmZ1NqOFZFelgwWGoyUFBfMnRKeVFwVnFES0xMSDIzOHd1bklFZjVFMFJ1OHJWTGZia2MzNW51S0dhdXhwcFBsYW9nM1Y2a2xJbzJLZUlGSXZvbU1lMllJdko2ekdhX1Q2bFd2ZHJETWFJcG5hV3hvbk9vS0hEei14OFlYYzNoRUdPYTd6NVlkNWJmTnA2YVdaSmZGVlYyZmJJNjhaV0hmWDJkdEpxX2tuRmI5VmVIbzdXMzMxOFA0cXFxSnFIU3VYdGdfRkhJTHlLem51aW9JWmpRS19YTnhuaHlZZllyUU84RndmY0w2QWNiVjVnQjEyem12OG5fTW5ZaDNTR2VhSktINXlWeUJaaEhRZnZWb211blotbnJSRzVzZmE1dUtjX2Ixb0d4U1I5R3BuRGpkRV9oU194OGdzWTZJamVvMzZnM2p3OFhKWUdpWUdlai1EOU1WdUlXajZUM3g1TWxKOGJwUWhIS0NlWkplRlNRRXhpblRnMlhBUHlHOE8yYUliWjFudUE3bkp0aDBJV0RQZm9ZekJRN0VCNlZkSGVUYVk2WXpYeUMzUWhzZlJiQlI4TDNSNjE5Ulo1UHhrS3djWXZveWJBZ20yYWpwMzgtcnMwNzlDTTJyNHdpYk5FTmJPRGxFVWN5Q3FjeEp1d1pzOGJidzFHbm5xRmJ6Q2lDWVd2b2pILTVOTnVwcVJPdjNlaHpoSE94TjhKNjVGb3hZU2FUQ1ZURkw3UGc5RGZGR09Rb3ktcERNcDhDWHYzT1JDRldmZHQzZWthOUxEUmZVdlYydmJTU0ttNnVveGxqWFdrdVZLSFJiUDVUNTM2M2M5VG5jYzg0dTR1NHVKdXJhbWRXWmticG83WjByZGFMRFcyeGVyZzIzRTA4V291cUp3NGttRk1KTmtGT0VkRXlKTGh1X2kxbTI0OWVqVGZOcER6RFdTcDJ5cFJQR0I5Y3JSMGRsdHRucE8zTWpJNXlhZkhtSDNUTG5NcDRuTXpvajA5eHhBc1FfTGVrUFJnMU9RdTlEZXJFcGppSUwteFdyTkEyLVY1dTlIVEJ0RUlGdlFSS1A2U19ZMEF3ZVVPejBWd0NuUUVCUEY1M2FYanBRSWZ2aENCbjhhZXRHbXVVSndhSFowRFQxWHlhdGtDdkZZTGxaMDc4aDZqMmZCSFpWbDVxdmR5N0l2SzNHcHdrWl8za2ticzVaWjlDSXRlM1F3dDExTXgteHRGRmQtVzJWQzBLS2Jvb2Fmajh3dlFrN1dVXzNPSkNwaHF4NUF3TVdIZWJWbWg2ekFheGotMElDcjVManhlMTJ4UjBDdWgzSjRmM1Rua0pDM1VRdm9mTm83M1RqeUNWdDk3NUxYRWhOMTBoSm1USHhiQVNteDRlcGl3QllHNWgzYkdmNnpvQmlmQmhIM2dKWVlLNlFDcXRuYThCcUZmZDRtOFB3WXpyYnRlb0J5RFVlUWJlWW9nUFU2RkNMX3FESHd3S1hfRHhhcG14dUVGSjVDXzVIWXE4N3hSR0ItRWdxYThFMHNsTE9PWjR2U29nc0U3QlRfUkoxaW8zV3VPV2VyNGhrNG10N01XemZwWDQxc0ZBQjBweEgxN3Znb1JOcTBIMWdkaHk4clBBMXQxaTlxRmhYMmNERG9acVNjRldRUVlTajdyRWxGN25mcFVZTC1ER0I0ZWRmZDB1cFFMSzVoZ2VoRG9ackt6SnFjZUtLcjNTZmVWUS5iODNzOXBOTFluLWhrZDlPV0JzWXRB"}'} + headers: {cache-control: no-cache, content-length: '42920', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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://vault3b4b1da4.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/03dd6f8416de4e1d98805b33559aef63","kid":"https://vault3b4b1da4.vault.azure.net/keys/cert-name/03dd6f8416de4e1d98805b33559aef63","sid":"https://vault3b4b1da4.vault.azure.net/secrets/cert-name/03dd6f8416de4e1d98805b33559aef63","x5t":"gRgbV_PM7vh1qKZcjjxYHxQSWC0","cer":"MIIDWjCCAkKgAwIBAgIQSwE+ti5GSQyt2jas56ewnTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NTQ4WhcNMjEwOTA2MTgwNTQ4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiPz5+ZKCAGG0ItB4h17pzzf3Tl9GQARzPz0WBye5SF+IfQkMrUncniJDBJRmiVe4OjSphJSHXgEnZmWeN+dSoVBY/lW0h/NEWag2eGqEO/HELI23dg3LF5ntPCB/0QkDYXoPWQuVpUK/syPw1qA67Fhl98pI9zrPSRxh3Nc1mq13pjawYZgKGQsrq8DxPyp1Tr46KXMMC0yiG/uDAsKUlG99Eml20xRPSkgbG53w+exTEHN26quo8QzNGdQPOO0EgmyGf47aGdJ/OZIuUSiN3zG0Bmn4D+C/kES+ZGI3AiJwGu9XZVi0mYu+nRoxk2l1Xj8AzX2lDKi5bCmLLLl7JAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFFYy3zriAmKWB0OM3OG47VWJ0iKSMB0GA1UdDgQWBBRWMt864gJilgdDjNzhuO1VidIikjANBgkqhkiG9w0BAQsFAAOCAQEAkpCAd/cL61Pite0mgPEbHM53jqd7TLQU2hh11ozuuDCykpOJpR4X47FIBZatZDSNudDy7RoR28Ol+YvGaGE7THM9HRC/ooNArvkY/ji9XdKubqBK4S68C9Vovg6cIN01zjeZu4tBz1Dwc4EbiHwV3L74ZcWNgB7fL7aHkeosu911nbcCOo7mVMEAQ1ipm5RDc0xKKgjXizBRZg7sNhoYwNWBEb+wNdsi12Yw0s2ik2mgUEIwcAYhBFqHr5X8/KFiPq0pzyIdoQwAau08Xd7WMCbBcoQafwvBJWHgnxDqTL7KWonPnDfydnf8gI2XEEPQirOzfvqW6EOdLoM6GjUDIg==","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault3b4b1da4.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":1567793128,"updated":1567793128}},"pending":{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2367', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.vault.azure.net, + /certificates/cert-name, api-version=7.0, ''] +- request: + body: '{"value": "JkF6dXJlS2V5VmF1bHRLZXlCYWNrdXBWMS5taWNyb3NvZnQuY29tZXlKcmFXUWlPaUkwTXpnMVlqQTNZaTFrTlRRM0xUUXlaVFV0WVdVNVpTMDJNVEJrWXpNNVpHWmhaamdpTENKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V4TWpoRFFrTXRTRk15TlRZaWZRLmR5SmptM1g0bnhtbjZQOFlOWm80QkNpQURoZ0sxaTdWRWZqMEpPNGxvdldPYTJFR2h1bHpfN0ZmbzNHcXl5bUJBUkNxNm5fS1drdlBGakN6aWs2VENlVFNWUmx3dVR2aEdUWnR6b1NUT2ZXYUwtMEhfNXp3UGk0T2NYemNxNjZnUVZkcG96VVBEQXQ5Qy1BcjZMMUV4b2NvY3VjUTloWUJVNTRHMEpqeTdxQ1ZtdTJ1eG4tWERUbkM5aDRqcmxXSG1RT09rWnd3RXowbmFhSVdzQVh3eW42UFVLeWVrVWVxVUhPRmxvekNITzNvOGJFQWZhbXVLUWktbmRHNldTZGJFTUJkUk9va1pGd2NLTU9UZklwM0VXaDJxWDZMRzFpTlBFaTBQLWpkN1EtaE9qT2hhaFlrNnE0TUg0ejdYZkFNNFBSUUtfcmZuM2JiTUl4MXNJMTB3Zy5kUVpUSUtZUzdKbnBIOWl6bDJDa3R3LldabHNxZFlUZlRlTmdnYzhCTTdqZ0pKdmhwX1owZ2hMekdUQ3BCcW90LUJsaGR5Y05TQkg5ZHdGek91NGlSUDBxSlljZkZDeHlualBsQ1YtYVlDb2FibFdFM3VSM0ViSURGT2M4SWM0SDN4MThvOGdzSEt0T2d6Nk5CUVdMd2VYbVgtZTU2dXo3Zmk4aE5tX1JNLXIyNlpBQVJPTTVNaWJCdGRwMkRvRkhXckpjd0d4em9SbTB3SjNpS0xEXzZGMEpDenE2T0VKcVpaUjVpRDBLdF82M2Q5Q3JKT05mQXNiS1VQdEdpQTBxMUlsMW5EQ1YyMVg4RXdCUmgxRHowaXJuMEU2OHQ2NHQ4Z3QtWE80UUNYaHBhaUdBcGNtZXZ2eXV1STNzalZOTnROaUVkNERFN19yNjZaSzdtX0xhd2h2RURfTHYteXg5Nm5IWWtHcWlUa01qc1RrTVJPMEJ6OWlzRGtUQmFwNmI0ek1hRTZIY2VBWFhzTDdYZHJrMkFMbDJ6UEV2Yzh2Z2RuUXZ2d3R3akljSS1hZWFuYnlidnJudGsxeV9yeEg2MU0xOFVWTWlldVhLYXRtVDNqQnhtamRNd2E3QUN5YVF4OVZjMlQzdmhUdVNZWGZJRFlKdmdEd25YbjJ1UkoyV0JzMVlQTTloOGcxUTJnck5hXzNabEp1dEpMbFFFTzlyWE9sNjJNSmtFZnR0VVRtQ0tqOE9iUTJEQ3ZtZm9QQjE0NjRrTE1hdDFyZ2MxaVFMYlU3c0FLX3dZMHh4alMwQmJsZnRxYWROYnRVUGY2b19UVGlmQlc0M3lEWkdCWjEwOGhHd2xSM2dmWm5hMXB4VVZMZXFwdGF2aHRLM2pFTGR5SGNub0RnWGsyaTlzOWROS1lkR3dxUy15SHB3UTkxOHpWNW5ENUJQZHVOOG1qcHl0SzBOQTM3cDNqZHdLMUlLck1BQzJDTW5WX2V1eEltYUhsVmZVR2p0NEhjWWxJR1JkS29nWXJaSkx4VGEtdDBFR18tbGxDXzU5c0U0RTlNcG5ESEY3ZmM4ZjdkNlFfSUZoNUdWWEdla1FFdDJJUnpSZjJxbWg1VlIxNld0U3pzb0p3Vlk3c2ZEbFdJd3A3cy11c0JXNUtmMEg0SW1JVjBLMkkwM0RyandhVzZwYV8xRHZZeEF4aXZjREphNXZLSmVERU02YXlXazh5VUpNeHRVS0xEN2t6WC1pUE9aNDlDWlNxMVRtSmFuVFlBQzFWWl80RW9CV2R4Nzl0d1I3YkVyZTR6SzA5a21kMjBhY3Y2TmV4ZzZHUGRQbE82VE9HV3J3VTgtTFpuUkV0S2cwZmJWN2VkSy1XMzVuZ1RBSkd3ZjIzM3diZ0VRY21MaHNNRzdfcGxjZ0M5bVJSRU5KeHlqUEctR2F0UnhXbWI4SHlhcTJ3S09kZXFkbDdKN0FZT1FnbXFFeENRSW9UVFlKUDVvSllWUHFzTWhoUE1GZ3o5bUFEQ1BWLUJZMXc3dlpha0hpRnZfX3dvMUl4a0Rlb1EyS2VWazdaY2JLbzJVUEVZNmFiNktLTGRTa29xaU5EMHMtdW5rZi12azkwTklCVDRWNWRUU1JKVmw0bEtYN0I2VFlJYVBad3JoMGY4ZjNENDN5T2V0Y1U2b1ZIYmZiQ1lIdDZFOEFLQVdfZ1pZLW8zS2FNMmlpaV9HY2tETUtYbzdnN1BUZEtyMlA2VTF6Y3Nwb3EwV1JRQXFkNWU3U1RQTm0xa0x2aG5FazI4YmpTaTdUWV8xNXViUEdpWVdncWpLeURxS3BLSmcwZnhaUE8wTDAycVBTcV9LeTFaY0NrVEVsUXIxQlFmdDQ2c2l5S25IWjBkdWR0STdxVlhKM1EyRFBIU2ZzTFhyUHRodGctTFctSkpHc1dQQU5iYTVOTExZWVZSaXlTd240NHh2Z2QtQTJ6d0Nsd3BBX0lxWWFUS0Q4cVBQZnJOaVUyR2VxRVlpN1NXM05fc1VDRjRyUENJX2RLUUdDV3ZNeDZBV0tFWWh4MklWTnFxXzJpYVJPSWJOdF9Qc3BTZ3g5TlN1d1VsSmtUOGFFcHNsWkxadXpCYjQ2eEVVaFBIZmtRS3Bta3lOVzFDeFMyV3NCaXpUNnN5djdYbkliOEg2LTE1SnNicmtZUWRMOHlJbG9kZTBLTndCZEZEUldWeVpkMENZellVaUplTFhWdllLaE5PazBfWnljamM1cjFfQktRTzhsZlNCWXRLWTVrMm9vLXlJekxkS05wRXpjYy1WakRqQnVCUmdqelh5S1NWODhYZFV5cmRzTEt0VjNtajZkeDFKelZjVWJva21icWoxU1BQcTBrUHF1ckpiWUUzeFlEd1lTSm55UENRWDRtQ0Z0cGFFeE94TTRIdTJnRkY3UlZDdE1zbEc3SU5OazBpbzY2ZTFnd08xSFNmQzJKLWxyZWFxVjdkMV9lVWl3ZDBNdWNJSDhCbEhwUndlZ196Z0xNT0p5b01xZDAzQmJoY3ZOVzRyS05OVkk0VjVwUUllbDlYZ2llcnhnRzlIUzNOaHQyWVYtd3dEMHdFTDh5eVNrMGdZclhsdUdkVjgxM0tudVFjb1NkRVZ6WjZHOE83cUNxYXJzdFh1R2VGN0JJenJHMS1pZXlUeTRjTVdZM0YyY3hRYy1BT1pySktMWU90aVhXbnBzOGIyWDFfdm4ydERyQ08tczJGam9oRERkSFUtSkhqSVV1eWdmaUt3WmpBeF82cHFSUmpKNF9wTUtQLS1CbUk2SWR1ZDFBT19ZSWRTZ2xaOGQxTUVHXzBSNjJoOUNKUWN0UTItODNpd3ZSMDVMN0VLcU4zb2toWExxYWVFYURGWlJ3bTJKOU96bDVBbVB0cWZyRkN5U1pHQk5oWE1ra1hnSkRIWGw3MUNoVXJ4ZXZDb2lIOEpJeERMMGlRWG5YaDk4LVhXQVRhYTFsUkZOal9YSjNwY09lU2pnZy1jRHl2cDJ2RkhxX0NhQ2xRYVk4ekg2OC11OXFUaTlUYTNsUl85TlNpS1FPamZtMzdxYktCaUQ0ZFUtUFpnRHlLOVI4WkNrbVlhcURYalJ0Uy15LW5uYVBGa09XeEJid3B5VTdoWWVpT2dSeE4zaFZzMnRzTUVDZl9aN1BsYktaaG1TZXhKb0w1VVBDSVpJeXBpSzdOTkNqM3JZRXh0VVJJdjhTeWpfS3ZuNmtVY3FNTEh6S1FGX2MzNmxZS0RuWkJ4T04wYVZaZmxWR2RKeUNfZy1rdXJ6TGJybFZ0TmRkY1phX1RhUkNzTUlwT3dTWk1leWlzRDVsTzdWdWc3ZjlGNFRCNzgwT1B1d0hmSk5SVm9INW1hV0tmUG5tZ0tva0RuenlxZzVPckRNZTEtdWNjSnhvbkdmWGdkSnAyUElsY094UE9WNnk1RlpVWUpCMWtIVkE1VUF3N3R0NWZpcjh4NTFSWTVfN3RzenFXWml5amtpV3lLdW14Xy1aQlRIV0J1STFlVHRPU2laMVlMM1ZEa2lfUFJSMTRJcGozMGFyUVZLeHVwa1NlLXdOZDVNUU1yOUp0N2RhZkxfb3p6Zm9HMDF2OFVxVkppUnRGdUxGdmcxSHFxZ2hCaERWMFFMX1NRNjU0Y3ZZeGNPSDRrNGJDOVhPNTlWVlZRTWZjUWw2ZWs4OENBSW53bUdoeU5DQlRSNWk1TkZzMnpOdUhTVTI5UXQ2c1lzM1QwRWdiMkQwWFBldjllLXFDb3dEbERmZUh3SHBnTmVQakdmZVhKVDdsN3ppTzRRcmloenp5Z1JTSE9kSUdrYUl2Xy1LRGo3UHVvMDJ5V3R6V0d6NnlSRkd4TENKeDIwMVVXZ3hvRVRnLUtRbmFMVWV1X2pjcmdGR2ZPeUhfTUhhVXRPMUh6MUhqbFZFMjBUOS11ME9rYlBrUHdUSmEtV3VkMkpfWm9aSXZ2dVljWXdjNGNyeG9wNkhCV1ZuandxcUM5eTN1SXhpOGlCOTRXUlRGYVVYTVR6QXhzRVZQanZJc1E2Y0ZyRXBiZkxwRXBxTTJkWXk4bXZ3cEJpZ3hLcUFybnJ3eFFTbEN0LUg2OEY5cmdtcEphMEFvM2lyWmJuZWlKVTRxcEhTZU1BVlVjN2hMQWRQZDhrN0o1WHRnMEFycU1KR3NmR05wX0psSzk2d1VGSGNpVVZKZ2NvRUNtLUkxR3d0STZaU01oMnJOOEMtNXRidkFrSWFBYklMSXZ5ZTM2ZnZQSzVfU0djOEFRV2hYeUs1Mk1fa3cwZUZRZ2JDNkdQUmQzS2p1dFRzVjk5NFUxU3VQX0EtSVNpTWxJaDNlRVZfWThPQ05TcWpDa282MkF5Qi1UMFpoSHFydEhrTE9XeWtiODRVZzlwWWQyZUdlWFBFUF94TlZKZ2xxa0JCc1hNaWJUUDN4aGdTTWMxdkZKcDBkbTNHMTdxTnVhcG5FaFlhVURDSVpZY1V4QmdnZkZJRmhxVWc3bXg3amN1eTI4eXE2cnNCMXVSYW5YclNhMGlzOFNSTWFLdXg3ekZNVmxfVllhNGkwOFdQTkNNVUVxbU5ySkNJc1lXV3ZRb1lwbDdsWTJhbWM1UzR1aWZGRE9tSHlOT1kzU3BTWDFEOGRKTGIzZ2pWTmtyblRGb09fNDM1akM2enRFN3Q5SVlaYlNfMDBaSzQ2eTNOdXA3TkxvaVNYcGFQYi1ZeVkyb3BEUENBQkQtZmxpWDUzZTZOSFJVUmQ1T19KMk9BTkJmUVFpa0F0ZWdFRmE5TERxRlloZnNVbFFFei11dmFCYjNENTVGak5JZE9QQmw1Ri1ULUdza09kSy1GSHlxVGZYbTNCUFNhUnhOM0FnUkRRZmVoV2R4NVR5WTZzRzZ1RHZZeThlcEJFdm5pT3FWNlR5MEVOdXVTczNZUklXTWhlYlFtUTEzYkM5SWVHbkpQeTBKSWFYUkh6Rl9jeUxpVlhBWDlfTDVwWVJTN080M0NTWWZGSmVianZ3dFYxaGdxR1BTU2Z1a0Z0dW95YVU2cER1dmdaWDB1OUIyeVJfNkNORnB0RGZZSkFxOGhVS2dyTGtfblhaSnBVRE1ZNDYwa2Y2NEtjTnd0VzhKRktHWGdSdDMxNUU2Y0tNTGV4RDYtQzRHLXNCa3c0dXlBNFhfckhweXF3ZkROb1pUZkhXSnFIakFDbktRTXhaQWEyMnNPWTVqQVJ6UEczSzBJUjFYamFvREg5cXpYdUpjN2NOLUZOVkNkRUYtOE1Kb2N3M2Q2VExWN21QVVNNekp4dV9zM3hSMUdaWjExRjkxRWhPUUFSdU5DUHBVQnB3NnpPazFndUg5WnJ6b05lRFVuNF9rT1phOWZHRjJ5LXdPc1JrVXBPbl9MYjZkZXRLOW9nTGxzRU15NnFWSjlLRmJvTmJyUHk1aFBtRXRDN2JpWnRudDBoZjlqTW9lQzBUTXNVeUhqZENNLTRYOW02bmMtWF8wTTBuSmlHY0dnWW1FbHVCNjVLNVgzZzNXYzVHUnFQRV96cjkzRmZwenNNbTg3c0EwYlhqSFRuQU1tcnFkbGZaTEw3WGZSWXotVS13dkhEWjU3Y1U3MmJRRE9jR3J5T0EtSURET2c5S2ZDLW5KOUV1YUFsdDFfY2RXb3FDNW1nU0NlVEN4bDZLZ1dmV3dLd3RDcnVLSEZ3TDNLTVZxWVduVnVMY1o0RUxaa0hwd0pTRTZUdlVzVlkwMTNlVWVnLWQyX0U2VjZ2c3lDXzYzamllZ2dVMy1IVUEwYV8zTzlkVFVNV2RCaDQwcV83b2sxY205ZE5sM1dqbnlHbGdKNlhtNmxVYnBIY2hzUlZRb1R6Z3dEdkdMQ1VfUVBEaHFtaGhYR1BJVi1YYlVMakZSWmRsQUwwa0t5bE9sXzdHODNHRzc5UGt0ZldxTDhvTHBzbTBhVFo0RjZuWWg1ZDZGVTkxQ0JSWGxBd1NIWVpaTnZnU0F4Ylp0Z3RuVDA5UW1CS1lTMjAwbk0xOTZJbEFBTFdPeEZLSndXQlBUaE5sX3hjak1JX1JBdFp6RUZEUl9sam9lbjFPbGpoYThHN2lycVd0TUthQTVWNEtkNUdtVVl4ekt2RGhHaldUX0JxWGNzWHY0LWtnc1Ytc3lNUnQ5UDkzZFpyemlEWTUwZGQwWXhqTlgwYmwtbzZIUDdNUlJvei0zaFJFNzZFUVkzMlk2bFZVd2VoaXpLRTJxR2JqcXgydWlpNE1vNlRhQ29uTWUzRGNqanVzeDA1MjJReWR5TzFVbUtDU2s0YUNmbkd0QkNLb0dlamVOWmczYTNCcndBcmcyZzcxYVZBazZ5Vmx6TDhYRTdZS3FaYm45TGFjaGRHSElTUHh5ajI3QktIMmVKOHNEY0dYeGVMc1FLUTlyLWZyOGFsc2FRYnowV2JVQ2xrOWlDVXZsUlZkQ1JKZXhrOEJPZUQtQzVjQktRQnV3cE5DM0ctTEdRY2FEb2FuanM2UW1POGRqS3NIbGVSN2hlMXduMGxrS3VSREdPdW5QbTNhazJqb0NsQlRCa0R5NTNXMUgxcHRNZzMxTmczSXNnSXlDWkFsd09DSU9sX1BUaXIwcmNPNXY4cXJPaGw3eTh5a2VHbV9teGxoeHNqWlNzeVlZZEtnam1UMENINko0U0JtblhLOWRSRlFlWGZLMmtKQnRMYjRfT2loN3dDcGVZZ3pyY3RWR2JXYTRsYUxuSkc1c3dMZ0ZWMlBMVHM3WUltbTktdHU2b3d0ajROUzlsdzVaQTFKVE1PZjFXdGk5Wm9aNk1xM2c2ZE1rRzRzLXIzWHhsQnpSZkdtOG9mSEdRdERZaDNnSlc1OVVJYTI3cHJSQmRwWU5YT2VBeXlLMVdxSFhldnEtUmdYaE5ubnhyeFdjMUNWbVM2empWcWZpR24xTGppbkw4R2VxWml3U09xcUdFSE5TZWFCVzRwOE1oLUk5Z3BPc1cydC1SLUFndDN1YkVXSVp0REdtdGlNSFRyOWhLU05rSEVCSFN0dGNJa3h5VUtqVjdmaHpqMTl2RmpDdGJhaDJSU1BWeWd0QWVaZzdjZWRyc3ZMaEJYLUpEVWhzUkFJb1ZFOUNTVTA4NTNVeXBMSDFoQnpVdXpWOWp2M3M2NnVwNzhuUktBWGxkRkJfZU9YWmZtcWJDTk9XMXJrem1mdVUxeVBRb3Rpa3F5VGhLZEFFTnk0UmdHcVBQaWRJa2dHQzNTRjZpMUxOU0R6MjJiR0RpTW94aER4eGE3c1Jfc1l2QTZ2aXZzNVZNOGdmOFAwcFlva1pQZlotOVgtNW1XVklCTGdMR3ZOWUQwX2pMMHJuSHJJZ21KLUdOdWRFV3A5UWpQVnRzWTFnUzhJVnFqMTN6UUZKQ1BYRTJubFlTV2syXzQxckFZcmdTTWc3a05kZ3VJY3FxRm5zaTh3UWRsSjZOSFVVTXhZb0kza21ka0FfUURkM3hLY0VwTkY2Y1BTUkVRNFBfVkFobHdsYXV1c2NfVDV3bmJJMU9jUS1zLTVkc1BaM2ZWYTVpcHBHcGhxblk5THA5WE4za1Y5dHViYTVHRkpyMEtWSXFuZUpzalJZMjdCMHZObWFCVmRPZTk4R1AxaURReUFGZEdhd3Mtd3E2MmZvNzlLbUNRZ3NENUxYNXVjdVhuR3VaVzlTWjZhM0g0Uk8wWWtQdG5vXzlRcXpqVUMydG5TdGV1cnkzTU5YRFlSckFxTl9SQ2U4Qk5wNmVrQWQzMEtjcFNBeEhoZ3RVZjJEWk9XbVFpaHBEVnRxSW8tYnliMWFQWW9BcUluVjhnendOb1RYeVNlczJrV2dpOWxuamFnX2JEbGxGU1ZhMDNwcEh5T2xmSzhrLTFIOWVBQjlvQWNBWFdzTEpFanhOX19aU3hsOXdSOEtvVTYyOWU4RVlrVkdfeDBEVGdzR0hUbVJock9jN09tQVNxZHNRckZrdGRiU1lNUEU1eFQ2MkpzdW9IMGRwZUlSSXpRa3Zud3g3YWFJUGRJMVh5SVQ3MmxCRDVZQ0xHdlU3bEFobHJrc0hJVVZNLWMxZWlCNVctd3RHQ09Dc2NEaGNHeTVQcUdXYjc4NVBacDdVb281NkRvRTlPNEQ1LTJvemhkRm1HSFFOd054YndKZlFpNElPZ2VuTDEzR0U3OFBZeDZBalZmSTcwVHl2R0lyTExqcEhwTmtIYVYtQmZ5TkJ3eGpiX0xlWGdvakhzNmRQS040SU9jLWpoSE1LSE44RDRMZmItTkQwdXpjNzk5MGNteXQxeWhZaG44VG1PU0RlYnBEVnVVRnFyWjFxeFZzVWtPeVNWdHVVSldoM0VKYTVyaEt4dEwtdUV1VVVmQTdOVzhYZ1JZaGhaS0g0ZTV4TTY1eFVfMGxzNXhNTnF3cWhMb2xqaEl1XzJzbXRybGtYSkR0d0c4UmFSMG8xRlhEM2FlZXFOYVE4a1VqWDR3MjdqclF3bnVwSUVRQnhLRDR6em5GakVKVm0tTUhzeE45SWpHLVlGdW9xbVFUMnlFV0N5LW52djdXWXEySFJyWFhQemRtOUZvU3Y5aDlIenNrUXFjbENzV1lmTnh5dk10VjFRV094OXBsUzRUQk9DTmNmTEtvZkN2aFRLRmZ3MUt1eEZCMFg2YS1hUFVIVTF5WUozV3l6RUlTb3RTemFod25QRTdlbnhEQWZGd2VfTm5iSVVqM3JsR1Awd0czb2gyZU9TN0kyaEJMY2JlbVFHWUtXb3ROeWtrUkVnLUh0SnNINUFfbnVEZHF3Y1NHdnJQb1k3OFB5VnJESFl4eWNqeGp5di0wc3lrUXdLdElXWWRzODJOcnFjblJ4V1ljU1I1aUZMOXVhVFhqQTlab2dJbi1HRGdOVldwTFZEcHIzOWlLczVwRmczUFFDay1YME94MUYyUVJqTUhxWXlaaVlrTkFMRHhjMk9QaGM3S3BjT2hva09TWXVqN3c3U1VjZFN4TnpaUGhUQ0ZueVBrZzNHY3kxQXhudUpubThHWi1hNU43a0dSQkQ0YW91b3FvR0JMVndDbWpzTElXZkEta2c0NmI0ekpsSlZ0ZTZaakd1WlFCSTB6djlORDctTU5ZeUowVkxvallZNWhPMWx2cWZVRnl4YVYzWkJpLWNzMEFiaVFaYlFkbk05ZXR0YUNORTBLbzFwV1NUQTV1REhpbmRZMldGR2dFcDJDbG5sd0NfSzBNczc2S3hQYUMwdDlSSGRPOTllZndxX0syUEgyaDh5UnVfMTVWbUljemN4U3QzNHd4MFY2MWc4anlYX2lvdXU2Mm1nQ2QwTE9IaG1VME5SbmdTTFNyV2hUNnJzdlVFQURrRmZ2XzNSQWpleVVvLVJEYm9VSk1hRVFqTGtiVjNfUEJNcUlwaXFLR3U2VDJvLWlTOXh3VXVEWktKMDh3SThkUVpRUUY1WllNMjBscjNSUGpNR2E3aUZzN29JVHVTM1FmZnVkdFQzenZyOTBweGJyVXk1YUZ3YnFnQTlTNXg1bXlWWVhPUExqT3N2anJkMDc5SEFWWlVNSnZVWFY4UElVODZjZTBFQmNNN2lLX3BTM1oyZnNXOGF5YmJNS09aS3NTSWQyY1BnWGl2ZVpzSkRNNmZMcnVNTXQxV21paVBvMUZHT0JfNHpGdHRaMHJ3VXFZUkg3XzFqN251TnBzTFlwem9EbE9ydk9wcERYdGsxeFkxZGMydFlJaV9ndkJwNkFXeGstWGJGMlpJemt2WmVjYmFLam51eWNFeHloUUhCTVU0MmhYN1gyUldqM3YzTmtNeEJOR0Y4X1FKRy1SM3NMdEdjVTdBYnlsa1hzSjd2dmY0UUJCaVBXNmJMRFR0bS1ZUzVCQW9QT3Z2enJ0cFQycHg3OGRLems1OUJCbWJOaDFsQmpES0FsZ1BQWFl0RS1GckZCQkdNNHdlcHZpZWpYWDFwQTF4TkItWHVIcWRfSkowcS0zRno4dm9KbWVuY2lYN0lIYWhkVmFOeDFIcEQtN2ktQlhnck52VHUtcjMydmJwNjRxSDk4cHdSOW5mQ3JZdG01Rm1XZzdITGEyVEhXU1VVUV8zeGtEUkFwRWlMZ0l5VUNmRDZ1c2NtTE9TYnZZZDNYUFk0Q0ZTY1Y2U2l5d2tIcExQMVR5MUtjNkhpeFdUYlVLSHR1RVJXS2dURWVuSm1nZUhRQl8wanBRWjlqazFUYU05UHdRcEhnMUVnOVN0UXBqajZpTGVvYzFGd2FXejZoZTZHT1plVTFTYnFaZndJZmRISXcxSGdldldCU25LWGFYajlZZjJpQmZkQV9mc0piVEJBaW1OcU02dl9aUm9NMXZYTWNwa2lsREU3bUlSVFlBc04tSDQtc0N1Z3JMdWZEWWg4T3JTUkwxdjRkZHZnRjVQQ2h1RElvZ2phOU02b3pMOW51YkhhdEFUYUE3dXNGeHVsU1VZT250T25sa3I2SVdTRGhhTXJGZnd3d1lxUFRUUmNfQUdvSkdxQkx3aFJBb1dWTXdzVDFqRTBKMkRqVXk5VGtDcTVlb25IcEJtRndka2FyaFZoYlFTMXVsRlF1cEZ2V1RqTnVfYVg2SnE5SXRvRmpQdHd5NEs0cnQ5ZVRZR2JNUm90MTF1MW5UVjV2VlBmcTBDaUJIV2d1RTY5bVd0TmJFOXdZLXZJTjJUbnN3RFk1dVNSanl1YTZ0dlRkTWJEckhlS2hOZldkWTlLZHp5LTJfMExiQnlvRDk1bEpKVE1lRXNLNTFlOHdJbGo1MkNWN2I1cHlhV0cxbG9LUHNDSVBkVEt3YUNscC1tWldibFVoRjZjYy1HbkRzZ1pZVHNLQjRQY3l0eG1zNTRJUE5IZmVLV0xWdk4xSnozeGN2b2lBN2ltdnBmZHdMOFlLZEU3WHBLbzNEVGwwcDR2WElFSktxQUhYYjhuS1Z1Q3FoUXpFcF9McGVTWnN4Qkx4N2J3ak9qU0w2TmNwUklnSUYzTEVRWnZSLUk2NHplN0w2UHZXZUszSnFrUEFRYXlXUDlXQ3ptaldNWDI1MXhTQ01XSllpTE1ZNEtqMk4ycndZd2hWS0lBelFaV09xQ0NyYldFdHBaRDFFMmJMdlRDR2hvSmc3Z1E0bVNKUmdBZkdxdmhHQ25XR2ZEYVRBYVYtWHozV211NzdkTHhrZWFYZG5LYThHUkx4akhDSUNhLUctZjE1QkFsUU92eExBT2NXNFI4VHctS3JjcmdiNHF3d3FNei04UF8yS0lRZ0hBRVlNV2xjWVc0aGNzckR5T2hjekkybkpXcDFJYzlodFo5ZXFxY0pjWDJNS3I1bGw3X3NndzRBS2lWMVNoejAtcDRWMm5oREVmemZzX1hxX0V3SnROUmlwOWVsdWZaYzdVTFRjcW1MTWIydEVnWExKbDBJMnNiVlhESE5xLXZ0dmpSbDBYV2h1MVkwd3V2bnB1X2RJbUNDYzdkQ3lCb0ZsTktXTjJ3Und3V0JwaFFSNG1aNWpRYlllM19wU0hsMXhCMmNMM0RRSlhmeFJUSE9kdVIxVmdCcVVoYWh5YkFkcmUzc2hXa3l1UU93dkdMMGN1ZHVCTXowNjBHbFMzc1lpeDlPTnBmZzROQ3RhMXk4OFVnLXljWHFJVUNrbFVDREhGUWNkYXFxbVg3SHMzV29Ed0ZYYXZfZXVZWkQxLWVFdi1YSzNnUFk5U3ZRY2NnVkJsQk00azUyalNDTGQ5bkdpcF81ZFVUd2I5S3NlMmlLMUZWSDdTM2YwZHZNOTliLXloOGdwWnZFcEFmMm9jUXpjM0VydmQ0dGdrZkF2dGk1ZVQyVzFxNVBSMzByZlhVRnBuWG50QUd4anBmdnhRN25LQUNmT3VxOHZHempGbnlaVFpfRkRYakxBLWpQNEpoZndLMEsxbVFxZHVzaW44bmlJNm5IbVMzTVBxcU5jaGdHU3JfRGxkMFloMjZrcTZjdGdDU3BYcHE4ZmJBR3R6NElZT1dmel8yUG45c1QzRUZ5ajJySVNZNjYxanNNNi1TMDY2cEdKRnpkVVRtTHpCbmc3R1Nvc09CdGJMMlBKUmV0cno5M0prbG9YeldXQmpfQUpCeWpHU001MlRWYTNoQ1lBU1NZR2V1alhHTFFIMVowbUFQS2E4NEFkY3R3RC1MV3o3eHJpanJGc1Z0eUh3emhXd3Z5ajJWODRmaTctSnFIU29NenFLV0I4ZktONmFLY1gzSDdHSTZ2TXQ2aHJVdlc5M2duT3JJUHBYUkxObDlHYlRZTXhuSWRoTzZMTDNwa3RXU0lyWFF1OUNheXNlMXl1Q0pHWXVWUklXYjM2SURpdmZzMmlTWFRUWVBWYTBuRjZlY2hJUVFNQS1iZkhuNjFEVVlmMXVLUDB5a3haOEpvYVBwSUozRGpDenZUS3d0aFlfUHBSZ1J2d19OMi01akRxQTYxb0hOYWRfOHZvbjJTc2pIelF0ckI5WmxPRDZmTTgwVGdDaXRKajBuUFFPTTAtTHY4YTM4a3lwRmtJRmRpS3VGbnl5cUsxcVA4QTF1WExIaU5nVVNWMG02TXZEMVhfVHEzRnFGZXE3c1Zld2tOMmR3Qm5HemtYR1R2Z1k4aGNoR2VMeFVGWEdOTEw2U2NRRk50NncydDBuMkxvMllRdjNhanJkeHRTUG1iTHJXOWZNekFLZEtFejBMS2RFaDZITUs3Z1JxWDhzTlM3TGlIYzExUlFaY0swemVmR05HRDlTLV9vbWl5eWIwbnQ2SG5yZS0zWEFIZUFhelVWU25HSVA3eDYzOWxSMEJxQjV0blNpTHVJU0hMdTl3VmJiNFExQjh0aXZmNXRjalZuX2hVTkYzMEhoYmVvR0xFSVpsNWh0NlJmVzB3Ymc5dXJQZmlmc2hLajBXem1HTFlJV0hYbFdMWmRWYWFNZm05b2ZYVjY0RWxHa1JfWlg3akgxclMxd0hHT09RWF9MV2I1WWktOGU4QjdFVmFYeWJZMVlDME5rWWFJVnF2YVZpUzdjQlFWMk9YX1lyUWp3VTc4VktkTVNsNnBrWms3emdObkdfSEhLUzBCZzBSRjZQYjU1TlFJREZiUGQzM1RreW0zTHNqb2xybjZPV05Pc0NJX29lb1h0SWNMb2xJVElVTnpSaGM5WVdrRTFBNEVtbkx4MzZiaGU2Q0hyQUtJcWlNb2tOZkR3UjFRTUZDbVhfa2FyZ3RjMVozOUEteDRQN3JBWmRHR3NIaV9KQjdNczRUbjQ0Vld1VGxvVkZpZkREVTZHemloXy1EVThwWkJxQkxIeFpiZU9hOThKZF9pdVJJX3JhZm00MThLNExLVzF2Tkp4TVJMRktmZ2pMQ0RaS09NdUZCWTdsclNzdDZsWEpOdmctNzVMY3REc0s3U2hGcGNqWGhrVl9KZnRHbGF4LUVCNlBVYVZsbzdfRU14b2p6REw0MkV1SW5LYWlOcVVjb2xfTHoxQy11UlZyVEpiZV9iSzZQYUx5bEhYRXJXYV8wMlpvOFg3bEpfeUtQakY0X0dydElzaXRySE5rOVlXRk05OHJBVXdNZy1sTkJtNE9kdlZDMktXTEN5Ml9pTWEyY0Nad0lYZTIwZ0JFZHVkUm1YMEFtSjNaQXVFVVYxNlVwb3V0bU5JdGppbUJGYkZtSzVUb3BmSzAyTmtqeDNHWFJuc2ttRTFVcHoyRDBxWmVvanZCbndmdUNibm5rV1o0bG1NRktrYlNYa0ptOHZLVTBrdk5rRml4eVRsSjMyU21QUzJaYkZlUlBVd0lRcS1NYWh0d2dqZmxkUHAyUEo0ajJ3bzdZS09RSXRmUGtaSzc1aVhmY3ZNV2xPUDlndVRmU3MyRU1BcGxHUzZOQ0RWV1I0Q0MtSWZMQTNQdFZCb3pIV1N2eUU2WkNWS0FGOGhaRVBnVDZSTVNMUzZVOWxacXBDTXBfSFZGY2YxMzBCT3VfY3dDbDNqeG94ZmxCMmZDZ0hleURYWkV2NzVfaWVEdkdZeHhnU01ldkZiMXktMEZqODNYNWIyZzN4akUwLUo5OHVZZUh4YzlBSHZwY29ySFpyd204VUZDdTdGS08wZHJWZlhzMVUxVTlGajJuZ05oWW51S1FOd09vdWZ5THJ3R0lqLWZENVVwcFJSS1JSdU9DY19tcUxUT0k4Z0Z4SXdIUkZiTkhwZGg5NXZSOVNyRVQ2N3pxb2hvSl9XRXhFaTVZbFBvOVAtbUVRdXZ3T0I4OVMycHVIenV6Y2N6UEI4Q1c0RGRTSlRGZS1zMkFMVHl4OTNBdW4zWUlzcXFUajh4cGlBVGVjQ1JLOWpHVkxlalUzc2VJelNKRlRwcVVsNFMzcEphOUxCQWJEQlg2c28yRk91d1NfS2R3WS00UnB3MFJEN0o2aEEwTDNnbUI2VEdOOWtNbkE5aTJGQ0J1ZUxtYWdRWmZDaDMzRHpuQmpCVW5CMFNUazhOS0c3NV9ZRmI2VU1yenc2YkNZdVBZTUxZM19QNHlEZThxYURBVS14a1g0bzVrVUxyYnF3TDdhQzdlZng3Vy10ZW41aTB5cFdMT1M0QnFQSzJBRTlZQm1RRWNKblBKMHVsSnNnUDlHeV9ITHRUZHRXS25teEp1UklXVEtXVGZSdDNUUjYtSzFCSDh6UTZEaEx4NksyRjdrVmJnTTBUN0VwMldwTmFDd3JPdUlsaDNzUWVKU2JiQ2JSSjRfM3NFWVZqREQ2MExaQUJfbkFRMGpNMmlrc0JaUkFMTG5CWDE1MFFoQ1I5Q2ZmaWNXcFphdEVHSE9CbGVmdUUyaGVXSVJ6UDRXajZrU3RUamlHWF9MU3E2Y095RG54d25uajNXdHktMU14dEVwT1dpVFQ2VWlYazB5VnRabC1SUklyUkNlMjBSM0ZoSVZVLXdBeVRCRi1Ec3hLeTB6TmEwTWRQUTlJLTdtdnNTdXlSRldDalVOTDJQcDItYTFkZE0yQzZhTzJoVkxUM0dNaU00VU9YeFhpajl3aTI1eEllVkkwS2tzQ05WS2VJOHk5S1ZzVDZyV2JfbEp0ZGU4WmtpQmEyWlZhME53NElsZnVLV3VDbDVBaTlSQ0xfdUExM0ROeElUR2oxX3FqMC1MNTg2ZnZydmg5ZGpHSU5pM3ZCaG1BRl80SFdEWXhVdXRPblo2SE5VeFoweW1naDFINFAzbm94WXpZaXpYbFdmaFNMcTgyM3laWGFnc25JeXI1aDNxUU5sNUxQNG9Ebzk0MlNmZTRSVDVPU1l4MF9QV0IxSTZZMjhuQnItSnAtT05zZklMMGFhaFFhQWhTZXhKNlBKcFNvVnZnV0pUb1Vub0c3TGJqcWh6Z203SzgtajlkaHZCcjh0VGU3ajlRWDh0Qzlrc0NveDNMUnJCZGJXdEVQbktpVE5ESFJ0UGF6SGRIT05wQUpxVGdhbV9uSnY2bzBmN2lzaTdjVmhoeHR1Umo5UDdKeFMzbjlLWFFBVVBEZzdod1RNWVJ2b1FjbXptMlA5encyOUxNNWhyY2dtSUJjU01GX0prQ0c0VEExNFBvSHVUbjEzNFNKa3laWVBfU211Y0hCcTEtT1U3SlU4UmdJSmtzazVmR016RHk1LWVPc2JhMVlxcDB2M0VLaTM3S3ZHeTBoOWVtd1FJclpBTXN0VE5LS2NPZWJiMDhwV0pjLUpYZzE4MXhMZ3dYNnZ2TEo4VWw0Vk5Hb3c4enZRa1VCUUxlUnVRNFlmYWFrdkVRNkVLM2RVYlZVdmNDekZmMVdMYWdrNVJLRmcxbWd3emlrYlJocGFFaTVLVWcxR3ppV3BPRkRMbTJrWHdIN1o1Qmc0OWpBZUFYRWMxVXhfWVlqaDV1UlVIYnJsc0ZFM1laUDVrVmthSWxsOEhBODR3U1kzaGlkeWEwN1QxZDdZNVlWc3Zwa1JuOU5BNUhuU0RaR0phb0JJWEd3b09oQnoxYUpwUFJOTVotMi0yVmFxVFZTMDFheGRZWjlKMjZPOVVhdW9EUkM5OWNJU284Mjg2T210QkF6bDlhRUhZTVR5ekxMOWtRVG9fVFJQcjRqLWM2NkhUSE9EN3J6WXphWnNORTBWTXNldFU2VVZnN0Y1elRHekZPZ0hUdllicVlZcEdEVTRVbHpFNnRnRzVhY1FrQ3JsdURmZ29Yckg0WkVxbnhiQTlZdXc5UlV3NVhfNzdvUVQ4NXZJeFJySDlWaGs1ZUpkYWdMc3Qweks4dWc5ZUNOcTJfaW56ZkxJMGFjUE9jMXdkUTNlb0o5b044MlNzdHpOV0UwVnNCXzF4bWNYV2d3Nks4SkZmYVotX292V0xaV0Q3NHhud252SGNMUlVlSlBtbmFOZ3JaN01nbXk0ZUxobnpWM0I0WU1aLS02VF9oT3IyNEtCUUtISDhLc3dYTFdqSjRQaDJwNjdyVkljejRnV1lKYS1yY3FSdjZreWVJRDJ3TENvaVhJaG4wbThSanJGNWt6anFFTld2bF9EY0QxQnY4Z0NjTURrVVJzSzN3VHVvemxzSmFfWlFsQTNneEVGOE90dTFtQk5lTjRqUHM2Uk5pWkFhZlZyNnRuRjJ0bmtSNExVN0pYQ2JUOVM5d2pOcHdBREYyaThhdmFLdHpPY1BKcnJWRHBob3pJTnYwZktQQjcxVmRiYWU5SDFQVWI0cjFRMzlBVnJZeVdUOXJYbDRFVC1jVkl6M18tWXhsMzVHN1BvQkFaU2w1VWRjWUFJUFVrVXFYdnJ2RlV2UGZiTFBkX2VibEVkX2lhUWhQYXB6WnhGRUNsRk1TX01RQll2WFZRQzZvSlZqX0Q5WjhWNm56S05tbUg3OU9VeHVPNm1DTHJSZDlfdVRobGpwT2ZENEFMNVZDSjQ5bE45cXg5NFlaeGp3WGVDZDB4eUl3OEVDSm9PMk51NDhrakwxeFcwVHMxWmdocFpDM2hMZ05TT2QyVUFJSk16TGhhb2FaVERHRkhJTC12UGtjS1RFTGpMcG9VbHNYWWl6blMxRkMzQlpMWDVoQ1Z5aEd1UHBQaWl6YVVJUXJQWDlKSkQzdVl2U3d4V3h5eEJKR24yb3pSR0VTbVRhZml4TjM1SE1xWmtwd05RaEw3MmRpTlhFaFo2cGtVU2tsRnU4SF9fZlowY3ZqNkxzdUVfOTJZdTBnN2VsMmhmTUI1QlBIZDdEeE1aeDRKV2VYT0U0eUhCMXQtYmdNenZrdDcyby1qODJJZzhpd2Y1V1IyU1FxcUU1Zk9oSU5UUFZjRzRJbFVWaXNjRHh0N0xzQzc3QS1PVGVValVXWERnSjZrOUpRU0puT2lFOUFieHI4eGx4Zi1jZWdNQTlxaVVqaTBSb1ZrWlU1RFlLY05nOW10b3QzLXZwdkxfT3VmRHZ5MlZLdXlPR1Q1V0J1QWtCeGM1REtEUlpPZWd5UDFvbXl4d0dhMEhzdnlua3BfbW53Vk1OMmg4cU84YjNwUVZSd3NrSWE5NHBoRlJHNHBBOXIzeS1McTlnbGNwLTdoMzlEdjZJdU5KSjhVdDJYZnAyVW9vQkdZZ1RyeFBoSUUzRWtVcFZIVE9VQmZLc2N4aUZMRnZVR3RfX1NpTUhZV0JSamEzdlZ0cS1WS2JFMU5KS2s4c3JhbExTYWh3dkpQeTdxUVpfQmRza2pVdC1MTi1abThnRlY5VXVVSVNzNkY3UVdNTUY3TlI3eHpVQVFsblp6SXViYmJGTmZNRllwS1FfQ29Rdm43dlJSRURzeUxHakdpakk0bVVDX2YyYVFheERSNzZZVzJKcTRxbEZfaTZ5YUZuWkJGSVNmU2Z2eEhZM3dFUTFnLUFQUlFYb0tnT2diWkcteW5GbXQ1UkNTaDV2enJIUVhuemYxTlJMRW5ZaHVNc3lEMGtPN2dsOS1Gbmh6UUNVRnBmT1YtcFFzeGswaUVmdThVN1JyWjhMeU1oNzhGOEk3WWtsZjltMUIzRU5UNDAzaWthZ01zR3BNTXVfQWlMQ1MwVGFfMjZsOHp0WTNvSDlPVDN6dkdPaDFaYzFFZ25nNzF4Qk9qelR4VDJSLW9BNGFnck90dUc3d0JiM1V5ck5xZmJrSUt3bjhBdGt2Smk2QjVtaEQtazloVk1BaWVlQ0NDT1ZNRzhPR3FwcVpyTkllY25Ea1dnV0ozanhnd09SbFppcmpnU090MG9NRWdhNVpMdGhBREsycGlZSUtFSU50QndqWXB2R3BEelJIbUhoMndhSDdZLTRrNXVuaTFSVnFEZmhZRF9XUUZ5RUFUT0Q5ajRLSVZvRlFTSmpsQ3h2UVkyUHA3bGxud09mQmIydTc4bk1UVFpSd2tVdlhyLWdjck9wSHVnQ2VsOHowaklIdkxwOUxCOFBwaERxVWVhUGdnd3NvMklfem9LSTNhT3FUdUtDbFdWbUUxUkk5OUpBdHQtSHk5ZFU5Q09Tc21Dc29Pckgzck9zN3pFNWJtdzRvUmZoM2lXX0tUV3U0cWdGSGRqUlIwUWU4T3hXN29vX2piYnY2Q3R3c0ZkQWdGN2VOQXgtSEZJUFIzcC0tQjNBQ2pqTm9fLUNZdnNXWERpdXBpNER4SUJ2T0lnRjIxaEJWN3R6UHNxYUlCSDV4VzQ3MFluSWJLZXdZS21ITV9BYnB2bDRPODlDRnBFdVktVlA4LWhjMzM5S0JtM0NFSTJNU08tcnVlNlNFUlNwWWdPSVM0QWJ1djVxXzZwNDdOVzFhb0R2TVRXeHhEYjV3NWNiN3k1ZEJCd3NBOVFzODFwNEx0LUFTVkVqdU5QSU1JV1ZISXJJQUhnZEQ5Z3hvSWhUUjVZYXUxNTloYUNjWm9nUDUzalhCSURzRUpBTmM1bEo5MWtGTFQyV2xVSkVWUkJCZlF0a0lDb09hOHVaZkJCNmdBV2h2RUs3UHlIUzMtTmpKX0pNT1V0STNrZnFkZkMwWEtYVnpwVXRkZVVjZUh5M0dRQzlmYzFpc0pVbWpPV2YtNkUyR2ZMSTJKQk03WWVNbHNWTDBZeFVEb2xtZFJkR1p3Z0RGYlJkTGFRelZpYzdzTkJRQzNMZjBUaHFPVW1BMjFhOERrS0c4bFFkXzdLRVFHRDlhQ0RCamMzMzhEbHpYaFBCVXNqd2s5OFBhN3l4M1BjVXRnSzdraV9DOVR4SFlZUS05U2FyTFdJYjFNZnJaaTNQMnVFN0JjM2puV1g4b2loTktyVTV6T1czSGRFRTdUVDR4TGd3X3NLNUFCMkV4QnRINURWTUpoSGN4bnlWeS13XzRtVW1sTzl6TlBVVnJOSDN3SnRzalZXemNOV2EzZ1NFNlhoVWRsRzBhSmh0TXhjcWV0U0J6ZjVMTXJKWnNIYU9fV296d2dxcUhaeDhaS0ZwWjVKZkVlZF84UGFCck0yMFhTV2NmZkVHRm5ockVvY1NEbWxqSzk3ZXhNamJhVVVhZmU3QUczVzdyQUdKTmRUb0N2Rzg5cGNyaXA3T29iNllkajAtOTdoaWtKTHM2RmJrTlhOWnpGVk5Rb1lVdzVXSFRiX3kxNkpCTEhxNTBSX2czcV9SUDA0ZnYxSUJWNEI1dTlQbDFUZkpLYnlyM2RNVXEtX25PMFVnVndXNU9ObHUxNFV1enloaWdaLVZHOWltMVR0a0tFcllzNmNpSlc5SDJ1X3NDdFVRVjQyZVU2ck0tSnFvN2hxM1hkTFEtV0VDV0hQMVVHOGFTZVpIM0FhME5qSl96cHZkQ1FvaGYtMHNfRkFaTXVJUUplSDNnTzE4SXVVX09zWFFXckY3Njc0RnB6WTRINzV1MGtNR0NRcnB4d19hRmU5dm5KZ194TE9uUzlRcHlZalFVWG9mOW5CcGRveEpsOTZYUG0tTk1uWUJNUUdHdGlkcGhDVEllZGlWbHhzZUkwSHlJRkkwNDdLUExVekFsRktqaEpkSTRuYklxc3dpX3JvM0hpbWNfMk92ZUpoV1RUSVEzVWtWYjJvcy1Gczc2VmZ2Zk1sMF9PX3owbkNWZlltdWtvN0Y2Z3NXaDZ2cWx2U056bFJvSldnMGFBTzBvSWdHbVNKNHJIYmY4MUx0b0p6c3JvTy1USGdrY0lpa2tXeU9VXzhGa2RkS25HVmtfUmZJYXd5eTcwa052d0NFZkpoeEh3MjMzS21vR0liNi1mTWlnejhOSjRYclV4ZkhWQV9PVkN6OWlqNFVLRTFudnBjeU5rRk5Oc3NWc3ozLTlsVWxpWllOblQwWUMzQ2RVcngycFFZXzFlWW5JWVJ5cVREMmV2bXRhelFkblFqQlRVZmxaUDhfTHk2bHZxRHBsbjE4WEhuaHRxLUhJeHU1ZHFaV05wajd2ZV9tcS01eDNTX0l3aEFXUmZaSUxFZGtIaGRnY2pwVm0ySzlLRGdZc2FEWDlYd0tXMG9KTUg3OU02OGhwdVBaU2RETUNEbk1vZS1IS0RyMmp6V0h5RkJ2ZEtLaFdIRVp0UUFVVzZWcDQyclJraDVaOVM0TlcybTV0SmpLd0g5NDdJYXg3cTFVT3VEUXJ2NHJwZHBMdFVwS0xwQml3QnlJczlOdThEOHFqNDlNRHJpd3VEQzdoUHlzS2VOLTI0U0xXQm85MzB0aVF2Vzd0X040RXFKUDBXU0tuRkZHSVJGZXpyOW9xT01iM2ZuMzNteUJpdk1RQmZZV0JoVERJc1lwS2JYWmhrSmtXUEp0TzNZZUpMSHZ1RXM5cGJMRGVuaHF6bF9iX0pyYUNjMkVSbE1YWXNTTk1mYndoNl8wcHBGOGNCOXhuaU5NbjVJTi1tRlZ0VXFQUWxNRG5zTVVZczVFdU5YendEaVVBSnlGZVYwbl9nYlFSUWhzckRTTWxDOVlWSDJTN1o3UDdLdVhRRlRjRldFOEREVk84MVdTSWJSU2JYR1pSUVFiSEJMVmQzWUZPaDlSRS1VNFFZdXJubHh1UG10YmxmQkt4NTgxcGtZSkZyUTE4NXhpOUhpVjhObnc4MHF2RW9UX2pOa1NnSE9vQmlmODVGd1RUOTBPYS15Rm5nclkzMG95SWkwd3NDS25adWdQSk9La2pUN2pac2hEWFZ1dG5EODlGYUJpMTE1emt2ek9lT2R1eGZTdjRUSmp6WnhxT0RoX0EtdjUzQlJsTWxQWXpVTWxZSVBYR2RBM0lCTnFWNHhqQXE0cEtwcXhYOVlrMm5TOFVjMGJVMGxGeE5PanZTS0ZZU1l3M01tRVNDN1NEZ2ZWNUdGcHhCWHdNMWVlZTdJV0NzV3RjYjBCcG1rRVlSaFh6Z3lGU214WkJRQV8xVE54c2dER2hJZkQ5bkNCbWtJUW9tdVY5YWQyeUNfQU8wamhoNTl2Z1R3YnBJajdaY1dIVG9oWW9CY0NEVk9tVm4wZ2owbUtiNjhSMVBIVXhVS3pFSHV5dXVtVFdkQUlPaHdrOG5sZjlnUlpGY0hwZTZxdDQxdVY2X1ZZTHpVNzJ6dVBKUGM5alpsSVNMXzJZa3ZLMEZHZTdXREV1U0RrQWhZLURSaGdSdjhsNGVPdk80YWRPNk5OVm5jTVFNelRSSGFyOUg2dl95OUJHTnIxRFU4c3RaNGdOTnpnbHFveGZKUkYxbkpUeWRSWTB2MVNHZVM2cFBnaGt2VmtyaFlyWFhmZ2xFUEw3QjVsdHJwQ0hMMmdrcnZvNml3azdUMnVqSzJQV3ZNQ2IyeGFnb3lCQXk4NTlVTjhGR2UyY0EtZWRoVENFeWRjUVFrNzRuV1N2Z2hKS2VOUkNlV1A0UHJ1ZnkxWDNaNXVKTk96em9zWjdJdm1HTnNLTmxacHhqaVpkcU1MTEllS204aUZZTW83azJ0TVY4ZnhOVk5KNGtPZTIwRVFiQ3JZNkl5YU50QUhnRmJ5aVVOb3lwZ0FJampxZGpmeHVONXZLZzFJUDA2OWdOUmUxVlpyMVpocTk1dVM4RFFkbm92VkNvdEUwV2dWMFJxalhPNzVvN2dIVjdpQVN6V1VxY0xtdlg2dnl3Z2hxQ3lzb3NWb09IRnNUSThVS1FmYzFsaUIxRGNLaHFFTnA3ajcwbVVNU3RjQ0FqdG1GeU9DV2dqS2dWTnFZRGRjdl80X3BoeVU3d2R6U05DZTQ5U0k0ajMwLWQ0cE1kVHVBTC00cHIxakFOUGJrM3A2LUtGRU9wdFlsMlJOajctT29UQXpYdnlxeXdnMHFpdlJyMnRmS2w0Ri1PVThzVTZTLVlxYlV1eGV1Nm1venJsVFFpcS04Mlc2alBhSVFJX0NqdTZYb1EweWJwMDJuY0NHLUF1clV4NThUUzhHUEY2NWNteFd0eDdaTXplZnRfWkxPOFZYbkt2VzEwcjZQVFUyNnYtbXJfb2ZXalkwTk0zWDh0ZWcxcUJYNmU5Q2RsMFNTdTkybHEycmFIVDFUVzB1WWJXY2lhMWNEbGpEa1FJby0wZ2wtZDhvWVJmeFhKVXR2bzZhcDZqX1NJZloyZVNETTVZVGs5X1VubERBV1BmZjJubWNUR1VUeFJTZEhmaTJ1TldGYUE5MHBMTkhINnlhdFZHYTZDa3NBdzZFVnk4R3pYQmNyMjNVSGVnbDNGaDl1R3pjTmVZQTNSYkVrc0xyWkZ5Uks5S0QxaVU4a2JvbkZiQXk0NWdYSGlOdFRpelY5bWh2Vm5NTjJjSU1POVJVZ1A3dk9KQnlsZi1OTFpJYklFSVlZRVdYeV9rVHRKX0dBLTZVV09OaGVJNVRVUVQwX3JTd2ZndlVtbEVkRHFhdXY0VkFxOTFLMFNQMVExSFZPRm5JcmxKT1VJdG4tZDVVNVpPR1d5WGp6aHBKUlBBT2xmQ1dfQUVjUVlNUlVoQVRULXNraXdId1F6dGVpSERqdFdrdnE2dzQyeXJQUG94UGpQT1Z6YkVJbkN0eHRuZEVHcjBfdjNFWGdjNWJ6TTV5RHF3X2lSVm9qdEwyRDNLaHRiUGYtOTNqVnQzTWM3eEszMG91M1pWeFJpLTJraVVsWGRKRTRXVk01RUwyaVotODM5ajVSN3ZVZV8xOGw3eHYtbXB1OEdxdUVuQnkzNTdLV3J1NVZ2S01GOGtwMWxpZjhEX2VZR0ROOXVWRkVXUl82ZHB3LUJ4eExkZ1hzNUUtUm0zZ3ZzVjlfMU1aZ3BWZ21mOVZoYUJIU3NhQS12eHhJUkVhRGV6TnpjTmk2NW1wX3NvNVVQMk44V3MxbjNTN3lXVFhIdFpHZ0RKU3pXWmtWNW54NkMyTEFhb1pxc3UtaDRBNWZFSE1YNEFUNlgzNEhocndlZ09RSGdDai1rZUJtbGtyYnQ3ZU5qamx1U1JwVk9aNF9Kd0U5OHBtNjhUWnpTZ1NkRng1ZHJ4ZDVoRl84YVJTTnVqcmM2SWxpNFhEWm8xY2RFVXZTc0E0TmUzVUZ6QWZwaldUaVIwSnhqRWJCZHhnajUybWJHT29HOWwzMFlWYXZ1eW5iQUktTGJKTUgxUHUwb2cyVlpleWFFbFQ5OVplS2tCb3lGVURkX3Y5eTIwSGs0T1BqOFpfMkE4aGtBNFZTVEQ1d3dva1Y0TGZ6UmdIci0tWllGRFY2VGg1SGQxS2U4aVZmRExtWVZkbzFObzQzcjdSaTVBcXpzMWZBWEc3MFF1SzFnMjJFd3lhaGRVRjI4MHpWTmdxOU9mQUs4RENPa1dKOGNXeFFMcDhFanNLYV9xZlJDc0lQbVQxMTcwRWNHM19FRXpJU2VNSGlCLVZRSnBEVmdnZUwwM0JCOWZsX3k2RTFlQlFXanA4OHQ3Q05mRlNzdWJHSkNJTlNpUmcyRm44NVlZbkZ2V3BlRTlQdjRRcWxYNHE0NERSc2p0anJSU0RHcmFaZDd4bTFCX0RUbzNLUTdPbnBRa0xLWVhydlBOUjNORDJOX01UZWJRS0NiM2RJajdURUNYLWZKZ2RRWXFhZG5WeG9UWFhnYUNaa0xCX0ZNMkZUWnpEYVd1V3FnTHpTR2o5SWxpSDhhM1dXbVpkR3NrTmdrdzRpcVRYT01IT0hCZGtJcnViaTE4Q2laUWZ6eWQ3WEVwTk0xRXcyazhjNGhFOG1KWVVLdFpCN0tZSTZJT1Y2SFNBRW1Va0M2TnpqNlh6aWFZbkEyQ2Y2YUx0UjJ4eEJmYzRXb2ZGY1p3QUQ4OVFTRjY4VXdvWEo0QzNEWEtqWmZXMzJUeVg5aUNlVUNDRnRTUXp6TVlQNE5vbVhKTVdMaldBMWpibVRtaEdxX05QQV9RbEVOMDcyTUo5d0ZUbEFWV2F3WnNTelRfTVVGUXR4RWZEb0VtQjRFRmpWQVFCY2x1dktWZkJicXFKTnhIaGVzNHNaR0oyaWg3d1YyTzgxREJoai1ndnlFMUNrMThCelRqVV9VWFMzTUNKRV9XR2NaWGJvN1AtY3hwUjkyQlJzcnp1V3E5aWRqS0laMS1mMXNxZkVUZmlMSkg1aXVrR0RCRUdtNlJBNndSUnpCNkpUZGU4WU5TRDRtUVVIWjFYNTdqR0c0SjNFM0JtVVhKVnNJT1dnZHU1REpSdTJTSGRfMDUtQnlDSkdIOHRoQUhwem1sVzFKMTJiX0RWMEwwZHFwbFVNUmx3MlRycE8tTWFmR1hvVHpKUkxPdG5nYzVtZTNKbGtaMEZGVGpTTFYtaE1KcjNwRVZxQmtXRmJaUzVsRFZqa1ZUdzRyT3FwaXpBUzM4MjM4a1Q1TEZ3ZG9KbUg5XzgzV1FXMU56V1VxQm9QdUdUY3p3SmRRbThFdmhsZTlEMDhjSDNFWjZrZ0VjcWVyQVdzZklOU29JenBaODUtSXR2MktFWndKMng2a2M2MmtMV251MWVyNTgwc1BEVEdBMDQ2UUtySDJnQ3lmUkJYVG94eUk5QmhZQ3dwNl80N01DcWpLd0JrQS01dGRlbjlLbEdiMWk2UWhwSTRrUGw3d1ltZnlwRGZXRkg0bTJ2dGFjU3ZjUWhhNWFpRVIzWXNEWDV1ZGRRc2NFRVVQZzV2UnZHeDZZdnZTazdxcHA3OVhZVzAxN1pZZjJtaU1SeVRSejR2R1dnZ19LRXJ6SExDOWRsb0lTQ0pmelpuSEtIZzByY3lEQTUwdzVZT3BPblBWa01ZZHEzTll0SEpyQjk1bnQzZGFDZm80bkZBNzJFb2hTQmtMRVU1aFRJQTJxbjBFdjhHNVlhUEd3WnJ1MFJuMnRPaHJjVzdQWlF5eE5NaHZpRm5xclFLazNhRDVTUGlPbGJzNUdaQU5CZnFVMlJhdEh5WENkQjFxRjR4ZzRpYzdVZDNPbWZ3R214bmtKNi02TjJzVndONjdMb2tsZ3QyenFhVHZpTlpLTWttN2U0dzgyTlZUc2pJMEJacmlrLW5yWFNsdV9MdENqZHlPQXJ3My0zbjdUbWlIbXNiSUtHaWtnOXZOYlNQQ3Jmb012T0lEaWV3eDR2bkp2cVdWaWdrajRTdGtNTVJUZWl1dUMtLThyQ1ZQaE5teHRuN2Eyb0c5cmdIaHhqdDBwU1AzUkt6eVJrUjgwclAyWGdIUktsMlV0SUpqM3MzWXNQWjZMMVdFczBLN3pZX0FDTEVaV0hveDVmT0ZZVkdNdjU4bFdhblFBT1V1T29jSkduOGIwY2NhY01maHFOSkF4cVJHcWljX29VbzJfT3pVMm1kSV9ud25JNTVrc215eTZvaTRZbW13TmR1NDhmTldETHl1c3d2dGlmNm9hUXNWVVAwZXlUNjJwVlVaRGoyT1hvbWY3RldzR0wwOTdJb1duQXVaOTBMdU9kMzc2NFB6cUppU1lxWWlLQmJiZ3BqOW9rSXJQWXd1akhPbjI5cjN6Znd1MTlzOUNqVGxQRGttY01FUUdzeWQ2UGMxZkNhZ1B3VjJxWjZxRDE0U2N5MXhkZkM3aGVFYThRWHZTZmJ0MXFJM2pnb0R0UndSWTBzYnJfOGR2ZjY2djgycVhFTklCa1ljQW9lckp0NFdZTXA4dXZEeEttUFdMdE9vMEc4dWRuMVJsZmJRWEhMT3NESjBXSGx4UUliZ0JmUGE0Zkx3SkJ4M3NOVlk1SFBpQ2NwLW5sT1JjUElkRHdzSWhScDlSMzRkSmFRNDZpckNkS0NiVUFXdnRDOG5LVzR4UURMRGpfbE9WU09VU3d0R2FqNzE2UVhQd1d2MExvNEVMa1RMQmw4cmViS2tsMkNoNWhWSkpxMXJBQmxOeDhBUUFDZFVsU3E3WXFzaVhjMjltYWFVNGFza3U4MDF4dGFhZDlaenFKSDlOVDYwZ0xnS1YteXc4QVdXcUpCaklkQVYyb1ZFU19uVV9kRDZVVk5RMG42eE5pWkpEcXRobUtLeU9yaFJaMUJoYU0wMVBPdnQwNU5BRXNNbnJjeGZEUHdrdUhRRlF1anlKRjRlV1RzVHVzeUNqTXIyMWFaUnFzd3BBNlRjYXExSUt5Z1gyMERMVTdWX0ZhcXk4Rmd6YkNuV0s1OXhqeEtaYTNJekEtWFN6dkhQcXNxYzlTUkVVbE1CbTBQSHJfQWFIVlRDTEdKbVk0UFMySE1iMG9iVjJzRVpGMmsyU2M5bnFRNlozM1BYdTFWSHoyX2dzbTZVcVQ2WVE3UEFna0I5RnJsdE9yVHE3TDJRV01YcFJYdmNIc2VPdHM4Ukt5ZXNZX201U1dtcURuandxVVl5U1Y3T3NVaFFPdjBfVTJKWUt5Y19ZZFNaT0lndUJfa3RIeGx2RTZxbzdYaGh1cnFXLUtjWTNwRHQ3c3B1SUZjQzVWeE5Qck5xbWVYWl9tdU1PX1hjQkRSNGIyWDBXMXYxY1Q5VUdLMXVweENUY2o2ckZ4azJWNGx1UnN2S0lzTXhIVXBzWF9BQWd6X1k3MTFxTXF0V0tTSUlleE4ySkJrM3JiM2V3NU5tT21YUDdqZnlQY0lRUzdQY0FpMXUzY3ZaVThEQ2ZEbF9QQndETk9DVDBEX2paRU5xOFFZWWhzVXQ2VlhtSUJXZlU3R3oweW5JUEc1alVDN0FneVJqRFF1a2lKNWZxNVdZNFU5TEh6Zk1LLW5UaURYelRIR29zS1Eyd3VlWEkwQ3JIbE54OFRnYzFYbWdCcW0wRXhPd2FNMGtNUWw3UlhheEQ0NHR5VGdWX1NIMzFoN0dFQ1JreFZWTi1oekNBS05BLWhLZEF0QUZpaGg1M0lrRk5vWFd0MG02NTVJSnRBaDRaVzh5YjB2VUVWNlVnWGw5eUYtOEZrSnNZN0FvZzB1Vmh1Wkw0ekJmWkRGSjBiMHdvRThUNHVhNVVPbjZhQ3l2bkgzeDd5MDNBc282amFUb0RnRzk0WjhjSXhSSlZTeGxJSE5IaWZ1ekkzWlRiQmxXTlVYeU5wb2tTQmpEelRiS1RzN1pmbXpvWDlVV2ZISFc0RVFMSDZidzg3aldkT05NOFhkY3R0cEQ1WkkxTUtZOWMtQktRNmdPQXRWU3gyb0FucDh0NjhraEZwNnl0T2RmdVcwZVg3TnBtb0NldUFNblUwbXJPYkQ2czM0Q1IySDM3Q1VsNGpWR0ZERDRxM0xQZEUyYzhneHo1ekotS1E0N0J1TWV6YVB3TlozQjBnVDA3QWRQckZ1aTV1cWlOV3FMVnBWd2J6cC1WOGFudEVWQlh3NTcxM0NzZGp6Vng3UlNmbXRrQnFlNHZYcmpGZWZtRV8tN0hwNlg5WUZqZzdDSjZJQVlxdU9aYmVOWWRlNy1qeE1hRVFsUW1xTGtMVUJZcWhfMUgtNERYSC03Zm9HM2VsYmVYUk1OMDVSWEFtT3dTbHVBelV0UlFRVDJ6WHpxVm5kZmlMSWVQMHJUQWRIN1dEb2NVZXFlZklfd0x4TXBnN25uV1k0T3RMbEVka3FsUTdmQmtvUzZ6MkZ4LXAyNHFKT2lXNGxoT1N0c1B4V005VXlsMlVreU1weFNpSW9vQkZ6dUlvSFlGQXVFejBPWTFCREY3b3BISXJXS1JmWm9TVjdsNE5XUElteXVyMmxPSW1xMUJzSXo0LXd4aWh2UjFWejRDMUpaMUpWRV9HQjJWNWFCVk9kT3l5REQydzFQdEdIaWtRaFozZkZLYUpNaGhkejZQTUZhcTVsMHVkTVVGX2RRVW1PdjVFSlRZWUhXQmN2OUlRR1VzMTV5YkN5NEZNMVpRYnRob1FRVThlUnU1RHVWbnZiRUpJS0ZfZlMzbmJHRTU0THExd2NCVEEwMXl0NXFxbUM3SVllendXR0lTVGZzSEJMTkxTbjdXQWR0cU1IZ0lYM2pRMHlLRU45bm82Yk1vWEp3YzhJRnhpMjNRTnhiaEhDNmxPVGdCenRsOWVQRGJNTWlGWHpPd0pIOTdzclRZX3dIeVRSRGZzbVM4MlptOGhxNnc0Y3lKVGZ4Ni02a21ib0YwX2NENXZEYmNQNE1DWFIxZE54WjAxbng1ajFsdjFVZFFVM2I1UEZLa0lkMFczME16NmVYYW5VUTFPSHk1aUtVVjA5b3BtOXhWcjJ3S2diWUdrcTRiMFE0YU5UVzdoSVhmR0JSSmM4VU1KOXRmSTBZdDlmbTVxMkZUdFpTZ2tFb1I3OWE3VHd5OHRKb3JjX1FBWkZxZFpLZmJqeHBWWFJZaWxoM2RXbTZuMERPNWZaS1pJVFFCcUlUQ21LTWZ0WHlsN1JwQ2w5cWZ6T1hOS2NwWE9oLTFLUXdibVBoSENkR2pFVVFqZGJQSFhnVWRhZThfSFpCSWtHMWY5S2xlaUo5ZFJpZjAtTVFzV29JNUw5eUNwX0VCLXdwNlRXRTdIbUt5eGpBc29tYmRRZ1pLTThvb2xQbTBFa1lIbkRMSTh1MnhXWFFhRlc2VzR3bWxWb3pDR2owM3ZsQzFRWEFNSjVmN2U3SnpIRmstQ3lWRHRZb1RoT0lDd2dGSmNLUXcwVE16RFNqQ01iM2NCNnQ5enlGN0psVFRlQzBsYmoxdlBLSXA5TWRxZjZrTnI1N3dkU0dCLW05NnktanRqbnZTMUVBSzM0ZjlaaURuXzlZaHZwUWFEdTZOOFAwZnRaRjJFX1NoOXI4eFlIOGlEX2pzZzkzNC1JQ1hta1p5X0hTUUw4LUtFNXl6N2VUdW9LeFN6b0o3akRvT05vcTM3cTZfbVphUWFGaS1DcndWVGJLWEgyaGxfM0N2eEdQSWczM19Ja05WZUFOYU1lbEJvVUtoZFdZeDhZY0hLY0tnRU1GT1d0Q0lGUU9ZUTJnc2hNeW5BTlVFcDFEcWVJb0p1cThGdE9jbXVBYkJoNHdzREstWDdNeUdPeGpnRy1UR210S2VuN3Z3V3ZJcno2bU9pQVZFZDBaeWtCRkdVU3VlSGNYMlRMUEtSV0FsS2xINnZld2F2SXRzTGN1RGN4MVRBVm94dGVUN1FBaXRSM0NybWZCTG5RMVVER3ZOa2ZER0VHMmduaXJObjVCUllaNDlvUFBIUlFDdnd3WndTQ0pvWlZ4clg4aDBOQlVKSzRFdlZuVHB2OXJsaXBRT0JyQnUyalZIVkxySXFMLWFOeXRGQkptWmNoRERUMDJROVhFYUpURjh1NFRJbG94Vlc4S1E2bkxpQjN0Y1lrQzRCR1EtZmo3TEgtM3RMN3JsZER5bTEyaXF6eGZna2dVc3RXLWtwd0lsSVlYcW80c3p4WG40ckhOZXZXWXBiWlFjek9leUJEdlBvRVZIZ0FCY3JlUkNhblhHMlNtRVRCME5uT3FwanpGeHlfaVlVWXUwc1VKdEQwY1RaRXFRMzBDR2dETTNvQlc2aTY5TlFEQ2NMSDhSelQyUkNsaHZzeEpJZ2JlM05WMG5rQ1RRdWtJR20xOVYzVEtTSTFZejV3eWt0UDM1REFUaDJtWkRWc0pKQmZyZVFaSGI2UkxuUTRHbUxxOENlR3V0M19FTjhiWTNoN0NkbE5FSkdFYjBxN2ZBUVpaaHIzV1Vremk3cVlaNHNReHRYRkQ4YVFfSmtadk5kU3NjcmEyNHFHMWVuSVVzaWF5c1FlLUQ2WE1WOEhXV0MwYUdCcG0xaV9SVWZ5M0hQakVjaDlVNlhKVlFUTEFCZ1o3TW8zTnRhNWhWYzhrWTlwaHJKbnJWVHpKcDViQ3lJU1JIX2wtQmdBbkZodUtGZlVHampvTEJZU2dTOW9pSXluaFZXR21FeTM3OGF6MU5sc3dtcngzNmhPeUVMcUdCTUZJd3huSW0xc0JLa1B6aXFvYVMtcTZDZmxBcUdReVVEVFRiZmtBQzFXYjJGZFp6S3dkbDYwcUhmWlNQelIzYmVlUExqTFFXb1F4WTlNV29TdEFoNVdwSm5YUkY5U0VXODFiU1FpZmdwUVVDSllyalRWSXl4ZXlvNDAtTE04WG9MVWRTRFp2bzkzclN6WXRwVzZkUEJkS1hxb0xzN2JwdUl4bnp4VU4zRkVha3JiaDBJeW91WmZqQlUxeDV1MVN6djFzb0NJd0IyT2hTbUVCOThIY3FBXzYzdlEzd1lweVMtWGktVmpwZlM4MTA5TmZXNGJGWUtrMmp5MnBsbk53c2M4ejJZU2hSTFBtanVjYTBOS0dsVjE5RlFQMHZVVHp0M0pCNGdXVTlMV2t3VWloSmVydFd0a0RyQmJJY2JWWENtMzZRVUtFRzRhZWZodmZ6dGstSUNwbWR1dHVvcmhvRE8xQzJVWHhIeHV6OTh4OEcxSTAwUDFVSndLVm9hYnBZd1gzcHJ3aWR3VFkwa0NDTmFDeWNHTXd1djExQUh2WXNmcXRTd0phWWVUWXB4U1VTZkliUG4xSkVYQnNVSGcxWENUdnFCYlJkQm16eWtIZHFiOENOYXdhUm5ZRDZmZjBRcEx3SFU1ejFIWFRiekxEQ3dudDY2Wno2MDdmVjY4M056RU9yRDhQSjBGMnMxTkhIdm9xa05leEVRSUQ1Qmh5M3RudXpDTnJiVFZ4akVGVmlmV3h5Rmp1cml2VVhqOHlxXzcxTXNQek91RHN0Vk9WLW5DZHc0SmRBckVNbFU3blVxb0xzSDIxZ1ZmcHF3T1Q1Zmxxa1ktcG1CV2lYZlFSM1RYV0dva1pXdE93Y3h5ckVMOXhVanJjNzI4QXVhSmZ2SkVqWUJXaFhXRHFmZi16d1gtQ2UzVDdXd3NKSUx4RWUwdlpNNldyem1LYXpsU29zQ2c5SkUwUTZfRHVMaDNpMHlTd19vSFRvM21GaG9ZMDM0NkNHYmVUYy1feEsyQ2hmd3Mwd2xtbHN0WmFoQWJTcndLQTdVbDU4YlRVZTBOdkVjTWhFR2d2ZWtaNkhTcmNTVzFNTlFYcjNFM2pqbzBSb1BPY2RkMzktN2FNdVdIc1owMkVxaWY4NGZVVEc0VU9IcHU4UXF4Sk9WQ3VrR2pkU1VDc3E4b1duNVM1TmRWLUU4QVBQOXFuTW04TVhKOWdKT21fZUZjdm4zN0Q0MjUzSldXejRDd0NVSzFsTW5sSDhjRV84T1h4RGZSbktQSXlldEVjcjNMR2JDSVZIX2xWZTN1ZS1IckhySnFLLXQtY2Y2dHdjVmNDZkxrelBhR0FpYWNsbXFuRnpIOFNzM3FMOUxCOF9VbmJzS2hLVVhCT1JxOEkyYkxTU1VQQVlnZ2xQOHotRE81dmQtR3BKQzkxTDBCQ2RpdnVWU0FVY2VZaVc1V1I5bHZqVU1YajdfNFlIUGFINjJETUFBSDRTc01QTUVnczItYU52SEUzZEltU1QzZlh3YzloZHowRks1dnNHaDJFMS1EbXZxVm56LUpiZ3JQcnZXd1d6dkR1alNxcGJOZG1MeWh4WFlVNWpOcmVQVlFxbl9kckVqamhSWmVaWmxkcjlTdUFhUTRObEJqYkNjamRnSEJkbklvbWx0OURNZXNCUUo4QzJOeWRtaGQwTW1OQnBPQVhUYUd4NGpZM1hwOWhTb3BKVnhPMmVhQVpZVlo2MWFQZUVWb2c1WUhkZnJ4VkdUOGY4UlMydVI4S3pJYlFOSXBjell4ei1WUHdVbmxRSUhQUzBzOHJUaXowRzBDQXBtSE5GWmFhN1FzeVVzWElWUWdlaHZmYUhzRnUtNXJMcGhrZU9NME1kbzlIMnVSRjFwcDE2OEVySjhuZnd0WjIxRjVSMG1MSlBYSUxYbjVGZWN5a0pGaUNLaHI2TEJ4NUY2NDVoZzJGWEFzSFJZU1RIUjZnWkxOVVRRZ1dMLW02bXp4U3k2YnNibjJKOXlmMm1GSTE2STYyN2tXdUQwT0kwVUdJY3hDdUR5bE1SLVBsdUF4S3laRDJHS2NVM2dSS0luQy1hd004UTN5Q0JNQlFMNnBWRE82dW5TU1Njd3VuOTlpbmtiV2loOXBWamhyOF9xXzNZUU1CMUx2dVNmZjctalpibUY1YmQ5dk91ZGk4ZUJpUVk3RmROS1hnUk5VNGFuSmNqRnozbERXVS1GU2QzVUg2NkR2M3diZWYtVHBadi15c0MtSzZkUFhtZmFNOGkyODlvM1F5YjdIODFYWFV1TTFxUk0xaUNJNVNCeDYxZ25UNnV2UEstcDNWNkRtdFpXQ2JKd3lyMGdRTVNRVVNzY3c3S0dCMUlnX0JqOE5YZl9lMFZ3dG9GU3lDMXBYeExlODJRUkVxbWhDUUZpckRLVlh6NkJ6aGJKeUxwc2RnU3ZtYUFEaTlONWwta3lPTU5yNndhb3pLMi14amo5dVNodS1icXNSaWh6UHZRREV5b0szbVp3b2ZPaUFSQmdsWVlSeEFhWGJ5amZkSmgtRDhFYVYxcGQ3RkdHM3JGdU5ONkhPaldSOEY5Y0M2Qy1fdXNhOERBcENuOV9iZVludlhCM0o1QXJHcDhEZEJacEk3enRhT3NNWUQxdmFEelJ1Z20zZFpYNEJ5dk5ub0lSMjlkdFYzYlJzd0xNaERyUm9oOTRLenV4SmQ3YkhFOWpCMFNwUGNweGlCWU1NVThncmdGUnFzamQyRjhGVktPcXJ0OHV3MW5Ic1J4RkUxYzlBVTV6S2taaWRpYmViNkg3S3N3LUF1NGpZdTZJMWJnUm9GY1Z2bGdWb3IzREk5ZjRNTUdSTkY1VXZJTUprdVhXdGlXMjRqSjN4NFA5eWVoR2VUN0xleFpvZXV5SkF5YVRKVmlZcngtUFdqRUV5MmotYkdDQmhOMWtUUnFUTExwSGtXZldjOG56dXdvVjdjZ2ZqQ0hKMWJwNG5uZXh1bWZzbGN4V01Wb01TQmRNLW55V1J0MnZBdVdnNEl1RWVkNWNGMXVKOWxUYTQ4YnowSkpGWUdwbURzSTBidEV5V0ZkeXVaT0o1bW95OWJEdVdFWkVwNHR5cVhJaWpvWWc1RXVwV2FmYkNYSzV5WWQ5V25OWEYzUGJMOVZwRE1pZzJBS2cxQjhKTDJGMnNaaEVMQ1RZbEZDWEdkbzNhQWRwamk5MUtaVURHY2xuOFZ5WGkta3Z1aV9rLS1RNGpMdGhDQ2lKNnFsSGgxMUk2MXZPNGdRN0xXOWJOeF80TGpWUHB6WXJRd2F3aFJjekNiTHZsXzVyS0RNcnU0RDNQZTBNbUdCVjJjVi00RlVpU2ozeVNEVWJDRWNGSDRZallQOTRLc1FBN3E2aF9uMTViT0NkMlQ4b0pCTWNYekZMU0phTU8xZ090cGVPYzhGaVBJR3UwYTh5a3JDdGhCMWN2d3o3MVVPc3JWRG9uMDNFM3hZT2ZwZ25kczBCVkRDc0JEMEhNWTFDZW53WS1vT01uNjVoV24zak1LUTVHcGlnR0hVclMtaU81aFVFeU03VE1lcDl3bWZ4SGd3VmJiMkdPYWNMSkJid3FwQVg4bmlKeGhNMmhjbVB1YmZBaVlMemU5V2ZlLW1MSzNnTC1uNXVSZ2RlUEF1ZUdYRVVMVzRSb1lHdVVPcjFzT3lLdkxfUGRUckw0TEYxM1dPQldaUktHcTNSaC1qdHFRLWhHYldYM3dZeEd6TVJmWUZaMzFsZ0tDX3dZN0FNbjZQSGVXRUpmN2llWU5PdW1uTWV1OE51SDY1b2tqQlNLcGhxc2tZZkxRbm8yX04zOGlTRGRGNDBLaXotN2htUC1BNVY1aWZOYWZxeEFKZERxMms5UGQyX2FOYTR5VW5Zak5iYVpEbUFBdUNxWGFtODVGRWM5eU55elU4T3c5eVhPSm1kOEpoTFlBbmlsMlFfX0FybTNnTlBjTUs1Q0lWTUE2LTFTYUxpWU4ySEt6RktpeXA3TGpsWm9TNXFWYWxJOVFhZm85bHFsYThndUg5T0R2MFE2WnJZdFc2c2wxb29mYlBmOVI5NkhVanZMdWVkWkpCYVNsMkdLWFhsd2JuYkJwanc0TmxYRDlMTmdwbnZ0VVFCT0YxMjQwcnFseWY4cldrNDlaSXNBZ01vWm9lUXlkNnBmREQ3bDU3Unp2TWh2ajBYbDhGcDRUMWIwckhFVEkxMnZsdnNZZG5iclY4VnlCeXRRQ2R1R0hZbmMyMHFEQU5QTXFROUNvWlgxM0ZhaHpTNkN6a2NOdXI2ZGRTRy12UzBOWFRjelNrMENKaVl2SDN5bFBlQXpFSS0tNzlPNmVZcHZieGFiQ3RFeVMtUDdKNGxXOWNOTHZueTlJa1JpTy1jYmVFLWNKWXpyT2dZd085R0xqYjVzT1lnWEFGemhIV3I5bVlsSERFLU5ud2trS2UwMmpHelFseHdlLXh2d0lxbmlCamoyN3Fkam5meDNQaXdwdk9pTjl5QkJSZ1lpZ0NiUGJQTVg5dXlVYjlsY1hkWlVDQ3d2X1BOVDJGalR2Xy1IaUdxSkZoWkFKTzF1OW9BM0w3YklFaklpTHFxcGt0QW1uZExGRTZVeVY0RVU4TVRzTE5mRzlOUlAwaGt3V3p5Q3Bzb3hwUEg1QzM5NHhRSzlaWXJOUG5VS21oU3FYczNjOFR4eGhfNEJPX29WSHNFR1RNTGxYWFFETkU1cWtXa2FNRHNJVVJxQy1lM25FcHVCejViYnFLYjZhOEQ3eHhLbmcyRC1zSDY4YjNVOE5BandJUlFfTEEtVUhxQVl1RWlvek1vTHNkNVZYSHNWMGkzZG5RNUZNX2k1aVJqQVB5VVdsRzFPSTRYMnVPWGFOT1Bpc0hQU1lqTEpiWHE1bUlCcDBrWlJCTndzSzlITnAtV1lCcVh2WG1vakNIb2ZIZ0R2cGtGamIxclhNTnYtbDZVcng1ejBuaFA5VjdUQzRfZEhUT1ZYZEJJUC1ibVE0TFZFMlRadVJ2S19qX2UtcHpRWEpROXlKQXdqUTMyU0FLdUF1a2JGN0xKdTUxdnY3aTl2X1RTMmdfaHp3bEp3TjgzMDdjallsS2VBb1E0RkR1Y1M0M2ZnbVlCMWJZN05iY0lQOExlZUZiU2ItYURteHhKcGJ4cWVjdW5RRF9NY2lka3NfdzgtZUEwUEVMNFVNZklXQmp0M1hUbko5dDFMT0dFc21uOUpqRV9DUkp6LWFreVpJT1JKZ0RJZW05VXpUTXVvVUpULTZGaHdBcGUwSWczSXF1VURoZGNUMWlKM25pYlBFUTl6ZnQ0dzc2aEthN2FhdUVCa052Y0EyVFpfSy1VeS1YU3NZRWNvU0kyOC1EbGJsLWFiakJnWEVzcWhReDQ0UXJNbHFBV3ZzWVM0NjZFY2N1QjlsN2JWb29VWGtFM2JDYUFDbVZ0aDZldjlPbUM3LWNaaTVsN2plRmdzOWlYSFg4UzRzM1RNNjFCQnBSTHpJSjBneFkyVFFXNlloR3VTSFRUeUxLdEF5Mm96ZHJ2Q1c1MWFLajJWZHNvdUNXM3A4eHZYa2ZlQi1EQ0d4RDNpUU5CRm4yWjMwbXIyNU5ZZ05UZkNaTEZ1RlkzYXZHXzEzS19fYUFRaERWUEZhTGJoTThEOW9mV0lRbHRtRW9iMEE0UTJTS0FKX3R0VmlkRUlNZVhFczBLNS1feG4zMUxLcWw4cVNqRXhkLTJRMmJnbE4yUm81dmtwdVBMc1o4ZlVYNkg1WlZjcklZa21BVFM1cWdOM1JwZ3VaOWVSeGhuLWN3Q2lZOEVuaFNqLUkxbkItWWxJbXpHWm1jTFI5WU9CaWY2Y01SZ3FoMlZTTkc4d2YxRWhuQWc0QlVtRklKYkwwclhuWTF2UDRGQW9XOUZOSFZ2bGJWTDdHRlJFdGFiQmMzV2xNdzdIMzNtMXlRWXUzUzVwZ3h4Qkphdm5TZk5tdmk1SklMYlh1SWtsNzlHNWJvQm1vYWotNDB1VzhvRjR2TThEX1Vtako3RzYtTjE3dFZiQ1FwcmZZX3BsLU1oT0J1ZlhYZ2ZrbXN4YUU5U0QwV1FRZFNUdjRxSjR4a1lWZzZVdUdPQWgyZmVGYWtGUHJ0b0xNMUxRakRERUJqQVduR3Fvam5DR29fUEMycTFWOUJweXF1M0pKVmwwNFhGbG11R0FVNG1zMlRBMWVaQnE2dnRCZ2FmS2NSNWtwS211eU03Q3NLV0tOYW1iM3ZlNldmVFRUUDJMN2NYME1Ndm5Hbk5Lc0hkeTVVVEQ1eEpCVHplbTU5encyeDM2ODBPOTVyREl1MlZTVTlkX1paSlJ0MmtvUzJVOFp3UXhkOFFFcjNvNUhZeDJPbTlPeUw1YXczQThMT2t0RktFME9zOGRxNzNYNFhtY2dKZ212Ml9kY1ZuWmV4X01fb3FOSjlqc0FLWEVneUdBOWFlVER4Zkwza29RVGxMd3NqWDN1eG81Z3U2SzVSN1VUZmZQeFBzUHpCTHJ5LTFUWWpZUXROTFA1dmh6N2xLNmNKdG9wZVIzRXpjNmc4VE1Md090dVdTMGNSaUxYR1VWQjFfa3BRUV9Pa3Rwd2RPYmx0a0lXYWtSTXh3aV9waG1SQTdzT3BJNGVWWWJtYW9jTXdBSlVCUkFUUGNHY0kxZF9EcGRvSldwNVhOS0FoTGppVWhYZnVEOVdNbVAzdElROXI2UlhMX1dndjljeGlkbmZJZnU3WXBPMUNGU2Vwd29wTHl5TEMyX1dPanVqenpwdTlJVEdKaGV0RFktaVFIOTV2bjQwZmtEV3IyMW9NQ0QySkpHNlVON1VaYzJhSVIwdGFQNkRJNDZKS1N2SkxTN21NdVNNVEZCaFNRTUIyVnJiS3ZLcTZONDlZMEpMSHhHUjBwbWFQdHlWM3padlZVc0ZJdmNkdC0wT0YzRVc3dXZVZ18xeE5jOGZlWVRsSS1kaFZOeGQxbmFxcjR5N2NrSHVSbklDc0xNcnNvUmlMYThqd2NuY0ljX3BqZ2lScDFuTVJZMzhJOWtaOXBHYmZtU3RGSGdHNjRvNUVMTkZpVkktSERWV1E4S2hmSnpPU0VWV0pYcHVhaE1Oek55R0JscHBQd0pjQ09lWjdQMnROekVLSTJaVDlTYUNtbmxlMEJZMkJHNlFxelRoMGRLOHdpZVFUb0huM3JPT3VIZ2ZkRjlLemY1TVJHT2R3SDNENkZ0cHVGWTE1dzBRVlNmWUZJZGtGRXV1NkhFbnhuV2N1WHNfb2t1ZTJoQUFaNE4zdS1yVUVpNnFZME9SMTh2MlhvUjkzSEZaZUY4UlBBbldXWkZHc0U1alZLeFVqc21GQzRzeU9MSks5Y055LVBXMk04STV4LXFaa0pUWnhIbjhabXkySjd0RkUzdDg5NTRlUl9yb3ZMT1VUX1N0ZHA5WWJmT1JDblBsaFc4VEJwSW1JVEwwUnZyWlBaUVF3Y0NIekgteWRDRXFFNm1RQkxfQlVZNmxsa3J1VFFxYVBBYjdzaXJpTHNQSU1WOHFHM2ljM2NObjdfOTI2Zjlfem1PNU9JbmdkcnZHTVlWU3VHRkhkSE1oUFE4RHRKQnczTU1RZzlZaW1abDdzYzFabGtyTFBReFpEOW9oM3FQMG5CQUVkUVlkTlV3Ny1hek43YklrOXRTd1FDYWplWmJxQWUtWGtwVTM4bEdUbzhfSFV3bXB5bkFvVXZ6cEFHSnJ3QWdsRmRkWGpVWnYzQW9lbkQ2UVBIQXRRdTBtc2JpSWIxR0xZVVRfeGJJbFJidGJJS3FULUZqS1dITlR1OHMyUkY1dmZ3M2tXdnVpaU5RU3NDOWkwSFlnOVlUVU4yNnJobV9lemxyRlFsaG90cUZ1Ny1tR2k3UGhLWFYwQWczSjg4ZnJqM1h5Q3hPUlhQM01qbHBrQmtnOUZkY2o2RmN6Y090XzY4bjNiWkpSRUw5b0k4cDREZV9IbjJ2NEU1RG9JTXJITkR3RkQ1NldHRWZvd3dwSWhHdkdmMDdGTUN6bXRGa0wwbTVFQWpGNjRTRUVpVGNyRlFfVjZLVU5iM01ReFlQcFkzbERBS3RTWWs3bklBTVFGY2NQblZ4VWFTNEo1RHNPUVZVdkVjVVJhVHJxMzZhb1BiSkhyMy1MR1BYN2t2QmE5WlJiNmVUWkd3T1NwMUpnbDlrZEI0aWEyb2o4Z3JNOTFDamJzN2pJWDQ0WHNaZmU4VUJrZlFXeV9hV2N3TTBQZWlQUFlkMkYzR1FkdHc3cTJVeTZHT05KWEZaNlQ4WXRuVTFtM2Jkck9HNHhaM21OMTctYUk5WVBrWGRtM1NUY3gtblpUTzZ2a3JRQlZ2cTkwdU5UcmFFS24wdGQzSmFJcWtQNWtjbnU3cFFXMURBQVlaaVdTZ2htTGJwV1Jta0VXaWhHWmxQSXZHd3JaZjVjNlFMQ20yUm9DQ3ZxcjJ1U3ZLazlrcVA4NGxXbUFWU1A0Uzc4TjA4dS1obFpZbnVRS2tjSHlCRjYwV3BjT2FWNmxrVFNLbW5CM0o2ZklsQ2R3aHBBdG1yYlZmaXdaTFFXSjhwNU9RNENZMFhKWFZXaVp5R1RobHVaSmFMSkt0dUJYSVFJVkRHamRmVkFEcmk4R1MtMlBXdGdpdW1KYnRILWw0a2RRRFlIUThUUnZ2bmwybVFvaXNpOGZZcjZocWZNSkhjUlNSVVRlSld2bUtyWHZhOFRwX3ZOamVZcHRNN3VNMHo1THE0RzcxMUhWOG15UzE4Qlh2TGN2UmVuYkF6OE5mX3NSRElNSGxiXzl5QmQ1WWNkVUtDSFJYcXVSSU45UjgtS3Nnc0xnS09GRTVUb0tHcUQ4VW4xUzJYMEFSQ3NKNHczSVVrVnluRTYxMk4tZXZfT255YWlYcUtYa2w0SVRVTGtwRW9yS2x5TUh1eFE0WmZ4WDhZWkFra05ESV9ERmpVMm82dm5nOWl6RzNQRDVXdllPdUo2dVdLMUxpSkdxaEEtTjNEZWNvd2Z5WTk5bEdhMUpOc0RYVHJqM3liSEhNUXdfRnUwTG5Kc3Z0QU1BM0x2eThSR0JHWXZpSzc1aG4xOWdIelJCRzFwT2JLYzc2NllpaHlwZGVIOWZncEdBX1FnVDllY0Q5QzgzUGlNb05YdUFfS1FNdkV4RnNUaW5EWEI1b28wZUxGT3dDX3N6UlVaak1SOUY4UjBKSF9pODJEUVE0Ymo0eEh0bHVBWTYtdmEzd2F1bWY2Q1R4WjNmTEotX3AwdW1TcXhMcUEyS1Z2N1FlR1dxU2hwbEl1YmVzSFd2RmxfUEJHb2ZDTEs1NFNLdVpmLWpxX1BLTmhia2NZRUxubHZHNVV3N3ZGc0dKaFgzMUNDaXFyRklPNlZ1Sy1qMloxRzFnYkt5OHJkQTI4bmdWOEtpTU5qYkljMEM1eXB4ZXA1eEhDb3BYU0tjeGhPZEpGdXBxMHRIbmViVkZ0ZG9DU1M0RHZ5ZDdONkluQS1hWU5FYnNGUnBLSFVTbnZETkQ5b2FQNGlWWVU2amZZWk5jOEVFNkhFNGt4SEh4VnNaaFV6ejNfQ3Y1dWVEcUh5aHpGdXBrRkY4ZkN3bDFDbG42aXl0Ti0wbTRTNGdDdUdYZU9Yc0dqUFNUekgzQXJ4ZENyMTVxUXNvT1pTRGh6SFNPZDhVWW1vaG9xZlkwM0c4SVl0TzVDa2tvUDFGNU9sVmo3WVp0aW5oUmlWbUJxZnRET0t0OW0xMWtReEZXUG9SN2JjOHFLN2p1UW1TSGpQUG91YmlCN3hWa0s3T0tjRTVMWFpUNTBVWksxNk4xek9iZkFFek9seGpxUDZEaVRYYkJacEwwWWFDUHJLSXVQNTdrNVRlanlPZGFWZUZxcC10LW1QN3laM0lCTE9KSUhQUmhwRmMwMDZJYmp1S1NQRnFrTVVSYWd2R1owS045T0t0VXJTLWNhZDVhMExZbkVfVjN1NnVQTnJ0ZVFwTG5zYlZvbHR3VGc1RVlWeVJxbGxJSGM4WkJRRndPNXpCWGtnWU5YOHY5U0FFcHZYNUMzWC1Ja2luSWpBbGxMYnZQNWFISTAwcHdrM2UzeWNfZFp5bGZjV08xYWxfbm0yaVJYUVlqTmlOR293MU9XazVKRkZ4QTNFS3oxQTdVbUIyaHhBbExMOUJVYmlqdjlOMXJoejYzRThzVE1WbE1fSURIUndqOE9jOHp0Xy0zSWVOS2NnYkZKd3NtZTlGeUNENHFUWUJSdjBaNE1feXhoT0JQX3NpUGJUV05jckM5S05RdGY2VzEwVThuRzNFVmVGN1pLVE1xMmViX3ZZN1hOSjdZN2gzc2VJeFk0S2Q3X1lQVGgyY3BhMlBDZGJLcllsSGl3QVd3YXdQUDRwd3haRHJINnFJdWcyQnVIR0lKbXJLT1ZLeWZCczJKenFyUHIyam5OTzhmZU1SSVZneEdETUxDLUJacTMxaXhnZHd6Y1J2b3hOcm1QckxZbExZMXhBZDl0Y3JXWTA0N1V1WlA5N0NUSGU1c1ZzUEhfa2xJaV9KUTlmZ1NqOFZFelgwWGoyUFBfMnRKeVFwVnFES0xMSDIzOHd1bklFZjVFMFJ1OHJWTGZia2MzNW51S0dhdXhwcFBsYW9nM1Y2a2xJbzJLZUlGSXZvbU1lMllJdko2ekdhX1Q2bFd2ZHJETWFJcG5hV3hvbk9vS0hEei14OFlYYzNoRUdPYTd6NVlkNWJmTnA2YVdaSmZGVlYyZmJJNjhaV0hmWDJkdEpxX2tuRmI5VmVIbzdXMzMxOFA0cXFxSnFIU3VYdGdfRkhJTHlLem51aW9JWmpRS19YTnhuaHlZZllyUU84RndmY0w2QWNiVjVnQjEyem12OG5fTW5ZaDNTR2VhSktINXlWeUJaaEhRZnZWb211blotbnJSRzVzZmE1dUtjX2Ixb0d4U1I5R3BuRGpkRV9oU194OGdzWTZJamVvMzZnM2p3OFhKWUdpWUdlai1EOU1WdUlXajZUM3g1TWxKOGJwUWhIS0NlWkplRlNRRXhpblRnMlhBUHlHOE8yYUliWjFudUE3bkp0aDBJV0RQZm9ZekJRN0VCNlZkSGVUYVk2WXpYeUMzUWhzZlJiQlI4TDNSNjE5Ulo1UHhrS3djWXZveWJBZ20yYWpwMzgtcnMwNzlDTTJyNHdpYk5FTmJPRGxFVWN5Q3FjeEp1d1pzOGJidzFHbm5xRmJ6Q2lDWVd2b2pILTVOTnVwcVJPdjNlaHpoSE94TjhKNjVGb3hZU2FUQ1ZURkw3UGc5RGZGR09Rb3ktcERNcDhDWHYzT1JDRldmZHQzZWthOUxEUmZVdlYydmJTU0ttNnVveGxqWFdrdVZLSFJiUDVUNTM2M2M5VG5jYzg0dTR1NHVKdXJhbWRXWmticG83WjByZGFMRFcyeGVyZzIzRTA4V291cUp3NGttRk1KTmtGT0VkRXlKTGh1X2kxbTI0OWVqVGZOcER6RFdTcDJ5cFJQR0I5Y3JSMGRsdHRucE8zTWpJNXlhZkhtSDNUTG5NcDRuTXpvajA5eHhBc1FfTGVrUFJnMU9RdTlEZXJFcGppSUwteFdyTkEyLVY1dTlIVEJ0RUlGdlFSS1A2U19ZMEF3ZVVPejBWd0NuUUVCUEY1M2FYanBRSWZ2aENCbjhhZXRHbXVVSndhSFowRFQxWHlhdGtDdkZZTGxaMDc4aDZqMmZCSFpWbDVxdmR5N0l2SzNHcHdrWl8za2ticzVaWjlDSXRlM1F3dDExTXgteHRGRmQtVzJWQzBLS2Jvb2Fmajh3dlFrN1dVXzNPSkNwaHF4NUF3TVdIZWJWbWg2ekFheGotMElDcjVManhlMTJ4UjBDdWgzSjRmM1Rua0pDM1VRdm9mTm83M1RqeUNWdDk3NUxYRWhOMTBoSm1USHhiQVNteDRlcGl3QllHNWgzYkdmNnpvQmlmQmhIM2dKWVlLNlFDcXRuYThCcUZmZDRtOFB3WXpyYnRlb0J5RFVlUWJlWW9nUFU2RkNMX3FESHd3S1hfRHhhcG14dUVGSjVDXzVIWXE4N3hSR0ItRWdxYThFMHNsTE9PWjR2U29nc0U3QlRfUkoxaW8zV3VPV2VyNGhrNG10N01XemZwWDQxc0ZBQjBweEgxN3Znb1JOcTBIMWdkaHk4clBBMXQxaTlxRmhYMmNERG9acVNjRldRUVlTajdyRWxGN25mcFVZTC1ER0I0ZWRmZDB1cFFMSzVoZ2VoRG9ackt6SnFjZUtLcjNTZmVWUS5iODNzOXBOTFluLWhrZDlPV0JzWXRB"}' + headers: + Accept: [application/json] + Content-Length: ['42921'] + 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://vault3b4b1da4.vault.azure.net/certificates/restore?api-version=7.0 + response: + body: {string: '{"id":"https://vault3b4b1da4.vault.azure.net/certificates/cert-name/03dd6f8416de4e1d98805b33559aef63","kid":"https://vault3b4b1da4.vault.azure.net/keys/cert-name/03dd6f8416de4e1d98805b33559aef63","sid":"https://vault3b4b1da4.vault.azure.net/secrets/cert-name/03dd6f8416de4e1d98805b33559aef63","x5t":"gRgbV_PM7vh1qKZcjjxYHxQSWC0","cer":"MIIDWjCCAkKgAwIBAgIQSwE+ti5GSQyt2jas56ewnTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NTQ4WhcNMjEwOTA2MTgwNTQ4WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiPz5+ZKCAGG0ItB4h17pzzf3Tl9GQARzPz0WBye5SF+IfQkMrUncniJDBJRmiVe4OjSphJSHXgEnZmWeN+dSoVBY/lW0h/NEWag2eGqEO/HELI23dg3LF5ntPCB/0QkDYXoPWQuVpUK/syPw1qA67Fhl98pI9zrPSRxh3Nc1mq13pjawYZgKGQsrq8DxPyp1Tr46KXMMC0yiG/uDAsKUlG99Eml20xRPSkgbG53w+exTEHN26quo8QzNGdQPOO0EgmyGf47aGdJ/OZIuUSiN3zG0Bmn4D+C/kES+ZGI3AiJwGu9XZVi0mYu+nRoxk2l1Xj8AzX2lDKi5bCmLLLl7JAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFFYy3zriAmKWB0OM3OG47VWJ0iKSMB0GA1UdDgQWBBRWMt864gJilgdDjNzhuO1VidIikjANBgkqhkiG9w0BAQsFAAOCAQEAkpCAd/cL61Pite0mgPEbHM53jqd7TLQU2hh11ozuuDCykpOJpR4X47FIBZatZDSNudDy7RoR28Ol+YvGaGE7THM9HRC/ooNArvkY/ji9XdKubqBK4S68C9Vovg6cIN01zjeZu4tBz1Dwc4EbiHwV3L74ZcWNgB7fL7aHkeosu911nbcCOo7mVMEAQ1ipm5RDc0xKKgjXizBRZg7sNhoYwNWBEb+wNdsi12Yw0s2ik2mgUEIwcAYhBFqHr5X8/KFiPq0pzyIdoQwAau08Xd7WMCbBcoQafwvBJWHgnxDqTL7KWonPnDfydnf8gI2XEEPQirOzfvqW6EOdLoM6GjUDIg==","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148,"recoveryLevel":"Purgeable"},"policy":{"id":"https://vault3b4b1da4.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":1567793128,"updated":1567793128}}}'} + headers: {cache-control: no-cache, content-length: '2236', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault3b4b1da4.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..65436612fb4f --- /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://vault5a0a1e1c.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: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bFQg9/vY04DJSsB3TWPvrjch5nkDh2WIVqKQQh2pRip04DjiOJujcKKHrH2/yilRLnzfGbUCCoJJpZe9p5rcNJwLvP8qgYW3AX2a73/gkE9WDMrYBjFgvZu67S9I/mnCqoG8pLCYxKLQvyjQsrlVgg4BvYq5Qoc3Qd5wTQEfaO/UI7rhm/QJ/D7ZEF2eUKw7aWFAjWZk522o9d7JI8r9mM3lxn3Eso5uv75sA5H4fx/rmifbb/0wWgadouQZFBvn8sIQRDpExb289wU/jzAKhU/7tfA92uPN1wDmO4b+J3chmZ6bFATeOUSipHpFSghXq7CyOWkRwhZ2K2f4StRLQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFN+oMtomUVOeKFC8+4vspePhTEjqSvOoj+pr2pTbX93hwYolts+lhFrwGb1ZbwFdqF9vwq5zgRdvJUT7J8rYcJNOi5zw+wGC6cUxP1niSDcdO5jcFjFHct0BS7zg8SjgZAZWtaafj+poqFNTMR8fIL/+7rPW/QU41zsGhjms1VMG5ARLJvOAHhDTU5m9MOIJXBi13KWkP9b1ZU+noCvPJe9h15sb2pUmZZclEpnuCVWhV9OTz0hARGLEqQWxNahOYBswlhZFTw71OaQYrVmbV7aToGIXHbBnN+u6cqtyDY+LTdy48r2JI3hBEUM6Lbm6k0N88yrJMowGJszNdHEKb0=","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":"f86f7402574c47bb8af86d62e8ee80ab"}'} + headers: + cache-control: no-cache + content-length: '1332' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:06:36 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', f, '8', '6', f, '7', '4', '0', '2', '5', '7', '4', + c, '4', '7', b, b, '8', a, f, '8', '6', d, '6', '2', e, '8', e, e, '8', '0', + a, 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bFQg9/vY04DJSsB3TWPvrjch5nkDh2WIVqKQQh2pRip04DjiOJujcKKHrH2/yilRLnzfGbUCCoJJpZe9p5rcNJwLvP8qgYW3AX2a73/gkE9WDMrYBjFgvZu67S9I/mnCqoG8pLCYxKLQvyjQsrlVgg4BvYq5Qoc3Qd5wTQEfaO/UI7rhm/QJ/D7ZEF2eUKw7aWFAjWZk522o9d7JI8r9mM3lxn3Eso5uv75sA5H4fx/rmifbb/0wWgadouQZFBvn8sIQRDpExb289wU/jzAKhU/7tfA92uPN1wDmO4b+J3chmZ6bFATeOUSipHpFSghXq7CyOWkRwhZ2K2f4StRLQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFN+oMtomUVOeKFC8+4vspePhTEjqSvOoj+pr2pTbX93hwYolts+lhFrwGb1ZbwFdqF9vwq5zgRdvJUT7J8rYcJNOi5zw+wGC6cUxP1niSDcdO5jcFjFHct0BS7zg8SjgZAZWtaafj+poqFNTMR8fIL/+7rPW/QU41zsGhjms1VMG5ARLJvOAHhDTU5m9MOIJXBi13KWkP9b1ZU+noCvPJe9h15sb2pUmZZclEpnuCVWhV9OTz0hARGLEqQWxNahOYBswlhZFTw71OaQYrVmbV7aToGIXHbBnN+u6cqtyDY+LTdy48r2JI3hBEUM6Lbm6k0N88yrJMowGJszNdHEKb0=","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":"f86f7402574c47bb8af86d62e8ee80ab"}'} + headers: {cache-control: no-cache, content-length: '1332', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bFQg9/vY04DJSsB3TWPvrjch5nkDh2WIVqKQQh2pRip04DjiOJujcKKHrH2/yilRLnzfGbUCCoJJpZe9p5rcNJwLvP8qgYW3AX2a73/gkE9WDMrYBjFgvZu67S9I/mnCqoG8pLCYxKLQvyjQsrlVgg4BvYq5Qoc3Qd5wTQEfaO/UI7rhm/QJ/D7ZEF2eUKw7aWFAjWZk522o9d7JI8r9mM3lxn3Eso5uv75sA5H4fx/rmifbb/0wWgadouQZFBvn8sIQRDpExb289wU/jzAKhU/7tfA92uPN1wDmO4b+J3chmZ6bFATeOUSipHpFSghXq7CyOWkRwhZ2K2f4StRLQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFN+oMtomUVOeKFC8+4vspePhTEjqSvOoj+pr2pTbX93hwYolts+lhFrwGb1ZbwFdqF9vwq5zgRdvJUT7J8rYcJNOi5zw+wGC6cUxP1niSDcdO5jcFjFHct0BS7zg8SjgZAZWtaafj+poqFNTMR8fIL/+7rPW/QU41zsGhjms1VMG5ARLJvOAHhDTU5m9MOIJXBi13KWkP9b1ZU+noCvPJe9h15sb2pUmZZclEpnuCVWhV9OTz0hARGLEqQWxNahOYBswlhZFTw71OaQYrVmbV7aToGIXHbBnN+u6cqtyDY+LTdy48r2JI3hBEUM6Lbm6k0N88yrJMowGJszNdHEKb0=","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":"f86f7402574c47bb8af86d62e8ee80ab"}'} + headers: {cache-control: no-cache, content-length: '1332', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bFQg9/vY04DJSsB3TWPvrjch5nkDh2WIVqKQQh2pRip04DjiOJujcKKHrH2/yilRLnzfGbUCCoJJpZe9p5rcNJwLvP8qgYW3AX2a73/gkE9WDMrYBjFgvZu67S9I/mnCqoG8pLCYxKLQvyjQsrlVgg4BvYq5Qoc3Qd5wTQEfaO/UI7rhm/QJ/D7ZEF2eUKw7aWFAjWZk522o9d7JI8r9mM3lxn3Eso5uv75sA5H4fx/rmifbb/0wWgadouQZFBvn8sIQRDpExb289wU/jzAKhU/7tfA92uPN1wDmO4b+J3chmZ6bFATeOUSipHpFSghXq7CyOWkRwhZ2K2f4StRLQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFN+oMtomUVOeKFC8+4vspePhTEjqSvOoj+pr2pTbX93hwYolts+lhFrwGb1ZbwFdqF9vwq5zgRdvJUT7J8rYcJNOi5zw+wGC6cUxP1niSDcdO5jcFjFHct0BS7zg8SjgZAZWtaafj+poqFNTMR8fIL/+7rPW/QU41zsGhjms1VMG5ARLJvOAHhDTU5m9MOIJXBi13KWkP9b1ZU+noCvPJe9h15sb2pUmZZclEpnuCVWhV9OTz0hARGLEqQWxNahOYBswlhZFTw71OaQYrVmbV7aToGIXHbBnN+u6cqtyDY+LTdy48r2JI3hBEUM6Lbm6k0N88yrJMowGJszNdHEKb0=","cancellation_requested":false,"status":"completed","target":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name","request_id":"f86f7402574c47bb8af86d62e8ee80ab"}'} + headers: {cache-control: no-cache, content-length: '1239', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/4eed0f740cc94c229678bb0782abc84e","kid":"https://vault5a0a1e1c.vault.azure.net/keys/cert-name/4eed0f740cc94c229678bb0782abc84e","sid":"https://vault5a0a1e1c.vault.azure.net/secrets/cert-name/4eed0f740cc94c229678bb0782abc84e","x5t":"appeWgnJVacplDJZ4DuIqaX6Leg","cer":"MIIDWjCCAkKgAwIBAgIQel7Mi0h0R6uUaJO1Osn2ajANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NjUzWhcNMjEwOTA2MTgwNjUzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZsVCD3+9jTgMlKwHdNY++uNyHmeQOHZYhWopBCHalGKnTgOOI4m6Nwooesfb/KKVEufN8ZtQIKgkmll72nmtw0nAu8/yqBhbcBfZrvf+CQT1YMytgGMWC9m7rtL0j+acKqgbyksJjEotC/KNCyuVWCDgG9irlChzdB3nBNAR9o79QjuuGb9An8PtkQXZ5QrDtpYUCNZmTnbaj13skjyv2YzeXGfcSyjm6/vmwDkfh/H+uaJ9tv/TBaBp2i5BkUG+fywhBEOkTFvbz3BT+PMAqFT/u18D3a483XAOY7hv4ndyGZnpsUBN45RKKkekVKCFersLI5aRHCFnYrZ/hK1EtAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFKYi20LtHf/HjX+hCbB/YeV5WT8PMB0GA1UdDgQWBBSmIttC7R3/x41/oQmwf2HleVk/DzANBgkqhkiG9w0BAQsFAAOCAQEAnnV+xvfxnoKXHQnRwXTHrY53qpsHip87ia7YlA11QcrNtESMGrXdJsJuIiLIqNP81yS0tbWAWxr8r/CFQgO3BQsdiuEZbUaiY9DDZt+Ra8f7hy9hEWSdqjrk916B3RQKUkFn5EZGsFSxvMPXDCKegBqOYzkIoqqjO/c+Wf7FxOCMlUq8Gvdrc/ouQcT6/Jpw40bBBGPcU+ew+WL8xdYS6WstQR/zr8gtRwJlYA0/CeT2M0gHF+QQoDQ2hSlIaIPlrIUxo8ey5TvPziGAkZ7i6/1hNllKFUQiBBjw8tigJwlrUFfR+O72i9yfTlStcL/DgBdRAt6tYWJhmRNkvxWCNA==","attributes":{"enabled":true,"nbf":1567792613,"exp":1630951613,"created":1567793213,"updated":1567793213,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault5a0a1e1c.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":1567793196,"updated":1567793196}},"pending":{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2379', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name/?api-version=7.0 + response: + body: {string: '{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/4eed0f740cc94c229678bb0782abc84e","kid":"https://vault5a0a1e1c.vault.azure.net/keys/cert-name/4eed0f740cc94c229678bb0782abc84e","sid":"https://vault5a0a1e1c.vault.azure.net/secrets/cert-name/4eed0f740cc94c229678bb0782abc84e","x5t":"appeWgnJVacplDJZ4DuIqaX6Leg","cer":"MIIDWjCCAkKgAwIBAgIQel7Mi0h0R6uUaJO1Osn2ajANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NjUzWhcNMjEwOTA2MTgwNjUzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZsVCD3+9jTgMlKwHdNY++uNyHmeQOHZYhWopBCHalGKnTgOOI4m6Nwooesfb/KKVEufN8ZtQIKgkmll72nmtw0nAu8/yqBhbcBfZrvf+CQT1YMytgGMWC9m7rtL0j+acKqgbyksJjEotC/KNCyuVWCDgG9irlChzdB3nBNAR9o79QjuuGb9An8PtkQXZ5QrDtpYUCNZmTnbaj13skjyv2YzeXGfcSyjm6/vmwDkfh/H+uaJ9tv/TBaBp2i5BkUG+fywhBEOkTFvbz3BT+PMAqFT/u18D3a483XAOY7hv4ndyGZnpsUBN45RKKkekVKCFersLI5aRHCFnYrZ/hK1EtAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFKYi20LtHf/HjX+hCbB/YeV5WT8PMB0GA1UdDgQWBBSmIttC7R3/x41/oQmwf2HleVk/DzANBgkqhkiG9w0BAQsFAAOCAQEAnnV+xvfxnoKXHQnRwXTHrY53qpsHip87ia7YlA11QcrNtESMGrXdJsJuIiLIqNP81yS0tbWAWxr8r/CFQgO3BQsdiuEZbUaiY9DDZt+Ra8f7hy9hEWSdqjrk916B3RQKUkFn5EZGsFSxvMPXDCKegBqOYzkIoqqjO/c+Wf7FxOCMlUq8Gvdrc/ouQcT6/Jpw40bBBGPcU+ew+WL8xdYS6WstQR/zr8gtRwJlYA0/CeT2M0gHF+QQoDQ2hSlIaIPlrIUxo8ey5TvPziGAkZ7i6/1hNllKFUQiBBjw8tigJwlrUFfR+O72i9yfTlStcL/DgBdRAt6tYWJhmRNkvxWCNA==","attributes":{"enabled":true,"nbf":1567792613,"exp":1630951613,"created":1567793213,"updated":1567793221,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault5a0a1e1c.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":1567793196,"updated":1567793196}},"pending":{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2408', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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://vault5a0a1e1c.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault5a0a1e1c.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793222,"scheduledPurgeDate":1575569222,"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/4eed0f740cc94c229678bb0782abc84e","kid":"https://vault5a0a1e1c.vault.azure.net/keys/cert-name/4eed0f740cc94c229678bb0782abc84e","sid":"https://vault5a0a1e1c.vault.azure.net/secrets/cert-name/4eed0f740cc94c229678bb0782abc84e","x5t":"appeWgnJVacplDJZ4DuIqaX6Leg","cer":"MIIDWjCCAkKgAwIBAgIQel7Mi0h0R6uUaJO1Osn2ajANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NjUzWhcNMjEwOTA2MTgwNjUzWjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZsVCD3+9jTgMlKwHdNY++uNyHmeQOHZYhWopBCHalGKnTgOOI4m6Nwooesfb/KKVEufN8ZtQIKgkmll72nmtw0nAu8/yqBhbcBfZrvf+CQT1YMytgGMWC9m7rtL0j+acKqgbyksJjEotC/KNCyuVWCDgG9irlChzdB3nBNAR9o79QjuuGb9An8PtkQXZ5QrDtpYUCNZmTnbaj13skjyv2YzeXGfcSyjm6/vmwDkfh/H+uaJ9tv/TBaBp2i5BkUG+fywhBEOkTFvbz3BT+PMAqFT/u18D3a483XAOY7hv4ndyGZnpsUBN45RKKkekVKCFersLI5aRHCFnYrZ/hK1EtAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFKYi20LtHf/HjX+hCbB/YeV5WT8PMB0GA1UdDgQWBBSmIttC7R3/x41/oQmwf2HleVk/DzANBgkqhkiG9w0BAQsFAAOCAQEAnnV+xvfxnoKXHQnRwXTHrY53qpsHip87ia7YlA11QcrNtESMGrXdJsJuIiLIqNP81yS0tbWAWxr8r/CFQgO3BQsdiuEZbUaiY9DDZt+Ra8f7hy9hEWSdqjrk916B3RQKUkFn5EZGsFSxvMPXDCKegBqOYzkIoqqjO/c+Wf7FxOCMlUq8Gvdrc/ouQcT6/Jpw40bBBGPcU+ew+WL8xdYS6WstQR/zr8gtRwJlYA0/CeT2M0gHF+QQoDQ2hSlIaIPlrIUxo8ey5TvPziGAkZ7i6/1hNllKFUQiBBjw8tigJwlrUFfR+O72i9yfTlStcL/DgBdRAt6tYWJhmRNkvxWCNA==","attributes":{"enabled":true,"nbf":1567792613,"exp":1630951613,"created":1567793213,"updated":1567793221,"recoveryLevel":"Recoverable+Purgeable"},"tags":{"foo":"updated + tag"},"policy":{"id":"https://vault5a0a1e1c.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":1567793196,"updated":1567793196}},"pending":{"id":"https://vault5a0a1e1c.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2548', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5a0a1e1c.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..8c54ca2684ec --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_list_operations.yaml @@ -0,0 +1,373 @@ +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://vault5ab91e2a.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: 'Fri, 06 Sep 2019 18:05:28 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate0/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteesN9DrlLM9HZfFzb1R+SAx/jHeToMZ5TI6SMRh21MmmJMMiZlCp0yJ9qijAOnW8GfJGkJEBfZLIz5yT2iVzhKKNb0BVuOigO4Sd9tojwqV7KxykhFz3snobPFrwcL2j+zGbEpgBwZauyLdYsOSxsGaQpfQP9hZZoIPkdQnYVsbPcYhEtZa0TtenQqstbjId2UxFbfPCdzoMOZndI/xxC7KrYPMFFIvQ8AaE9dJbr+T/r+kb3B4kVYNOaVIw6GWb/11MoWDJHn00z29gUXQbA4UWizQmSEr3ftzToyZ5hznED1FnN1oN0UmXQgjFMb1lc5S8/wd4VZ/NgmxtBldawIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACg2QzQBWOzb9N7aWrq5057LBjhufzn/AVsWUC5rJget6QxuncijsL2gvAGcfFpztN5lucYcLts+czcDZH57ghHIrmCWxhVfXt/whoGIfl+ql2tzyqvA0lIUY0BwW+JRO5WZngSHCQwz6ZXeIZ6S3CEMQ0LlPiWJIccqCgXDjBS4NA4rO4ivG+Xnklj6svZpbB+ZPZKoFK9Ui0mWyL1ZnBAOO6Qah+Q0Bs3q40fUda0cE9x3QjeWYNSmJioX9JCqSoURxPGJhImi8Q+HtT+aa9LLAmd8YjMLNjUnYaGAHQpZUKgvM+owvh0+jkPkRXmmnNdjOTtCN2kj0J6uwrpwBQw=","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":"6dd0e539eb0b4b38a1a9572ff9d198f2"}'} + headers: + cache-control: no-cache + content-length: '1335' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:05:29 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '6', d, d, '0', e, '5', '3', '9', e, b, + '0', b, '4', b, '3', '8', a, '1', a, '9', '5', '7', '2', f, f, '9', d, '1', + '9', '8', f, '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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate1/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7mtYM7R5Pp0DdEcEQupBE8+Af4ai/a1SH7hLW+qnQ/M8C57nmJECvqJ4t5Hfl8HD0a3OJzVYvH8V7hoDlwqPQmBMlQ9T5fo7z/d/0z1ch2L9ahFqWyMrtopTrCvbYAIdIZx6hcr9QVrEmAoCZ779AWLZ+wProXJgNiXUVVMy9/grTj4+jDOjOD3pF3SBZGiHRH2AMDMhOwe8SMNp7I7/mN61zTvtDIn2dcwb/1EJt3xKUixioRm8Nz6eZfz7fYDOE8s7rAIYLKIKqLSg3kb+PBemG3b+/7z8j2HATgHtM6AI09TYF2AYOIQaiKa7IlsMmE6mLY+97+tHbE7ZaIcJwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHbCoF+1RrB2k1N3Ro68JIA2jWtYbTq/ZyzqJ3a6SZNXV/BQx73QBGm+6BwMgQxMULNq8UflxX5fzcfoIh3P0PnNsvGuDWJZr0ecLgxES6Wa2+98WiIt26yKccgE0lGabZtdekVIi/TRpnR84OBAN+DVgRJCsduGt1qPv+JXW1QMl9jcuzda1eJZ5YgjnfvxtVIOXYBiiob7lIynxvo6KlFmKiOPSYSzQHCbhqmBE2UQ/+3m1CZUX0P6O5N+36fGtmOwrdiXApPRXs373Qm2BBry9xCBFXFyhi3/5m9Vef6t4lNjetDs5vCq1BW3zFABX0bujEXRuCxNeUoqbObes98=","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":"5a6284a2ab1c4f5f8b6aa76cfd38aa3e"}'} + headers: + cache-control: no-cache + content-length: '1335' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:05:30 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '5', a, '6', '2', '8', '4', a, '2', a, + b, '1', c, '4', f, '5', f, '8', b, '6', a, a, '7', '6', c, f, d, '3', '8', + a, a, '3', e] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate2/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvbXHFpscQV7Uivxj2oKKVIsbnbm98IjOUaEfZBgUEfFnsQxK4Ko9PjhfIP7NdwhhGNEKRhsl7guRVKEn+nxUpwLY0u/MQVt9bI6wNGop2POYVt97AdMqo0kXfn2c5IPr09nOoaPAgb2Bj68luA+7QhIhmleEcB6/m/cG1kymnOw2lrLmsz8sPWFYkfm25k4zQWkYGEJJiaWl6dQzakz8IVVGOiDUfWl0uWS86pjGT93UJoUpnRVQ3I7GrFx/LC2rxttO/Jx68M8XcNjwKIoKads/+U1Jrl2Lgkk0NJtzOsdMxF/ihD/xtzZg999usI9ymXWqL2w3nKg64/FAD/owjQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAEWIm7pWOMpHQXzN2QE181/eSzbod2vgHCcYI0UY3/AlJ5s6Bb7CQJatZoDdHMLqoZdac8LQx6f8xOYb6Sr9uppsmdpm/Hqahg2zViehePdvBaTnXUNlXeiU8gwN4hMil8ThAe17D3tiyqX4p034idmL5Hy2+BYp4nOl7mn+QabN+jhUZeHsMYg4L6n7JN/Jq7fLcAFT7lE3kFF0YaKtA1oALjVpAarYqWXTLj/Te1hVDS/J3MpQiCx/o5BELs4W6wQE3mJwwj0rpc3SIIgpRfMcHCOq+ELGqzRSsT+vs2tYLknMfNcW1cctOK/M1jIE+HMQkYjD+FeZXZhrzvSm9ig=","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":"74e3e918f8814a1c80fc08cd957c08df"}'} + headers: + cache-control: no-cache + content-length: '1335' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:05:30 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '7', '4', e, '3', e, '9', '1', '8', f, + '8', '8', '1', '4', a, '1', c, '8', '0', f, c, '0', '8', c, d, '9', '5', '7', + c, '0', '8', d, 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate3/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxjre29icJVjfQIEXHjNaZS9uO5z51QKwYNsD121iPYfjBiQykzSsXjwknXQ/lGHV4uNsQo4v6GtEah6RTBPYKxh/yrklN/wxU8SldKBUAHNdqoTTn+p0iYfWOXh3NcFWnEHaLT1Qsjmh9W7h7RIqQZDhwVm5J1k1COIuO1/eAQkIdXysX2IRwXIFTGwCTopvvrl/rP4K6iF3RrnkgJDN7GbW7r/qeCU0V8rjWOGR+RMo6JiO5ULHJcY1JvN1xO+JeENbJDu7GnJw1q25iWL9FN620C/F6UUtARrDkzsR4VPSbSYA5vnSqWHYwuqz94TNhf4Vp/nA+abUvrb3sY1QfwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAITuNTiYPxJh9xkMZkmjjlsRSvOO2vV9qGVJ9CwoYWMW093iFOtrNwfaG+LvoTlhMycDpfsCCND2S/hZInSt5bNjBkCNId2FOTwJGBKxZp3UnOkHZZ0TnZeSg8uTor2aYytCnDU0TZPGL03cNLD526hpaiSrXDaPp3OhDXc+xfo2qWlpc9UYNAOYgnHg5X/PHVV3NoiTZL21jcB+qw73JEOKExkLMIp/IwZ40/KiotqP77Ulek895RoqglmPn5KPJcqC+HY2eQCf2H3YUz51Wy1bhpdGQEQ28oiHlzV5Kecm2O8oPnGdyZdNV3Qc8seG5K47Mu1eK78kkaWI7/x6HVA=","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":"3adc249e373241c892dae57104074d1b"}'} + headers: + cache-control: no-cache + content-length: '1335' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:05:31 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', '3', a, d, c, '2', '4', '9', e, '3', '7', + '3', '2', '4', '1', c, '8', '9', '2', d, a, e, '5', '7', '1', '0', '4', '0', + '7', '4', d, '1', 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.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteesN9DrlLM9HZfFzb1R+SAx/jHeToMZ5TI6SMRh21MmmJMMiZlCp0yJ9qijAOnW8GfJGkJEBfZLIz5yT2iVzhKKNb0BVuOigO4Sd9tojwqV7KxykhFz3snobPFrwcL2j+zGbEpgBwZauyLdYsOSxsGaQpfQP9hZZoIPkdQnYVsbPcYhEtZa0TtenQqstbjId2UxFbfPCdzoMOZndI/xxC7KrYPMFFIvQ8AaE9dJbr+T/r+kb3B4kVYNOaVIw6GWb/11MoWDJHn00z29gUXQbA4UWizQmSEr3ftzToyZ5hznED1FnN1oN0UmXQgjFMb1lc5S8/wd4VZ/NgmxtBldawIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACg2QzQBWOzb9N7aWrq5057LBjhufzn/AVsWUC5rJget6QxuncijsL2gvAGcfFpztN5lucYcLts+czcDZH57ghHIrmCWxhVfXt/whoGIfl+ql2tzyqvA0lIUY0BwW+JRO5WZngSHCQwz6ZXeIZ6S3CEMQ0LlPiWJIccqCgXDjBS4NA4rO4ivG+Xnklj6svZpbB+ZPZKoFK9Ui0mWyL1ZnBAOO6Qah+Q0Bs3q40fUda0cE9x3QjeWYNSmJioX9JCqSoURxPGJhImi8Q+HtT+aa9LLAmd8YjMLNjUnYaGAHQpZUKgvM+owvh0+jkPkRXmmnNdjOTtCN2kj0J6uwrpwBQw=","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":"6dd0e539eb0b4b38a1a9572ff9d198f2"}'} + headers: {cache-control: no-cache, content-length: '1335', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteesN9DrlLM9HZfFzb1R+SAx/jHeToMZ5TI6SMRh21MmmJMMiZlCp0yJ9qijAOnW8GfJGkJEBfZLIz5yT2iVzhKKNb0BVuOigO4Sd9tojwqV7KxykhFz3snobPFrwcL2j+zGbEpgBwZauyLdYsOSxsGaQpfQP9hZZoIPkdQnYVsbPcYhEtZa0TtenQqstbjId2UxFbfPCdzoMOZndI/xxC7KrYPMFFIvQ8AaE9dJbr+T/r+kb3B4kVYNOaVIw6GWb/11MoWDJHn00z29gUXQbA4UWizQmSEr3ftzToyZ5hznED1FnN1oN0UmXQgjFMb1lc5S8/wd4VZ/NgmxtBldawIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACg2QzQBWOzb9N7aWrq5057LBjhufzn/AVsWUC5rJget6QxuncijsL2gvAGcfFpztN5lucYcLts+czcDZH57ghHIrmCWxhVfXt/whoGIfl+ql2tzyqvA0lIUY0BwW+JRO5WZngSHCQwz6ZXeIZ6S3CEMQ0LlPiWJIccqCgXDjBS4NA4rO4ivG+Xnklj6svZpbB+ZPZKoFK9Ui0mWyL1ZnBAOO6Qah+Q0Bs3q40fUda0cE9x3QjeWYNSmJioX9JCqSoURxPGJhImi8Q+HtT+aa9LLAmd8YjMLNjUnYaGAHQpZUKgvM+owvh0+jkPkRXmmnNdjOTtCN2kj0J6uwrpwBQw=","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":"6dd0e539eb0b4b38a1a9572ff9d198f2"}'} + headers: {cache-control: no-cache, content-length: '1335', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAteesN9DrlLM9HZfFzb1R+SAx/jHeToMZ5TI6SMRh21MmmJMMiZlCp0yJ9qijAOnW8GfJGkJEBfZLIz5yT2iVzhKKNb0BVuOigO4Sd9tojwqV7KxykhFz3snobPFrwcL2j+zGbEpgBwZauyLdYsOSxsGaQpfQP9hZZoIPkdQnYVsbPcYhEtZa0TtenQqstbjId2UxFbfPCdzoMOZndI/xxC7KrYPMFFIvQ8AaE9dJbr+T/r+kb3B4kVYNOaVIw6GWb/11MoWDJHn00z29gUXQbA4UWizQmSEr3ftzToyZ5hznED1FnN1oN0UmXQgjFMb1lc5S8/wd4VZ/NgmxtBldawIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACg2QzQBWOzb9N7aWrq5057LBjhufzn/AVsWUC5rJget6QxuncijsL2gvAGcfFpztN5lucYcLts+czcDZH57ghHIrmCWxhVfXt/whoGIfl+ql2tzyqvA0lIUY0BwW+JRO5WZngSHCQwz6ZXeIZ6S3CEMQ0LlPiWJIccqCgXDjBS4NA4rO4ivG+Xnklj6svZpbB+ZPZKoFK9Ui0mWyL1ZnBAOO6Qah+Q0Bs3q40fUda0cE9x3QjeWYNSmJioX9JCqSoURxPGJhImi8Q+HtT+aa9LLAmd8YjMLNjUnYaGAHQpZUKgvM+owvh0+jkPkRXmmnNdjOTtCN2kj0J6uwrpwBQw=","cancellation_requested":false,"status":"completed","target":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0","request_id":"6dd0e539eb0b4b38a1a9572ff9d198f2"}'} + headers: {cache-control: no-cache, content-length: '1245', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate1/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate1/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7mtYM7R5Pp0DdEcEQupBE8+Af4ai/a1SH7hLW+qnQ/M8C57nmJECvqJ4t5Hfl8HD0a3OJzVYvH8V7hoDlwqPQmBMlQ9T5fo7z/d/0z1ch2L9ahFqWyMrtopTrCvbYAIdIZx6hcr9QVrEmAoCZ779AWLZ+wProXJgNiXUVVMy9/grTj4+jDOjOD3pF3SBZGiHRH2AMDMhOwe8SMNp7I7/mN61zTvtDIn2dcwb/1EJt3xKUixioRm8Nz6eZfz7fYDOE8s7rAIYLKIKqLSg3kb+PBemG3b+/7z8j2HATgHtM6AI09TYF2AYOIQaiKa7IlsMmE6mLY+97+tHbE7ZaIcJwwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAHbCoF+1RrB2k1N3Ro68JIA2jWtYbTq/ZyzqJ3a6SZNXV/BQx73QBGm+6BwMgQxMULNq8UflxX5fzcfoIh3P0PnNsvGuDWJZr0ecLgxES6Wa2+98WiIt26yKccgE0lGabZtdekVIi/TRpnR84OBAN+DVgRJCsduGt1qPv+JXW1QMl9jcuzda1eJZ5YgjnfvxtVIOXYBiiob7lIynxvo6KlFmKiOPSYSzQHCbhqmBE2UQ/+3m1CZUX0P6O5N+36fGtmOwrdiXApPRXs373Qm2BBry9xCBFXFyhi3/5m9Vef6t4lNjetDs5vCq1BW3zFABX0bujEXRuCxNeUoqbObes98=","cancellation_requested":false,"status":"completed","target":"https://vault5ab91e2a.vault.azure.net/certificates/certificate1","request_id":"5a6284a2ab1c4f5f8b6aa76cfd38aa3e"}'} + headers: {cache-control: no-cache, content-length: '1245', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate2/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate2/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvbXHFpscQV7Uivxj2oKKVIsbnbm98IjOUaEfZBgUEfFnsQxK4Ko9PjhfIP7NdwhhGNEKRhsl7guRVKEn+nxUpwLY0u/MQVt9bI6wNGop2POYVt97AdMqo0kXfn2c5IPr09nOoaPAgb2Bj68luA+7QhIhmleEcB6/m/cG1kymnOw2lrLmsz8sPWFYkfm25k4zQWkYGEJJiaWl6dQzakz8IVVGOiDUfWl0uWS86pjGT93UJoUpnRVQ3I7GrFx/LC2rxttO/Jx68M8XcNjwKIoKads/+U1Jrl2Lgkk0NJtzOsdMxF/ihD/xtzZg999usI9ymXWqL2w3nKg64/FAD/owjQIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAEWIm7pWOMpHQXzN2QE181/eSzbod2vgHCcYI0UY3/AlJ5s6Bb7CQJatZoDdHMLqoZdac8LQx6f8xOYb6Sr9uppsmdpm/Hqahg2zViehePdvBaTnXUNlXeiU8gwN4hMil8ThAe17D3tiyqX4p034idmL5Hy2+BYp4nOl7mn+QabN+jhUZeHsMYg4L6n7JN/Jq7fLcAFT7lE3kFF0YaKtA1oALjVpAarYqWXTLj/Te1hVDS/J3MpQiCx/o5BELs4W6wQE3mJwwj0rpc3SIIgpRfMcHCOq+ELGqzRSsT+vs2tYLknMfNcW1cctOK/M1jIE+HMQkYjD+FeZXZhrzvSm9ig=","cancellation_requested":false,"status":"completed","target":"https://vault5ab91e2a.vault.azure.net/certificates/certificate2","request_id":"74e3e918f8814a1c80fc08cd957c08df"}'} + headers: {cache-control: no-cache, content-length: '1245', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates/certificate3/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate3/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxjre29icJVjfQIEXHjNaZS9uO5z51QKwYNsD121iPYfjBiQykzSsXjwknXQ/lGHV4uNsQo4v6GtEah6RTBPYKxh/yrklN/wxU8SldKBUAHNdqoTTn+p0iYfWOXh3NcFWnEHaLT1Qsjmh9W7h7RIqQZDhwVm5J1k1COIuO1/eAQkIdXysX2IRwXIFTGwCTopvvrl/rP4K6iF3RrnkgJDN7GbW7r/qeCU0V8rjWOGR+RMo6JiO5ULHJcY1JvN1xO+JeENbJDu7GnJw1q25iWL9FN620C/F6UUtARrDkzsR4VPSbSYA5vnSqWHYwuqz94TNhf4Vp/nA+abUvrb3sY1QfwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAITuNTiYPxJh9xkMZkmjjlsRSvOO2vV9qGVJ9CwoYWMW093iFOtrNwfaG+LvoTlhMycDpfsCCND2S/hZInSt5bNjBkCNId2FOTwJGBKxZp3UnOkHZZ0TnZeSg8uTor2aYytCnDU0TZPGL03cNLD526hpaiSrXDaPp3OhDXc+xfo2qWlpc9UYNAOYgnHg5X/PHVV3NoiTZL21jcB+qw73JEOKExkLMIp/IwZ40/KiotqP77Ulek895RoqglmPn5KPJcqC+HY2eQCf2H3YUz51Wy1bhpdGQEQ28oiHlzV5Kecm2O8oPnGdyZdNV3Qc8seG5K47Mu1eK78kkaWI7/x6HVA=","cancellation_requested":false,"status":"completed","target":"https://vault5ab91e2a.vault.azure.net/certificates/certificate3","request_id":"3adc249e373241c892dae57104074d1b"}'} + headers: {cache-control: no-cache, content-length: '1245', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.vault.azure.net/certificates?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate0","x5t":"vEpiu-fBKQ1hRQG6ENoNGPfaNGc","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148},"subject":""},{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate1","x5t":"m0IKSRTWKpPW6J3-28b1hURMnyY","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148},"subject":""},{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate2","x5t":"eevbciIVZCjQURJTSMyprkYBiL8","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148},"subject":""},{"id":"https://vault5ab91e2a.vault.azure.net/certificates/certificate3","x5t":"V4-fMa7MCcC4s2wD4eZu_L2sh5c","attributes":{"enabled":true,"nbf":1567792548,"exp":1630951548,"created":1567793148,"updated":1567793148},"subject":""}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '939', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.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: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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://vault5ab91e2a.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: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault5ab91e2a.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..225f86332e75 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_certificate_recover.yaml @@ -0,0 +1,245 @@ +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://vault75531ac1.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: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/certificates/cert-name/create?api-version=7.0 + response: + body: {string: '{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA53FGdN7YOnu1cATxTBdHtrIVyNjAKLOxUI2Ahhb1x1JHtkNX4esafcPTBofX4s9AcviA7fz/Bdbd+AcPSJkklXeva99PQUd0IbgS9qNdasDsdWsCDsCBNhFZrLEC3g2Ztk3RAWnEVK2RYA4/GqYUa1lj9qd+i1+xjZkN1661MlCw+4SN3zI4GrERTgSqK42WwEWHyuMonIU6W3irpTIvaRib7Zo6sjIvs3xiIckTG7Fw+tfb23XNsnQB95yMOJtRZb1sJX8E2jwJUZkQg58MySnfOpeR5rM4RLDU+988/9HXazI32gXkJZEZVL9BD0+voq/nHRBEduLUMfuEjmTCqwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAMLtxSC2QHf9P0IngdIB5j2aQuLFg7naEzHYoOeX2VbTyRuECaxAyG2k6IaoNkvGqpyX434076DXposNFYftmpUXBH4ozRdqI/sIwxVwRxOcTXmla9SQIoiXbUBiIhoT1d2grCySEGnmgmlPDWBUAe4engDdOGeRtbaSRNvwLdd32urcypOiWH6UkRUUipeLFa8BEGm3CIIKedcDLJaRGKo+Pb4aNgh1Mq2M+SsfI47TqplIXh96Zj+ZOyC9BNx79QNUUF3dIyOXpNRLJT4kKg4ES8D4HNvtq4RAP6gXtE9rLTuq3UdUJoxDquWkpi7kcEmoHiuTgLNohgSqE/Fvjp4=","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":"e0892e3ef4ce4f7eb24ba85245ae69c1"}'} + headers: + cache-control: no-cache + content-length: '1332' + content-type: application/json; charset=utf-8 + date: Fri, 06 Sep 2019 18:07:03 GMT + expires: '-1' + location: [h, t, t, p, s, ':', /, /, v, a, u, l, t, '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, '=', e, '0', '8', '9', '2', e, '3', e, f, '4', c, + e, '4', f, '7', e, b, '2', '4', b, a, '8', '5', '2', '4', '5', a, e, '6', + '9', c, '1'] + pragma: no-cache + server: Microsoft-IIS/10.0 + strict-transport-security: max-age=31536000;includeSubDomains + x-aspnet-version: 4.0.30319 + x-content-type-options: nosniff + x-ms-keyvault-network-info: addr=131.107.174.72;act_addr_fam=InterNetwork; + x-ms-keyvault-region: westus + x-ms-keyvault-service-version: 1.1.0.878 + 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, vault75531ac1.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://vault75531ac1.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA53FGdN7YOnu1cATxTBdHtrIVyNjAKLOxUI2Ahhb1x1JHtkNX4esafcPTBofX4s9AcviA7fz/Bdbd+AcPSJkklXeva99PQUd0IbgS9qNdasDsdWsCDsCBNhFZrLEC3g2Ztk3RAWnEVK2RYA4/GqYUa1lj9qd+i1+xjZkN1661MlCw+4SN3zI4GrERTgSqK42WwEWHyuMonIU6W3irpTIvaRib7Zo6sjIvs3xiIckTG7Fw+tfb23XNsnQB95yMOJtRZb1sJX8E2jwJUZkQg58MySnfOpeR5rM4RLDU+988/9HXazI32gXkJZEZVL9BD0+voq/nHRBEduLUMfuEjmTCqwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAMLtxSC2QHf9P0IngdIB5j2aQuLFg7naEzHYoOeX2VbTyRuECaxAyG2k6IaoNkvGqpyX434076DXposNFYftmpUXBH4ozRdqI/sIwxVwRxOcTXmla9SQIoiXbUBiIhoT1d2grCySEGnmgmlPDWBUAe4engDdOGeRtbaSRNvwLdd32urcypOiWH6UkRUUipeLFa8BEGm3CIIKedcDLJaRGKo+Pb4aNgh1Mq2M+SsfI47TqplIXh96Zj+ZOyC9BNx79QNUUF3dIyOXpNRLJT4kKg4ES8D4HNvtq4RAP6gXtE9rLTuq3UdUJoxDquWkpi7kcEmoHiuTgLNohgSqE/Fvjp4=","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":"e0892e3ef4ce4f7eb24ba85245ae69c1"}'} + headers: {cache-control: no-cache, content-length: '1332', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/certificates/cert-name/pending?api-version=7.0 + response: + body: {string: '{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending","issuer":{"name":"Self"},"csr":"MIICyDCCAbACAQAwGjEYMBYGA1UEAwwPKi5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA53FGdN7YOnu1cATxTBdHtrIVyNjAKLOxUI2Ahhb1x1JHtkNX4esafcPTBofX4s9AcviA7fz/Bdbd+AcPSJkklXeva99PQUd0IbgS9qNdasDsdWsCDsCBNhFZrLEC3g2Ztk3RAWnEVK2RYA4/GqYUa1lj9qd+i1+xjZkN1661MlCw+4SN3zI4GrERTgSqK42WwEWHyuMonIU6W3irpTIvaRib7Zo6sjIvs3xiIckTG7Fw+tfb23XNsnQB95yMOJtRZb1sJX8E2jwJUZkQg58MySnfOpeR5rM4RLDU+988/9HXazI32gXkJZEZVL9BD0+voq/nHRBEduLUMfuEjmTCqwIDAQABoGkwZwYJKoZIhvcNAQkOMVowWDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAMLtxSC2QHf9P0IngdIB5j2aQuLFg7naEzHYoOeX2VbTyRuECaxAyG2k6IaoNkvGqpyX434076DXposNFYftmpUXBH4ozRdqI/sIwxVwRxOcTXmla9SQIoiXbUBiIhoT1d2grCySEGnmgmlPDWBUAe4engDdOGeRtbaSRNvwLdd32urcypOiWH6UkRUUipeLFa8BEGm3CIIKedcDLJaRGKo+Pb4aNgh1Mq2M+SsfI47TqplIXh96Zj+ZOyC9BNx79QNUUF3dIyOXpNRLJT4kKg4ES8D4HNvtq4RAP6gXtE9rLTuq3UdUJoxDquWkpi7kcEmoHiuTgLNohgSqE/Fvjp4=","cancellation_requested":false,"status":"completed","target":"https://vault75531ac1.vault.azure.net/certificates/cert-name","request_id":"e0892e3ef4ce4f7eb24ba85245ae69c1"}'} + headers: {cache-control: no-cache, content-length: '1239', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/certificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault75531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/3f5504313cb843c097438a9066124666","kid":"https://vault75531ac1.vault.azure.net/keys/cert-name/3f5504313cb843c097438a9066124666","sid":"https://vault75531ac1.vault.azure.net/secrets/cert-name/3f5504313cb843c097438a9066124666","x5t":"EmKz0j1_Zk7F74t2lLWbNMIhouA","cer":"MIIDWjCCAkKgAwIBAgIQSRcJHFOTQ3C69+9pdOLeAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzA5WhcNMjEwOTA2MTgwNzA5WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDncUZ03tg6e7VwBPFMF0e2shXI2MAos7FQjYCGFvXHUke2Q1fh6xp9w9MGh9fiz0By+IDt/P8F1t34Bw9ImSSVd69r309BR3QhuBL2o11qwOx1awIOwIE2EVmssQLeDZm2TdEBacRUrZFgDj8aphRrWWP2p36LX7GNmQ3XrrUyULD7hI3fMjgasRFOBKorjZbARYfK4yichTpbeKulMi9pGJvtmjqyMi+zfGIhyRMbsXD619vbdc2ydAH3nIw4m1FlvWwlfwTaPAlRmRCDnwzJKd86l5HmszhEsNT73zz/0ddrMjfaBeQlkRlUv0EPT6+ir+cdEER24tQx+4SOZMKrAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAq42L0vFy2Ohtpd6eJR2xCJ7Q8QMB0GA1UdDgQWBBQKuNi9LxctjobaXeniUdsQie0PEDANBgkqhkiG9w0BAQsFAAOCAQEA0oKOuLdPtvt7eOAzkhGkAUaYxMb8R+V51uBiBZ172Df4SgO0QKnKJPQuixGbhzg25dJcH6ITOvqs6GqwApQnPjhrdLZVj24YuDdYykr7a42LApqa8JQWeJG/yARblqxL2291kMU6q68fVIIZFqkniW+pNfpBhAr7WVJ4lqD3uHv8mC8TnOGSUYixQ/vJ4X2krV32iBohOE1PI6ZhUJmIat+/v2yoJ72GLH2LJqXy0A6YANCHaxKBZXRgH43y1O4Ba9OLdt4wwlebCWIWbklDbzxXZSr7vfe0pNjxMzM40UxGVo+MSwpGh7sBBAHGveOgj3nv5sOFfILHXgdUV95yjA==","attributes":{"enabled":true,"nbf":1567792629,"exp":1630951629,"created":1567793229,"updated":1567793229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault75531ac1.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2519', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.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: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.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: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.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: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault75531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/3f5504313cb843c097438a9066124666","kid":"https://vault75531ac1.vault.azure.net/keys/cert-name/3f5504313cb843c097438a9066124666","sid":"https://vault75531ac1.vault.azure.net/secrets/cert-name/3f5504313cb843c097438a9066124666","x5t":"EmKz0j1_Zk7F74t2lLWbNMIhouA","cer":"MIIDWjCCAkKgAwIBAgIQSRcJHFOTQ3C69+9pdOLeAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzA5WhcNMjEwOTA2MTgwNzA5WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDncUZ03tg6e7VwBPFMF0e2shXI2MAos7FQjYCGFvXHUke2Q1fh6xp9w9MGh9fiz0By+IDt/P8F1t34Bw9ImSSVd69r309BR3QhuBL2o11qwOx1awIOwIE2EVmssQLeDZm2TdEBacRUrZFgDj8aphRrWWP2p36LX7GNmQ3XrrUyULD7hI3fMjgasRFOBKorjZbARYfK4yichTpbeKulMi9pGJvtmjqyMi+zfGIhyRMbsXD619vbdc2ydAH3nIw4m1FlvWwlfwTaPAlRmRCDnwzJKd86l5HmszhEsNT73zz/0ddrMjfaBeQlkRlUv0EPT6+ir+cdEER24tQx+4SOZMKrAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAq42L0vFy2Ohtpd6eJR2xCJ7Q8QMB0GA1UdDgQWBBQKuNi9LxctjobaXeniUdsQie0PEDANBgkqhkiG9w0BAQsFAAOCAQEA0oKOuLdPtvt7eOAzkhGkAUaYxMb8R+V51uBiBZ172Df4SgO0QKnKJPQuixGbhzg25dJcH6ITOvqs6GqwApQnPjhrdLZVj24YuDdYykr7a42LApqa8JQWeJG/yARblqxL2291kMU6q68fVIIZFqkniW+pNfpBhAr7WVJ4lqD3uHv8mC8TnOGSUYixQ/vJ4X2krV32iBohOE1PI6ZhUJmIat+/v2yoJ72GLH2LJqXy0A6YANCHaxKBZXRgH43y1O4Ba9OLdt4wwlebCWIWbklDbzxXZSr7vfe0pNjxMzM40UxGVo+MSwpGh7sBBAHGveOgj3nv5sOFfILHXgdUV95yjA==","attributes":{"enabled":true,"nbf":1567792629,"exp":1630951629,"created":1567793229,"updated":1567793229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault75531ac1.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2519', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/deletedcertificates/cert-name?api-version=7.0 + response: + body: {string: '{"recoveryId":"https://vault75531ac1.vault.azure.net/deletedcertificates/cert-name","deletedDate":1567793239,"scheduledPurgeDate":1575569239,"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/3f5504313cb843c097438a9066124666","kid":"https://vault75531ac1.vault.azure.net/keys/cert-name/3f5504313cb843c097438a9066124666","sid":"https://vault75531ac1.vault.azure.net/secrets/cert-name/3f5504313cb843c097438a9066124666","x5t":"EmKz0j1_Zk7F74t2lLWbNMIhouA","cer":"MIIDWjCCAkKgAwIBAgIQSRcJHFOTQ3C69+9pdOLeAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzA5WhcNMjEwOTA2MTgwNzA5WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDncUZ03tg6e7VwBPFMF0e2shXI2MAos7FQjYCGFvXHUke2Q1fh6xp9w9MGh9fiz0By+IDt/P8F1t34Bw9ImSSVd69r309BR3QhuBL2o11qwOx1awIOwIE2EVmssQLeDZm2TdEBacRUrZFgDj8aphRrWWP2p36LX7GNmQ3XrrUyULD7hI3fMjgasRFOBKorjZbARYfK4yichTpbeKulMi9pGJvtmjqyMi+zfGIhyRMbsXD619vbdc2ydAH3nIw4m1FlvWwlfwTaPAlRmRCDnwzJKd86l5HmszhEsNT73zz/0ddrMjfaBeQlkRlUv0EPT6+ir+cdEER24tQx+4SOZMKrAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAq42L0vFy2Ohtpd6eJR2xCJ7Q8QMB0GA1UdDgQWBBQKuNi9LxctjobaXeniUdsQie0PEDANBgkqhkiG9w0BAQsFAAOCAQEA0oKOuLdPtvt7eOAzkhGkAUaYxMb8R+V51uBiBZ172Df4SgO0QKnKJPQuixGbhzg25dJcH6ITOvqs6GqwApQnPjhrdLZVj24YuDdYykr7a42LApqa8JQWeJG/yARblqxL2291kMU6q68fVIIZFqkniW+pNfpBhAr7WVJ4lqD3uHv8mC8TnOGSUYixQ/vJ4X2krV32iBohOE1PI6ZhUJmIat+/v2yoJ72GLH2LJqXy0A6YANCHaxKBZXRgH43y1O4Ba9OLdt4wwlebCWIWbklDbzxXZSr7vfe0pNjxMzM40UxGVo+MSwpGh7sBBAHGveOgj3nv5sOFfILHXgdUV95yjA==","attributes":{"enabled":true,"nbf":1567792629,"exp":1630951629,"created":1567793229,"updated":1567793229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault75531ac1.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2519', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.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://vault75531ac1.vault.azure.net/deletedcertificates/cert-name/recover?api-version=7.0 + response: + body: {string: '{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/3f5504313cb843c097438a9066124666","kid":"https://vault75531ac1.vault.azure.net/keys/cert-name/3f5504313cb843c097438a9066124666","sid":"https://vault75531ac1.vault.azure.net/secrets/cert-name/3f5504313cb843c097438a9066124666","x5t":"EmKz0j1_Zk7F74t2lLWbNMIhouA","cer":"MIIDWjCCAkKgAwIBAgIQSRcJHFOTQ3C69+9pdOLeAjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wHhcNMTkwOTA2MTc1NzA5WhcNMjEwOTA2MTgwNzA5WjAaMRgwFgYDVQQDDA8qLm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDncUZ03tg6e7VwBPFMF0e2shXI2MAos7FQjYCGFvXHUke2Q1fh6xp9w9MGh9fiz0By+IDt/P8F1t34Bw9ImSSVd69r309BR3QhuBL2o11qwOx1awIOwIE2EVmssQLeDZm2TdEBacRUrZFgDj8aphRrWWP2p36LX7GNmQ3XrrUyULD7hI3fMjgasRFOBKorjZbARYfK4yichTpbeKulMi9pGJvtmjqyMi+zfGIhyRMbsXD619vbdc2ydAH3nIw4m1FlvWwlfwTaPAlRmRCDnwzJKd86l5HmszhEsNT73zz/0ddrMjfaBeQlkRlUv0EPT6+ir+cdEER24tQx+4SOZMKrAgMBAAGjgZswgZgwDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBwGA1UdEQQVMBOCEXNkay5henVyZS1pbnQubmV0MB8GA1UdIwQYMBaAFAq42L0vFy2Ohtpd6eJR2xCJ7Q8QMB0GA1UdDgQWBBQKuNi9LxctjobaXeniUdsQie0PEDANBgkqhkiG9w0BAQsFAAOCAQEA0oKOuLdPtvt7eOAzkhGkAUaYxMb8R+V51uBiBZ172Df4SgO0QKnKJPQuixGbhzg25dJcH6ITOvqs6GqwApQnPjhrdLZVj24YuDdYykr7a42LApqa8JQWeJG/yARblqxL2291kMU6q68fVIIZFqkniW+pNfpBhAr7WVJ4lqD3uHv8mC8TnOGSUYixQ/vJ4X2krV32iBohOE1PI6ZhUJmIat+/v2yoJ72GLH2LJqXy0A6YANCHaxKBZXRgH43y1O4Ba9OLdt4wwlebCWIWbklDbzxXZSr7vfe0pNjxMzM40UxGVo+MSwpGh7sBBAHGveOgj3nv5sOFfILHXgdUV95yjA==","attributes":{"enabled":true,"nbf":1567792629,"exp":1630951629,"created":1567793229,"updated":1567793229,"recoveryLevel":"Recoverable+Purgeable"},"policy":{"id":"https://vault75531ac1.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":1567793223,"updated":1567793223}},"pending":{"id":"https://vault75531ac1.vault.azure.net/certificates/cert-name/pending"}}'} + headers: {cache-control: no-cache, content-length: '2379', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:07: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault75531ac1.vault.azure.net, + /deletedcertificates/cert-name/recover, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_contacts.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_contacts.yaml new file mode 100644 index 000000000000..cffcce1147aa --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_contacts.yaml @@ -0,0 +1,90 @@ +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://vault664c1648.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: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault664c1648.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://vault664c1648.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault664c1648.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault664c1648.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://vault664c1648.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault664c1648.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault664c1648.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://vault664c1648.vault.azure.net/certificates/contacts?api-version=7.0 + response: + body: {string: '{"id":"https://vault664c1648.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: '221', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:06: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault664c1648.vault.azure.net, + /certificates/contacts, api-version=7.0, ''] +version: 1 diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_issuers.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_issuers.yaml new file mode 100644 index 000000000000..080d54cbad9d --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_examples_certificates_async.test_example_issuers.yaml @@ -0,0 +1,128 @@ +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://vault508c15f7.vault.azure.net/certificates/issuers/issuer1?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: 'Fri, 06 Sep 2019 18:05:47 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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.vault.azure.net, + /certificates/issuers/issuer1, 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://vault508c15f7.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer1","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":1567793148,"updated":1567793148}}'} + headers: {cache-control: no-cache, content-length: '342', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.vault.azure.net, + /certificates/issuers/issuer1, 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://vault508c15f7.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer1","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":1567793148,"updated":1567793148}}'} + headers: {cache-control: no-cache, content-length: '342', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.vault.azure.net, + /certificates/issuers/issuer1, api-version=7.0, ''] +- request: + body: '{"provider": "Test", "credentials": {"account_id": "keyvaultuser"}, "attributes": + {"enabled": true}}' + headers: + Accept: [application/json] + Content-Length: ['100'] + 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://vault508c15f7.vault.azure.net/certificates/issuers/issuer2?api-version=7.0 + response: + body: {string: '{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer2","provider":"Test","credentials":{"account_id":"keyvaultuser"},"attributes":{"enabled":true,"created":1567793149,"updated":1567793149}}'} + headers: {cache-control: no-cache, content-length: '209', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.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://vault508c15f7.vault.azure.net/certificates/issuers?api-version=7.0 + response: + body: {string: '{"value":[{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer1","provider":"Test"},{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer2","provider":"Test"}],"nextLink":null}'} + headers: {cache-control: no-cache, content-length: '215', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.vault.azure.net, + /certificates/issuers, 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://vault508c15f7.vault.azure.net/certificates/issuers/issuer1?api-version=7.0 + response: + body: {string: '{"id":"https://vault508c15f7.vault.azure.net/certificates/issuers/issuer1","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":1567793148,"updated":1567793148}}'} + headers: {cache-control: no-cache, content-length: '342', content-type: application/json; + charset=utf-8, date: 'Fri, 06 Sep 2019 18:05: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.174.72;act_addr_fam=InterNetwork;, + x-ms-keyvault-region: westus, x-ms-keyvault-service-version: 1.1.0.878, 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, vault508c15f7.vault.azure.net, + /certificates/issuers/issuer1, api-version=7.0, ''] +version: 1 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..d7d34d7f0ce6 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates.py @@ -0,0 +1,397 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +from __future__ import print_function +import functools + +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.PKCS12, + 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 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.PKCS12, + 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 + 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.PKCS12, + 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 = 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 + from azure.core.exceptions import HttpResponseError + 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.PKCS12, + 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 = 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), + HttpResponseError + ) + # [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] + + @ResourceGroupPreparer() + @VaultClientPreparer() + def test_example_contacts(self, vault_client, **kwargs): + from azure.keyvault.certificates import CertificatePolicy, Contact + + certificate_client = vault_client.certificates + + # [START create_contacts] + + # Create a list of the contacts that you want to set for this key vault. + contact_list = [ + Contact(email='admin@contoso.com', + name='John Doe', + phone='1111111111'), + Contact(email='admin2@contoso.com', + name='John Doe2', + phone='2222222222') + ] + + contacts = certificate_client.create_contacts(contacts=contact_list) + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # [END create_contacts] + + # [START get_contacts] + + contacts = certificate_client.get_contacts() + + # Loop through the certificate contacts for this key vault. + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # [END get_contacts] + + # [START delete_contacts] + + deleted_contacts = certificate_client.delete_contacts() + + for deleted_contact in deleted_contacts: + print(deleted_contact.name) + print(deleted_contact.email) + print(deleted_contact.phone) + + # [END delete_contacts] + + @ResourceGroupPreparer() + @VaultClientPreparer() + def test_example_issuers(self, vault_client, **kwargs): + from azure.keyvault.certificates import AdministratorDetails, CertificatePolicy + + certificate_client = vault_client.certificates + + # [START create_issuer] + + # First we specify the AdministratorDetails for a issuer. + admin_details = [AdministratorDetails( + first_name="John", + last_name="Doe", + email="admin@microsoft.com", + phone="4255555555" + )] + + issuer = certificate_client.create_issuer( + name="issuer1", + provider="Test", + account_id="keyvaultuser", + admin_details=admin_details, + enabled=True + ) + + print(issuer.name) + print(issuer.provider) + print(issuer.account_id) + + for admin_detail in issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END create_issuer] + + # [START get_issuer] + + issuer = certificate_client.get_issuer(name="issuer1") + + print(issuer.name) + print(issuer.provider) + print(issuer.account_id) + + for admin_detail in issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END get_issuer] + + certificate_client.create_issuer( + name="issuer2", + provider="Test", + account_id="keyvaultuser", + enabled=True + ) + + # [START list_issuers] + + issuers = certificate_client.list_issuers() + + for issuer in issuers: + print(issuer.name) + print(issuer.provider) + + # [END list_issuers] + + # [START delete_issuer] + + deleted_issuer = certificate_client.delete_issuer(name="issuer1") + + print(deleted_issuer.name) + print(deleted_issuer.provider) + print(deleted_issuer.account_id) + + for admin_detail in deleted_issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END delete_issuer] \ No newline at end of file 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..d85ca344b317 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_examples_certificates_async.py @@ -0,0 +1,394 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +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): + certificate_client = vault_client.certificates + # [START create_certificate] + from azure.keyvault.certificates.aio 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.PKCS12, + 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.aio 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.PKCS12, + 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.aio 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.PKCS12, + 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.aio import CertificatePolicy, KeyProperties, SecretContentType + from azure.core.exceptions import HttpResponseError + 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.PKCS12, + 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=HttpResponseError + ) + + # [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] + + @ResourceGroupPreparer() + @AsyncVaultClientPreparer() + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_contacts(self, vault_client, **kwargs): + from azure.keyvault.certificates.aio import CertificatePolicy, Contact + + certificate_client = vault_client.certificates + + # [START create_contacts] + + # Create a list of the contacts that you want to set for this key vault. + contact_list = [ + Contact(email='admin@contoso.com', + name='John Doe', + phone='1111111111'), + Contact(email='admin2@contoso.com', + name='John Doe2', + phone='2222222222') + ] + + contacts = await certificate_client.create_contacts(contacts=contact_list) + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # [END create_contacts] + + # [START get_contacts] + + contacts = await certificate_client.get_contacts() + + # Loop through the certificate contacts for this key vault. + for contact in contacts: + print(contact.name) + print(contact.email) + print(contact.phone) + + # [END get_contacts] + + # [START delete_contacts] + + deleted_contacts = await certificate_client.delete_contacts() + + for deleted_contact in deleted_contacts: + print(deleted_contact.name) + print(deleted_contact.email) + print(deleted_contact.phone) + + # [END delete_contacts] + + @ResourceGroupPreparer() + @AsyncVaultClientPreparer() + @AsyncKeyVaultTestCase.await_prepared_test + async def test_example_issuers(self, vault_client, **kwargs): + from azure.keyvault.certificates import AdministratorDetails, CertificatePolicy + + certificate_client = vault_client.certificates + + # [START create_issuer] + + # First we specify the AdministratorDetails for a issuer. + admin_details = [AdministratorDetails( + first_name="John", + last_name="Doe", + email="admin@microsoft.com", + phone="4255555555" + )] + + issuer = await certificate_client.create_issuer( + name="issuer1", + provider="Test", + account_id="keyvaultuser", + admin_details=admin_details, + enabled=True + ) + + print(issuer.name) + print(issuer.provider) + print(issuer.account_id) + + for admin_detail in issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END create_issuer] + + # [START get_issuer] + + issuer = await certificate_client.get_issuer(name="issuer1") + + print(issuer.name) + print(issuer.provider) + print(issuer.account_id) + + for admin_detail in issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END get_issuer] + + await certificate_client.create_issuer( + name="issuer2", + provider="Test", + account_id="keyvaultuser", + enabled=True + ) + + # [START list_issuers] + + issuers = certificate_client.list_issuers() + + async for issuer in issuers: + print(issuer.name) + print(issuer.provider) + + # [END list_issuers] + + # [START delete_issuer] + + deleted_issuer = await certificate_client.delete_issuer(name="issuer1") + + print(deleted_issuer.name) + print(deleted_issuer.provider) + print(deleted_issuer.account_id) + + for admin_detail in deleted_issuer.admin_details: + print(admin_detail.first_name) + print(admin_detail.last_name) + print(admin_detail.email) + print(admin_detail.phone) + + # [END delete_issuer] \ No newline at end of file