From 32acc044a7ed1b27b45aa529f0a21051752249c0 Mon Sep 17 00:00:00 2001 From: Lukas Bezdicka Date: Wed, 11 Jan 2023 12:48:05 +0100 Subject: [PATCH] Improve vip extraction for the multi-cell The multi-cell stacks don't have networks and only tag the ports. The code now simply mixes ports of multiple stacks together. To resolve this we filter for the tags of stacks in the vip ports. Co-authored-by: Daniel Bengtsson Change-Id: Id3eacdb631a7a7102d28ca4b9963fed3d99f2414 (cherry picked from commit 685896e50c169957abf2b0541d05f6ef1613394a) --- .../tripleo_overcloud_network_vip_extract.py | 65 +++++-------------- ...t_tripleo_overcloud_network_vip_extract.py | 42 +----------- 2 files changed, 20 insertions(+), 87 deletions(-) diff --git a/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_vip_extract.py b/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_vip_extract.py index a95d53f0d..2eca197bb 100644 --- a/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_vip_extract.py +++ b/tripleo_ansible/ansible_plugins/modules/tripleo_overcloud_network_vip_extract.py @@ -96,54 +96,25 @@ EXAMPLES = ''' ''' -def update_vip_data(conn, network, vip_ports, vip_data): - try: - vip = next(vip_ports) - except StopIteration: - return - - if not vip.fixed_ips: - return - - subnet = conn.network.get_subnet(vip.fixed_ips[0]['subnet_id']) - if (vip.dns_name is not None): - vip_data.append(dict(name=vip.name, - network=network.name, - subnet=subnet.name, - ip_address=vip.fixed_ips[0]['ip_address'], - dns_name=vip.dns_name)) - else: - vip_data.append(dict(name=vip.name, - network=network.name, - subnet=subnet.name, - ip_address=vip.fixed_ips[0]['ip_address'])) - - -def find_net_vips(conn, net_resrcs, vip_data): - for net in net_resrcs: - for res in net_resrcs[net]: - if not net_resrcs[net][res]['resource_type'] == n_utils.TYPE_NET: - continue - - network = conn.network.get_network( - net_resrcs[net][res][n_utils.RES_ID]) - vip_ports = conn.network.ports( - network_id=network.id, - tags='tripleo_vip_net={}'.format(network.name)) - - update_vip_data(conn, network, vip_ports, vip_data) - - -def find_ctlplane_vip(conn, vip_data): - network = conn.network.find_network('ctlplane') - vip_ports = conn.network.ports( - network_id=network.id, - name='control{}'.format(n_utils.NET_VIP_SUFFIX)) - - update_vip_data(conn, network, vip_ports, vip_data) +def find_net_vips(conn, stack): + return [ + (dict(name=vip.name, + network=conn.network.get_network(vip['network_id'])['name'], + subnet=conn.network.get_subnet(vip.fixed_ips[0]['subnet_id'])['name'], + ip_address=vip.fixed_ips[0]['ip_address'], + dns_name=vip.dns_name)) + if vip.dns_name is not None else + (dict(name=vip.name, + network=conn.network.get_network(vip['network_id'])['name'], + subnet=conn.network.get_subnet(vip.fixed_ips[0]['subnet_id'])['name'], + ip_address=vip.fixed_ips[0]['ip_address'])) + for vip in conn.network.ports(tags='tripleo_stack_name={}'.format(stack)) + if [x for x in vip['tags'] if x.startswith('tripleo_vip_net=')] + ] def run_module(): + result = dict( success=False, changed=False, @@ -165,10 +136,8 @@ def run_module(): try: _, conn = openstack_cloud_from_module(module) - net_resources = n_utils.get_overcloud_network_resources(conn, stack) - find_net_vips(conn, net_resources, result['vip_data']) - find_ctlplane_vip(conn, result['vip_data']) + result['vip_data'] = find_net_vips(conn, stack) result['changed'] = True if result['vip_data'] else False result['success'] = True if result['vip_data'] else False module.exit_json(**result) diff --git a/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_vip_extract.py b/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_vip_extract.py index e2d3fc342..cd188cc33 100644 --- a/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_vip_extract.py +++ b/tripleo_ansible/tests/modules/test_tripleo_overcloud_network_vip_extract.py @@ -37,16 +37,6 @@ class TestTripleoOvercloudVipExtract(tests_base.TestCase): self.a2g = lambda x: (n for n in x) def test_find_net_vips(self, mock_conn): - fake_net_resources = { - 'StorageNetwork': { - 'InternalApiNetwork': {'physical_resource_id': 'fake-id', - 'resource_type': n_utils.TYPE_NET}, - 'StorageSubnet': {'physical_resource_id': 'fake-id', - 'resource_type': n_utils.TYPE_SUBNET}, - 'StorageSubnet_leaf1': {'physical_resource_id': 'fake-id', - 'resource_type': n_utils.TYPE_SUBNET} - } - } fake_network = stubs.FakeNeutronNetwork( id='internal_api_id', name='internal_api') @@ -55,47 +45,21 @@ class TestTripleoOvercloudVipExtract(tests_base.TestCase): name='internal_api_subnet') fake_vip_port = stubs.FakeNeutronPort( id='internal_api_vip_id', + network_id='internal_api_id', name='internal_api_virtual_ip', fixed_ips=[{'subnet_id': 'internal_api_subnet_id', 'ip_address': '1.2.3.4'}], + tags=['tripleo_stack_name=overcloud', 'tripleo_vip_net=internal_api'], dns_name='internalapi.localdomain' ) mock_conn.network.get_network.return_value = fake_network mock_conn.network.get_subnet.return_value = fake_subnet mock_conn.network.ports.return_value = self.a2g([fake_vip_port]) - vip_data = list() - plugin.find_net_vips(mock_conn, fake_net_resources, vip_data) + vip_data = plugin.find_net_vips(mock_conn, 'overcloud') self.assertEqual([{'name': 'internal_api_virtual_ip', 'network': 'internal_api', 'subnet': 'internal_api_subnet', 'ip_address': '1.2.3.4', 'dns_name': 'internalapi.localdomain'}], vip_data) - - def test_find_ctlplane_vip(self, mock_conn): - fake_network = stubs.FakeNeutronNetwork( - id='ctlplane_id', - name='ctlplane') - fake_subnet = stubs.FakeNeutronSubnet( - id='ctlplane_subnet_id', - name='ctlplane-subnet') - fake_vip_port = stubs.FakeNeutronPort( - id='ctlplane_vip_id', - name='control_virtual_ip', - fixed_ips=[{'subnet_id': 'ctlplane_subnet_id', - 'ip_address': '4.3.2.1'}], - dns_name='ctlplane.localdomain' - ) - mock_conn.network.find_network.return_value = fake_network - mock_conn.network.get_subnet.return_value = fake_subnet - mock_conn.network.ports.return_value = self.a2g([fake_vip_port]) - - vip_data = list() - plugin.find_ctlplane_vip(mock_conn, vip_data) - self.assertEqual([{'name': 'control_virtual_ip', - 'network': 'ctlplane', - 'subnet': 'ctlplane-subnet', - 'ip_address': '4.3.2.1', - 'dns_name': 'ctlplane.localdomain'}], - vip_data)