Skip to content

Commit e31c98a

Browse files
authored
Merge pull request #577 from chengshifan/add-retry-for-vault
chore: add retry when invoke API from vault
2 parents a42d327 + 3ccaf7a commit e31c98a

File tree

1 file changed

+33
-19
lines changed

1 file changed

+33
-19
lines changed

src/api/handlers/job_api.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pylint: disable=too-many-lines,too-few-public-methods,too-many-locals,too-many-statements,too-many-branches
22
import os
33
import json
4+
import time
45
import uuid
56
import copy
67
import urllib.request, urllib.parse, urllib.error
@@ -43,6 +44,35 @@ def delete_file(path):
4344
logger.warning("Failed to delete file: %s", error)
4445

4546

47+
def get_token_by_app_role(app_role_url, role_id, secret_id):
48+
app_role = {'role_id': role_id, 'secret_id': secret_id}
49+
json_data = json.dumps(app_role)
50+
for i in range(0, 10):
51+
res = requests.post(url=app_role_url, data=json_data, verify=False)
52+
if res.status_code == 200:
53+
json_res = json.loads(res.content)
54+
token = json_res['auth']['client_token']
55+
return token
56+
time.sleep(5)
57+
err_msg = "Getting token from Vault error even tried 10 times, url is {}, API response is {}:{}".format(app_role_url, res.status_code, res.text)
58+
abort(400, err_msg)
59+
60+
61+
def get_value_from_vault(url, token, secret_key, verify):
62+
for i in range(0, 10):
63+
response = requests.get(url=url, headers={'X-Vault-Token': token}, verify=verify)
64+
if response.status_code == 200:
65+
json_res = json.loads(response.content)
66+
if json_res['data'].get('data') and isinstance(json_res['data'].get('data'), dict):
67+
value = json_res['data'].get('data').get(secret_key)
68+
else:
69+
value = json_res['data'].get(secret_key)
70+
return value
71+
time.sleep(5)
72+
err_msg = "Getting value from Vault error even tried 10 times, url is {}, API response is {}:{}".format(url, response.status_code, response.text)
73+
abort(400, err_msg)
74+
75+
4676
@api.route("/api/job/job", doc=False)
4777
class Job(Resource):
4878

@@ -295,34 +325,18 @@ def get_secret(name):
295325
if validate_res == 'token':
296326
logger.info('validate way is token')
297327
elif validate_res == 'appRole':
298-
app_role = {'role_id': role_id, 'secret_id': secret_id}
299-
json_data = json.dumps(app_role)
300328
app_role_url = result[0] + '/v1/' + namespace + '/auth/approle/login' if namespace else result[0] + '/v1/auth/approle/login'
301-
res = requests.post(url=app_role_url, data=json_data, verify=False)
302-
if res.status_code == 200:
303-
json_res = json.loads(res.content)
304-
token = json_res['auth']['client_token']
305-
else:
306-
abort(400, "Getting value from vault error: url is '%s', validate way is appRole; API response: '%s'" % (app_role_url, res.text))
329+
token = get_token_by_app_role(app_role_url, role_id, secret_id)
307330
else:
308331
abort(400, "Validate way is '%s' ! result is '%s' " % (validate_res, result))
309332

310333
if not ca:
311-
res = requests.get(url=url, headers={'X-Vault-Token': token}, verify=False)
334+
return get_value_from_vault(url, token, secret_key, False)
312335
else:
313336
with tempfile.NamedTemporaryFile(delete=False) as f:
314337
f.write(ca)
315338
f.flush() # ensure all data written
316-
res = requests.get(url=url, headers={'X-Vault-Token': token}, verify=f.name)
317-
if res.status_code == 200:
318-
json_res = json.loads(res.content)
319-
if json_res['data'].get('data') and isinstance(json_res['data'].get('data'), dict):
320-
value = json_res['data'].get('data').get(secret_key)
321-
else:
322-
value = json_res['data'].get(secret_key)
323-
return value
324-
else:
325-
abort(400, "Getting value from vault error: url is '%s', token is '%s' " % (url, result))
339+
return get_value_from_vault(url, token, secret_key, f.name)
326340
else:
327341
if is_fork:
328342
abort(400, 'Access to secret %s is not allowed from a fork' % name)

0 commit comments

Comments
 (0)