@@ -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