[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:
parent
8b55dc0ac3
commit
90cfd1d8d5
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue