diff --git a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md index 579f7f48fb94..b3f756507332 100644 --- a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md +++ b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md @@ -5,6 +5,10 @@ - Correct typing for paging methods - Fixed incompatibility issues with API version 2016-10-01 +### Added +- Added method `parse_key_vault_certificate_id` that parses out a full ID returned by key vault, so users +can easily access the certificate's `name`, `vault_url`, and `version`. + ## 4.2.0 (2020-08-11) ### Fixed diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py index 31d88019da14..d5ed0e632eef 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/__init__.py @@ -24,7 +24,9 @@ LifetimeAction, KeyVaultCertificate ) +from ._parse_id import parse_key_vault_certificate_id from ._shared.client_base import ApiVersion +from ._shared import ParsedId __all__ = [ "ApiVersion", @@ -47,7 +49,9 @@ "CertificateContentType", "WellKnownIssuerNames", "CertificateIssuer", - "IssuerProperties" + "IssuerProperties", + "parse_key_vault_certificate_id", + "ParsedId", ] from ._version import VERSION diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_models.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_models.py index a73c8e359ef4..6cfee8b32de1 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_models.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_models.py @@ -4,7 +4,7 @@ # ------------------------------------ # pylint: disable=too-many-lines,too-many-public-methods -from ._shared import parse_vault_id +from ._shared import parse_key_vault_identifier from ._generated.v7_1 import models from ._enums import( CertificatePolicyAction, @@ -147,7 +147,7 @@ def __init__(self, **kwargs): # type: (**Any) -> None self._attributes = kwargs.pop("attributes", None) self._id = kwargs.pop("cert_id", None) - self._vault_id = parse_vault_id(self._id) + self._vault_id = parse_key_vault_identifier(self._id) self._x509_thumbprint = kwargs.pop("x509_thumbprint", None) self._tags = kwargs.pop("tags", None) @@ -430,7 +430,7 @@ def __init__( ): # type: (...) -> None self._id = cert_operation_id - self._vault_id = parse_vault_id(cert_operation_id) + self._vault_id = parse_key_vault_identifier(cert_operation_id) self._issuer_name = issuer_name self._certificate_type = certificate_type self._certificate_transparency = certificate_transparency @@ -1058,7 +1058,7 @@ class IssuerProperties(object): def __init__(self, provider=None, **kwargs): # type: (Optional[str], **Any) -> None self._id = kwargs.pop("issuer_id", None) - self._vault_id = parse_vault_id(self._id) + self._vault_id = parse_key_vault_identifier(self._id) self._provider = provider def __repr__(self): @@ -1120,7 +1120,7 @@ def __init__( self._organization_id = organization_id self._admin_contacts = admin_contacts self._id = kwargs.pop("issuer_id", None) - self._vault_id = parse_vault_id(self._id) + self._vault_id = parse_key_vault_identifier(self._id) def __repr__(self): # type () -> str @@ -1158,7 +1158,8 @@ def id(self): def name(self): # type: () -> str # Issuer name is listed under version under vault_id - # This is because the id we pass to parse_vault_id has an extra segment, so where most cases the version of + # This is because the id we pass to parse_key_vault_identifier has an extra segment, + # so where most cases the version of # The general pattern is certificates/name/version, but here we have certificates/issuers/name/version # Issuers are not versioned. """:rtype: str""" diff --git a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py new file mode 100644 index 000000000000..23b5f4d683a3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py @@ -0,0 +1,33 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +from ._shared import parse_key_vault_identifier, ParsedId + + +def parse_key_vault_certificate_id(source_id): + # type: (str) -> ParsedId + """Parses a full certificate's ID into a class. + + :param str source_id: the full original identifier of a certificate + :returns: Returns a parsed certificate id + :rtype: ~azure.keyvault.certificates.ParsedId + :raises: ValueError + + Example: + .. literalinclude:: ../tests/test_parse_id.py + :start-after: [START parse_key_vault_certificate_id] + :end-before: [END parse_key_vault_certificate_id] + :language: python + :caption: Parse a certificate's ID + :dedent: 8 + """ + parsed_id = parse_key_vault_identifier(source_id) + + return ParsedId( + name=parsed_id.name, + source_id=parsed_id.source_id, + vault_url=parsed_id.vault_url, + version=parsed_id.version + ) 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 index e13f15a61c71..08901cf40f1c 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py @@ -2,8 +2,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ -from collections import namedtuple - try: import urllib.parse as parse except ImportError: @@ -24,25 +22,45 @@ "KeyVaultClientBase", ] -_VaultId = namedtuple("VaultId", ["vault_url", "collection", "name", "version"]) +class ParsedId(): + """Represents a key vault identifier and its parsed contents. + + :param str source_id: The originally received complete identifier + :param str vault_url: The vault URL + :param str name: The name extracted from the id + :param str version: The version extracted from the id + """ + + def __init__( + self, + source_id, # type: str + vault_url, # type: str + name, # type: str + version=None # type: Optional[str] + ): + self.source_id = source_id + self.vault_url = vault_url + self.name = name + self.version = version -def parse_vault_id(url): +def parse_key_vault_identifier(source_id): + # type: (str) -> ParsedId try: - parsed_uri = parse.urlparse(url) + parsed_uri = parse.urlparse(source_id) except Exception: # pylint: disable=broad-except - raise ValueError("'{}' is not not a valid url".format(url)) + raise ValueError("'{}' is not not a valid ID".format(source_id)) if not (parsed_uri.scheme and parsed_uri.hostname): - raise ValueError("'{}' is not not a valid url".format(url)) + raise ValueError("'{}' is not not a valid ID".format(source_id)) 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)) + raise ValueError("'{}' is not not a valid vault ID".format(source_id)) - return _VaultId( + return ParsedId( + source_id=source_id, vault_url="{}://{}".format(parsed_uri.scheme, parsed_uri.hostname), - collection=path[0], name=path[1], version=path[2] if len(path) == 3 else None, ) diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml new file mode 100644 index 000000000000..bbf24b50e1c0 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml @@ -0,0 +1,585 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-certificates/4.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: POST + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/create?api-version=7.1 + response: + body: + string: '{"error":{"code":"Unauthorized","message":"Request is missing a Bearer + or PoP token."}}' + headers: + cache-control: + - no-cache + content-length: + - '87' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:29 GMT + expires: + - '-1' + pragma: + - no-cache + 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: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + x-powered-by: + - ASP.NET + status: + code: 401 + message: Unauthorized +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-identity/1.5.0b1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/v2.0/.well-known/openid-configuration + response: + body: + string: '{"token_endpoint":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/v2.0/token","token_endpoint_auth_methods_supported":["client_secret_post","private_key_jwt","client_secret_basic"],"jwks_uri":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/discovery/v2.0/keys","response_modes_supported":["query","fragment","form_post"],"subject_types_supported":["pairwise"],"id_token_signing_alg_values_supported":["RS256"],"response_types_supported":["code","id_token","code + id_token","id_token token"],"scopes_supported":["openid","profile","email","offline_access"],"issuer":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/v2.0","request_uri_parameter_supported":false,"userinfo_endpoint":"https://graph.microsoft.com/oidc/userinfo","authorization_endpoint":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/v2.0/authorize","device_authorization_endpoint":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/v2.0/devicecode","http_logout_supported":true,"frontchannel_logout_supported":true,"end_session_endpoint":"https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/v2.0/logout","claims_supported":["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],"tenant_region_scope":"WW","cloud_instance_name":"microsoftonline.com","cloud_graph_host_name":"graph.windows.net","msgraph_host":"graph.microsoft.com","rbac_url":"https://pas.windows.net"}' + headers: + access-control-allow-methods: + - GET, OPTIONS + access-control-allow-origin: + - '*' + cache-control: + - max-age=86400, private + content-length: + - '1651' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:29 GMT + p3p: + - CP="DSP CUR OTPi IND OTRi ONL FIN" + set-cookie: + - fpc=AlsXrepreJVFku05iefZ7jI; expires=Sat, 03-Oct-2020 18:43:30 GMT; path=/; + secure; HttpOnly; SameSite=None + - esctx=AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tABW6qoTcLn2dfss5FLK1xQizSgQzB8-w1SJmHL5xfkw8Jm2T40fc7RV6fHYyrv0MbLnRnubLcdhfsYpOC4XtDw-4ggMM268S8Sih1iU9xo14f7I_s5flSc9eMAeRQYjcZNC_lpYH-AYd7OgQXdONUbqETGPiWSeHOrI2ci06IplYgAA; + domain=.login.microsoftonline.com; path=/; secure; HttpOnly; SameSite=None + - x-ms-gateway-slice=estsfd; path=/; secure; samesite=none; httponly + - stsservicecookie=estsfd; path=/; secure; samesite=none; httponly + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-ms-ests-server: + - 2.1.11000.19 - NCUS ProdSlices + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - esctx=AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tABW6qoTcLn2dfss5FLK1xQizSgQzB8-w1SJmHL5xfkw8Jm2T40fc7RV6fHYyrv0MbLnRnubLcdhfsYpOC4XtDw-4ggMM268S8Sih1iU9xo14f7I_s5flSc9eMAeRQYjcZNC_lpYH-AYd7OgQXdONUbqETGPiWSeHOrI2ci06IplYgAA; + fpc=AlsXrepreJVFku05iefZ7jI; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd + User-Agent: + - azsdk-python-identity/1.5.0b1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=https://login.microsoftonline.com/common/oauth2/authorize + response: + body: + string: '{"tenant_discovery_endpoint":"https://login.microsoftonline.com/common/.well-known/openid-configuration","api-version":"1.1","metadata":[{"preferred_network":"login.microsoftonline.com","preferred_cache":"login.windows.net","aliases":["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{"preferred_network":"login.partner.microsoftonline.cn","preferred_cache":"login.partner.microsoftonline.cn","aliases":["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{"preferred_network":"login.microsoftonline.de","preferred_cache":"login.microsoftonline.de","aliases":["login.microsoftonline.de"]},{"preferred_network":"login.microsoftonline.us","preferred_cache":"login.microsoftonline.us","aliases":["login.microsoftonline.us","login.usgovcloudapi.net"]},{"preferred_network":"login-us.microsoftonline.com","preferred_cache":"login-us.microsoftonline.com","aliases":["login-us.microsoftonline.com"]}]}' + headers: + access-control-allow-methods: + - GET, OPTIONS + access-control-allow-origin: + - '*' + cache-control: + - max-age=86400, private + content-length: + - '945' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:30 GMT + p3p: + - CP="DSP CUR OTPi IND OTRi ONL FIN" + set-cookie: + - fpc=AlsXrepreJVFku05iefZ7jI; expires=Sat, 03-Oct-2020 18:43:30 GMT; path=/; + secure; HttpOnly; SameSite=None + - x-ms-gateway-slice=prod; path=/; secure; samesite=none; httponly + - stsservicecookie=estsfd; path=/; secure; samesite=none; httponly + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-ms-ests-server: + - 2.1.10985.18 - EST ProdSlices + status: + code: 200 + message: OK +- request: + body: '{"policy": {"x509_props": {"subject": "CN=DefaultPolicy", "sans": {}}, + "issuer": {"name": "Self"}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '99' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-certificates/4.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: POST + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/create?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:30 GMT + expires: + - '-1' + location: + - https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1&request_id=d2d492a04a844ecabc3839a2e7a84ab7 + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:30 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:35 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:46 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","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":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1302' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:51 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCZvxJf427uYXyNvlTHgH4Xyrj5zvQiFNosO6+DiAqa719Ysn0/+W8En4Dx8rhW1LvNwY8S6du98yCNc42nG6pqGJGwCzb39/2aHc1LvuoTX0Np0l0A6H0aoZ2R5ioEH1mbpD05WaJw84GCLqBTfg0l57CqRodp0q6XMtkx3wSOdE6VdS9+cZ2umSvyTuw6hJ2PBFIutQVCXFH3+egt5pTJNinJdR8JS06kjNIEyaKlOLudzQMCcRcxC1GeHPEPfsqqDxPA6m/eVoIlmrqPH3+3JBAYISkjrrcc1jEVEIEi2DeZLs55LwtAipoQxJqe7hwuUhaO50mTelQhONU7PtpD","cancellation_requested":false,"status":"completed","target":"https://vaultname.vault.azure.net/certificates/cert3382155d","request_id":"d2d492a04a844ecabc3839a2e7a84ab7"}' + headers: + cache-control: + - no-cache + content-length: + - '1223' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:56 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","x5t":"EdWG7uwf45IiIBefWCvpUM9LDyo","cer":"MIIDNjCCAh6gAwIBAgIQf/VFeszKRgSKtME3nVP7BzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMDkwMzE4MzM1M1oXDTIxMDkwMzE4NDM1M1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOtPhjRlJl6lDO8xxSe2IiW+EgmSMB0GA1UdDgQWBBTrT4Y0ZSZepQzvMcUntiIlvhIJkjANBgkqhkiG9w0BAQsFAAOCAQEApOx+fS4bT2Xc4NUwu4QpAq4KBX/KjzCa2nTx47gRcydaJNUSnjGnC/dPunhUulerOTrwkP2e3EJmcGnvzldIJ/DhI0B3pdMsfUqtR2Iy5zs+RSgLnohI9WDJmpvqC4BVJTu66GX1Cm7ZMk5RnkK1cId7SEYNKTPv4qgkjZmexq/yEUphfBS5xvsIaKLpoYbwcxVaN7hQcDI1X5ZrPn9Zw3ydZFjqZv6gNb7cB17gOUUQZzTMKyCXEWAXK8LAs1ySIFyor3IUxYGciXS+FxaRl5+R6UoC+ck2xqPi/xCC7OU18eZZam7IDitKVeW7qVL+nSowKsC1R5CEvbvPRNIvZw==","attributes":{"enabled":true,"nbf":1599158033,"exp":1630694633,"created":1599158634,"updated":1599158634,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"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":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1599158610,"updated":1599158610}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' + headers: + cache-control: + - no-cache + content-length: + - '2387' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:56 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + 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.2.1 Python/3.8.5 (macOS-10.13.6-x86_64-i386-64bit) + method: GET + uri: https://vaultname.vault.azure.net/certificates/cert3382155d/?api-version=7.1 + response: + body: + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/24284f8ef9b6422d9b24ea5c9bb80fe2","x5t":"EdWG7uwf45IiIBefWCvpUM9LDyo","cer":"MIIDNjCCAh6gAwIBAgIQf/VFeszKRgSKtME3nVP7BzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMDkwMzE4MzM1M1oXDTIxMDkwMzE4NDM1M1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7cRxQ53VnJZ+dP18NutICGiZsi9O/vOlpzKeGPUNLZ5WH7S9jhrhMazm06puRfh3+yKZaxY1XmTffYO4Aa3oVJdwJeREPTkrJUHgmWfsNNe/AWX39Yx0iqMFKxow6Gy1sDFc20lKOYpyQvY8YXpad/lCHzVIbYAgOU95n8VbRakw5MbycqHDmSLo79DdrOGjbokGuIY98HcY+Vact3amjoiq0F2b1iIDzkF5R6ohkKKPL0OcUe3rz0QeGEMtLn3DCMpkwHKlq0fTeksWVvgZQtmGjB9/GngFE+2wkeMnlVG5tRwa7ACQ0WzoPB7KrDo2O7t3yelzWvuJkKsEHd89sCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOtPhjRlJl6lDO8xxSe2IiW+EgmSMB0GA1UdDgQWBBTrT4Y0ZSZepQzvMcUntiIlvhIJkjANBgkqhkiG9w0BAQsFAAOCAQEApOx+fS4bT2Xc4NUwu4QpAq4KBX/KjzCa2nTx47gRcydaJNUSnjGnC/dPunhUulerOTrwkP2e3EJmcGnvzldIJ/DhI0B3pdMsfUqtR2Iy5zs+RSgLnohI9WDJmpvqC4BVJTu66GX1Cm7ZMk5RnkK1cId7SEYNKTPv4qgkjZmexq/yEUphfBS5xvsIaKLpoYbwcxVaN7hQcDI1X5ZrPn9Zw3ydZFjqZv6gNb7cB17gOUUQZzTMKyCXEWAXK8LAs1ySIFyor3IUxYGciXS+FxaRl5+R6UoC+ck2xqPi/xCC7OU18eZZam7IDitKVeW7qVL+nSowKsC1R5CEvbvPRNIvZw==","attributes":{"enabled":true,"nbf":1599158033,"exp":1630694633,"created":1599158634,"updated":1599158634,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"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":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1599158610,"updated":1599158610}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' + headers: + cache-control: + - no-cache + content-length: + - '2387' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 03 Sep 2020 18:43:56 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=73.135.72.237;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.1.44.0 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +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 index a2ab84c7b4ef..614b1790b441 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py @@ -26,7 +26,7 @@ IssuerProperties, ApiVersion, ) -from azure.keyvault.certificates._shared import parse_vault_id +from azure.keyvault.certificates._shared import parse_key_vault_identifier from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer from _shared.preparer import KeyVaultClientPreparer as _KeyVaultClientPreparer @@ -85,7 +85,7 @@ def _validate_certificate_operation(self, pending_cert_operation, vault, cert_na self.assertIsNotNone(pending_cert_operation) self.assertIsNotNone(pending_cert_operation.csr) self.assertEqual(original_cert_policy.issuer_name, pending_cert_operation.issuer_name) - pending_id = parse_vault_id(pending_cert_operation.id) + pending_id = parse_key_vault_identifier(pending_cert_operation.id) self.assertEqual(pending_id.vault_url.strip("/"), vault.strip("/")) self.assertEqual(pending_id.name, cert_name) @@ -260,9 +260,10 @@ def test_list(self, client, **kwargs): error_count = 0 try: cert_bundle = self._import_common_certificate(client=client, cert_name=cert_name) - parsed_id = parse_vault_id(url=cert_bundle.id) - cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name - expected[cid.strip("/")] = cert_bundle + # going to remove the id from the last '/' onwards. This is because list + # properties of certificates doesn't return the version in the id + cid = "/".join(cert_bundle.id.split("/")[:-1]) + expected[cid] = cert_bundle except Exception as ex: if hasattr(ex, "message") and "Throttled" in ex.message: error_count += 1 @@ -289,9 +290,7 @@ def test_list_certificate_versions(self, client, **kwargs): error_count = 0 try: cert_bundle = self._import_common_certificate(client=client, cert_name=cert_name) - parsed_id = parse_vault_id(url=cert_bundle.id) - cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name + "/" + parsed_id.version - expected[cid.strip("/")] = cert_bundle + expected[cert_bundle.id] = cert_bundle except Exception as ex: if hasattr(ex, "message") and "Throttled" in ex.message: error_count += 1 @@ -357,7 +356,7 @@ def test_recover_and_purge(self, client, **kwargs): client.begin_delete_certificate(certificate_name=cert_name).wait() # validate all our deleted certificates are returned by list_deleted_certificates - deleted = [parse_vault_id(url=c.id).name for c in client.list_deleted_certificates()] + deleted = [parse_key_vault_identifier(source_id=c.id).name for c in client.list_deleted_certificates()] self.assertTrue(all(c in deleted for c in certs.keys())) # recover select certificates @@ -372,7 +371,7 @@ def test_recover_and_purge(self, client, **kwargs): time.sleep(50) # validate none of our deleted certificates are returned by list_deleted_certificates - deleted = [parse_vault_id(url=c.id).name for c in client.list_deleted_certificates()] + deleted = [parse_key_vault_identifier(source_id=c.id).name for c in client.list_deleted_certificates()] self.assertTrue(not any(c in deleted for c in certs.keys())) # validate the recovered certificates diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client_async.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client_async.py index 8620833ee750..9f451a1b51a0 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client_async.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client_async.py @@ -20,10 +20,10 @@ LifetimeAction, CertificateIssuer, IssuerProperties, + parse_key_vault_certificate_id, ApiVersion, ) from azure.keyvault.certificates.aio import CertificateClient -from azure.keyvault.certificates._shared import parse_vault_id from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer import pytest @@ -78,7 +78,7 @@ def _validate_certificate_operation(self, pending_cert_operation, vault, cert_na self.assertIsNotNone(pending_cert_operation) self.assertIsNotNone(pending_cert_operation.csr) self.assertEqual(original_cert_policy.issuer_name, pending_cert_operation.issuer_name) - pending_id = parse_vault_id(pending_cert_operation.id) + pending_id = parse_key_vault_certificate_id(pending_cert_operation.id) self.assertEqual(pending_id.vault_url.strip("/"), vault.strip("/")) self.assertEqual(pending_id.name, cert_name) @@ -254,9 +254,10 @@ async def test_list(self, client, **kwargs): error_count = 0 try: cert_bundle = await self._import_common_certificate(client=client, cert_name=cert_name) - parsed_id = parse_vault_id(url=cert_bundle.id) - cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name - expected[cid.strip("/")] = cert_bundle + # going to remove the id from the last '/' onwards. This is because list + # properties of certificates doesn't return the version in the id + cid = "/".join(cert_bundle.id.split("/")[:-1]) + expected[cid] = cert_bundle except Exception as ex: if hasattr(ex, "message") and "Throttled" in ex.message: error_count += 1 @@ -283,9 +284,7 @@ async def test_list_certificate_versions(self, client, **kwargs): error_count = 0 try: cert_bundle = await self._import_common_certificate(client=client, cert_name=cert_name) - parsed_id = parse_vault_id(url=cert_bundle.id) - cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name + "/" + parsed_id.version - expected[cid.strip("/")] = cert_bundle + expected[cert_bundle.id.strip("/")] = cert_bundle except Exception as ex: if hasattr(ex, "message") and "Throttled" in ex.message: error_count += 1 @@ -356,7 +355,7 @@ async def test_recover_and_purge(self, client, **kwargs): deleted_certificates = client.list_deleted_certificates() deleted = [] async for c in deleted_certificates: - deleted.append(parse_vault_id(url=c.id).name) + deleted.append(parse_key_vault_certificate_id(source_id=c.id).name) self.assertTrue(all(c in deleted for c in certs.keys())) # recover select certificates @@ -374,7 +373,7 @@ async def test_recover_and_purge(self, client, **kwargs): deleted_certificates = client.list_deleted_certificates() deleted = [] async for c in deleted_certificates: - deleted.append(parse_vault_id(url=c.id).name) + deleted.append(parse_key_vault_certificate_id(source_id=c.id).name) self.assertTrue(not any(c in deleted for c in certs.keys())) # validate the recovered certificates diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py new file mode 100644 index 000000000000..610cf14d2da7 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -0,0 +1,60 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------- +import pytest +import functools +from azure.keyvault.certificates import( + CertificateClient, CertificatePolicy, parse_key_vault_certificate_id +) +from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer + +from _shared.preparer import KeyVaultClientPreparer as _KeyVaultClientPreparer +from _shared.test_case import KeyVaultTestCase + +# pre-apply the client_cls positional argument so it needn't be explicitly passed below +KeyVaultClientPreparer = functools.partial(_KeyVaultClientPreparer, CertificateClient) + + +class TestParseId(KeyVaultTestCase): + + @ResourceGroupPreparer(random_name_enabled=True) + @KeyVaultPreparer() + @KeyVaultClientPreparer() + def test_parse_certificate_id_with_version(self, client): + cert_name = self.get_resource_name("cert") + # create certificate + certificate = client.begin_create_certificate(cert_name, CertificatePolicy.get_default()).result() + + # [START parse_key_vault_certificate_id] + cert = client.get_certificate(cert_name) + parsed_certificate_id = parse_key_vault_certificate_id(cert.id) + + print(parsed_certificate_id.name) + print(parsed_certificate_id.vault_url) + print(parsed_certificate_id.version) + print(parsed_certificate_id.source_id) + # [END parse_key_vault_certificate_id] + self.assertEqual(parsed_certificate_id.name, cert_name) + self.assertEqual(parsed_certificate_id.vault_url, client.vault_url) + self.assertEqual(parsed_certificate_id.version, cert.properties.version) + self.assertEqual(parsed_certificate_id.source_id, cert.id) + + def test_parse_certificate_id_with_pending_version(self): + source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + parsed_certificate_id = parse_key_vault_certificate_id(source_id) + + self.assertEqual(parsed_certificate_id.name, "certificate-name") + self.assertEqual(parsed_certificate_id.vault_url, "https://keyvault-name.vault.azure.net") + self.assertEqual(parsed_certificate_id.version, "pending") + self.assertEqual(parsed_certificate_id.source_id, "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending") + + def test_parse_deleted_certificate_id(self): + source_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + parsed_certificate_id = parse_key_vault_certificate_id(source_id) + + self.assertEqual(parsed_certificate_id.name, "deleted-certificate") + self.assertEqual(parsed_certificate_id.vault_url, "https://keyvault-name.vault.azure.net") + self.assertIsNone(parsed_certificate_id.version) + self.assertEqual(parsed_certificate_id.source_id, "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate") +