Skip to content

Commit 5f5877b

Browse files
authored
[Key Vault] Correctly return CertificateOperation when creating certificate with unknown issuer (#41879)
* Return CertificateOperation when issuer is unknown * Update changelog
1 parent 65947ad commit 5f5877b

File tree

6 files changed

+64
-1
lines changed

6 files changed

+64
-1
lines changed

sdk/keyvault/azure-keyvault-certificates/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
### Bugs Fixed
1010

11+
- When creating a certificate with an unknown issuer, `CertificateClient.(begin_)create_certificate` now returns a
12+
`CertificateOperation` instead of `None`
13+
1114
### Other Changes
1215

1316
## 4.10.0 (2025-06-16)

sdk/keyvault/azure-keyvault-certificates/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "python",
44
"TagPrefix": "python/keyvault/azure-keyvault-certificates",
5-
"Tag": "python/keyvault/azure-keyvault-certificates_d160d7cd76"
5+
"Tag": "python/keyvault/azure-keyvault-certificates_d281d3c6c6"
66
}

sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/_polling.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def run(self) -> None:
4444
def finished(self) -> bool:
4545
operation = self._pending_certificate_op
4646
if operation and operation.issuer_name and operation.issuer_name.lower() == "unknown":
47+
# Because we've finished, self._resource won't be set by the run method; set it here so we don't return None
48+
self._resource = self._pending_certificate_op
4749
return True
4850
return self._pending_certificate_op.status.lower() != "inprogress" # type: ignore
4951

sdk/keyvault/azure-keyvault-certificates/azure/keyvault/certificates/aio/_polling_async.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ async def run(self) -> None:
4545
def finished(self) -> bool:
4646
operation = self._pending_certificate_op
4747
if operation and operation.issuer_name and operation.issuer_name.lower() == "unknown":
48+
# Because we've finished, self._resource won't be set by the run method; set it here so we don't return None
49+
self._resource = self._pending_certificate_op
4850
return True
4951
return self._pending_certificate_op.status.lower() != "inprogress" # type: ignore
5052

sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ApiVersion,
1717
CertificateClient,
1818
CertificateContact,
19+
CertificateOperation,
1920
CertificatePolicyAction,
2021
CertificatePolicy,
2122
CertificateProperties,
@@ -758,6 +759,34 @@ def run(*_, **__):
758759
with pytest.raises(ResourceExistsError):
759760
client.begin_create_certificate("...", CertificatePolicy.get_default())
760761

762+
@pytest.mark.parametrize("api_version", only_latest)
763+
@CertificatesClientPreparer()
764+
@recorded_by_proxy
765+
def test_unknown_issuer_response(self, client, **kwargs):
766+
"""When a certificate is created with an unknown issuer, the poller result should be a CertificateOperation"""
767+
cert_name = self.get_resource_name("unknownIssuer")
768+
769+
# create certificate with unknown issuer
770+
cert_policy = CertificatePolicy(
771+
issuer_name=WellKnownIssuerNames.unknown,
772+
subject="CN=*.microsoft.com",
773+
san_dns_names=["sdk.azure-int.net"],
774+
exportable=True,
775+
key_type="RSA",
776+
key_size=2048,
777+
reuse_key=False,
778+
content_type=CertificateContentType.pkcs12,
779+
validity_in_months=24,
780+
)
781+
create_certificate_poller = client.begin_create_certificate(
782+
certificate_name=cert_name, policy=cert_policy
783+
)
784+
result = create_certificate_poller.result()
785+
# The operation should indicate that certificate creation is in progress and requires a merge to complete
786+
assert isinstance(result, CertificateOperation)
787+
assert result.status and result.status.lower() == "inprogress"
788+
assert result.status_details and "merge" in result.status_details.lower()
789+
761790

762791
def test_policy_expected_errors_for_create_cert():
763792
"""Either a subject or subject alternative name property are required for creating a certificate"""

sdk/keyvault/azure-keyvault-certificates/tests/test_certificates_client_async.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
AdministratorContact,
1717
ApiVersion,
1818
CertificateContact,
19+
CertificateOperation,
1920
CertificatePolicyAction,
2021
CertificatePolicy,
2122
KeyType,
@@ -785,6 +786,32 @@ async def run(*_, **__):
785786
await client.create_certificate("...", CertificatePolicy.get_default())
786787
await client.close()
787788

789+
@pytest.mark.asyncio
790+
@pytest.mark.parametrize("api_version", only_latest)
791+
@AsyncCertificatesClientPreparer()
792+
@recorded_by_proxy_async
793+
async def test_unknown_issuer_response(self, client, **kwargs):
794+
"""When a certificate is created with an unknown issuer, the poller result should be a CertificateOperation"""
795+
cert_name = self.get_resource_name("unknownIssuer")
796+
797+
# create certificate with unknown issuer
798+
cert_policy = CertificatePolicy(
799+
issuer_name=WellKnownIssuerNames.unknown,
800+
subject="CN=*.microsoft.com",
801+
san_dns_names=["sdk.azure-int.net"],
802+
exportable=True,
803+
key_type="RSA",
804+
key_size=2048,
805+
reuse_key=False,
806+
content_type=CertificateContentType.pkcs12,
807+
validity_in_months=24,
808+
)
809+
result = await client.create_certificate(certificate_name=cert_name, policy=cert_policy)
810+
# The operation should indicate that certificate creation is in progress and requires a merge to complete
811+
assert isinstance(result, CertificateOperation)
812+
assert result.status and result.status.lower() == "inprogress"
813+
assert result.status_details and "merge" in result.status_details.lower()
814+
788815

789816
@pytest.mark.asyncio
790817
async def test_policy_expected_errors_for_create_cert():

0 commit comments

Comments
 (0)