diff --git a/tripleo_ansible/ansible_plugins/filter/tripleo_inventory.py b/tripleo_ansible/ansible_plugins/filter/tripleo_inventory.py index 478eff05e..4353bff82 100644 --- a/tripleo_ansible/ansible_plugins/filter/tripleo_inventory.py +++ b/tripleo_ansible/ansible_plugins/filter/tripleo_inventory.py @@ -50,6 +50,36 @@ def to_inventory_hostmap(data): return group_host_map +def to_inventory_rolemap(data): + # Falttens inventory to a group->role mapping + if isinstance(data, six.string_types): + inventory = yaml.safe_load(data) + else: + inventory = data + + group_role_map = {} + + todo = collections.deque(inventory.keys()) + while todo: + group = todo.popleft() + if 'tripleo_role_name' in inventory[group].get('vars', {}): + group_role_map[group] = [inventory[group]['vars']['tripleo_role_name']] + else: + if 'children' in inventory[group]: + for child in inventory[group]['children']: + # Children have not all been flattened yet + # so postpone flattening this group + if child in todo: + todo.append(group) + break + else: + group_role_map[group] = [] + for child in inventory[group]['children']: + group_role_map[group] += group_role_map[child] + group_role_map[group].sort() + return group_role_map + + def to_inventory_roles(data): # Returns list of tripleo roles in inventory if isinstance(data, six.string_types): @@ -69,5 +99,6 @@ class FilterModule(object): def filters(self): return { 'to_inventory_hostmap': to_inventory_hostmap, + 'to_inventory_rolemap': to_inventory_rolemap, 'to_inventory_roles': to_inventory_roles, } diff --git a/tripleo_ansible/tests/plugins/filter/test_tripleo_inventory.py b/tripleo_ansible/tests/plugins/filter/test_tripleo_inventory.py index 6216df688..457b3ec2a 100644 --- a/tripleo_ansible/tests/plugins/filter/test_tripleo_inventory.py +++ b/tripleo_ansible/tests/plugins/filter/test_tripleo_inventory.py @@ -28,11 +28,17 @@ allovercloud: Controller: {} vars: {} Controller: + children: + overcloud_Controller: {} +overcloud_Controller: hosts: overcloud-controller-0: {foo_bar: baz} vars: tripleo_role_name: Controller Compute: + children: + overcloud_Compute: {} +overcloud_Compute: hosts: overcloud-novacompute-0: {foo_bar: baz} vars: @@ -49,10 +55,16 @@ dynamic_inventory = """ "vars" : {} }, "Controller" : { + "children": [ "overcloud_Controller" ] + }, + "overcloud_Controller" : { "hosts": [ "overcloud-controller-0" ], "vars": { "tripleo_role_name": "Controller" } }, "Compute" : { + "children": [ "overcloud_Compute" ] + }, + "overcloud_Compute" : { "hosts": ["overcloud-novacompute-0" ], "vars": { "tripleo_role_name": "Compute" } } @@ -68,7 +80,9 @@ class TestInventoryFilters(tests_base.TestCase): def _test_hostmap(self, inventory): expected = { "Compute": ["overcloud-novacompute-0"], + "overcloud_Compute": ["overcloud-novacompute-0"], "Controller": ["overcloud-controller-0"], + "overcloud_Controller": ["overcloud-controller-0"], "overcloud": ["overcloud-controller-0", "overcloud-novacompute-0"], "allovercloud": ["overcloud-controller-0", "overcloud-novacompute-0"], } @@ -81,6 +95,24 @@ class TestInventoryFilters(tests_base.TestCase): def test_hostmap_dynamic(self): self._test_hostmap(dynamic_inventory) + def _test_rolemap(self, inventory): + expected = { + "overcloud": ["Compute", "Controller"], + "allovercloud": ["Compute", "Controller"], + "Controller": ["Controller"], + "overcloud_Controller": ["Controller"], + "Compute": ["Compute"], + "overcloud_Compute": ["Compute"] + } + result = tripleo_inventory.to_inventory_rolemap(inventory) + self.assertEqual(expected, result) + + def test_rolemap_static(self): + self._test_rolemap(static_inventory) + + def test_rolemap_dynamic(self): + self._test_rolemap(dynamic_inventory) + def _test_roles(self, inventory): expected = ["Compute", "Controller"] result = tripleo_inventory.to_inventory_roles(inventory)