diff --git a/docker/base/set_configs.py b/docker/base/set_configs.py index 12da192c01..cd9ccd83f7 100644 --- a/docker/base/set_configs.py +++ b/docker/base/set_configs.py @@ -140,21 +140,38 @@ def set_permissions(data): def load_config(): - config_file = '/var/lib/kolla/config_files/config.json' - LOG.info('Loading config file at {}'.format(config_file)) + def load_from_env(): + config_raw = os.environ.get("KOLLA_CONFIG") + if config_raw is None: + return None - # Attempt to read config file - with open(config_file) as f: + # Attempt to read config try: - config = json.load(f) + return json.loads(config_raw) except ValueError: - LOG.error('Invalid json file found at {}'.format(config_file)) - sys.exit(1) - except IOError as e: - LOG.error('Could not read file {}. Failed with error {}'.format( - config_file, e)) + LOG.error('Invalid json for Kolla config') sys.exit(1) + def load_from_file(): + config_file = '/var/lib/kolla/config_files/config.json' + LOG.info('Loading config file at {}'.format(config_file)) + + # Attempt to read config file + with open(config_file) as f: + try: + return json.load(f) + except ValueError: + LOG.error('Invalid json file found at {}'.format(config_file)) + sys.exit(1) + except IOError as e: + LOG.error('Could not read file {}. Failed with error {}' + .format(config_file, e)) + sys.exit(1) + + config = load_from_env() + if config is None: + config = load_from_file() + LOG.info('Validating config file') validate_config(config) diff --git a/tests/test_set_config.py b/tests/test_set_config.py index c1e7f79273..1e8ac9ce62 100644 --- a/tests/test_set_config.py +++ b/tests/test_set_config.py @@ -45,3 +45,20 @@ class LoadFromFile(base.BaseTestCase): mock.call().__enter__(), mock.call().write(u'/bin/true'), mock.call().__exit__(None, None, None)], mo.mock_calls) + + +class LoadFromEnv(base.BaseTestCase): + + def test_load_ok(self): + in_config = json.dumps({'command': '/bin/true', + 'config_files': {}}) + + mo = mock.mock_open() + with mock.patch.object(set_configs, 'open', mo): + with mock.patch.dict('os.environ', {'KOLLA_CONFIG': in_config}): + set_configs.load_config() + self.assertEqual([mock.call('/run_command', 'w+'), + mock.call().__enter__(), + mock.call().write(u'/bin/true'), + mock.call().__exit__(None, None, None)], + mo.mock_calls)