env-config: use proper ALL keys reconfiguration based on env vars

This commit is contained in:
RhodeCode Admin 2022-12-12 22:04:53 +01:00
parent c3bd2e4093
commit 911fc2e7e3
5 changed files with 48 additions and 17 deletions

View file

@ -34,6 +34,8 @@ def _sanitize_settings_and_apply_defaults(settings):
default_store = os.path.join(os.path.dirname(settings['__file__']), 'upload_store')
settings_maker.make_setting(config_keys.store_path, default_store)
settings_maker.env_expand()
def includeme(config):
from rhodecode.apps.file_store.views import FileStoreView

View file

@ -48,6 +48,8 @@ def _sanitize_settings_and_apply_defaults(settings):
settings_maker.make_setting(config_keys.ssh_git_bin, '~/.rccontrol/vcsserver-1/profile/bin/git')
settings_maker.make_setting(config_keys.ssh_svn_bin, '~/.rccontrol/vcsserver-1/profile/bin/svnserve')
settings_maker.env_expand()
def includeme(config):
settings = config.registry.settings

View file

@ -48,6 +48,8 @@ def _sanitize_settings_and_apply_defaults(settings):
settings_maker.make_setting(config_keys.reload_command, '')
settings_maker.make_setting(config_keys.template, '')
settings_maker.env_expand()
# Convert negative timeout values to zero.
if settings[config_keys.reload_timeout] < 0:
settings[config_keys.reload_timeout] = 0

View file

@ -525,6 +525,13 @@ def sanitize_settings_and_apply_defaults(global_config, settings):
settings_maker.make_setting('is_test', False, parser='bool')
settings_maker.make_setting('gzip_responses', False, parser='bool')
# statsd
settings_maker.make_setting('statsd.enabled', False, parser='bool')
settings_maker.make_setting('statsd.statsd_host', '0.0.0.0')
settings_maker.make_setting('statsd.statsd_port', 8125, parser='int')
settings_maker.make_setting('statsd.statsd_prefix', '')
settings_maker.make_setting('statsd.statsd_ipv6', False, parser='bool')
settings_maker.make_setting('vcs.svn.compatible_version', '')
settings_maker.make_setting('vcs.hooks.protocol', 'http')
settings_maker.make_setting('vcs.hooks.host', '127.0.0.1')
@ -549,17 +556,6 @@ def sanitize_settings_and_apply_defaults(global_config, settings):
settings_maker.make_setting('appenlight', False, parser='bool')
_sanitize_cache_settings(settings)
# configure instance id
config_utils.set_instance_id(settings)
return settings
def _sanitize_cache_settings(settings):
settings_maker = SettingsMaker(settings)
temp_store = tempfile.gettempdir()
default_cache_dir = os.path.join(temp_store, 'rc_cache')
@ -609,3 +605,10 @@ def _sanitize_cache_settings(settings):
settings_maker.make_setting('rc_cache.sql_cache_short.backend', 'dogpile.cache.rc.memory_lru')
settings_maker.make_setting('rc_cache.sql_cache_short.expiration_time', 30, parser='int')
settings_maker.make_setting('rc_cache.sql_cache_short.max_size', 10000, parser='int')
settings_maker.env_expand()
# configure instance id
config_utils.set_instance_id(settings)
return settings

View file

@ -27,6 +27,8 @@ import tempfile
import logging.config
log = logging.getLogger(__name__)
set_keys = {}
def str2bool(_str):
"""
@ -119,6 +121,27 @@ class SettingsMaker(object):
def _key_transformator(cls, key):
return "{}_{}".format('RC'.upper(), key.upper().replace('.', '_').replace('-', '_'))
def maybe_env_key(self, key):
# now maybe we have this KEY in env, search and use the value with higher priority.
transformed_key = self._key_transformator(key)
envvar_value = os.environ.get(transformed_key)
if envvar_value:
log.debug('using `%s` key instead of `%s` key for config', transformed_key, key)
return envvar_value
def env_expand(self):
replaced = {}
for k, v in self.settings.items():
if k not in set_keys:
envvar_value = self.maybe_env_key(k)
if envvar_value:
replaced[k] = envvar_value
set_keys[k] = envvar_value
# replace ALL keys updated
self.settings.update(replaced)
def enable_logging(self, logging_conf=None, level='INFO', formatter='generic'):
"""
Helper to enable debug on running instance
@ -133,7 +156,8 @@ class SettingsMaker(object):
logging_conf = self.settings.get('logging.logging_conf_file') or ''
if not os.path.isfile(logging_conf):
log.error('Unable to setup logging based on %s, file does not exist...', logging_conf)
log.error('Unable to setup logging based on %s, '
'file does not exist.... specify path using logging.logging_conf_file= config setting. ', logging_conf)
return
with open(logging_conf, 'rb') as f:
@ -151,7 +175,6 @@ class SettingsMaker(object):
os.remove(f.name)
def make_setting(self, key, default, lower=False, default_when_empty=False, parser=None):
input_val = self.settings.get(key, default)
if default_when_empty and not input_val:
@ -172,11 +195,10 @@ class SettingsMaker(object):
None: lambda i: i
}[parser]
# now maybe we have this KEY in env, search and use the value with higher priority.
transformed_key = self._key_transformator(key)
envvar_value = os.environ.get(transformed_key)
envvar_value = self.maybe_env_key(key)
if envvar_value:
log.debug('using `%s` key instead of `%s` key for config', transformed_key, key)
input_val = envvar_value
set_keys[key] = input_val
self.settings[key] = parser_func(input_val)
return self.settings[key]