[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 1413ae8324)
This commit is contained in:
Fernando Royo 2024-02-07 15:09:00 +01:00
parent 8b55dc0ac3
commit 90cfd1d8d5
2 changed files with 45 additions and 10 deletions

View File

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

View File

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