From d9274fca1341734e2848e026c6a9be60ed817ef3 Mon Sep 17 00:00:00 2001 From: John Mulligan Date: Fri, 9 Aug 2024 10:15:15 -0400 Subject: [PATCH] config: allow reading teuthology config from env var location Allow changing the default "user" location of the teuthology configuration yaml using the (optional) TEUTHOLOGY_CONFIG environment variable. This change aids my effort to run a customized local teuthology environment. Signed-off-by: John Mulligan --- teuthology/config.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/teuthology/config.py b/teuthology/config.py index 30204aa46..82a7d4434 100644 --- a/teuthology/config.py +++ b/teuthology/config.py @@ -7,6 +7,12 @@ from collections import MutableMapping +# Configuration constants +_SYSTEM_CONFIG_PATH = '/etc/teuthology.yaml' +_USER_CONFIG_PATH = '~/.teuthology.yaml' +_ALT_PATH_ENV_VAR = 'TEUTHOLOGY_CONFIG' + + def init_logging(): log = logging.getLogger(__name__) return log @@ -135,9 +141,9 @@ class TeuthologyConfig(YamlConfig): """ This class is intended to unify teuthology's many configuration files and objects. Currently it serves as a convenient interface to - ~/.teuthology.yaml and nothing else. + ~/.teuthology.yaml or equivalent. """ - yaml_path = os.path.join(os.path.expanduser('~/.teuthology.yaml')) + yaml_path = _USER_CONFIG_PATH # yaml_path is updated in _get_config_path _defaults = { 'archive_base': '/home/teuthworker/archive', 'archive_upload': None, @@ -285,10 +291,20 @@ def set_config_attr(obj): def _get_config_path(): - system_config_path = '/etc/teuthology.yaml' - if not os.path.exists(TeuthologyConfig.yaml_path) and \ - os.path.exists(system_config_path): - return system_config_path - return TeuthologyConfig.yaml_path + """Look for a teuthology config yaml and return it's path. + Raises ValueError if no config yaml can be found. + """ + paths = [ + os.path.join(os.path.expanduser(_USER_CONFIG_PATH)), + _SYSTEM_CONFIG_PATH, + ] + if _ALT_PATH_ENV_VAR in os.environ: + paths.insert(0, os.path.expanduser(os.environ[_ALT_PATH_ENV_VAR])) + for path in paths: + if os.path.exists(path): + return path + log.warning(f"no teuthology config found, looked for: {paths}") + return None + config = TeuthologyConfig(yaml_path=_get_config_path())