Fix backward compatibility for setups that export subnets per host

Closes-Bug: #2054696
Change-Id: I8a6c2d5e9c426f698c250793462ee5ef769748ab
This commit is contained in:
Michel Nederlof 2024-02-22 13:58:35 +00:00 committed by Michel Nederlof
parent 7fa2f22daa
commit 7243e1c1ab
4 changed files with 79 additions and 21 deletions
ovn_bgp_agent
config.pyconstants.py
drivers/openstack
tests/unit/drivers/openstack

@ -18,6 +18,8 @@ from oslo_config import cfg
from oslo_log import log as logging
from oslo_privsep import priv_context
from ovn_bgp_agent import constants
LOG = logging.getLogger(__name__)
agent_opts = [
@ -40,7 +42,9 @@ agent_opts = [
'So either per /32 or /128 or per subnet like /24. '
'Choose "host" as value for this option to advertise per '
'host or choose "subnet" to announce per subnet prefix.',
default='host', choices=['host', 'subnet']),
default=constants.ADVERTISEMENT_METHOD_HOST,
choices=[constants.ADVERTISEMENT_METHOD_HOST,
constants.ADVERTISEMENT_METHOD_SUBNET]),
cfg.BoolOpt('expose_ipv6_gua_tenant_networks',
help='Expose only VM IPv6 IPs on tenant networks if they are '
'GUA. The expose_tenant_networks parameter takes '

@ -100,6 +100,10 @@ EXPOSE_METHOD_VRF = 'vrf'
EXPOSE_METHOD_OVN = 'ovn'
EXPOSE_METHOD_DYNAMIC = 'dynamic'
# Advertisement method names for tenant networks
ADVERTISEMENT_METHOD_HOST = 'host'
ADVERTISEMENT_METHOD_SUBNET = 'subnet'
# OVN Cluster related constants
OVN_CLUSTER_BRIDGE = 'bgp'
OVN_CLUSTER_ROUTER = 'bgp-router'

@ -606,7 +606,8 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
self._withdraw_remote_ip(ips, ips_info)
def _expose_remote_ip(self, ips, ips_info):
if CONF.advertisement_method_tenant_networks == 'subnet':
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
# Ip should already be exported via cr-lrp subnet announcement.
return
@ -628,7 +629,8 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
ips_to_expose, self.chassis)
def _withdraw_remote_ip(self, ips, ips_info):
if CONF.advertisement_method_tenant_networks == 'subnet':
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
return
ips_to_withdraw = ips
@ -675,7 +677,8 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
"and they have not been properly exposed", ips)
return
if CONF.advertisement_method_tenant_networks == 'subnet':
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
# Networks have been exposed via self._expose_router_lsp
return
@ -710,7 +713,8 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
self._withdraw_router_lsp(ips, subnet_info, cr_lrp_info)
if CONF.advertisement_method_tenant_networks == 'subnet':
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
# Expose the routes per prefix, rather than per port.
return
@ -732,10 +736,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
if not self._expose_tenant_networks:
return True
# Fix ips to be the network address, instead of the lrp address
# so the cleanup will not remove them, since they match what's
# in the kernel
ips = driver_utils.get_prefixes_from_ips(ips)
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
# Fix ips to be the network address, instead of the lrp address
# so the cleanup will not remove them, since they match what's
# in the kernel
ips = driver_utils.get_prefixes_from_ips(ips)
success = True
for ip in ips:
@ -774,10 +780,12 @@ class NBOVNBGPDriver(driver_api.AgentDriverBase):
if not self._expose_tenant_networks:
return
# Fix ips to be the network address, instead of the lrp address
# so the cleanup will not remove them, since they match what's
# in the kernel
ips = driver_utils.get_prefixes_from_ips(ips)
if (CONF.advertisement_method_tenant_networks ==
constants.ADVERTISEMENT_METHOD_SUBNET):
# Fix ips to be the network address, instead of the lrp address
# so the cleanup will not remove them, since they match what's
# in the kernel
ips = driver_utils.get_prefixes_from_ips(ips)
for ip in ips:
if (not CONF.expose_tenant_networks and

@ -937,7 +937,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
def test_expose_subnet_not_per_lsp(self):
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1033,7 +1034,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
'network': 'network1',
'address_scopes': {4: None, 6: None}}
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1046,6 +1048,23 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.router1_info['bridge_vlan'], mock.ANY,
self.router1_info['ips'])
@mock.patch.object(wire_utils, 'wire_lrp_port')
def test__expose_router_lsp_per_host(self, mock_wire):
ips = ['10.0.0.1/24']
subnet_info = {
'associated_router': 'other-router',
'network': 'network1',
'address_scopes': {4: None, 6: None}}
ret = self.nb_bgp_driver._expose_router_lsp(ips, subnet_info,
self.router1_info)
self.assertTrue(ret)
mock_wire.assert_called_once_with(
mock.ANY, '10.0.0.1/24', self.router1_info['bridge_device'],
self.router1_info['bridge_vlan'], mock.ANY,
self.router1_info['ips'])
@mock.patch.object(wire_utils, 'wire_lrp_port')
def test__expose_router_lsp_exception(self, mock_wire):
ips = ['10.0.0.1/24']
@ -1055,7 +1074,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
'address_scopes': {4: None, 6: None}}
mock_wire.side_effect = Exception
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1091,7 +1111,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.addCleanup(CONF.clear_override, 'expose_tenant_networks')
CONF.set_override('expose_ipv6_gua_tenant_networks', True)
self.addCleanup(CONF.clear_override, 'expose_ipv6_gua_tenant_networks')
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1119,7 +1140,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
'network': 'network1',
'address_scopes': {4: None, 6: None}}
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1132,6 +1154,23 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.router1_info['bridge_vlan'], mock.ANY,
self.router1_info['ips'])
@mock.patch.object(wire_utils, 'unwire_lrp_port')
def test__withdraw_router_lsp_per_host(self, mock_unwire):
ips = ['10.0.0.1/24']
subnet_info = {
'associated_router': 'other-router',
'network': 'network1',
'address_scopes': {4: None, 6: None}}
ret = self.nb_bgp_driver._withdraw_router_lsp(ips, subnet_info,
self.router1_info)
self.assertTrue(ret)
mock_unwire.assert_called_once_with(
mock.ANY, '10.0.0.1/24', self.router1_info['bridge_device'],
self.router1_info['bridge_vlan'], mock.ANY,
self.router1_info['ips'])
@mock.patch.object(wire_utils, 'unwire_lrp_port')
def test__withdraw_router_lsp_exception(self, mock_unwire):
ips = ['10.0.0.1/24']
@ -1141,7 +1180,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
'address_scopes': {4: None, 6: None}}
mock_unwire.side_effect = Exception
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1164,7 +1204,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
'network': 'network1',
'address_scopes': {4: None, 6: None}}
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')
@ -1182,7 +1223,8 @@ class TestNBOVNBGPDriver(test_base.TestCase):
self.addCleanup(CONF.clear_override, 'expose_tenant_networks')
CONF.set_override('expose_ipv6_gua_tenant_networks', True)
self.addCleanup(CONF.clear_override, 'expose_ipv6_gua_tenant_networks')
CONF.set_override('advertisement_method_tenant_networks', 'subnet')
CONF.set_override('advertisement_method_tenant_networks',
constants.ADVERTISEMENT_METHOD_SUBNET)
self.addCleanup(CONF.clear_override,
'advertisement_method_tenant_networks')