14
14
import base64
15
15
import os
16
16
import time
17
- from typing import Iterator , Tuple
17
+ from typing import Iterator , Optional , Tuple , Union
18
18
import uuid
19
19
20
- from google .api_core import exceptions
20
+ from google .api_core import exceptions , retry
21
21
from google .cloud import secretmanager
22
22
import pytest
23
23
@@ -63,19 +63,54 @@ def iam_user() -> str:
63
63
return "serviceAccount:" + os .environ ["GCLOUD_SECRETS_SERVICE_ACCOUNT" ]
64
64
65
65
66
+ @retry .Retry ()
67
+ def retry_client_create_secret (
68
+ client : secretmanager .SecretManagerServiceClient ,
69
+ request : Optional [Union [secretmanager .CreateSecretRequest , dict ]],
70
+ ) -> secretmanager .Secret :
71
+ # Retry to avoid 503 error & flaky issues
72
+ return client .create_secret (request = request )
73
+
74
+
75
+ @retry .Retry ()
76
+ def retry_client_access_secret_version (
77
+ client : secretmanager .SecretManagerServiceClient ,
78
+ request : Optional [Union [secretmanager .AccessSecretVersionRequest , dict ]],
79
+ ) -> secretmanager .AccessSecretVersionResponse :
80
+ # Retry to avoid 503 error & flaky issues
81
+ return client .access_secret_version (request = request )
82
+
83
+
84
+ @retry .Retry ()
85
+ def retry_client_delete_secret (
86
+ client : secretmanager .SecretManagerServiceClient ,
87
+ request : Optional [Union [secretmanager .DeleteSecretRequest , dict ]],
88
+ ) -> None :
89
+ # Retry to avoid 503 error & flaky issues
90
+ return client .delete_secret (request = request )
91
+
92
+
93
+ @retry .Retry ()
94
+ def retry_client_add_secret_version (
95
+ client : secretmanager .SecretManagerServiceClient ,
96
+ request : Optional [Union [secretmanager .AddSecretVersionRequest , dict ]],
97
+ ) -> secretmanager .SecretVersion :
98
+ # Retry to avoid 503 error & flaky issues
99
+ return client .add_secret_version (request = request )
100
+
101
+
66
102
@pytest .fixture ()
67
103
def secret_id (
68
104
client : secretmanager .SecretManagerServiceClient , project_id : str
69
105
) -> Iterator [str ]:
70
106
secret_id = f"python-secret-{ uuid .uuid4 ()} "
71
107
72
108
yield secret_id
73
-
74
109
secret_path = client .secret_path (project_id , secret_id )
75
110
print (f"deleting secret { secret_id } " )
76
111
try :
77
112
time .sleep (5 )
78
- client . delete_secret ( request = {"name" : secret_path })
113
+ retry_client_delete_secret ( client , request = {"name" : secret_path })
79
114
except exceptions .NotFound :
80
115
# Secret was already deleted, probably in the test
81
116
print (f"Secret { secret_id } was not found." )
@@ -89,12 +124,13 @@ def secret(
89
124
90
125
parent = f"projects/{ project_id } "
91
126
time .sleep (5 )
92
- secret = client .create_secret (
127
+ secret = retry_client_create_secret (
128
+ client ,
93
129
request = {
94
130
"parent" : parent ,
95
131
"secret_id" : secret_id ,
96
132
"secret" : {"replication" : {"automatic" : {}}},
97
- }
133
+ },
98
134
)
99
135
100
136
yield project_id , secret_id , secret .etag
@@ -174,7 +210,7 @@ def test_delete_secret(
174
210
with pytest .raises (exceptions .NotFound ):
175
211
print (f"{ client } " )
176
212
name = f"projects/{ project_id } /secrets/{ secret_id } /versions/latest"
177
- client . access_secret_version ( request = {"name" : name })
213
+ retry_client_access_secret_version ( client , request = {"name" : name })
178
214
179
215
180
216
def test_delete_secret_with_etag (
@@ -185,7 +221,7 @@ def test_delete_secret_with_etag(
185
221
with pytest .raises (exceptions .NotFound ):
186
222
print (f"{ client } " )
187
223
name = f"projects/{ project_id } /secrets/{ secret_id } /versions/latest"
188
- client . access_secret_version ( request = {"name" : name })
224
+ retry_client_access_secret_version ( client , request = {"name" : name })
189
225
190
226
191
227
def test_destroy_secret_version (
0 commit comments