Skip to content

Commit 8b97ddd

Browse files
authored
[KV] Fix flakiness in release policy test (Azure#21181)
1 parent cd4d365 commit 8b97ddd

10 files changed

+601
-2525
lines changed

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_2016_10_01_vault.yaml

Lines changed: 87 additions & 376 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_0_vault.yaml

Lines changed: 87 additions & 463 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_1_vault.yaml

Lines changed: 91 additions & 438 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_2_mhsm.yaml

Lines changed: 70 additions & 69 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_2_vault.yaml

Lines changed: 89 additions & 668 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_3_preview_mhsm.yaml

Lines changed: 50 additions & 49 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_key_crud_operations_7_3_preview_vault.yaml

Lines changed: 84 additions & 431 deletions
Large diffs are not rendered by default.

sdk/keyvault/azure-keyvault-keys/tests/recordings/test_keys_async.test_update_release_policy_7_3_preview_mhsm.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interactions:
99
Content-Type:
1010
- application/json
1111
User-Agent:
12-
- azsdk-python-keyvault-keys/4.5.0b2 Python/3.9.0 (Windows-10-10.0.19041-SP0)
12+
- azsdk-python-keyvault-keys/4.5.0b5 Python/3.9.0 (Windows-10-10.0.22000-SP0)
1313
method: POST
1414
uri: https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/create?api-version=7.3-preview
1515
response:
@@ -25,7 +25,7 @@ interactions:
2525
resource="https://managedhsm.azure.net"
2626
x-content-type-options: nosniff
2727
x-frame-options: SAMEORIGIN
28-
x-ms-server-latency: '0'
28+
x-ms-server-latency: '1'
2929
status:
3030
code: 401
3131
message: Unauthorized
@@ -41,12 +41,12 @@ interactions:
4141
Content-Type:
4242
- application/json
4343
User-Agent:
44-
- azsdk-python-keyvault-keys/4.5.0b2 Python/3.9.0 (Windows-10-10.0.19041-SP0)
44+
- azsdk-python-keyvault-keys/4.5.0b5 Python/3.9.0 (Windows-10-10.0.22000-SP0)
4545
method: POST
4646
uri: https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/create?api-version=7.3-preview
4747
response:
4848
body:
49-
string: '{"attributes":{"created":1628108364,"enabled":true,"exportable":true,"recoverableDays":7,"recoveryLevel":"CustomizedRecoverable+Purgeable","updated":1628108364},"key":{"e":"AQAB","key_ops":["wrapKey","decrypt","encrypt","unwrapKey","sign","verify"],"kid":"https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/6e738db2a7c60f432fb8befd069f2ab2","kty":"RSA-HSM","n":"oDdi5cXpMWJpMv9R8xWyFfezI8_Pnt8mWXnhsjNROc8YaLZzdAUwYfCa4kS8QjUWYxxOgYXSsX8bISrHRAJiZqnopfUruSCrMqBVE8PotgOdVn_D-EIOIPHB--nwf1bRACC3wANiKuMsXI2dCRnOZVgWP-CoaMeMxuOplLp08g8SlYDzdXAqRjj2na8zA152DHz5tZVIqI6kAQVjGxYeb6DnFSqRsLrcR-UJXtdKT6G4wGupDgchhwK9D3zhEE78qtarsDNr0x9fxbTKtwtFVFAJIyLbsAhXQ0vUXLO1V2FalIr4SMPuah3sbw4UiFKLVt4lwGmub3rixicA1acFww"},"release_policy":{"contentType":"application/json;
49+
string: '{"attributes":{"created":1633729957,"enabled":true,"exportable":true,"recoverableDays":7,"recoveryLevel":"CustomizedRecoverable+Purgeable","updated":1633729957},"key":{"e":"AQAB","key_ops":["wrapKey","decrypt","encrypt","unwrapKey","sign","verify"],"kid":"https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/264bd2f68e264ff0981310113b993ef8","kty":"RSA-HSM","n":"qXlKVYSmNi9oCLhrP3Ba5kV0MAf3-5VDdMgISpxhrQkt5KZ4poE7aOx8iJ6pxsUhgBTptuOS2rJD7BXfr-c77M2zPgX0yg3-4DV8Ppm2mQE6Orkdh5OTGSd9_LWV4BSwZkXrUlSSgGP0DcQH3pAdwe5u6KVwOINn-YRdMGWtMUMXBPEz3-sn7M2eR08oYi2PDGiaCyMPi_UdOhQG0VGuZw5z2rYZzEDOWF61eSAhzrDX4SsMjYNbgE-whUZO7sRW02JCh_-tXIGBCofA9nyWgIpUQGjw1Fp7lp0e2KyyhUtvDHg2W5QwhfOQ3dFUY5tadhunDLNbF1CKJqF_7zbmxQ"},"release_policy":{"contentType":"application/json;
5050
charset=utf-8","data":"eyJhbnlPZiI6W3siYW55T2YiOlt7ImNsYWltIjoic2RrLXRlc3QiLCJlcXVhbHMiOnRydWV9XSwiYXV0aG9yaXR5IjoiaHR0cHM6Ly9za3JhdHRlc3RhdGlvbi5henVyZXdlYnNpdGVzLm5ldC8ifV0sInZlcnNpb24iOiIxLjAuMCJ9"}}'
5151
headers:
5252
cache-control: no-cache
@@ -58,41 +58,41 @@ interactions:
5858
x-frame-options: SAMEORIGIN
5959
x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4;
6060
x-ms-keyvault-region: westus
61-
x-ms-server-latency: '873'
61+
x-ms-server-latency: '866'
6262
status:
6363
code: 200
6464
message: OK
6565
url: https://mcpatinotesthsm.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/create?api-version=7.3-preview
6666
- request:
67-
body: '{"attributes": {"exp": 2524723200}, "tags": {"foo": "updated tag"}, "release_policy":
68-
{"data": "eyJhbnlPZiI6IFt7ImFueU9mIjogW3siY2xhaW0iOiAic2RrLXRlc3QiLCAiZXF1YWxzIjogZmFsc2V9XSwgImF1dGhvcml0eSI6ICJodHRwczovL3NrcmF0dGVzdGF0aW9uLmF6dXJld2Vic2l0ZXMubmV0LyJ9XSwgInZlcnNpb24iOiAiMS4wLjAifQ"}}'
67+
body: '{"key_ops": ["decrypt", "encrypt"], "attributes": {"exp": 2524723200},
68+
"tags": {"foo": "updated tag"}, "release_policy": {"data": "eyJhbnlPZiI6IFt7ImFueU9mIjogW3siY2xhaW0iOiAic2RrLXRlc3QiLCAiZXF1YWxzIjogZmFsc2V9XSwgImF1dGhvcml0eSI6ICJodHRwczovL3NrcmF0dGVzdGF0aW9uLmF6dXJld2Vic2l0ZXMubmV0LyJ9XSwgInZlcnNpb24iOiAiMS4wLjAifQ"}}'
6969
headers:
7070
Accept:
7171
- application/json
7272
Content-Length:
73-
- '289'
73+
- '324'
7474
Content-Type:
7575
- application/json
7676
User-Agent:
77-
- azsdk-python-keyvault-keys/4.5.0b2 Python/3.9.0 (Windows-10-10.0.19041-SP0)
77+
- azsdk-python-keyvault-keys/4.5.0b5 Python/3.9.0 (Windows-10-10.0.22000-SP0)
7878
method: PATCH
7979
uri: https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/?api-version=7.3-preview
8080
response:
8181
body:
82-
string: '{"attributes":{"created":1628108364,"enabled":true,"exp":2524723200,"exportable":true,"recoverableDays":7,"recoveryLevel":"CustomizedRecoverable+Purgeable","updated":1628108365},"key":{"e":"AQAB","key_ops":["wrapKey","verify","sign","unwrapKey","encrypt","decrypt"],"kid":"https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/6e738db2a7c60f432fb8befd069f2ab2","kty":"RSA-HSM","n":"oDdi5cXpMWJpMv9R8xWyFfezI8_Pnt8mWXnhsjNROc8YaLZzdAUwYfCa4kS8QjUWYxxOgYXSsX8bISrHRAJiZqnopfUruSCrMqBVE8PotgOdVn_D-EIOIPHB--nwf1bRACC3wANiKuMsXI2dCRnOZVgWP-CoaMeMxuOplLp08g8SlYDzdXAqRjj2na8zA152DHz5tZVIqI6kAQVjGxYeb6DnFSqRsLrcR-UJXtdKT6G4wGupDgchhwK9D3zhEE78qtarsDNr0x9fxbTKtwtFVFAJIyLbsAhXQ0vUXLO1V2FalIr4SMPuah3sbw4UiFKLVt4lwGmub3rixicA1acFww"},"release_policy":{"contentType":"application/json;
82+
string: '{"attributes":{"created":1633729957,"enabled":true,"exp":2524723200,"exportable":true,"recoverableDays":7,"recoveryLevel":"CustomizedRecoverable+Purgeable","updated":1633729960},"key":{"e":"AQAB","key_ops":["decrypt","encrypt"],"kid":"https://managedhsmname.managedhsm.azure.net/keys/livekvtestkey-named4c517f5/264bd2f68e264ff0981310113b993ef8","kty":"RSA-HSM","n":"qXlKVYSmNi9oCLhrP3Ba5kV0MAf3-5VDdMgISpxhrQkt5KZ4poE7aOx8iJ6pxsUhgBTptuOS2rJD7BXfr-c77M2zPgX0yg3-4DV8Ppm2mQE6Orkdh5OTGSd9_LWV4BSwZkXrUlSSgGP0DcQH3pAdwe5u6KVwOINn-YRdMGWtMUMXBPEz3-sn7M2eR08oYi2PDGiaCyMPi_UdOhQG0VGuZw5z2rYZzEDOWF61eSAhzrDX4SsMjYNbgE-whUZO7sRW02JCh_-tXIGBCofA9nyWgIpUQGjw1Fp7lp0e2KyyhUtvDHg2W5QwhfOQ3dFUY5tadhunDLNbF1CKJqF_7zbmxQ"},"release_policy":{"contentType":"application/json;
8383
charset=utf-8","data":"eyJhbnlPZiI6W3siYW55T2YiOlt7ImNsYWltIjoic2RrLXRlc3QiLCJlcXVhbHMiOmZhbHNlfV0sImF1dGhvcml0eSI6Imh0dHBzOi8vc2tyYXR0ZXN0YXRpb24uYXp1cmV3ZWJzaXRlcy5uZXQvIn1dLCJ2ZXJzaW9uIjoiMS4wLjAifQ"},"tags":{"foo":"updated
8484
tag"}}'
8585
headers:
8686
cache-control: no-cache
87-
content-length: '1034'
87+
content-length: '996'
8888
content-security-policy: default-src 'self'
8989
content-type: application/json; charset=utf-8
9090
strict-transport-security: max-age=31536000; includeSubDomains
9191
x-content-type-options: nosniff
9292
x-frame-options: SAMEORIGIN
9393
x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4;
9494
x-ms-keyvault-region: westus
95-
x-ms-server-latency: '738'
95+
x-ms-server-latency: '655'
9696
status:
9797
code: 200
9898
message: OK

sdk/keyvault/azure-keyvault-keys/tests/test_key_client.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ class KeyClientTests(KeysTestCase, KeyVaultTestCase):
6161
def __init__(self, *args, **kwargs):
6262
super(KeyClientTests, self).__init__(*args, match_body=False, **kwargs)
6363

64+
def _assert_jwks_equal(self, jwk1, jwk2):
65+
for field in JsonWebKey._FIELDS:
66+
if field != "key_ops":
67+
assert getattr(jwk1, field) == getattr(jwk2, field)
68+
6469
def _assert_key_attributes_equal(self, k1, k2):
6570
self.assertEqual(k1.name, k2.name)
6671
self.assertEqual(k1.vault_url, k2.vault_url)
@@ -123,9 +128,14 @@ def _update_key_properties(self, client, key, release_policy=None):
123128
expires = date_parse.parse("2050-01-02T08:00:00.000Z")
124129
tags = {"foo": "updated tag"}
125130
key_ops = ["decrypt", "encrypt"]
131+
132+
# wait before updating the key to make sure updated_on has a different value
133+
if self.is_live:
134+
time.sleep(2)
126135
key_bundle = client.update_key_properties(
127136
key.name, key_operations=key_ops, expires_on=expires, tags=tags, release_policy=release_policy
128137
)
138+
129139
assert tags == key_bundle.properties.tags
130140
assert key.id == key_bundle.id
131141
assert key.properties.updated_on != key_bundle.properties.updated_on
@@ -183,7 +193,10 @@ def test_key_crud_operations(self, client, is_hsm, **kwargs):
183193
assert tags == ec_key.properties.tags
184194
# create ec with curve
185195
ec_key_curve_name = self.get_resource_name("crud-P-256-ec-key")
186-
self._create_ec_key(client, key_name=ec_key_curve_name, curve="P-256", hardware_protected=is_hsm)
196+
created_ec_key_curve = self._create_ec_key(
197+
client, key_name=ec_key_curve_name, curve="P-256", hardware_protected=is_hsm
198+
)
199+
self.assertEqual("P-256", created_ec_key_curve.key.crv)
187200

188201
# import key
189202
import_test_key_name = self.get_resource_name("import-test-key")
@@ -217,13 +230,16 @@ def test_key_crud_operations(self, client, is_hsm, **kwargs):
217230
deleted_key_poller = client.begin_delete_key(rsa_key.name)
218231
deleted_key = deleted_key_poller.result()
219232
self.assertIsNotNone(deleted_key)
220-
self.assertEqual(rsa_key.key_type, deleted_key.key_type)
233+
234+
# aside from key_ops, the original updated keys should have the same JWKs
235+
self._assert_jwks_equal(rsa_key.key, deleted_key.key)
221236
self.assertEqual(deleted_key.id, rsa_key.id)
222237
self.assertTrue(
223238
deleted_key.recovery_id and deleted_key.deleted_date and deleted_key.scheduled_purge_date,
224239
"Missing required deleted key attributes.",
225240
)
226241
deleted_key_poller.wait()
242+
227243
# get the deleted key when soft deleted enabled
228244
deleted_key = client.get_deleted_key(rsa_key.name)
229245
self.assertIsNotNone(deleted_key)

sdk/keyvault/azure-keyvault-keys/tests/test_keys_async.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,9 @@ def __init__(self, *args, **kwargs):
4949
super().__init__(*args, match_body=False, **kwargs)
5050

5151
def _assert_jwks_equal(self, jwk1, jwk2):
52-
assert jwk1.kid == jwk2.kid
53-
assert jwk1.kty == jwk2.kty
54-
assert sorted(jwk1.key_ops) == sorted(jwk2.key_ops)
55-
assert jwk1.n == jwk2.n
56-
assert jwk1.e == jwk2.e
57-
assert jwk1.d == jwk2.d
58-
assert jwk1.dp == jwk2.dp
59-
assert jwk1.dq == jwk2.dq
60-
assert jwk1.qi == jwk2.qi
61-
assert jwk1.p == jwk2.p
62-
assert jwk1.q == jwk2.q
63-
assert jwk1.k == jwk2.k
64-
assert jwk1.t == jwk2.t
65-
assert jwk1.crv == jwk2.crv
66-
assert jwk1.x == jwk2.x
67-
assert jwk1.y == jwk2.y
52+
for field in JsonWebKey._FIELDS:
53+
if field != "key_ops":
54+
assert getattr(jwk1, field) == getattr(jwk2, field)
6855

6956
def _assert_key_attributes_equal(self, k1, k2):
7057
self.assertEqual(k1.name, k2.name)
@@ -127,12 +114,19 @@ def _validate_rsa_key_bundle(self, key_attributes, vault, key_name, kty, key_ops
127114
async def _update_key_properties(self, client, key, release_policy=None):
128115
expires = date_parse.parse("2050-01-02T08:00:00.000Z")
129116
tags = {"foo": "updated tag"}
117+
key_ops = ["decrypt", "encrypt"]
118+
119+
# wait before updating the key to make sure updated_on has a different value
120+
if self.is_live:
121+
await asyncio.sleep(2)
130122
key_bundle = await client.update_key_properties(
131-
key.name, expires_on=expires, tags=tags, release_policy=release_policy
123+
key.name, key_operations=key_ops, expires_on=expires, tags=tags, release_policy=release_policy
132124
)
125+
133126
assert tags == key_bundle.properties.tags
134127
assert key.id == key_bundle.id
135128
assert key.properties.updated_on != key_bundle.properties.updated_on
129+
assert sorted(key_ops) == sorted(key_bundle.key_operations)
136130
if release_policy:
137131
assert key.properties.release_policy.data != key_bundle.properties.release_policy.data
138132
return key_bundle
@@ -233,6 +227,8 @@ async def test_key_crud_operations(self, client, is_hsm, **kwargs):
233227
# delete the new key
234228
deleted_key = await client.delete_key(rsa_key.name)
235229
self.assertIsNotNone(deleted_key)
230+
231+
# aside from key_ops, the original updated keys should have the same JWKs
236232
self._assert_jwks_equal(rsa_key.key, deleted_key.key)
237233
self.assertEqual(deleted_key.id, rsa_key.id)
238234
self.assertTrue(

0 commit comments

Comments
 (0)