Merge "Check for configured groups in the environment"

This commit is contained in:
Jenkins 2016-11-01 15:34:54 +00:00 committed by Gerrit Code Review
commit 1a2f9ac0ac
4 changed files with 94 additions and 1 deletions

View File

@ -124,6 +124,9 @@ Using the ``--check`` flag when running ``dynamic_inventory.py`` will run the
inventory build process and look for known errors, but not write any files to inventory build process and look for known errors, but not write any files to
disk. disk.
If any groups defined in the ``openstack_user_config.yml`` or ``conf.d`` files
are not found in the environment, a warning will be raised.
This check does not do YAML syntax validation, though it will fail if there This check does not do YAML syntax validation, though it will fail if there
are unparseable errors. are unparseable errors.

View File

@ -25,6 +25,7 @@ import Queue
import random import random
import tarfile import tarfile
import uuid import uuid
import warnings
import yaml import yaml
logger = logging.getLogger('osa-inventory') logger = logging.getLogger('osa-inventory')
@ -1053,6 +1054,34 @@ def _check_config_settings(cidr_networks, config, container_skel):
_check_lxc_hosts(config) _check_lxc_hosts(config)
def _check_all_conf_groups_present(config, environment):
"""Verifies that all groups defined in the config are in the environment
If a group is in config but not the environment, a warning will be raised.
Multiple warnings can be raised, and the return value will be set to False.
If all groups found are in the environment, the function returns True
:param config: ``dict`` user's provided configuration
:param environment: ``dict`` group membership mapping
:rtype: bool, True if all groups are in environment, False otherwise
"""
excludes = ('global_overrides', 'cidr_networks', 'used_ips')
config_groups = [k for k in config.keys() if k not in excludes]
env_groups = environment['physical_skel'].keys()
retval = True
for group in config_groups:
if group not in env_groups:
msg = ("Group %s was found in configuration but "
"not the environment." % group)
warnings.warn(msg)
retval = False
return retval
def load_environment(config_path, environment): def load_environment(config_path, environment):
"""Create an environment dictionary from config files """Create an environment dictionary from config files
@ -1224,6 +1253,7 @@ def main(config=None, check=False, debug=False, environment=None, **kwargs):
) )
if check: if check:
if _check_all_conf_groups_present(user_defined_config, environment):
return 'Configuration ok!' return 'Configuration ok!'
# Generate a list of all hosts and their used IP addresses # Generate a list of all hosts and their used IP addresses

View File

@ -0,0 +1,5 @@
---
features:
- The ``--check`` parameter for ``dynamic_inventory.py`` will now raise
warnings if there are any groups defined in the user configuration that
are not also found in the environment definition.

View File

@ -10,6 +10,7 @@ from os import path
import Queue import Queue
import sys import sys
import unittest import unittest
import warnings
import yaml import yaml
INV_DIR = 'playbooks/inventory' INV_DIR = 'playbooks/inventory'
@ -1207,5 +1208,59 @@ class TestLxcHosts(TestConfigCheckBase):
get_inventory() get_inventory()
class TestConfigMatchesEnvironment(unittest.TestCase):
def setUp(self):
self.env = di.load_environment(BASE_ENV_DIR, {})
def test_matching_keys(self):
config = get_config()
result = di._check_all_conf_groups_present(config, self.env)
self.assertTrue(result)
def test_failed_match(self):
bad_config = get_config()
bad_config['bogus_key'] = []
result = di._check_all_conf_groups_present(bad_config, self.env)
self.assertFalse(result)
def test_extra_config_key_warning(self):
bad_config = get_config()
bad_config['bogus_key'] = []
with warnings.catch_warnings(record=True) as wl:
di._check_all_conf_groups_present(bad_config, self.env)
self.assertEqual(1, len(wl))
self.assertTrue('bogus_key' in str(wl[0].message))
def test_multiple_extra_keys(self):
bad_config = get_config()
bad_config['bogus_key1'] = []
bad_config['bogus_key2'] = []
with warnings.catch_warnings(record=True) as wl:
di._check_all_conf_groups_present(bad_config, self.env)
self.assertEqual(2, len(wl))
warn_msgs = [str(warn.message) for warn in wl]
warn_msgs.sort()
self.assertTrue('bogus_key1' in warn_msgs[0])
self.assertTrue('bogus_key2' in warn_msgs[1])
def test_confirm_exclusions(self):
"""Ensure the the excluded keys in the function are present."""
config = get_config()
excluded_keys = ('global_overrides', 'cidr_networks', 'used_ips')
for key in excluded_keys:
config[key] = 'sentinel value'
with warnings.catch_warnings(record=True) as wl:
di._check_all_conf_groups_present(config, self.env)
self.assertEqual(0, len(wl))
for key in excluded_keys:
self.assertIn(key, config.keys())
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()