Merge "Remove _check_ip_associated method from Event" into stable/2024.1
This commit is contained in:
commit
61c6e0e0dc
ovn_bgp_agent
drivers/openstack
tests/unit/drivers/openstack
17
ovn_bgp_agent/drivers/openstack/utils/port.py
Normal file
17
ovn_bgp_agent/drivers/openstack/utils/port.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Copyright 2024 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
def has_ip_address_defined(address):
|
||||||
|
return ' ' in address.strip()
|
@ -41,9 +41,6 @@ class PortBindingChassisEvent(Event):
|
|||||||
super().__init__(bgp_agent, events, table)
|
super().__init__(bgp_agent, events, table)
|
||||||
self.event_name = self.__class__.__name__
|
self.event_name = self.__class__.__name__
|
||||||
|
|
||||||
def _check_ip_associated(self, mac):
|
|
||||||
return len(mac.strip().split(' ')) > 1
|
|
||||||
|
|
||||||
|
|
||||||
class OVNLBEvent(Event):
|
class OVNLBEvent(Event):
|
||||||
def __init__(self, bgp_agent, events):
|
def __init__(self, bgp_agent, events):
|
||||||
@ -98,9 +95,6 @@ class LSPChassisEvent(Event):
|
|||||||
super().__init__(bgp_agent, events, table)
|
super().__init__(bgp_agent, events, table)
|
||||||
self.event_name = self.__class__.__name__
|
self.event_name = self.__class__.__name__
|
||||||
|
|
||||||
def _check_ip_associated(self, mac):
|
|
||||||
return len(mac.strip().split(' ')) > 1
|
|
||||||
|
|
||||||
def _get_chassis(self, row, default_type=constants.OVN_VM_VIF_PORT_TYPE):
|
def _get_chassis(self, row, default_type=constants.OVN_VM_VIF_PORT_TYPE):
|
||||||
return driver_utils.get_port_chassis(row, self.agent.chassis,
|
return driver_utils.get_port_chassis(row, self.agent.chassis,
|
||||||
default_port_type=default_type)
|
default_port_type=default_type)
|
||||||
|
@ -17,6 +17,7 @@ from oslo_config import cfg
|
|||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from ovn_bgp_agent import constants
|
from ovn_bgp_agent import constants
|
||||||
|
from ovn_bgp_agent.drivers.openstack.utils import port as port_utils
|
||||||
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
||||||
from ovn_bgp_agent.utils import helpers
|
from ovn_bgp_agent.utils import helpers
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ class PortBindingChassisCreatedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
if not bool(row.up[0]):
|
if not bool(row.up[0]):
|
||||||
return False
|
return False
|
||||||
@ -67,7 +68,7 @@ class PortBindingChassisDeletedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
if event == self.ROW_DELETE:
|
if event == self.ROW_DELETE:
|
||||||
return row.chassis[0].name == self.agent.chassis
|
return row.chassis[0].name == self.agent.chassis
|
||||||
@ -181,7 +182,7 @@ class SubnetRouterAttachedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
return (not row.chassis and
|
return (not row.chassis and
|
||||||
row.logical_port.startswith('lrp-') and
|
row.logical_port.startswith('lrp-') and
|
||||||
@ -212,8 +213,8 @@ class SubnetRouterUpdateEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
# mac = [ff:ff:ff:ff:ff:ff subnet1/cidr subnet2/cidr [...]]
|
# mac = [ff:ff:ff:ff:ff:ff subnet1/cidr subnet2/cidr [...]]
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if (not self._check_ip_associated(row.mac[0]) and
|
if (not port_utils.has_ip_address_defined(row.mac[0]) and
|
||||||
not self._check_ip_associated(old.mac[0])):
|
not port_utils.has_ip_address_defined(old.mac[0])):
|
||||||
return False
|
return False
|
||||||
return (
|
return (
|
||||||
not row.chassis and
|
not row.chassis and
|
||||||
@ -240,7 +241,7 @@ class SubnetRouterDetachedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
return (not row.chassis and
|
return (not row.chassis and
|
||||||
row.logical_port.startswith('lrp-') and
|
row.logical_port.startswith('lrp-') and
|
||||||
@ -272,7 +273,7 @@ class TenantPortCreatedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
if not n_cidrs:
|
if not n_cidrs:
|
||||||
return False
|
return False
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
elif not self._check_ip_associated(row.mac[0]):
|
elif not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
return (not old.chassis and row.chassis and
|
return (not old.chassis and row.chassis and
|
||||||
self.agent.ovn_local_lrps != [])
|
self.agent.ovn_local_lrps != [])
|
||||||
@ -311,7 +312,7 @@ class TenantPortDeletedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
if not n_cidrs:
|
if not n_cidrs:
|
||||||
return False
|
return False
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
elif not self._check_ip_associated(row.mac[0]):
|
elif not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
if event == self.ROW_UPDATE:
|
if event == self.ROW_UPDATE:
|
||||||
return (old.chassis and not row.chassis and
|
return (old.chassis and not row.chassis and
|
||||||
|
@ -16,6 +16,7 @@ from oslo_concurrency import lockutils
|
|||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from ovn_bgp_agent import constants
|
from ovn_bgp_agent import constants
|
||||||
|
from ovn_bgp_agent.drivers.openstack.utils import port as port_utils
|
||||||
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
||||||
|
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ class PortBindingChassisCreatedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
if row.type != constants.OVN_CHASSISREDIRECT_VIF_PORT_TYPE:
|
if row.type != constants.OVN_CHASSISREDIRECT_VIF_PORT_TYPE:
|
||||||
return False
|
return False
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
return (row.chassis[0].name == self.agent.chassis and
|
return (row.chassis[0].name == self.agent.chassis and
|
||||||
not old.chassis)
|
not old.chassis)
|
||||||
@ -60,7 +61,7 @@ class PortBindingChassisDeletedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
if row.type != constants.OVN_CHASSISREDIRECT_VIF_PORT_TYPE:
|
if row.type != constants.OVN_CHASSISREDIRECT_VIF_PORT_TYPE:
|
||||||
return False
|
return False
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
if event == self.ROW_UPDATE:
|
if event == self.ROW_UPDATE:
|
||||||
return (old.chassis[0].name == self.agent.chassis and
|
return (old.chassis[0].name == self.agent.chassis and
|
||||||
@ -156,7 +157,7 @@ class TenantPortCreatedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
return (not old.chassis and row.chassis and
|
return (not old.chassis and row.chassis and
|
||||||
self.agent.ovn_local_lrps != [])
|
self.agent.ovn_local_lrps != [])
|
||||||
@ -181,7 +182,7 @@ class TenantPortDeletedEvent(base_watcher.PortBindingChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.mac[0]):
|
if not port_utils.has_ip_address_defined(row.mac[0]):
|
||||||
return False
|
return False
|
||||||
if event == self.ROW_UPDATE:
|
if event == self.ROW_UPDATE:
|
||||||
return (old.chassis and not row.chassis and
|
return (old.chassis and not row.chassis and
|
||||||
|
@ -17,6 +17,7 @@ from oslo_log import log as logging
|
|||||||
|
|
||||||
from ovn_bgp_agent import constants
|
from ovn_bgp_agent import constants
|
||||||
from ovn_bgp_agent.drivers.openstack.utils import driver_utils
|
from ovn_bgp_agent.drivers.openstack.utils import driver_utils
|
||||||
|
from ovn_bgp_agent.drivers.openstack.utils import port as port_utils
|
||||||
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
|
||||||
|
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ class LogicalSwitchPortProviderCreateEvent(base_watcher.LSPChassisEvent):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
current_chassis = self._get_chassis(row)
|
current_chassis = self._get_chassis(row)
|
||||||
@ -100,7 +101,7 @@ class LogicalSwitchPortProviderDeleteEvent(base_watcher.LSPChassisEvent):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
ips = row.addresses[0].split(' ')[1:]
|
ips = row.addresses[0].split(' ')[1:]
|
||||||
@ -189,7 +190,7 @@ class LogicalSwitchPortFIPCreateEvent(base_watcher.LSPChassisEvent):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
current_chassis = self._get_chassis(row)
|
current_chassis = self._get_chassis(row)
|
||||||
@ -270,7 +271,7 @@ class LogicalSwitchPortFIPDeleteEvent(base_watcher.LSPChassisEvent):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
current_port_fip = self._get_port_fip(row)
|
current_port_fip = self._get_port_fip(row)
|
||||||
@ -591,7 +592,7 @@ class LogicalSwitchPortTenantCreateEvent(base_watcher.LSPChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not bool(row.up[0]):
|
if not bool(row.up[0]):
|
||||||
@ -639,7 +640,7 @@ class LogicalSwitchPortTenantDeleteEvent(base_watcher.LSPChassisEvent):
|
|||||||
def match_fn(self, event, row, old):
|
def match_fn(self, event, row, old):
|
||||||
try:
|
try:
|
||||||
# single and dual-stack format
|
# single and dual-stack format
|
||||||
if not self._check_ip_associated(row.addresses[0]):
|
if not port_utils.has_ip_address_defined(row.addresses[0]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
current_network = self._get_network(row)
|
current_network = self._get_network(row)
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
# Copyright 2024 Red Hat, Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from ovn_bgp_agent.drivers.openstack.utils import port
|
||||||
|
from ovn_bgp_agent.tests import base as test_base
|
||||||
|
|
||||||
|
|
||||||
|
class TestHasIpAddressDefined(test_base.TestCase):
|
||||||
|
def test_no_ip_address(self):
|
||||||
|
self.assertFalse(
|
||||||
|
port.has_ip_address_defined('aa:bb:cc:dd:ee:ff'))
|
||||||
|
|
||||||
|
def test_one_ip_address(self):
|
||||||
|
self.assertTrue(
|
||||||
|
port.has_ip_address_defined('aa:bb:cc:dd:ee:ff 10.10.1.16'))
|
||||||
|
|
||||||
|
def test_two_ip_addresses(self):
|
||||||
|
self.assertTrue(
|
||||||
|
port.has_ip_address_defined(
|
||||||
|
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17'))
|
||||||
|
|
||||||
|
def test_three_ip_addresses(self):
|
||||||
|
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'))
|
@ -21,29 +21,6 @@ from ovn_bgp_agent.tests import base as test_base
|
|||||||
from ovn_bgp_agent.tests import utils
|
from ovn_bgp_agent.tests import utils
|
||||||
|
|
||||||
|
|
||||||
class FakePortBindingChassisEvent(base_watcher.PortBindingChassisEvent):
|
|
||||||
def run(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class TestPortBindingChassisEvent(test_base.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestPortBindingChassisEvent, self).setUp()
|
|
||||||
self.pb_event = FakePortBindingChassisEvent(
|
|
||||||
mock.Mock(), [mock.Mock()])
|
|
||||||
|
|
||||||
def test__check_ip_associated(self):
|
|
||||||
self.assertTrue(self.pb_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16'))
|
|
||||||
self.assertTrue(self.pb_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17'))
|
|
||||||
self.assertFalse(self.pb_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff'))
|
|
||||||
self.assertTrue(self.pb_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17 10.10.1.18'))
|
|
||||||
|
|
||||||
|
|
||||||
class FakeOVNLBEvent(base_watcher.OVNLBEvent):
|
class FakeOVNLBEvent(base_watcher.OVNLBEvent):
|
||||||
def run(self):
|
def run(self):
|
||||||
pass
|
pass
|
||||||
@ -115,16 +92,6 @@ class TestLSPChassisEvent(test_base.TestCase):
|
|||||||
self.lsp_event = FakeLSPChassisEvent(
|
self.lsp_event = FakeLSPChassisEvent(
|
||||||
mock.Mock(), [mock.Mock()])
|
mock.Mock(), [mock.Mock()])
|
||||||
|
|
||||||
def test__check_ip_associated(self):
|
|
||||||
self.assertTrue(self.lsp_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16'))
|
|
||||||
self.assertTrue(self.lsp_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17'))
|
|
||||||
self.assertFalse(self.lsp_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff'))
|
|
||||||
self.assertTrue(self.lsp_event._check_ip_associated(
|
|
||||||
'aa:bb:cc:dd:ee:ff 10.10.1.16 10.10.1.17 10.10.1.18'))
|
|
||||||
|
|
||||||
def test__has_additional_binding(self):
|
def test__has_additional_binding(self):
|
||||||
row = utils.create_row(
|
row = utils.create_row(
|
||||||
options={constants.OVN_REQUESTED_CHASSIS: 'host1,host2'})
|
options={constants.OVN_REQUESTED_CHASSIS: 'host1,host2'})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user