Fix backward compatibility for setups that export subnets per host
Closes-Bug: #2054696 Change-Id: I8a6c2d5e9c426f698c250793462ee5ef769748ab
This commit is contained in:
parent
7fa2f22daa
commit
7243e1c1ab
ovn_bgp_agent
@ -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')
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user