From 6be18f31ffb62e28a2c73822af84c1966b9112d4 Mon Sep 17 00:00:00 2001 From: Oliver Walsh Date: Fri, 4 Dec 2020 12:26:46 +0000 Subject: [PATCH] Cleanup and add test coverage for inventory without overcloud This should generate an inventory containing just the Undercloud group. There are a few vars being set that do not make sense in this case e.g plan/plans and overcloud admin password. Clean this up and add unit tests. Change-Id: I98dbbaaea25a0d61674e989eca8d2daf6090ebc4 (cherry picked from commit 43fa36d3c274e00a362e366ffd5beaf46ac29423) (cherry picked from commit 9d292a63e1af5d6684f8216725437310d853561b) --- tripleo_common/inventories.py | 3 +- tripleo_common/inventory.py | 18 ++++---- .../inventory_data/undercloud_dynamic.json | 32 +++++++++++++++ .../undercloud_dynamic_merged.json | 33 +++++++++++++++ .../inventory_data/undercloud_static.yaml | 17 ++++++++ .../undercloud_static_merged.yaml | 18 ++++++++ tripleo_common/tests/test_inventories.py | 41 ++++++++++++++++++- tripleo_common/tests/test_inventory.py | 30 ++++++++++++++ 8 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 tripleo_common/tests/inventory_data/undercloud_dynamic.json create mode 100644 tripleo_common/tests/inventory_data/undercloud_dynamic_merged.json create mode 100644 tripleo_common/tests/inventory_data/undercloud_static.yaml create mode 100644 tripleo_common/tests/inventory_data/undercloud_static_merged.yaml diff --git a/tripleo_common/inventories.py b/tripleo_common/inventories.py index 11261a24e..6b69dc1e7 100644 --- a/tripleo_common/inventories.py +++ b/tripleo_common/inventories.py @@ -59,7 +59,8 @@ class TripleoInventories(object): # save the plan for this stack in the plans list plan = inv['Undercloud']['vars']['plan'] - inventory['Undercloud']['vars']['plans'].append(plan) + if plan is not None: + inventory['Undercloud']['vars']['plans'].append(plan) for key in inv.keys(): if key != 'Undercloud': diff --git a/tripleo_common/inventory.py b/tripleo_common/inventory.py index 7249c8671..b239808b8 100644 --- a/tripleo_common/inventory.py +++ b/tripleo_common/inventory.py @@ -148,6 +148,8 @@ class TripleoInventory(object): return alist def _get_stack(self): + if self.plan_name is None: + return None try: stack = self.hclient.stacks.get(self.plan_name) except HTTPNotFound: @@ -168,7 +170,7 @@ class TripleoInventory(object): # see https://github.com/ansible/ansible/issues/41808 'ansible_remote_tmp': '/tmp/ansible-${USER}', 'auth_url': self.auth_url, - 'plan': self.plan_name, + 'plan': None, 'project_name': self.project_name, 'username': self.username, }, @@ -193,12 +195,6 @@ class TripleoInventory(object): ret['Undercloud']['vars']['undercloud_service_list'] = \ self.get_undercloud_service_list() - admin_password = self.get_overcloud_environment().get( - 'parameter_defaults', {}).get('AdminPassword') - if admin_password: - ret['Undercloud']['vars']['overcloud_admin_password'] =\ - admin_password - if dynamic: # Prevent Ansible from repeatedly calling us to get empty host # details @@ -207,6 +203,14 @@ class TripleoInventory(object): self.stack = self._get_stack() if not self.stack: return ret + + ret['Undercloud']['vars']['plan'] = self.plan_name + admin_password = self.get_overcloud_environment().get( + 'parameter_defaults', {}).get('AdminPassword') + if admin_password: + ret['Undercloud']['vars']['overcloud_admin_password'] =\ + admin_password + self.stack_outputs = StackOutputs(self.stack) keystone_url = self.stack_outputs.get('KeystoneURL') diff --git a/tripleo_common/tests/inventory_data/undercloud_dynamic.json b/tripleo_common/tests/inventory_data/undercloud_dynamic.json new file mode 100644 index 000000000..98fc8f805 --- /dev/null +++ b/tripleo_common/tests/inventory_data/undercloud_dynamic.json @@ -0,0 +1,32 @@ +{ + "_meta": { + "hostvars": {} + }, + "Undercloud": { + "hosts": [ + "undercloud" + ], + "vars": { + "ansible_host": "localhost", + "ansible_python_interpreter": "/usr/bin/python3", + "ansible_connection": "local", + "ansible_remote_tmp": "/tmp/ansible-${USER}", + "auth_url": "https://192.168.24.2:13000", + "cacert": null, + "os_auth_token": "gAAAAABfyhfVBvn9GwTNPKCgjTLtBAMW4_8JVMUj4n9GTrt8Ns2_YrJiAK9E3E9V0ABixQ2TRICTgZtHGgl4qfIcJMvbbLjH84oL4QxuyQ4LfcNIF7WBcnvoo3qvkCYfTNbzEJChFYiId8W0lyXiTGE80Dhr13PXrHuYDeejs4jShuFGSP_8BeQ", + "plan": null, + "project_name": "admin", + "username": "admin", + "undercloud_swift_url": "https://192.168.24.2:13808/v1/AUTH_ad15d77254c94b03b1534a261059cd76", + "undercloud_service_list": [ + "tripleo_nova_compute", + "tripleo_heat_engine", + "tripleo_ironic_conductor", + "tripleo_swift_container_server", + "tripleo_swift_object_server", + "tripleo_mistral_engine" + ] + } + } +} + diff --git a/tripleo_common/tests/inventory_data/undercloud_dynamic_merged.json b/tripleo_common/tests/inventory_data/undercloud_dynamic_merged.json new file mode 100644 index 000000000..a35457c69 --- /dev/null +++ b/tripleo_common/tests/inventory_data/undercloud_dynamic_merged.json @@ -0,0 +1,33 @@ +{ + "_meta": { + "hostvars": {} + }, + "Undercloud": { + "hosts": [ + "undercloud" + ], + "vars": { + "ansible_host": "localhost", + "ansible_python_interpreter": "/usr/bin/python3", + "ansible_connection": "local", + "ansible_remote_tmp": "/tmp/ansible-${USER}", + "auth_url": "https://192.168.24.2:13000", + "cacert": null, + "os_auth_token": "gAAAAABfyhfVBvn9GwTNPKCgjTLtBAMW4_8JVMUj4n9GTrt8Ns2_YrJiAK9E3E9V0ABixQ2TRICTgZtHGgl4qfIcJMvbbLjH84oL4QxuyQ4LfcNIF7WBcnvoo3qvkCYfTNbzEJChFYiId8W0lyXiTGE80Dhr13PXrHuYDeejs4jShuFGSP_8BeQ", + "plan": null, + "plans": [], + "project_name": "admin", + "username": "admin", + "undercloud_swift_url": "https://192.168.24.2:13808/v1/AUTH_ad15d77254c94b03b1534a261059cd76", + "undercloud_service_list": [ + "tripleo_nova_compute", + "tripleo_heat_engine", + "tripleo_ironic_conductor", + "tripleo_swift_container_server", + "tripleo_swift_object_server", + "tripleo_mistral_engine" + ] + } + } +} + diff --git a/tripleo_common/tests/inventory_data/undercloud_static.yaml b/tripleo_common/tests/inventory_data/undercloud_static.yaml new file mode 100644 index 000000000..b2132453b --- /dev/null +++ b/tripleo_common/tests/inventory_data/undercloud_static.yaml @@ -0,0 +1,17 @@ +Undercloud: + hosts: + undercloud: {} + vars: + ansible_connection: local + ansible_host: localhost + ansible_python_interpreter: /usr/bin/python3 + ansible_remote_tmp: /tmp/ansible-${USER} + auth_url: https://192.168.24.2:13000 + cacert: null + os_auth_token: gAAAAABfyheSpP9F_O2zpn_zMgPANBpl10eMR4QWL3tfBDJYhDEP_iEoPBjP0H0kCfkoDBldnlmkf9LRIWqSRJ1Z6FJOQdMp--DjJE4lpvWk6_swo2NpSt3IGW9Kudc7xNm-WA9R7xBujF4DtZ_WjWw7H_Ue0VfF6eKfo2HLP6Y9VS2IY3m9HZQ + plan: null + project_name: admin + undercloud_service_list: [tripleo_nova_compute, tripleo_heat_engine, tripleo_ironic_conductor, + tripleo_swift_container_server, tripleo_swift_object_server, tripleo_mistral_engine] + undercloud_swift_url: https://192.168.24.2:13808/v1/AUTH_ad15d77254c94b03b1534a261059cd76 + username: admin diff --git a/tripleo_common/tests/inventory_data/undercloud_static_merged.yaml b/tripleo_common/tests/inventory_data/undercloud_static_merged.yaml new file mode 100644 index 000000000..ac722bb13 --- /dev/null +++ b/tripleo_common/tests/inventory_data/undercloud_static_merged.yaml @@ -0,0 +1,18 @@ +Undercloud: + hosts: + undercloud: {} + vars: + ansible_connection: local + ansible_host: localhost + ansible_python_interpreter: /usr/bin/python3 + ansible_remote_tmp: /tmp/ansible-${USER} + auth_url: https://192.168.24.2:13000 + cacert: null + os_auth_token: gAAAAABfyheSpP9F_O2zpn_zMgPANBpl10eMR4QWL3tfBDJYhDEP_iEoPBjP0H0kCfkoDBldnlmkf9LRIWqSRJ1Z6FJOQdMp--DjJE4lpvWk6_swo2NpSt3IGW9Kudc7xNm-WA9R7xBujF4DtZ_WjWw7H_Ue0VfF6eKfo2HLP6Y9VS2IY3m9HZQ + plan: null + plans: [] + project_name: admin + undercloud_service_list: [tripleo_nova_compute, tripleo_heat_engine, tripleo_ironic_conductor, + tripleo_swift_container_server, tripleo_swift_object_server, tripleo_mistral_engine] + undercloud_swift_url: https://192.168.24.2:13808/v1/AUTH_ad15d77254c94b03b1534a261059cd76 + username: admin diff --git a/tripleo_common/tests/test_inventories.py b/tripleo_common/tests/test_inventories.py index 444d331ad..6d90bb3c6 100644 --- a/tripleo_common/tests/test_inventories.py +++ b/tripleo_common/tests/test_inventories.py @@ -42,7 +42,10 @@ class _TestInventoriesBase(base.TestCase): 'merged_static.yaml', 'single_dynamic.json', 'single_static.yaml', - + 'undercloud_dynamic.json', + 'undercloud_static.yaml', + 'undercloud_dynamic_merged.json', + 'undercloud_static_merged.yaml', ): name = os.path.basename(datafile).split('.')[0] path = os.path.join(inventory_dir, datafile) @@ -145,3 +148,39 @@ class TestInventorySingleDynamic(_TestInventoriesBase): actual = self.inventories.list() expected = self.inventory_data['single_dynamic'] self.assertEqual(expected, actual) + + +class TestInventoryUndercloudStatic(_TestInventoriesBase): + def setUp(self): + super(TestInventoryUndercloudStatic, self).setUp() + mock_inv_undercloud = MagicMock() + mock_inv_undercloud.list.return_value = self.inventory_data[ + 'undercloud_static' + ] + stack_to_inv_obj_map = { + 'foobar': mock_inv_undercloud + } + self.inventories = TripleoInventories(stack_to_inv_obj_map) + + def test_list(self): + actual = self.inventories.list(dynamic=False) + expected = self.inventory_data['undercloud_static_merged'] + self.assertEqual(expected, actual) + + +class TestInventoryUndercloudDynamic(_TestInventoriesBase): + def setUp(self): + super(TestInventoryUndercloudDynamic, self).setUp() + mock_inv_undercloud = MagicMock() + mock_inv_undercloud.list.return_value = self.inventory_data[ + 'undercloud_dynamic' + ] + stack_to_inv_obj_map = { + 'foobar': mock_inv_undercloud + } + self.inventories = TripleoInventories(stack_to_inv_obj_map) + + def test_list(self): + actual = self.inventories.list() + expected = self.inventory_data['undercloud_dynamic_merged'] + self.assertEqual(expected, actual) diff --git a/tripleo_common/tests/test_inventory.py b/tripleo_common/tests/test_inventory.py index 15f588e35..5efb41ca7 100644 --- a/tripleo_common/tests/test_inventory.py +++ b/tripleo_common/tests/test_inventory.py @@ -309,6 +309,36 @@ class TestInventory(base.TestCase): for k in expected: self.assertEqual(expected[k], inv_list[k]) + def test_inventory_list_undercloud_only(self): + self.inventory.plan_name = None + self.inventory.undercloud_connection = 'local' + expected = { + 'Undercloud': { + 'hosts': ['undercloud'], + 'vars': { + 'ansible_connection': 'local', + 'ansible_host': 'localhost', + 'ansible_python_interpreter': sys.executable, + 'ansible_remote_tmp': '/tmp/ansible-${USER}', + 'auth_url': 'xyz://keystone.local', + 'cacert': 'acacert', + 'project_name': 'admin', + 'plan': None, + 'undercloud_service_list': [ + 'tripleo_nova_compute', + 'tripleo_heat_engine', + 'tripleo_ironic_conductor', + 'tripleo_swift_container_server', + 'tripleo_swift_object_server', + 'tripleo_mistral_engine' + ], + 'username': 'admin' + } + }, + '_meta': {'hostvars': {}}, + } + self.assertEqual(expected, self.inventory.list()) + def test_ansible_ssh_user(self): self._try_alternative_args( ansible_ssh_user='my-custom-admin', undercloud_connection='ssh')