OVNNB backend: Fix LbDelCommand when using vip param
Fix issue in ovn_northbound LbDelCommand where logic
for removing vip while using if_exists=True was not
doing the right thing.
In order to be consistent with as ovn-nbctl [1], this
change also introduces a modified behavior. When the
last vip is removed, it will also remove the load
balancer instance.
[1]: 1e2f4aaab6/utilities/ovn-nbctl.c (L2870)
Closes-Bug: #1877673
Change-Id: Ie8ae8f5efae2afb958ed2010053ff04372cc1c51
This commit is contained in:
parent
f8235d8022
commit
8cb3b56fa9
|
@ -683,11 +683,15 @@ class API(api.API, metaclass=abc.ABCMeta):
|
||||||
def lb_del(self, lb, vip=None, if_exists=False):
|
def lb_del(self, lb, vip=None, if_exists=False):
|
||||||
"""Remove a load balancer or just the VIP from a load balancer
|
"""Remove a load balancer or just the VIP from a load balancer
|
||||||
|
|
||||||
|
If all vips of the load balancer are removed, the load balancer
|
||||||
|
instance will be removed as well. If vip parameter is 'None'
|
||||||
|
this will cause all vips (and load balancer) to be removed.
|
||||||
|
|
||||||
:param lb: The name or uuid of a load balancer
|
:param lb: The name or uuid of a load balancer
|
||||||
:type lb: string or uuid.UUID
|
:type lb: string or uuid.UUID
|
||||||
:param vip: The VIP on the load balancer to match
|
:param vip: The VIP to match. If None, match all vips
|
||||||
:type: string
|
:type: string
|
||||||
:param if_exists: If True, don't fail if the port doesn't exist
|
:param if_exists: If True, don't fail if the lb/vip doesn't exist
|
||||||
:type if_exists: boolean
|
:type if_exists: boolean
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -1047,16 +1047,19 @@ class LbDelCommand(cmd.BaseCommand):
|
||||||
def run_idl(self, txn):
|
def run_idl(self, txn):
|
||||||
try:
|
try:
|
||||||
lb = self.api.lookup('Load_Balancer', self.lb)
|
lb = self.api.lookup('Load_Balancer', self.lb)
|
||||||
if self.vip:
|
|
||||||
if self.vip in lb.vips:
|
|
||||||
if self.if_exists:
|
|
||||||
return
|
|
||||||
lb.delkey('vips', self.vip)
|
|
||||||
else:
|
|
||||||
lb.delete()
|
|
||||||
except idlutils.RowNotFound:
|
except idlutils.RowNotFound:
|
||||||
if not self.if_exists:
|
if not self.if_exists:
|
||||||
raise
|
raise
|
||||||
|
return
|
||||||
|
if self.vip:
|
||||||
|
if self.vip in lb.vips:
|
||||||
|
lb.delkey('vips', self.vip)
|
||||||
|
elif not self.if_exists:
|
||||||
|
raise idlutils.RowNotFound(table='Load_Balancer', col=self.vip,
|
||||||
|
match=self.lb)
|
||||||
|
# Remove load balancer if vips were not provided or no vips are left.
|
||||||
|
if not self.vip or not lb.vips:
|
||||||
|
lb.delete()
|
||||||
|
|
||||||
|
|
||||||
class LbListCommand(cmd.ReadOnlyCommand):
|
class LbListCommand(cmd.ReadOnlyCommand):
|
||||||
|
|
|
@ -1126,6 +1126,32 @@ class TestLoadBalancerOps(OvnNorthboundTest):
|
||||||
self.api.lb_del(utils.get_rand_device_name(), if_exists=True).execute(
|
self.api.lb_del(utils.get_rand_device_name(), if_exists=True).execute(
|
||||||
check_error=True)
|
check_error=True)
|
||||||
|
|
||||||
|
def test_lb_del_vip_if_exists(self):
|
||||||
|
name = utils.get_rand_device_name()
|
||||||
|
lb = self._lb_add(name, '192.0.2.1', ['10.0.0.1'])
|
||||||
|
lb2 = self._lb_add(name, '192.0.2.2', ['10.1.0.1'])
|
||||||
|
self.assertEqual(lb, lb2)
|
||||||
|
# Remove vip that does not exist.
|
||||||
|
self.api.lb_del(lb.name, '9.9.9.9', if_exists=True
|
||||||
|
).execute(check_error=True)
|
||||||
|
self.assertIn('192.0.2.1', lb.vips)
|
||||||
|
self.assertIn('192.0.2.2', lb.vips)
|
||||||
|
# Remove one vip.
|
||||||
|
self.api.lb_del(lb.name, '192.0.2.1', if_exists=True
|
||||||
|
).execute(check_error=True)
|
||||||
|
self.assertNotIn('192.0.2.1', lb.vips)
|
||||||
|
# Attempt to remove same vip a second time with if_exists=True.
|
||||||
|
self.api.lb_del(lb.name, '192.0.2.1', if_exists=True).execute(
|
||||||
|
check_error=True)
|
||||||
|
# Attempt to remove same vip a third time with if_exists=False.
|
||||||
|
cmd = self.api.lb_del(lb.name, '192.0.2.1', if_exists=False)
|
||||||
|
self.assertRaises(idlutils.RowNotFound, cmd.execute, check_error=True)
|
||||||
|
# Remove last vip and make sure that lb is also removed.
|
||||||
|
self.assertIn('192.0.2.2', lb.vips)
|
||||||
|
self.api.lb_del(lb.name, '192.0.2.2').execute(check_error=True)
|
||||||
|
cmd = self.api.lb_del(lb.name)
|
||||||
|
self.assertRaises(idlutils.RowNotFound, cmd.execute, check_error=True)
|
||||||
|
|
||||||
def test_lb_list(self):
|
def test_lb_list(self):
|
||||||
lbs = {self._lb_add(utils.get_rand_device_name(), '192.0.2.1',
|
lbs = {self._lb_add(utils.get_rand_device_name(), '192.0.2.1',
|
||||||
['10.0.0.1', '10.0.0.2']) for _ in range(3)}
|
['10.0.0.1', '10.0.0.2']) for _ in range(3)}
|
||||||
|
|
Loading…
Reference in New Issue