Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,26 @@ def setUp(self):
self.list_test_size = 7
super(KeyVaultTestCase, self).setUp()

async def _poll_until_no_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3):
async def _poll_until_no_exception(self, fn, expected_exception, max_retries=20, retry_delay=3):
"""polling helper for live tests because some operations take an unpredictable amount of time to complete"""

for name in resource_names:
for i in range(max_retries):
try:
# TODO: better for caller to apply args to fn; could also gather
await fn(name)
break
except expected_exception:
if i == max_retries - 1:
raise
if self.is_live:
await asyncio.sleep(retry_delay)

async def _poll_until_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3):
for i in range(max_retries):
try:
return await fn()
except expected_exception:
if i == max_retries - 1:
raise
if self.is_live:
await asyncio.sleep(retry_delay)

async def _poll_until_exception(self, fn, expected_exception, max_retries=20, retry_delay=3):
"""polling helper for live tests because some operations take an unpredictable amount of time to complete"""

for name in resource_names:
for _ in range(max_retries):
try:
# TODO: better for caller to apply args to fn; could also gather
await fn(name)
if self.is_live:
await asyncio.sleep(retry_delay)
except expected_exception:
return
for _ in range(max_retries):
try:
await fn()
if self.is_live:
await asyncio.sleep(retry_delay)
except expected_exception:
return
self.fail("expected exception {expected_exception} was not raised")

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import time
import pytest

from azure.core.exceptions import ResourceExistsError
from azure_devtools.scenario_tests import RecordingProcessor, RequestUrlNormalizer

from azure.keyvault.certificates import (
Expand Down Expand Up @@ -480,7 +481,7 @@ def test_get_pending_certificate_signing_request(self, client, **kwargs):
self.assertEqual(client.get_certificate_operation(certificate_name=cert_name).csr, pending_version_csr)

@ResourceGroupPreparer(random_name_enabled=True)
@KeyVaultPreparer(enable_soft_delete=False)
@KeyVaultPreparer()
@KeyVaultClientPreparer()
def test_backup_restore(self, client, **kwargs):
policy = CertificatePolicy.get_default()
Expand All @@ -496,8 +497,12 @@ def test_backup_restore(self, client, **kwargs):
# delete the certificate
client.begin_delete_certificate(certificate_name=cert_name).wait()

# purge the certificate
client.purge_deleted_certificate(certificate_name=cert_name)

# restore certificate
restored_certificate = client.restore_certificate_backup(backup=certificate_backup)
restore_function = functools.partial(client.restore_certificate_backup, certificate_backup)
restored_certificate = self._poll_until_no_exception(restore_function, ResourceExistsError)
self._validate_certificate_bundle(cert=restored_certificate, cert_name=cert_name, cert_policy=policy)

@ResourceGroupPreparer(random_name_enabled=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import logging
import json

from azure.core.exceptions import ResourceExistsError
from azure_devtools.scenario_tests import RecordingProcessor
from azure.keyvault.certificates import (
AdministratorContact,
Expand Down Expand Up @@ -492,7 +493,7 @@ async def test_get_pending_certificate_signing_request(self, client, **kwargs):
self.assertEqual((await client.get_certificate_operation(certificate_name=cert_name)).csr, pending_version_csr)

@ResourceGroupPreparer(random_name_enabled=True)
@KeyVaultPreparer(enable_soft_delete=False)
@KeyVaultPreparer()
@KeyVaultClientPreparer()
async def test_backup_restore(self, client, **kwargs):
cert_name = self.get_resource_name("cert")
Expand All @@ -508,8 +509,14 @@ async def test_backup_restore(self, client, **kwargs):
# delete the certificate
await client.delete_certificate(certificate_name=cert_name)

# purge the certificate
await client.purge_deleted_certificate(certificate_name=cert_name)

# restore certificate
restored_certificate = await client.restore_certificate_backup(backup=certificate_backup)
restore_function = functools.partial(client.restore_certificate_backup, certificate_backup)
restored_certificate = await self._poll_until_no_exception(
restore_function, expected_exception=ResourceExistsError
)
self._validate_certificate_bundle(cert=restored_certificate, cert_name=cert_name, cert_policy=policy)

@ResourceGroupPreparer(random_name_enabled=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# ------------------------------------
from __future__ import print_function
import functools
import time

from azure.keyvault.certificates import (
CertificateClient,
Expand Down Expand Up @@ -198,7 +199,7 @@ def test_example_certificate_list_operations(self, client, **kwargs):
# [END list_deleted_certificates]

@ResourceGroupPreparer(random_name_enabled=True)
@KeyVaultPreparer(enable_soft_delete=False)
@KeyVaultPreparer()
@KeyVaultClientPreparer()
def test_example_certificate_backup_restore(self, client, **kwargs):
certificate_client = client
Expand All @@ -220,26 +221,26 @@ def test_example_certificate_backup_restore(self, client, **kwargs):
certificate_client.begin_create_certificate(certificate_name=cert_name, policy=cert_policy).wait()

# [START backup_certificate]

# backup certificate
certificate_backup = certificate_client.backup_certificate(cert_name)

# returns the raw bytes of the backed up certificate
print(certificate_backup)

# [END backup_certificate]

certificate_client.begin_delete_certificate(certificate_name=cert_name).wait()
certificate_client.purge_deleted_certificate(certificate_name=cert_name)

# [START restore_certificate]
if self.is_live:
time.sleep(15)

# [START restore_certificate]
# restore a certificate backup
restored_certificate = certificate_client.restore_certificate_backup(certificate_backup)

print(restored_certificate.id)
print(restored_certificate.name)
print(restored_certificate.properties.version)

# [END restore_certificate]

@ResourceGroupPreparer(random_name_enabled=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------
import asyncio
import functools

from azure.keyvault.certificates import CertificatePolicy, CertificateContentType, WellKnownIssuerNames
Expand Down Expand Up @@ -184,7 +185,7 @@ async def test_example_certificate_list_operations(self, client, **kwargs):
# [END list_deleted_certificates]

@ResourceGroupPreparer(random_name_enabled=True)
@KeyVaultPreparer(enable_soft_delete=False)
@KeyVaultPreparer()
@KeyVaultClientPreparer()
async def test_example_certificate_backup_restore(self, client, **kwargs):
certificate_client = client
Expand All @@ -210,25 +211,25 @@ async def test_example_certificate_backup_restore(self, client, **kwargs):
await create_certificate_poller

# [START backup_certificate]

# backup certificate
certificate_backup = await certificate_client.backup_certificate(cert_name)

# returns the raw bytes of the backed up certificate
print(certificate_backup)

# [END backup_certificate]

await certificate_client.delete_certificate(certificate_name=cert_name)
await certificate_client.purge_deleted_certificate(certificate_name=cert_name)

# [START restore_certificate]
if self.is_live:
await asyncio.sleep(15)

# [START restore_certificate]
# restores a certificate backup
restored_certificate = await certificate_client.restore_certificate_backup(certificate_backup)
print(restored_certificate.id)
print(restored_certificate.name)
print(restored_certificate.properties.version)

# [END restore_certificate]

@ResourceGroupPreparer(random_name_enabled=True)
Expand Down
41 changes: 18 additions & 23 deletions sdk/keyvault/azure-keyvault-keys/tests/_shared/test_case_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,26 @@ def setUp(self):
self.list_test_size = 7
super(KeyVaultTestCase, self).setUp()

async def _poll_until_no_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3):
async def _poll_until_no_exception(self, fn, expected_exception, max_retries=20, retry_delay=3):
"""polling helper for live tests because some operations take an unpredictable amount of time to complete"""

for name in resource_names:
for i in range(max_retries):
try:
# TODO: better for caller to apply args to fn; could also gather
await fn(name)
break
except expected_exception:
if i == max_retries - 1:
raise
if self.is_live:
await asyncio.sleep(retry_delay)

async def _poll_until_exception(self, fn, *resource_names, expected_exception, max_retries=20, retry_delay=3):
for i in range(max_retries):
try:
return await fn()
except expected_exception:
if i == max_retries - 1:
raise
if self.is_live:
await asyncio.sleep(retry_delay)

async def _poll_until_exception(self, fn, expected_exception, max_retries=20, retry_delay=3):
"""polling helper for live tests because some operations take an unpredictable amount of time to complete"""

for name in resource_names:
for _ in range(max_retries):
try:
# TODO: better for caller to apply args to fn; could also gather
await fn(name)
if self.is_live:
await asyncio.sleep(retry_delay)
except expected_exception:
return
for _ in range(max_retries):
try:
await fn()
if self.is_live:
await asyncio.sleep(retry_delay)
except expected_exception:
return
self.fail("expected exception {expected_exception} was not raised")
Loading