From 566b28dc4cfe720ffc685dd21e389325fb404730 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Tue, 9 Jul 2019 00:04:02 +0300 Subject: [PATCH] Add external configuration support --- server/config/basic.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/server/config/basic.py b/server/config/basic.py index b9fab32..946f6ba 100644 --- a/server/config/basic.py +++ b/server/config/basic.py @@ -1,4 +1,7 @@ import logging +from functools import reduce +from os import getenv +from os.path import expandvars from pathlib import Path from pyhocon import ConfigTree, ConfigFactory @@ -9,6 +12,10 @@ from pyparsing import ( ParseSyntaxException, ) +DEFAULT_EXTRA_CONFIG_PATH = "/opt/trains/config" +EXTRA_CONFIG_PATH_ENV_KEY = "TRAINS_CONFIG_DIR" +EXTRA_CONFIG_PATH_SEP = ":" + class BasicConfig: NotSet = object() @@ -39,8 +46,32 @@ class BasicConfig: path = ".".join((self.prefix, Path(name).stem)) return logging.getLogger(path) + def _read_env_paths(self, key): + value = getenv(EXTRA_CONFIG_PATH_ENV_KEY, DEFAULT_EXTRA_CONFIG_PATH) + if value is None: + return + paths = [ + Path(expandvars(v)).expanduser() for v in value.split(EXTRA_CONFIG_PATH_SEP) + ] + invalid = [ + path + for path in paths + if not path.is_dir() and str(path) != DEFAULT_EXTRA_CONFIG_PATH + ] + if invalid: + print(f"WARNING: Invalid paths in {key} env var: {' '.join(invalid)}") + return [path for path in paths if path.is_dir()] + def _load(self, verbose=True): - self._config = self._read_recursive(self.folder, verbose=verbose) + extra_config_paths = self._read_env_paths(EXTRA_CONFIG_PATH_ENV_KEY) or [] + + self._config = reduce( + lambda config, path: ConfigTree.merge_configs( + config, self._read_recursive(path, verbose=verbose), copy_trees=True + ), + [self.folder] + extra_config_paths, + ConfigTree(), + ) def _read_recursive(self, conf_root, verbose=True): conf = ConfigTree()