From 45ff9201988009c72ac691f12231236f39facb8c Mon Sep 17 00:00:00 2001 From: Travis Truman Date: Wed, 2 Mar 2016 22:06:48 -0500 Subject: [PATCH] Test basic structure of dynamic inventory output This is intended as a building block for future refactoring of the dynamic inventory script. Tests validate the output: * meets basic content requirements imposed by Ansible * contains all expected OSA host groups * contains only the OSA expected host groups Additionally, the iteration count for the duplicate IP test has been changed from 25 to 100 since the check execution time is not adversely effected by the difference and the original author had wanted 100 iterations. Change-Id: I17971a35b69ebe4aa4dcdbc60210a5bbbc6764a3 --- tests/test_inventory.py | 200 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/tests/test_inventory.py b/tests/test_inventory.py index d7e1165bcd..6c8eefed5e 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -46,6 +46,206 @@ def get_inventory(): cleanup() +class TestAnsibleInventoryFormatConstraints(unittest.TestCase): + inventory = None + + expected_groups = [ + 'aio1_containers', + 'all', + 'all_containers', + 'aodh_alarm_evaluator', + 'aodh_alarm_notifier', + 'aodh_all', + 'aodh_api', + 'aodh_container', + 'aodh_listener', + 'ceilometer_agent_central', + 'ceilometer_agent_compute', + 'ceilometer_agent_notification', + 'ceilometer_all', + 'ceilometer_api', + 'ceilometer_api_container', + 'ceilometer_collector', + 'ceilometer_collector_container', + 'cinder_all', + 'cinder_api', + 'cinder_api_container', + 'cinder_backup', + 'cinder_scheduler', + 'cinder_scheduler_container', + 'cinder_volume', + 'cinder_volumes_container', + 'compute_all', + 'compute_containers', + 'compute_hosts', + 'galera', + 'galera_all', + 'galera_container', + 'glance_all', + 'glance_api', + 'glance_container', + 'glance_registry', + 'haproxy', + 'haproxy_all', + 'haproxy_container', + 'haproxy_containers', + 'haproxy_hosts', + 'heat_all', + 'heat_api', + 'heat_api_cfn', + 'heat_api_cloudwatch', + 'heat_apis_container', + 'heat_engine', + 'heat_engine_container', + 'horizon', + 'horizon_all', + 'horizon_container', + 'hosts', + 'identity_all', + 'identity_containers', + 'identity_hosts', + 'infra_containers', + 'infra_hosts', + 'keystone', + 'keystone_all', + 'keystone_container', + 'log_all', + 'log_containers', + 'log_hosts', + 'memcached', + 'memcached_all', + 'memcached_container', + 'metering-alarm_containers', + 'metering-alarm_hosts', + 'metering-compute_container', + 'metering-compute_containers', + 'metering-compute_hosts', + 'metering-infra_containers', + 'metering-infra_hosts', + 'network_all', + 'network_containers', + 'network_hosts', + 'neutron_agent', + 'neutron_agents_container', + 'neutron_all', + 'neutron_dhcp_agent', + 'neutron_l3_agent', + 'neutron_lbaas_agent', + 'neutron_linuxbridge_agent', + 'neutron_metadata_agent', + 'neutron_metering_agent', + 'neutron_server', + 'neutron_server_container', + 'nova_all', + 'nova_api_metadata', + 'nova_api_metadata_container', + 'nova_api_os_compute', + 'nova_api_os_compute_container', + 'nova_cert', + 'nova_cert_container', + 'nova_compute', + 'nova_compute_container', + 'nova_conductor', + 'nova_conductor_container', + 'nova_console', + 'nova_console_container', + 'nova_scheduler', + 'nova_scheduler_container', + 'os-infra_all', + 'os-infra_containers', + 'os-infra_hosts', + 'pkg_repo', + 'rabbit_mq_container', + 'rabbitmq', + 'rabbitmq_all', + 'remote', + 'remote_containers', + 'repo-infra_all', + 'repo-infra_containers', + 'repo-infra_hosts', + 'repo_all', + 'repo_container', + 'rsyslog', + 'rsyslog_all', + 'rsyslog_container', + 'shared-infra_all', + 'shared-infra_containers', + 'shared-infra_hosts', + 'storage-infra_all', + 'storage-infra_containers', + 'storage-infra_hosts', + 'storage_all', + 'storage_containers', + 'storage_hosts', + 'swift-proxy_containers', + 'swift-proxy_hosts', + 'swift-remote_containers', + 'swift-remote_hosts', + 'swift_acc', + 'swift_acc_container', + 'swift_all', + 'swift_cont', + 'swift_cont_container', + 'swift_containers', + 'swift_hosts', + 'swift_obj', + 'swift_obj_container', + 'swift_proxy', + 'swift_proxy_container', + 'swift_remote', + 'swift_remote_all', + 'swift_remote_container', + 'utility', + 'utility_all', + 'utility_container', + ] + + @classmethod + def setUpClass(cls): + cls.inventory = get_inventory() + + def test_meta(self): + meta = self.inventory['_meta'] + self.assertIsNotNone(meta, "_meta missing from inventory") + self.assertIsInstance(meta, dict, "_meta is not a dict") + + def test_hostvars(self): + hostvars = self.inventory['_meta']['hostvars'] + self.assertIsNotNone(hostvars, "hostvars missing from _meta") + self.assertIsInstance(hostvars, dict, "hostvars is not a dict") + + def test_group_vars_all(self): + group_vars_all = self.inventory['all'] + self.assertIsNotNone(group_vars_all, + "group vars all missing from inventory") + self.assertIsInstance(group_vars_all, dict, + "group vars all is not a dict") + + the_vars = group_vars_all['vars'] + self.assertIsNotNone(the_vars, + "vars missing from group vars all") + self.assertIsInstance(the_vars, dict, + "vars in group vars all is not a dict") + + def test_expected_host_groups_present(self): + + for group in self.expected_groups: + the_group = self.inventory[group] + self.assertIsNotNone(the_group, + "Required host group: %s is missing " + "from inventory" % group) + self.assertIsInstance(the_group, dict) + + if group != 'all': + self.assertIn('hosts', the_group) + self.assertIsInstance(the_group['hosts'], list) + + def test_only_expected_host_groups_present(self): + all_keys = list(self.expected_groups) + all_keys.append('_meta') + self.assertEqual(set(all_keys), set(self.inventory.keys())) + + class TestDuplicateIps(unittest.TestCase): def setUp(self): # Allow custom assertion errors.