Merge "[OVN] Set reside-on-chassis-redirect also for FLAT networks"
This commit is contained in:
commit
8bd3de0bfb
@ -753,16 +753,17 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase):
|
||||
periodic_run_limit=ovn_const.MAINTENANCE_TASK_RETRY_LIMIT,
|
||||
spacing=ovn_const.MAINTENANCE_ONE_RUN_TASK_SPACING,
|
||||
run_immediately=True)
|
||||
def check_vlan_distributed_ports(self):
|
||||
"""Check VLAN distributed ports
|
||||
def check_provider_distributed_ports(self):
|
||||
"""Check provider (VLAN and FLAT) distributed ports
|
||||
Check for the option "reside-on-redirect-chassis" value for
|
||||
distributed VLAN ports.
|
||||
distributed ports which belongs to the FLAT or VLAN networks.
|
||||
"""
|
||||
context = n_context.get_admin_context()
|
||||
cmds = []
|
||||
# Get router ports belonging to VLAN networks
|
||||
# Get router ports belonging to VLAN or FLAT networks
|
||||
vlan_nets = self._ovn_client._plugin.get_networks(
|
||||
context, {pnet.NETWORK_TYPE: [n_const.TYPE_VLAN]})
|
||||
context, {pnet.NETWORK_TYPE: [n_const.TYPE_VLAN,
|
||||
n_const.TYPE_FLAT]})
|
||||
vlan_net_ids = [vn['id'] for vn in vlan_nets]
|
||||
router_ports = self._ovn_client._plugin.get_ports(
|
||||
context, {'network_id': vlan_net_ids,
|
||||
|
@ -1684,12 +1684,12 @@ class OVNClient(object):
|
||||
network_type = ls.external_ids[ovn_const.OVN_NETTYPE_EXT_ID_KEY]
|
||||
network_mtu = int(
|
||||
ls.external_ids[ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY])
|
||||
# For VLAN type networks we need to set the
|
||||
# For provider networks (VLAN, FLAT types) we need to set the
|
||||
# "reside-on-redirect-chassis" option so the routing for this
|
||||
# logical router port is centralized in the chassis hosting the
|
||||
# distributed gateway port.
|
||||
# https://github.com/openvswitch/ovs/commit/85706c34d53d4810f54bec1de662392a3c06a996
|
||||
if network_type == const.TYPE_VLAN:
|
||||
if network_type in [const.TYPE_VLAN, const.TYPE_FLAT]:
|
||||
reside_redir_ch = self._get_reside_redir_for_gateway_port(
|
||||
port['device_id'])
|
||||
options[ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH] = reside_redir_ch
|
||||
|
@ -16,6 +16,7 @@
|
||||
from unittest import mock
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_utils import strutils
|
||||
|
||||
from futurist import periodics
|
||||
from neutron_lib.api.definitions import external_net as extnet_apidef
|
||||
@ -68,12 +69,17 @@ class _TestMaintenanceHelper(base.TestOVNFunctionalBase):
|
||||
ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY) == name):
|
||||
return row
|
||||
|
||||
def _create_network(self, name, external=False, provider=None):
|
||||
def _create_network(self, name, external=False, provider=None,
|
||||
net_type=None):
|
||||
data = {'network': {'name': name,
|
||||
extnet_apidef.EXTERNAL: external}}
|
||||
if net_type:
|
||||
data['network'][provnet_apidef.NETWORK_TYPE] = net_type
|
||||
if provider:
|
||||
data['network'][provnet_apidef.NETWORK_TYPE] = 'flat'
|
||||
net_type = net_type or 'flat'
|
||||
data['network'][provnet_apidef.NETWORK_TYPE] = net_type
|
||||
data['network'][provnet_apidef.PHYSICAL_NETWORK] = provider
|
||||
|
||||
req = self.new_create_request('networks', data, self.fmt,
|
||||
as_admin=True)
|
||||
res = req.get_response(self.api)
|
||||
@ -1063,6 +1069,63 @@ class TestMaintenance(_TestMaintenanceHelper):
|
||||
lsp = self.nb_api.lookup('Logical_Switch_Port', p1['id'])
|
||||
self.assertEqual(hcg_uuid, lsp.ha_chassis_group[0].uuid)
|
||||
|
||||
def _test_check_provider_distributed_ports(
|
||||
self, is_distributed_fip, net_type, expected_value=None):
|
||||
cfg.CONF.set_override(
|
||||
'enable_distributed_floating_ip', is_distributed_fip, group='ovn')
|
||||
net_args = {'net_type': net_type}
|
||||
if net_type == n_const.TYPE_FLAT:
|
||||
net_args['provider'] = 'datacentre'
|
||||
net = self._create_network(
|
||||
'net_distributed_ports_test', **net_args)
|
||||
subnet = self._create_subnet('subnet_distributed_ports_test',
|
||||
net['id'])
|
||||
router = self._create_router('router_distributed_ports_test')
|
||||
self._add_router_interface(router['id'], subnet['id'])
|
||||
|
||||
# Lets make sure that reside-on-chassis-redirect is not set for the LRP
|
||||
lr = self.nb_api.lookup('Logical_Router',
|
||||
utils.ovn_name(router['id']))
|
||||
lrp = lr.ports[0]
|
||||
self.nb_api.db_remove(
|
||||
'Logical_Router_Port',
|
||||
lrp.name,
|
||||
'options',
|
||||
ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH
|
||||
).execute()
|
||||
|
||||
self.assertRaises(periodics.NeverAgain,
|
||||
self.maint.check_provider_distributed_ports)
|
||||
|
||||
lrp = self.nb_api.lookup('Logical_Router_Port', lrp.name)
|
||||
if net_type in [n_const.TYPE_VLAN, n_const.TYPE_FLAT]:
|
||||
self.assertEqual(
|
||||
expected_value,
|
||||
strutils.bool_from_string(
|
||||
lrp.options[ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH]))
|
||||
else:
|
||||
self.assertNotIn(
|
||||
ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH,
|
||||
lrp.options)
|
||||
|
||||
def test_check_provider_distributed_ports_dvr_vlan_net(self):
|
||||
self._test_check_provider_distributed_ports(True, 'vlan', False)
|
||||
|
||||
def test_check_provider_distributed_ports_non_dvr_vlan_net(self):
|
||||
self._test_check_provider_distributed_ports(False, 'vlan', True)
|
||||
|
||||
def test_check_provider_distributed_ports_dvr_flat_net(self):
|
||||
self._test_check_provider_distributed_ports(True, 'flat', False)
|
||||
|
||||
def test_check_provider_distributed_ports_non_dvr_flat_net(self):
|
||||
self._test_check_provider_distributed_ports(False, 'flat', True)
|
||||
|
||||
def test_check_provider_distributed_ports_dvr_geneve_net(self):
|
||||
self._test_check_provider_distributed_ports(True, 'geneve')
|
||||
|
||||
def test_check_provider_distributed_ports_non_dvr_geneve_net(self):
|
||||
self._test_check_provider_distributed_ports(False, 'geneve')
|
||||
|
||||
def test_configure_nb_global(self):
|
||||
def options_intersect(options1, options2):
|
||||
return bool(set(
|
||||
|
@ -15,6 +15,7 @@
|
||||
from neutron_lib.api.definitions import external_net
|
||||
from neutron_lib.api.definitions import provider_net
|
||||
from neutron_lib import constants
|
||||
from oslo_config import cfg
|
||||
from oslo_utils import strutils
|
||||
|
||||
from neutron.common.ovn import constants as ovn_const
|
||||
@ -131,3 +132,51 @@ class TestOVNClient(base.TestOVNFunctionalBase,
|
||||
ovn_utils.ovn_name(router_id),
|
||||
default=None)
|
||||
self.assertIsNone(hcg)
|
||||
|
||||
def _test_router_reside_chassis_redirect(
|
||||
self, is_distributed_fip, net_type, expected_value=None):
|
||||
cfg.CONF.set_override(
|
||||
'enable_distributed_floating_ip', is_distributed_fip, group='ovn')
|
||||
net_arg = {
|
||||
provider_net.NETWORK_TYPE: net_type}
|
||||
if net_type == constants.TYPE_FLAT:
|
||||
net_arg[provider_net.PHYSICAL_NETWORK] = 'datacentre'
|
||||
with self.network('test-ovn-client', as_admin=True,
|
||||
arg_list=tuple(net_arg.keys()), **net_arg) as net:
|
||||
with self.subnet(net) as subnet:
|
||||
subnet_id = subnet['subnet']['id']
|
||||
with self.router() as router:
|
||||
router_id = router['router']['id']
|
||||
self._router_interface_action(
|
||||
'add', router_id, subnet_id, None)
|
||||
lr = self.nb_api.lookup('Logical_Router',
|
||||
ovn_utils.ovn_name(router_id))
|
||||
lrp = lr.ports[0]
|
||||
if net_type in [constants.TYPE_VLAN, constants.TYPE_FLAT]:
|
||||
self.assertEqual(
|
||||
expected_value,
|
||||
strutils.bool_from_string(
|
||||
lrp.options[
|
||||
ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH]))
|
||||
else:
|
||||
self.assertNotIn(
|
||||
ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH,
|
||||
lrp.options)
|
||||
|
||||
def test_router_reside_chassis_redirect_dvr_vlan_net(self):
|
||||
self._test_router_reside_chassis_redirect(True, 'vlan', False)
|
||||
|
||||
def test_router_reside_chassis_redirect_non_dvr_vlan_net(self):
|
||||
self._test_router_reside_chassis_redirect(False, 'vlan', True)
|
||||
|
||||
def test_router_reside_chassis_redirect_dvr_flat_net(self):
|
||||
self._test_router_reside_chassis_redirect(True, 'flat', False)
|
||||
|
||||
def test_router_reside_chassis_redirect_non_dvr_flat_net(self):
|
||||
self._test_router_reside_chassis_redirect(False, 'flat', True)
|
||||
|
||||
def test_router_reside_chassis_redirect_dvr_geneve_net(self):
|
||||
self._test_router_reside_chassis_redirect(True, 'geneve', False)
|
||||
|
||||
def test_router_reside_chassis_redirect_non_dvr_geneve_net(self):
|
||||
self._test_router_reside_chassis_redirect(False, 'geneve')
|
||||
|
@ -834,7 +834,7 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
||||
self._test_check_redirect_type_router_gateway_ports(
|
||||
networks, False, flavored_router=True)
|
||||
|
||||
def _test_check_vlan_distributed_ports(self, opt_value=None):
|
||||
def _test_check_provider_distributed_ports(self, opt_value=None):
|
||||
fake_net0 = {'id': 'net0'}
|
||||
fake_net1 = {'id': 'net1'}
|
||||
fake_port0 = {'id': 'port0', 'device_id': 'device0'}
|
||||
@ -856,18 +856,18 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
||||
# Invoke the periodic method, it meant to run only once at startup
|
||||
# so NeverAgain will be raised at the end
|
||||
self.assertRaises(periodics.NeverAgain,
|
||||
self.periodic.check_vlan_distributed_ports)
|
||||
self.periodic.check_provider_distributed_ports)
|
||||
|
||||
def test_check_vlan_distributed_ports_expected_value(self):
|
||||
self._test_check_vlan_distributed_ports(opt_value='true')
|
||||
def test_check_provider_distributed_ports_expected_value(self):
|
||||
self._test_check_provider_distributed_ports(opt_value='true')
|
||||
|
||||
# If the "reside-on-redirect-chassis" option value do match
|
||||
# the expected value, assert we do not update the database
|
||||
self.assertFalse(
|
||||
self.fake_ovn_client._nb_idl.db_set.called)
|
||||
|
||||
def test_check_vlan_distributed_ports_non_expected_value(self):
|
||||
self._test_check_vlan_distributed_ports(opt_value='false')
|
||||
def test_check_provider_distributed_ports_non_expected_value(self):
|
||||
self._test_check_provider_distributed_ports(opt_value='false')
|
||||
|
||||
# If the "reside-on-redirect-chassis" option value does not match
|
||||
# the expected value, assert we update the database
|
||||
|
Loading…
Reference in New Issue
Block a user