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 43fa36d3c2)
(cherry picked from commit 9d292a63e1)
(cherry picked from commit 6be18f31ff)
This commit is contained in:
Oliver Walsh 2020-12-04 12:26:46 +00:00
parent 0630a76c69
commit 8b37b05ea8
8 changed files with 191 additions and 9 deletions

View File

@ -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':

View File

@ -149,6 +149,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:
@ -172,7 +174,7 @@ class TripleoInventory(object):
'cacert': self.cacert,
'os_auth_token':
self.session.get_token() if self.session else None,
'plan': self.plan_name,
'plan': None,
'project_name': self.project_name,
'username': self.username,
},
@ -199,12 +201,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
@ -213,6 +209,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')

View File

@ -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"
]
}
}
}

View File

@ -0,0 +1,36 @@
{
"_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"
]
}
},
"overcloud": {
"children": ["foobar"]
}
}

View File

@ -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

View File

@ -0,0 +1,21 @@
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
overcloud:
children:
foobar: {}

View File

@ -41,7 +41,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)
@ -144,3 +147,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)

View File

@ -248,6 +248,38 @@ 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',
'os_auth_token': 'atoken',
'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'
],
'undercloud_swift_url': 'anendpoint',
'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',