From 90cfd1d8d51f223d6f3daa88b4c99412f206a100 Mon Sep 17 00:00:00 2001 From: Fernando Royo Date: Wed, 7 Feb 2024 15:09:00 +0100 Subject: [PATCH] [stable-only] Fix to cover multiple listener on IPv6 LB This patch fixes the issue where the calculation of the vips field failed when more than one listener was included in an IPv6 LB. Closes-Bug: 2052628 Change-Id: I37e660d5eaa45deb38ff127cf69195b0a9ef0846 (cherry picked from commit 1413ae83243b582a0e0840221625559cac9b6024) --- ovn_octavia_provider/helper.py | 28 ++++++++++++------- .../tests/unit/test_helper.py | 27 ++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/ovn_octavia_provider/helper.py b/ovn_octavia_provider/helper.py index d1803c23..31c56e00 100644 --- a/ovn_octavia_provider/helper.py +++ b/ovn_octavia_provider/helper.py @@ -926,20 +926,28 @@ class OvnProviderHelper(): for mb_ip, mb_port, mb_subnet, mb_id in self._extract_member_info( lb_external_ids[pool_id]): if not self._is_member_offline(ovn_lb, mb_id): - if netaddr.IPNetwork(mb_ip).version == 6: - ips.append(f'[{mb_ip}]:{mb_port}') - else: - ips.append(f'{mb_ip}:{mb_port}') + mb_ip_formatted = ( + f'[{mb_ip}]:{mb_port}' + if netaddr.IPNetwork(mb_ip).version == 6 + else f'{mb_ip}:{mb_port}' + ) + ips.append(mb_ip_formatted) if ips: - if netaddr.IPNetwork(lb_vip).version == 6: - lb_vip = f'[{lb_vip}]' - vip_ips[lb_vip + ':' + vip_port] = ','.join(ips) + lb_vip_formatted = ( + f'[{lb_vip}]' + if netaddr.IPNetwork(lb_vip).version == 6 + else lb_vip + ) + vip_ips[lb_vip_formatted + ':' + vip_port] = ','.join(ips) if vip_fip: - if netaddr.IPNetwork(vip_fip).version == 6: - vip_fip = f'[{vip_fip}]' - vip_ips[vip_fip + ':' + vip_port] = ','.join(ips) + vip_fip_formatted = ( + f'[{vip_fip}]' + if netaddr.IPNetwork(vip_fip).version == 6 + else vip_fip + ) + vip_ips[vip_fip_formatted + ':' + vip_port] = ','.join(ips) return vip_ips diff --git a/ovn_octavia_provider/tests/unit/test_helper.py b/ovn_octavia_provider/tests/unit/test_helper.py index 13bdb635..ac7e05a7 100644 --- a/ovn_octavia_provider/tests/unit/test_helper.py +++ b/ovn_octavia_provider/tests/unit/test_helper.py @@ -3722,6 +3722,33 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase): '[fc00::]:80': '[2001:db8::1]:1010'} self.assertEqual(expected, ret) + def test__frame_lb_vips_ipv6_multiple_listener_pool_member(self): + listener2_id = uuidutils.generate_uuid() + pool2_id = uuidutils.generate_uuid() + member2_id = uuidutils.generate_uuid() + member2_port = '1011' + self.member_address = '2001:db8::1' + member2_line = ( + 'member_%s_%s:%s_%s' % + (member2_id, self.member_address, + member2_port, self.member_subnet_id)) + + self.member_line = ( + 'member_%s_%s:%s_%s' % + (self.member_id, self.member_address, + self.member_port, self.member_subnet_id)) + + self.ovn_lb.external_ids = { + ovn_const.LB_EXT_IDS_VIP_KEY: 'fc00::', + 'pool_%s' % self.pool_id: self.member_line, + 'pool_%s' % pool2_id: member2_line, + 'listener_%s' % self.listener_id: '80:pool_%s' % self.pool_id, + 'listener_%s' % listener2_id: '443:pool_%s' % pool2_id} + ret = self.helper._frame_vip_ips(self.ovn_lb, self.ovn_lb.external_ids) + expected = {'[fc00::]:80': '[2001:db8::1]:1010', + '[fc00::]:443': '[2001:db8::1]:1011'} + self.assertEqual(expected, ret) + def test_check_lb_protocol(self): self.ovn_lb.protocol = ['tcp'] ret = self.helper.check_lb_protocol(self.listener_id, 'udp')