From b5de5d76263230be27c33af04d08a2a1e62570b7 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 25 Aug 2020 16:40:19 -0400 Subject: [PATCH 1/9] renamed existing id parser to be more consistent with new class --- .../azure/keyvault/certificates/__init__.py | 6 ++- .../azure/keyvault/certificates/_models.py | 13 +++--- .../keyvault/certificates/_shared/__init__.py | 40 ++++++++++++++----- .../tests/test_certificates_client.py | 12 +++--- .../tests/test_certificates_client_async.py | 12 +++--- 5 files changed, 55 insertions(+), 28 deletions(-) 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..0a9a616c97af 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_certificate_id from ._shared.client_base import ApiVersion +from ._shared import ParsedId __all__ = [ "ApiVersion", @@ -47,7 +49,9 @@ "CertificateContentType", "WellKnownIssuerNames", "CertificateIssuer", - "IssuerProperties" + "IssuerProperties", + "parse_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/_shared/__init__.py b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_shared/__init__.py index e13f15a61c71..dbb386c674e6 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,23 +22,47 @@ "KeyVaultClientBase", ] -_VaultId = namedtuple("VaultId", ["vault_url", "collection", "name", "version"]) +class ParsedId(): + """Represents a key vault identifier and its parsed contents. + + :param str original_id: The originally received complete identifier + :param str vault_url: The vault URL + :param str collection: The collection name of the id. + :param str name: The name extracted from the id + :param str version: The version extracted from the id + """ + + def __init__( + self, + original_id, # type: str + vault_url, # type: str + collection, # type: str + name, # type: str + version=None # type: Optional[str] + ): + self.original_id = original_id + self.vault_url = vault_url + self.collection = collection + self.name = name + self.version = version -def parse_vault_id(url): +def parse_key_vault_identifier(original_id): + # type: (str) -> ParsedId try: - parsed_uri = parse.urlparse(url) + parsed_uri = parse.urlparse(original_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(original_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(original_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(original_id)) - return _VaultId( + return ParsedId( + original_id=original_id, vault_url="{}://{}".format(parsed_uri.scheme, parsed_uri.hostname), collection=path[0], name=path[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 c69e57756f69..9b80f8fd3a23 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py @@ -24,7 +24,7 @@ CertificateIssuer, IssuerProperties, ) -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 @@ -83,7 +83,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) @@ -258,7 +258,7 @@ 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) + parsed_id = parse_key_vault_identifier(original_id=cert_bundle.id) cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name expected[cid.strip("/")] = cert_bundle except Exception as ex: @@ -287,7 +287,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) + parsed_id = parse_key_vault_identifier(original_id=cert_bundle.id) cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name + "/" + parsed_id.version expected[cid.strip("/")] = cert_bundle except Exception as ex: @@ -355,7 +355,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(original_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 @@ -370,7 +370,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(original_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 7aa5d82d8efe..2b1d53136426 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 @@ -22,7 +22,7 @@ IssuerProperties, ) from azure.keyvault.certificates.aio import CertificateClient -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 import pytest @@ -77,7 +77,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) @@ -253,7 +253,7 @@ 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) + parsed_id = parse_key_vault_identifier(original_id=cert_bundle.id) cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name expected[cid.strip("/")] = cert_bundle except Exception as ex: @@ -282,7 +282,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) + parsed_id = parse_key_vault_identifier(original_id=cert_bundle.id) cid = parsed_id.vault_url + "/" + parsed_id.collection + "/" + parsed_id.name + "/" + parsed_id.version expected[cid.strip("/")] = cert_bundle except Exception as ex: @@ -355,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_identifier(original_id=c.id).name) self.assertTrue(all(c in deleted for c in certs.keys())) # recover select certificates @@ -373,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_identifier(original_id=c.id).name) self.assertTrue(not any(c in deleted for c in certs.keys())) # validate the recovered certificates From 6c9f3e0dbe60a693f97ed2383bc8385d6c2375fe Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 25 Aug 2020 17:02:18 -0400 Subject: [PATCH 2/9] add parse_certificate_id --- .../azure-keyvault-certificates/CHANGELOG.md | 4 +++ .../azure/keyvault/certificates/_parse_id.py | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py diff --git a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md index aa8bab5357fc..886216c079e6 100644 --- a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md +++ b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md @@ -2,6 +2,10 @@ ## 4.2.1 (Unreleased) +### Added +- Added method `parse_certificate_id` that parses out a full ID returned by key vault, so users +can easily access the certificate's `name`, `vault_url`, `version` etc. + ## 4.2.0 (2020-08-11) ### Fixed 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..9e1cc07f6192 --- /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_certificate_id(original_id): + # type: (str) -> ParsedId + """Parses a full certificate's ID into a class. + + :param str original_id: the full original identifier of a certificate + :returns: Returns a parsed certificate id + :rtype: ~azure.keyvault.certificates.ParsedId + :raises: ValueError + """ + parsed_id = parse_key_vault_identifier(original_id) + + valid_collections = ["certificates", "deletedcertificates"] + + if parsed_id.collection not in valid_collections: + raise ValueError( + "Collection '{}' is not a valid certificate collection. ".format(parsed_id.collection), + "Valid collections are: {}".format(", ".join(valid_collections)) + ) + return ParsedId( + collection=parsed_id.collection, + name=parsed_id.name, + original_id=parsed_id.original_id, + vault_url=parsed_id.vault_url, + version=parsed_id.version + ) From ead06e6ebbb576e66cdf0eba24edcc157a351e92 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 25 Aug 2020 17:06:09 -0400 Subject: [PATCH 3/9] add tests --- .../azure/keyvault/certificates/_parse_id.py | 8 +++ .../tests/test_parse_id.py | 49 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py 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 index 9e1cc07f6192..8ab345d9223d 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py @@ -14,6 +14,14 @@ def parse_certificate_id(original_id): :returns: Returns a parsed certificate id :rtype: ~azure.keyvault.certificates.ParsedId :raises: ValueError + + Example: + .. literalinclude:: ../tests/test_parse_id.py + :start-after: [START parse_certificate_id] + :end-before: [END parse_certificate_id] + :language: python + :caption: Parse a certificate's ID + :dedent: 8 """ parsed_id = parse_key_vault_identifier(original_id) 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..fff4ce0c0def --- /dev/null +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -0,0 +1,49 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------- +import pytest +from azure.keyvault.certificates import parse_certificate_id + +def print(*args): + assert all(arg is not None for arg in args) + +class TestParseId(): + def test_parse_certificate_id_with_version(self): + # [START parse_certificate_id] + original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" + parsed_certificate_id = parse_certificate_id(original_id) + + print(parsed_certificate_id.name) + print(parsed_certificate_id.collection) + print(parsed_certificate_id.vault_url) + print(parsed_certificate_id.version) + print(parsed_certificate_id.original_id) + # [END parse_certificate_id] + + def test_parse_certificate_id_with_pending_version(self): + original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + parsed_certificate_id = parse_certificate_id(original_id) + + assert parsed_certificate_id.name == "certificate-name" + assert parsed_certificate_id.collection == "certificates" + assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_certificate_id.version == "pending" + assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + + def test_parse_deleted_certificate_id(self): + original_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + parsed_certificate_id = parse_certificate_id(original_id) + + assert parsed_certificate_id.name == "deleted-certificate" + assert parsed_certificate_id.collection == "deletedcertificates" + assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_certificate_id.version == None + assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + + def test_parse_certificate_id_with_invalid_collection(self): + original_id = "https://keyvault-name.vault.azure.net/invalidcollection/certificate" + + with pytest.raises(ValueError) as excinfo: + parse_certificate_id(original_id) + assert "Collection 'invalidcollection' is not a valid certificate collection" in str(excinfo.value) From 1a5c23ba1e0054da36cd5b64113b8f0234d4797c Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 26 Aug 2020 11:25:25 -0400 Subject: [PATCH 4/9] remove print override, validate properties instead --- .../azure-keyvault-certificates/tests/test_parse_id.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py index fff4ce0c0def..7571007bfce1 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -4,11 +4,10 @@ # ------------------------------------- import pytest from azure.keyvault.certificates import parse_certificate_id +from _shared.test_case import KeyVaultTestCase -def print(*args): - assert all(arg is not None for arg in args) -class TestParseId(): +class TestParseId(KeyVaultTestCase): def test_parse_certificate_id_with_version(self): # [START parse_certificate_id] original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" @@ -20,6 +19,11 @@ def test_parse_certificate_id_with_version(self): print(parsed_certificate_id.version) print(parsed_certificate_id.original_id) # [END parse_certificate_id] + assert parsed_certificate_id.name == "certificate-name" + assert parsed_certificate_id.collection == "certificates" + assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_certificate_id.version == "version" + assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" def test_parse_certificate_id_with_pending_version(self): original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" From af05671376313f1305598027814e9d8cfd5ba44c Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 1 Sep 2020 11:53:44 -0400 Subject: [PATCH 5/9] remove exposed collection property --- .../azure/keyvault/certificates/_parse_id.py | 8 -------- .../keyvault/certificates/_shared/__init__.py | 4 ---- .../tests/test_certificates_client.py | 11 +++++------ .../tests/test_certificates_client_async.py | 19 +++++++++---------- .../tests/test_parse_id.py | 11 ----------- 5 files changed, 14 insertions(+), 39 deletions(-) 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 index 8ab345d9223d..3065d8f46ee6 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py @@ -25,15 +25,7 @@ def parse_certificate_id(original_id): """ parsed_id = parse_key_vault_identifier(original_id) - valid_collections = ["certificates", "deletedcertificates"] - - if parsed_id.collection not in valid_collections: - raise ValueError( - "Collection '{}' is not a valid certificate collection. ".format(parsed_id.collection), - "Valid collections are: {}".format(", ".join(valid_collections)) - ) return ParsedId( - collection=parsed_id.collection, name=parsed_id.name, original_id=parsed_id.original_id, vault_url=parsed_id.vault_url, 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 dbb386c674e6..cebb2150660b 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 @@ -27,7 +27,6 @@ class ParsedId(): :param str original_id: The originally received complete identifier :param str vault_url: The vault URL - :param str collection: The collection name of the id. :param str name: The name extracted from the id :param str version: The version extracted from the id """ @@ -36,13 +35,11 @@ def __init__( self, original_id, # type: str vault_url, # type: str - collection, # type: str name, # type: str version=None # type: Optional[str] ): self.original_id = original_id self.vault_url = vault_url - self.collection = collection self.name = name self.version = version @@ -64,7 +61,6 @@ def parse_key_vault_identifier(original_id): return ParsedId( original_id=original_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/test_certificates_client.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py index 9b80f8fd3a23..1f75d8565426 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py @@ -258,9 +258,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_key_vault_identifier(original_id=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 @@ -287,9 +288,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_key_vault_identifier(original_id=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 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 2b1d53136426..ebafd0c92ea1 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,9 +20,9 @@ LifetimeAction, CertificateIssuer, IssuerProperties, + parse_certificate_id, ) from azure.keyvault.certificates.aio import CertificateClient -from azure.keyvault.certificates._shared import parse_key_vault_identifier from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer import pytest @@ -77,7 +77,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_key_vault_identifier(pending_cert_operation.id) + pending_id = parse_certificate_id(pending_cert_operation.id) self.assertEqual(pending_id.vault_url.strip("/"), vault.strip("/")) self.assertEqual(pending_id.name, cert_name) @@ -253,9 +253,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_key_vault_identifier(original_id=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 @@ -282,9 +283,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_key_vault_identifier(original_id=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 @@ -355,7 +354,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_key_vault_identifier(original_id=c.id).name) + deleted.append(parse_certificate_id(original_id=c.id).name) self.assertTrue(all(c in deleted for c in certs.keys())) # recover select certificates @@ -373,7 +372,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_key_vault_identifier(original_id=c.id).name) + deleted.append(parse_certificate_id(original_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 index 7571007bfce1..ecf07b66e47d 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -14,13 +14,11 @@ def test_parse_certificate_id_with_version(self): parsed_certificate_id = parse_certificate_id(original_id) print(parsed_certificate_id.name) - print(parsed_certificate_id.collection) print(parsed_certificate_id.vault_url) print(parsed_certificate_id.version) print(parsed_certificate_id.original_id) # [END parse_certificate_id] assert parsed_certificate_id.name == "certificate-name" - assert parsed_certificate_id.collection == "certificates" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == "version" assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" @@ -30,7 +28,6 @@ def test_parse_certificate_id_with_pending_version(self): parsed_certificate_id = parse_certificate_id(original_id) assert parsed_certificate_id.name == "certificate-name" - assert parsed_certificate_id.collection == "certificates" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == "pending" assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" @@ -40,14 +37,6 @@ def test_parse_deleted_certificate_id(self): parsed_certificate_id = parse_certificate_id(original_id) assert parsed_certificate_id.name == "deleted-certificate" - assert parsed_certificate_id.collection == "deletedcertificates" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == None assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" - - def test_parse_certificate_id_with_invalid_collection(self): - original_id = "https://keyvault-name.vault.azure.net/invalidcollection/certificate" - - with pytest.raises(ValueError) as excinfo: - parse_certificate_id(original_id) - assert "Collection 'invalidcollection' is not a valid certificate collection" in str(excinfo.value) From 00a32cbc60f00dfadc2496f2b66e50eeb98fb5f7 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 1 Sep 2020 11:57:23 -0400 Subject: [PATCH 6/9] original_id -> source_id --- .../azure/keyvault/certificates/_parse_id.py | 8 ++++---- .../keyvault/certificates/_shared/__init__.py | 18 ++++++++--------- .../tests/test_certificates_client.py | 4 ++-- .../tests/test_certificates_client_async.py | 4 ++-- .../tests/test_parse_id.py | 20 +++++++++---------- 5 files changed, 27 insertions(+), 27 deletions(-) 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 index 3065d8f46ee6..c15314142d8f 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py @@ -6,11 +6,11 @@ from ._shared import parse_key_vault_identifier, ParsedId -def parse_certificate_id(original_id): +def parse_certificate_id(source_id): # type: (str) -> ParsedId """Parses a full certificate's ID into a class. - :param str original_id: the full original identifier of a certificate + :param str source_id: the full original identifier of a certificate :returns: Returns a parsed certificate id :rtype: ~azure.keyvault.certificates.ParsedId :raises: ValueError @@ -23,11 +23,11 @@ def parse_certificate_id(original_id): :caption: Parse a certificate's ID :dedent: 8 """ - parsed_id = parse_key_vault_identifier(original_id) + parsed_id = parse_key_vault_identifier(source_id) return ParsedId( name=parsed_id.name, - original_id=parsed_id.original_id, + 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 cebb2150660b..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 @@ -25,7 +25,7 @@ class ParsedId(): """Represents a key vault identifier and its parsed contents. - :param str original_id: The originally received complete identifier + :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 @@ -33,33 +33,33 @@ class ParsedId(): def __init__( self, - original_id, # type: str + source_id, # type: str vault_url, # type: str name, # type: str version=None # type: Optional[str] ): - self.original_id = original_id + self.source_id = source_id self.vault_url = vault_url self.name = name self.version = version -def parse_key_vault_identifier(original_id): +def parse_key_vault_identifier(source_id): # type: (str) -> ParsedId try: - parsed_uri = parse.urlparse(original_id) + parsed_uri = parse.urlparse(source_id) except Exception: # pylint: disable=broad-except - raise ValueError("'{}' is not not a valid ID".format(original_id)) + 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 ID".format(original_id)) + 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 ID".format(original_id)) + raise ValueError("'{}' is not not a valid vault ID".format(source_id)) return ParsedId( - original_id=original_id, + source_id=source_id, vault_url="{}://{}".format(parsed_uri.scheme, parsed_uri.hostname), name=path[1], version=path[2] if len(path) == 3 else None, 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 1f75d8565426..b13b7b910bdb 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py @@ -354,7 +354,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_key_vault_identifier(original_id=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 @@ -369,7 +369,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_key_vault_identifier(original_id=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 ebafd0c92ea1..5891d567f9e2 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 @@ -354,7 +354,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_certificate_id(original_id=c.id).name) + deleted.append(parse_certificate_id(source_id=c.id).name) self.assertTrue(all(c in deleted for c in certs.keys())) # recover select certificates @@ -372,7 +372,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_certificate_id(original_id=c.id).name) + deleted.append(parse_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 index ecf07b66e47d..09b7c6c01c00 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -10,33 +10,33 @@ class TestParseId(KeyVaultTestCase): def test_parse_certificate_id_with_version(self): # [START parse_certificate_id] - original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" - parsed_certificate_id = parse_certificate_id(original_id) + source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" + parsed_certificate_id = parse_certificate_id(source_id) print(parsed_certificate_id.name) print(parsed_certificate_id.vault_url) print(parsed_certificate_id.version) - print(parsed_certificate_id.original_id) + print(parsed_certificate_id.source_id) # [END parse_certificate_id] assert parsed_certificate_id.name == "certificate-name" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == "version" - assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" + assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" def test_parse_certificate_id_with_pending_version(self): - original_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" - parsed_certificate_id = parse_certificate_id(original_id) + source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + parsed_certificate_id = parse_certificate_id(source_id) assert parsed_certificate_id.name == "certificate-name" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == "pending" - assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" def test_parse_deleted_certificate_id(self): - original_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" - parsed_certificate_id = parse_certificate_id(original_id) + source_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + parsed_certificate_id = parse_certificate_id(source_id) assert parsed_certificate_id.name == "deleted-certificate" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == None - assert parsed_certificate_id.original_id == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" From 5f1d2f6be135526bf5d4e8b7b6d374b80a37295d Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 1 Sep 2020 12:00:53 -0400 Subject: [PATCH 7/9] parse_certificate_id -> parse_key_vault_certificate_id --- .../azure-keyvault-certificates/CHANGELOG.md | 2 +- .../azure/keyvault/certificates/__init__.py | 4 ++-- .../azure/keyvault/certificates/_parse_id.py | 6 +++--- .../tests/test_certificates_client_async.py | 8 ++++---- .../tests/test_parse_id.py | 12 ++++++------ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md index 7cfa0d8bfb51..1415c7ced495 100644 --- a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md +++ b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md @@ -5,7 +5,7 @@ - Correct typing for paging methods ### Added -- Added method `parse_certificate_id` that parses out a full ID returned by key vault, so users +- 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`, `version` etc. 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 0a9a616c97af..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,7 @@ LifetimeAction, KeyVaultCertificate ) -from ._parse_id import parse_certificate_id +from ._parse_id import parse_key_vault_certificate_id from ._shared.client_base import ApiVersion from ._shared import ParsedId @@ -50,7 +50,7 @@ "WellKnownIssuerNames", "CertificateIssuer", "IssuerProperties", - "parse_certificate_id", + "parse_key_vault_certificate_id", "ParsedId", ] 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 index c15314142d8f..23b5f4d683a3 100644 --- a/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_parse_id.py @@ -6,7 +6,7 @@ from ._shared import parse_key_vault_identifier, ParsedId -def parse_certificate_id(source_id): +def parse_key_vault_certificate_id(source_id): # type: (str) -> ParsedId """Parses a full certificate's ID into a class. @@ -17,8 +17,8 @@ def parse_certificate_id(source_id): Example: .. literalinclude:: ../tests/test_parse_id.py - :start-after: [START parse_certificate_id] - :end-before: [END parse_certificate_id] + :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 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 5891d567f9e2..94236e497556 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,7 +20,7 @@ LifetimeAction, CertificateIssuer, IssuerProperties, - parse_certificate_id, + parse_key_vault_certificate_id, ) from azure.keyvault.certificates.aio import CertificateClient from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer @@ -77,7 +77,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_certificate_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) @@ -354,7 +354,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_certificate_id(source_id=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 @@ -372,7 +372,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_certificate_id(source_id=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 index 09b7c6c01c00..d434b6675d6d 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -3,21 +3,21 @@ # Licensed under the MIT License. # ------------------------------------- import pytest -from azure.keyvault.certificates import parse_certificate_id +from azure.keyvault.certificates import parse_key_vault_certificate_id from _shared.test_case import KeyVaultTestCase class TestParseId(KeyVaultTestCase): def test_parse_certificate_id_with_version(self): - # [START parse_certificate_id] + # [START parse_key_vault_certificate_id] source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" - parsed_certificate_id = parse_certificate_id(source_id) + parsed_certificate_id = parse_key_vault_certificate_id(source_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_certificate_id] + # [END parse_key_vault_certificate_id] assert parsed_certificate_id.name == "certificate-name" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" assert parsed_certificate_id.version == "version" @@ -25,7 +25,7 @@ def test_parse_certificate_id_with_version(self): 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_certificate_id(source_id) + parsed_certificate_id = parse_key_vault_certificate_id(source_id) assert parsed_certificate_id.name == "certificate-name" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" @@ -34,7 +34,7 @@ def test_parse_certificate_id_with_pending_version(self): def test_parse_deleted_certificate_id(self): source_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" - parsed_certificate_id = parse_certificate_id(source_id) + parsed_certificate_id = parse_key_vault_certificate_id(source_id) assert parsed_certificate_id.name == "deleted-certificate" assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" From 6bc362fdb9b820e67d84d0c7486ff85a18cc44f5 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 1 Sep 2020 12:02:52 -0400 Subject: [PATCH 8/9] remove etc from changelog comment --- sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md index 1415c7ced495..5e455dbfae37 100644 --- a/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md +++ b/sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md @@ -6,7 +6,7 @@ ### 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`, `version` etc. +can easily access the certificate's `name`, `vault_url`, and `version`. ## 4.2.0 (2020-08-11) From 057ee2ddd864c73652dfd03046da256924564360 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 3 Sep 2020 14:46:20 -0400 Subject: [PATCH 9/9] make code snippet include get of certificate --- ...est_parse_certificate_id_with_version.yaml | 585 ++++++++++++++++++ .../tests/test_parse_id.py | 50 +- 2 files changed, 619 insertions(+), 16 deletions(-) create mode 100644 sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml 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_parse_id.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py index d434b6675d6d..610cf14d2da7 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -3,40 +3,58 @@ # Licensed under the MIT License. # ------------------------------------- import pytest -from azure.keyvault.certificates import parse_key_vault_certificate_id +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): - def test_parse_certificate_id_with_version(self): + + @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] - source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" - parsed_certificate_id = parse_key_vault_certificate_id(source_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] - assert parsed_certificate_id.name == "certificate-name" - assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" - assert parsed_certificate_id.version == "version" - assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/version" + 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) - assert parsed_certificate_id.name == "certificate-name" - assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" - assert parsed_certificate_id.version == "pending" - assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + 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) - assert parsed_certificate_id.name == "deleted-certificate" - assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" - assert parsed_certificate_id.version == None - assert parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + 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") +