From 4879d1082c6b5d53ea0bd09612f9357ecf3ea726 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 --- .../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)