Skip to content

Commit 05eb4ea

Browse files
committed
refactor
1 parent fb599e9 commit 05eb4ea

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

src/api/handlers/job_api.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@ def get(self):
360360
''', [data['project']['id']])
361361

362362
is_fork = data['job'].get('fork', False)
363+
# Cache Vault instances per vault name+project so we create them only once
364+
vault_cache = {}
363365

364366
def get_secret_type(name):
365367
try:
@@ -382,10 +384,10 @@ def get_auth_type(res):
382384
def get_secret(name):
383385
secret_type = get_secret_type(name)
384386
if secret_type == 'vault':
385-
vault = json.loads(name)
386-
vault_name = vault['$vault']
387-
secret_path = vault['$vault_secret_path']
388-
secret_key = vault['$vault_secret_key']
387+
vault_cfg = json.loads(name)
388+
vault_name = vault_cfg['$vault']
389+
secret_path = vault_cfg['$vault_secret_path']
390+
secret_key = vault_cfg['$vault_secret_key']
389391

390392
result = g.db.execute_one("""
391393
SELECT url, version, token, ca, namespace, role_id, secret_id FROM vault WHERE name = %s and project_id = %s
@@ -397,26 +399,34 @@ def get_secret(name):
397399
url, version, token, ca, namespace, role_id, secret_id = result[0], result[1], result[2], result[3], result[4], result[5], result[6]
398400
# choose validate way
399401
validate_res = get_auth_type(result)
400-
vault = Vault(url, namespace, version, role_id, secret_id)
402+
403+
# key vault per project to avoid collisions
404+
vault_key = f"{vault_name}-{data['project']['id']}"
405+
vault_client = vault_cache.get(vault_key)
406+
if not vault_client:
407+
vault_client = Vault(url, namespace, version, role_id, secret_id)
408+
vault_cache[vault_key] = vault_client
409+
401410
if validate_res == 'token':
402411
logger.info('validate way is token')
412+
token_to_use = token
403413
elif validate_res == 'appRole':
404-
logger.info('validate way is appRole')
405-
token = vault.get_token_by_app_role()
406-
batch_token = vault.generate_batch_token(token)
414+
logger.info('validate way is appRole')
415+
token_to_use = vault_client.get_token_by_app_role()
416+
batch_token = vault_client.generate_batch_token(token_to_use)
407417
if batch_token:
408-
token = batch_token
418+
token_to_use = batch_token
409419
else:
410420
abort(400, "Validate way is '%s' ! result is '%s' " % (validate_res, result))
411421

412422
if not ca:
413-
logger.info('Start to get value fron vault %s %s %s' % (token, secret_path, secret_key))
414-
return vault.get_value_from_vault(token, secret_path, secret_key, False)
423+
logger.info('Start to get value fron vault %s %s %s' % (token_to_use, secret_path, secret_key))
424+
return vault_client.get_value_from_vault(token_to_use, secret_path, secret_key, False)
415425
else:
416426
with tempfile.NamedTemporaryFile(delete=False) as f:
417427
f.write(ca)
418428
f.flush() # ensure all data written
419-
return vault.get_value_from_vault(token, secret_path, secret_key, f.name)
429+
return vault_client.get_value_from_vault(token_to_use, secret_path, secret_key, f.name)
420430
else:
421431
if is_fork:
422432
abort(400, 'Access to secret %s is not allowed from a fork' % name)

0 commit comments

Comments
 (0)