Merge "Move methods out of LSP events" into stable/2024.1

This commit is contained in:
Zuul 2024-11-20 12:54:54 +00:00 committed by Gerrit Code Review
commit d23cdf87b2
5 changed files with 80 additions and 60 deletions

View File

@ -12,6 +12,32 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.utils import common
def has_ip_address_defined(address):
return ' ' in address.strip()
def get_fip(lsp):
return common.get_from_external_ids(lsp, key=constants.OVN_FIP_EXT_ID_KEY)
def has_additional_binding(row):
# requested-chassis can be a comma separated list, so if there
# is a comma in the string, there is an additional binding.
return ',' in getattr(row, 'options', {}).get(
constants.OVN_REQUESTED_CHASSIS, '')
def make_lsp_dict(row):
# TODO(jlibosva): Stop passing around dynamic maps
return {
'mac': row.addresses[0].strip().split(' ')[0],
'cidrs': row.external_ids.get(constants.OVN_CIDRS_EXT_ID_KEY,
"").split(),
'type': row.type,
'logical_switch': common.get_from_external_ids(
row, constants.OVN_LS_NAME_EXT_ID_KEY),
}

View File

@ -67,30 +67,6 @@ class LSPChassisEvent(Event):
return driver_utils.get_port_chassis(row, self.agent.chassis,
default_port_type=default_type)
def _has_additional_binding(self, row):
if (hasattr(row, 'options') and
row.options.get(constants.OVN_REQUESTED_CHASSIS)):
# requested-chassis can be a comma separated list, so if there
# is a comma in the string, there is an additional binding.
return ',' in row.options[constants.OVN_REQUESTED_CHASSIS]
return False
def _get_ips_info(self, row):
return {
'mac': row.addresses[0].strip().split(' ')[0],
'cidrs': row.external_ids.get(constants.OVN_CIDRS_EXT_ID_KEY,
"").split(),
'type': row.type,
'logical_switch': common_utils.get_from_external_ids(
row, constants.OVN_LS_NAME_EXT_ID_KEY),
}
def _get_port_fip(self, row):
return getattr(row, 'external_ids', {}).get(
constants.OVN_FIP_EXT_ID_KEY)
class LRPChassisEvent(Event):
def __init__(self, bgp_agent, events):

View File

@ -83,7 +83,7 @@ class LogicalSwitchPortProviderCreateEvent(base_watcher.LSPChassisEvent):
def _run(self, event, row, old):
with _SYNC_STATE_LOCK.read_lock():
ips = row.addresses[0].split(' ')[1:]
ips_info = self._get_ips_info(row)
ips_info = port_utils.make_lsp_dict(row)
self.agent.expose_ip(ips, ips_info)
@ -130,7 +130,7 @@ class LogicalSwitchPortProviderDeleteEvent(base_watcher.LSPChassisEvent):
# 1. port went down (while only attached here)
if (hasattr(old, 'up') and bool(old.up[0]) and # port was up
not bool(row.up[0]) and # is now down
not self._has_additional_binding(row)): # and bound here
not port_utils.has_additional_binding(row)): # and bound
return True
# 2. port no longer bound here
@ -142,7 +142,7 @@ class LogicalSwitchPortProviderDeleteEvent(base_watcher.LSPChassisEvent):
def _run(self, event, row, old):
with _SYNC_STATE_LOCK.read_lock():
ips = row.addresses[0].split(' ')[1:]
ips_info = self._get_ips_info(row)
ips_info = port_utils.make_lsp_dict(row)
self.agent.withdraw_ip(ips, ips_info)
@ -281,8 +281,8 @@ class LogicalSwitchPortFIPDeleteEvent(base_watcher.LSPChassisEvent):
if not port_utils.has_ip_address_defined(row.addresses[0]):
return False
current_port_fip = self._get_port_fip(row)
old_port_fip = self._get_port_fip(old)
current_port_fip = port_utils.get_fip(row)
old_port_fip = port_utils.get_fip(old)
if not current_port_fip and not old_port_fip:
# This port is not a floating ip update
return False
@ -321,11 +321,11 @@ class LogicalSwitchPortFIPDeleteEvent(base_watcher.LSPChassisEvent):
def _run(self, event, row, old):
# First check to remove the fip provided in old (since this might
# have been updated)
fip = self._get_port_fip(old)
fip = port_utils.get_fip(old)
if not fip:
# Remove the fip provided in the current row, probably a
# disassociate of the fip (or a down or a move)
fip = self._get_port_fip(row)
fip = port_utils.get_fip(row)
if not fip:
return
with _SYNC_STATE_LOCK.read_lock():

View File

@ -13,8 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.utils import port
from ovn_bgp_agent.tests import base as test_base
from ovn_bgp_agent.tests import utils as test_utils
class TestHasIpAddressDefined(test_base.TestCase):
@ -35,3 +37,48 @@ class TestHasIpAddressDefined(test_base.TestCase):
self.assertTrue(
port.has_ip_address_defined(
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17 10.10.1.18'))
class TestGetFip(test_base.TestCase):
def test_get_fip(self):
value = 'foo'
lsp = test_utils.create_row(
external_ids={constants.OVN_FIP_EXT_ID_KEY: value})
observed = port.get_fip(lsp)
self.assertEqual(value, observed)
def test_get_fip_not_present(self):
lsp = test_utils.create_row()
self.assertIsNone(port.get_fip(lsp))
class TestHasAdditionalBinding(test_base.TestCase):
def test_has_multiple_chassis(self):
lsp = test_utils.create_row(
options={constants.OVN_REQUESTED_CHASSIS: "chassis1,chassis2"})
self.assertTrue(port.has_additional_binding(lsp))
def test_has_one_chassis(self):
lsp = test_utils.create_row(
options={constants.OVN_REQUESTED_CHASSIS: "chassis1"})
self.assertFalse(port.has_additional_binding(lsp))
def test_no_options(self):
lsp = test_utils.create_row()
self.assertFalse(port.has_additional_binding(lsp))
def test_no_requested_chassis(self):
lsp = test_utils.create_row(
options={})
self.assertFalse(port.has_additional_binding(lsp))
def test_empty_requested_chassis(self):
lsp = test_utils.create_row(
options={constants.OVN_REQUESTED_CHASSIS: ""})
self.assertFalse(port.has_additional_binding(lsp))

View File

@ -15,37 +15,8 @@
from unittest import mock
from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
from ovn_bgp_agent.tests import base as test_base
from ovn_bgp_agent.tests import utils
class FakeLSPChassisEvent(base_watcher.LSPChassisEvent):
def run(self):
pass
class TestLSPChassisEvent(test_base.TestCase):
def setUp(self):
super(TestLSPChassisEvent, self).setUp()
self.lsp_event = FakeLSPChassisEvent(
mock.Mock(), [mock.Mock()])
def test__has_additional_binding(self):
row = utils.create_row(
options={constants.OVN_REQUESTED_CHASSIS: 'host1,host2'})
self.assertTrue(self.lsp_event._has_additional_binding(row))
def test__has_additional_binding_no_options(self):
row = utils.create_row()
self.assertFalse(self.lsp_event._has_additional_binding(row))
def test__has_additional_binding_single_host(self):
row = utils.create_row(
options={constants.OVN_REQUESTED_CHASSIS: 'host1'})
self.assertFalse(self.lsp_event._has_additional_binding(row))
class TestChassisCreateEvent(test_base.TestCase):