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

View File

@ -933,20 +933,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

@ -3740,6 +3740,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')