[OVN] Add the network type to the `Logical_Switch
` register
Now the ``Logical_Switch`` register (that represents an OVN network), stored the network type in the "external_ids" field. Related-Bug: #2056558 Change-Id: I9e55a7412d841b7b59602c56c3a4e2f9c954aeed
This commit is contained in:
parent
e8468a6dd6
commit
f82c650c8c
@ -40,6 +40,7 @@ from neutron.conf.plugins.ml2.drivers.ovn import ovn_conf
|
|||||||
from neutron.db import l3_attrs_db
|
from neutron.db import l3_attrs_db
|
||||||
from neutron.db import ovn_hash_ring_db as hash_ring_db
|
from neutron.db import ovn_hash_ring_db as hash_ring_db
|
||||||
from neutron.db import ovn_revision_numbers_db as revision_numbers_db
|
from neutron.db import ovn_revision_numbers_db as revision_numbers_db
|
||||||
|
from neutron.objects import network as network_obj
|
||||||
from neutron.objects import ports as ports_obj
|
from neutron.objects import ports as ports_obj
|
||||||
from neutron.objects import router as router_obj
|
from neutron.objects import router as router_obj
|
||||||
from neutron.objects import servicetype as servicetype_obj
|
from neutron.objects import servicetype as servicetype_obj
|
||||||
@ -1228,6 +1229,30 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase):
|
|||||||
|
|
||||||
raise periodics.NeverAgain()
|
raise periodics.NeverAgain()
|
||||||
|
|
||||||
|
# TODO(ralonsoh): Remove this method in the E cycle (SLURP release)
|
||||||
|
@has_lock_periodic(spacing=600, run_immediately=True)
|
||||||
|
def set_network_type(self):
|
||||||
|
"""Add the network type to the Logical_Switch registers"""
|
||||||
|
context = n_context.get_admin_context()
|
||||||
|
net_segments = network_obj.NetworkSegment.get_objects(context)
|
||||||
|
net_segments = {seg.network_id: seg.network_type
|
||||||
|
for seg in net_segments}
|
||||||
|
cmds = []
|
||||||
|
for ls in self._nb_idl.ls_list().execute(check_error=True):
|
||||||
|
if ovn_const.OVN_NETTYPE_EXT_ID_KEY not in ls.external_ids:
|
||||||
|
net_id = ls.name.replace('neutron-', '')
|
||||||
|
external_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: net_segments[net_id]}
|
||||||
|
cmds.append(self._nb_idl.db_set(
|
||||||
|
'Logical_Switch', ls.uuid, ('external_ids', external_ids)))
|
||||||
|
|
||||||
|
if cmds:
|
||||||
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
|
for cmd in cmds:
|
||||||
|
txn.add(cmd)
|
||||||
|
|
||||||
|
raise periodics.NeverAgain()
|
||||||
|
|
||||||
|
|
||||||
class HashRingHealthCheckPeriodics(object):
|
class HashRingHealthCheckPeriodics(object):
|
||||||
|
|
||||||
|
@ -1647,12 +1647,14 @@ class OVNClient(object):
|
|||||||
for net in networks) else 'false'
|
for net in networks) else 'false'
|
||||||
return reside_redir_ch
|
return reside_redir_ch
|
||||||
|
|
||||||
def _gen_router_port_options(self, port, network=None):
|
def _gen_router_port_options(self, port):
|
||||||
options = {}
|
options = {}
|
||||||
admin_context = n_context.get_admin_context()
|
admin_context = n_context.get_admin_context()
|
||||||
if network is None:
|
ls_name = utils.ovn_name(port['network_id'])
|
||||||
network = self._plugin.get_network(admin_context,
|
ls = self._nb_idl.ls_get(ls_name).execute(check_error=True)
|
||||||
port['network_id'])
|
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 VLAN type networks we need to set the
|
||||||
# "reside-on-redirect-chassis" option so the routing for this
|
# "reside-on-redirect-chassis" option so the routing for this
|
||||||
# logical router port is centralized in the chassis hosting the
|
# logical router port is centralized in the chassis hosting the
|
||||||
@ -1660,7 +1662,7 @@ class OVNClient(object):
|
|||||||
# https://github.com/openvswitch/ovs/commit/85706c34d53d4810f54bec1de662392a3c06a996
|
# https://github.com/openvswitch/ovs/commit/85706c34d53d4810f54bec1de662392a3c06a996
|
||||||
# FIXME(ltomasbo): Once Bugzilla 2162756 is fixed the
|
# FIXME(ltomasbo): Once Bugzilla 2162756 is fixed the
|
||||||
# is_provider_network check should be removed
|
# is_provider_network check should be removed
|
||||||
if network.get(pnet.NETWORK_TYPE) == const.TYPE_VLAN:
|
if network_type == const.TYPE_VLAN:
|
||||||
reside_redir_ch = self._get_reside_redir_for_gateway_port(
|
reside_redir_ch = self._get_reside_redir_for_gateway_port(
|
||||||
port['device_id'])
|
port['device_id'])
|
||||||
options[ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH] = reside_redir_ch
|
options[ovn_const.LRP_OPTIONS_RESIDE_REDIR_CH] = reside_redir_ch
|
||||||
@ -1682,10 +1684,10 @@ class OVNClient(object):
|
|||||||
admin_context, filters={'id': network_ids})
|
admin_context, filters={'id': network_ids})
|
||||||
if ovn_conf.is_ovn_emit_need_to_frag_enabled():
|
if ovn_conf.is_ovn_emit_need_to_frag_enabled():
|
||||||
for net in networks:
|
for net in networks:
|
||||||
if net['mtu'] > network['mtu']:
|
if net['mtu'] > network_mtu:
|
||||||
options[
|
options[
|
||||||
ovn_const.OVN_ROUTER_PORT_GW_MTU_OPTION] = str(
|
ovn_const.OVN_ROUTER_PORT_GW_MTU_OPTION] = str(
|
||||||
network['mtu'])
|
network_mtu)
|
||||||
break
|
break
|
||||||
if ovn_conf.is_ovn_distributed_floating_ip():
|
if ovn_conf.is_ovn_distributed_floating_ip():
|
||||||
# NOTE(ltomasbo): For VLAN type networks connected through
|
# NOTE(ltomasbo): For VLAN type networks connected through
|
||||||
@ -2002,7 +2004,11 @@ class OVNClient(object):
|
|||||||
ovn_const.OVN_REV_NUM_EXT_ID_KEY: str(
|
ovn_const.OVN_REV_NUM_EXT_ID_KEY: str(
|
||||||
utils.get_revision_number(network, ovn_const.TYPE_NETWORKS)),
|
utils.get_revision_number(network, ovn_const.TYPE_NETWORKS)),
|
||||||
ovn_const.OVN_AZ_HINTS_EXT_ID_KEY:
|
ovn_const.OVN_AZ_HINTS_EXT_ID_KEY:
|
||||||
','.join(common_utils.get_az_hints(network))}}
|
','.join(common_utils.get_az_hints(network)),
|
||||||
|
# NOTE(ralonsoh): it is not considered the case of multiple
|
||||||
|
# segments.
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: network.get(pnet.NETWORK_TYPE),
|
||||||
|
}}
|
||||||
|
|
||||||
# Enable IGMP snooping if igmp_snooping_enable is enabled in Neutron
|
# Enable IGMP snooping if igmp_snooping_enable is enabled in Neutron
|
||||||
vlan_transparent = (
|
vlan_transparent = (
|
||||||
@ -2057,7 +2063,7 @@ class OVNClient(object):
|
|||||||
commands = []
|
commands = []
|
||||||
for port in ports:
|
for port in ports:
|
||||||
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
||||||
options = self._gen_router_port_options(port, prov_net)
|
options = self._gen_router_port_options(port)
|
||||||
commands.append(self._nb_idl.lrp_set_options(lrp_name, **options))
|
commands.append(self._nb_idl.lrp_set_options(lrp_name, **options))
|
||||||
self._transaction(commands, txn=txn)
|
self._transaction(commands, txn=txn)
|
||||||
|
|
||||||
|
@ -1220,6 +1220,21 @@ class TestMaintenance(_TestMaintenanceHelper):
|
|||||||
lr = self.nb_api.lookup('Logical_Router', utils.ovn_name(router['id']))
|
lr = self.nb_api.lookup('Logical_Router', utils.ovn_name(router['id']))
|
||||||
self.assertEqual([], lr.ports[0].gateway_chassis)
|
self.assertEqual([], lr.ports[0].gateway_chassis)
|
||||||
|
|
||||||
|
def test_set_network_type(self):
|
||||||
|
net1 = self._create_network(uuidutils.generate_uuid())
|
||||||
|
ls_name = utils.ovn_name(net1['id'])
|
||||||
|
self.nb_api.db_remove(
|
||||||
|
'Logical_Switch', ls_name, 'external_ids',
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY).execute(check_error=True)
|
||||||
|
ls = self.nb_api.lookup('Logical_Switch', ls_name)
|
||||||
|
self.assertIsNone(ls.external_ids.get(
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY))
|
||||||
|
|
||||||
|
self.assertRaises(periodics.NeverAgain, self.maint.set_network_type)
|
||||||
|
ls = self.nb_api.lookup('Logical_Switch', ls_name)
|
||||||
|
self.assertEqual(net1[provnet_apidef.NETWORK_TYPE],
|
||||||
|
ls.external_ids.get(ovn_const.OVN_NETTYPE_EXT_ID_KEY))
|
||||||
|
|
||||||
|
|
||||||
class TestLogMaintenance(_TestMaintenanceHelper,
|
class TestLogMaintenance(_TestMaintenanceHelper,
|
||||||
test_log_driver.LogApiTestCaseBase):
|
test_log_driver.LogApiTestCaseBase):
|
||||||
|
@ -2565,6 +2565,12 @@ class TestOVNMechanismDriver(TestOVNMechanismDriverBase):
|
|||||||
network['network']['mtu'] = new_mtu
|
network['network']['mtu'] = new_mtu
|
||||||
fake_ctx = mock.MagicMock(current=network['network'])
|
fake_ctx = mock.MagicMock(current=network['network'])
|
||||||
fake_ctx.plugin_context.session.is_active = False
|
fake_ctx.plugin_context.session.is_active = False
|
||||||
|
external_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: const.TYPE_GENEVE,
|
||||||
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY: str(new_mtu),
|
||||||
|
}
|
||||||
|
self.nb_ovn.ls_get.return_value.execute.return_value = (
|
||||||
|
mock.Mock(external_ids=external_ids))
|
||||||
|
|
||||||
self.mech_driver.update_network_postcommit(fake_ctx)
|
self.mech_driver.update_network_postcommit(fake_ctx)
|
||||||
|
|
||||||
|
@ -339,6 +339,12 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
'neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.ovn_client.'
|
'neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.ovn_client.'
|
||||||
'OVNClient._get_router_gw_ports',
|
'OVNClient._get_router_gw_ports',
|
||||||
return_value=self.fake_ext_gw_ports)
|
return_value=self.fake_ext_gw_ports)
|
||||||
|
ext_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: constants.TYPE_GENEVE,
|
||||||
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY: 9000,
|
||||||
|
}
|
||||||
|
self.l3_inst._nb_ovn.ls_get.return_value.execute.return_value = (
|
||||||
|
mock.Mock(external_ids=ext_ids))
|
||||||
|
|
||||||
def test__plugin_driver(self):
|
def test__plugin_driver(self):
|
||||||
# No valid mech drivers should raise an exception.
|
# No valid mech drivers should raise an exception.
|
||||||
@ -744,6 +750,12 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
fake_network_vlan = self.fake_network
|
fake_network_vlan = self.fake_network
|
||||||
fake_network_vlan[pnet.NETWORK_TYPE] = constants.TYPE_VLAN
|
fake_network_vlan[pnet.NETWORK_TYPE] = constants.TYPE_VLAN
|
||||||
gn.return_value = fake_network_vlan
|
gn.return_value = fake_network_vlan
|
||||||
|
ext_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: constants.TYPE_VLAN,
|
||||||
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY: 1500,
|
||||||
|
}
|
||||||
|
self.l3_inst._nb_ovn.ls_get.return_value.execute.return_value = (
|
||||||
|
mock.Mock(external_ids=ext_ids))
|
||||||
|
|
||||||
payload = self._create_payload_for_router_interface(router_id)
|
payload = self._create_payload_for_router_interface(router_id)
|
||||||
self.ovn_drv._process_add_router_interface(resources.ROUTER_INTERFACE,
|
self.ovn_drv._process_add_router_interface(resources.ROUTER_INTERFACE,
|
||||||
@ -1915,13 +1927,20 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
ari.return_value = self.fake_router_interface_info
|
ari.return_value = self.fake_router_interface_info
|
||||||
grps.return_value = [interface_info]
|
grps.return_value = [interface_info]
|
||||||
self.get_router.return_value = self.fake_router_with_ext_gw
|
self.get_router.return_value = self.fake_router_with_ext_gw
|
||||||
network_attrs = {'id': 'prov-net', 'mtu': 1200}
|
mtu = 1200
|
||||||
|
network_attrs = {'id': 'prov-net', 'mtu': mtu}
|
||||||
prov_net = fake_resources.FakeNetwork.create_one_network(
|
prov_net = fake_resources.FakeNetwork.create_one_network(
|
||||||
attrs=network_attrs).info()
|
attrs=network_attrs).info()
|
||||||
self.fake_router_port['device_owner'] = (
|
self.fake_router_port['device_owner'] = (
|
||||||
constants.DEVICE_OWNER_ROUTER_GW)
|
constants.DEVICE_OWNER_ROUTER_GW)
|
||||||
gn.return_value = prov_net
|
gn.return_value = prov_net
|
||||||
gns.return_value = [self.fake_network]
|
gns.return_value = [self.fake_network]
|
||||||
|
ext_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: constants.TYPE_GENEVE,
|
||||||
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY: mtu,
|
||||||
|
}
|
||||||
|
self.l3_inst._nb_ovn.ls_get.return_value.execute.return_value = (
|
||||||
|
mock.Mock(external_ids=ext_ids))
|
||||||
|
|
||||||
payload = self._create_payload_for_router_interface(router_id)
|
payload = self._create_payload_for_router_interface(router_id)
|
||||||
self.ovn_drv._process_add_router_interface(resources.ROUTER_INTERFACE,
|
self.ovn_drv._process_add_router_interface(resources.ROUTER_INTERFACE,
|
||||||
@ -2119,6 +2138,12 @@ class OVNL3ExtrarouteTests(test_l3_gw.ExtGwModeIntTestCase,
|
|||||||
self.l3_inst._nb_ovn.db_get.return_value.execute.return_value = ext_ids
|
self.l3_inst._nb_ovn.db_get.return_value.execute.return_value = ext_ids
|
||||||
self.l3_inst._nb_ovn.lookup.return_value = mock.Mock(
|
self.l3_inst._nb_ovn.lookup.return_value = mock.Mock(
|
||||||
external_ids=ext_ids)
|
external_ids=ext_ids)
|
||||||
|
ext_ids = {
|
||||||
|
ovn_const.OVN_NETTYPE_EXT_ID_KEY: constants.TYPE_GENEVE,
|
||||||
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY: 9000,
|
||||||
|
}
|
||||||
|
self.l3_inst._nb_ovn.ls_get.return_value.execute.return_value = (
|
||||||
|
mock.Mock(external_ids=ext_ids))
|
||||||
|
|
||||||
# Note(dongj): According to bug #1657693, status of an unassociated
|
# Note(dongj): According to bug #1657693, status of an unassociated
|
||||||
# floating IP is set to DOWN. Revise expected_status to DOWN for related
|
# floating IP is set to DOWN. Revise expected_status to DOWN for related
|
||||||
|
Loading…
Reference in New Issue
Block a user