From bd005d69d77c10aadc4c309cbaae33f33f9fb0a4 Mon Sep 17 00:00:00 2001 From: Christophe Haen Date: Sat, 21 Sep 2024 11:22:08 +0200 Subject: [PATCH] tmp speedup getusernameForDN --- .../Client/Helpers/Registry.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/DIRAC/ConfigurationSystem/Client/Helpers/Registry.py b/src/DIRAC/ConfigurationSystem/Client/Helpers/Registry.py index 066277a1135..ddf51205360 100644 --- a/src/DIRAC/ConfigurationSystem/Client/Helpers/Registry.py +++ b/src/DIRAC/ConfigurationSystem/Client/Helpers/Registry.py @@ -1,11 +1,15 @@ """ Helper for /Registry section """ + import errno +from cachetools import TTLCache, cached from DIRAC import S_OK, S_ERROR from DIRAC.ConfigurationSystem.Client.Config import gConfig from DIRAC.ConfigurationSystem.Client.Helpers.CSGlobals import getVO +from DIRAC.Core.Utilities.ReturnValues import returnValueOrRaise, convertToReturnValue + ID_DN_PREFIX = "/O=DIRAC/CN=" # pylint: disable=missing-docstring @@ -33,6 +37,44 @@ def getUsernameForDN(dn, usersList=None): return S_ERROR(f"No username found for dn {dn}") +dn_cache = TTLCache(1, 60) + + +@cached(dn_cache) +def _get_dn_user_mapping(): + user_section = returnValueOrRaise(gConfig.getOptionsDictRecursively("/Registry/Users")) + + dn_user = {} + for user, user_info in user_section.items(): + dns = user_info.get("DN", "").split(",") + for dn in dns: + dn_user[dn] = user + return dn_user + + +@convertToReturnValue +def getUsernameForDN_fast(dn, usersList=None): + """Find DIRAC user for DN + + :param str dn: user DN + :param list usersList: list of possible users + + :return: S_OK(str)/S_ERROR() + """ + dn = dn.strip() + + dn_user = _get_dn_user_mapping() + username = dn_user.get(dn) + if not username: + return S_ERROR(f"No username found for dn {dn}") + + if usersList: + if username not in set(usersList): + return S_ERROR(f"No username found for dn {dn}") + + return username + + def getDNForUsername(username): """Get user DN for user