summaryrefslogtreecommitdiff
path: root/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py')
-rw-r--r--neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py60
1 files changed, 27 insertions, 33 deletions
diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py
index f5607e2849..11650493ef 100644
--- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py
+++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py
@@ -1329,20 +1329,17 @@ class OVNClient(object):
'device_owner': [const.DEVICE_OWNER_ROUTER_GW],
'device_id': [router_id]})
- def _get_router_ports(self, context, router_id, get_gw_port=False):
+ def _get_router_ports(self, context, router_id):
# _get_router() will raise a RouterNotFound error if there's no router
# with the router_id
router_db = self._l3_plugin._get_router(context, router_id)
- if get_gw_port:
- return [p.port for p in router_db.attached_ports]
- else:
- # When the existing deployment is migrated to OVN
- # we may need to consider other port types - DVR_INTERFACE/HA_INTF.
- return [p.port for p in router_db.attached_ports
- if p.port_type in [const.DEVICE_OWNER_ROUTER_INTF,
- const.DEVICE_OWNER_DVR_INTERFACE,
- const.DEVICE_OWNER_HA_REPLICATED_INT,
- const.DEVICE_OWNER_ROUTER_HA_INTF]]
+ # When the existing deployment is migrated to OVN
+ # we may need to consider other port types - DVR_INTERFACE/HA_INTF.
+ return [p.port for p in router_db.attached_ports
+ if p.port_type in [const.DEVICE_OWNER_ROUTER_INTF,
+ const.DEVICE_OWNER_DVR_INTERFACE,
+ const.DEVICE_OWNER_HA_REPLICATED_INT,
+ const.DEVICE_OWNER_ROUTER_HA_INTF]]
def _get_v4_network_for_router_port(self, context, port):
cidr = None
@@ -1366,18 +1363,13 @@ class OVNClient(object):
return networks
def _gen_router_ext_ids(self, router):
- gw_net_id = (router.get('external_gateway_info') or
- {}).get('network_id') or ''
return {
ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY:
router.get('name', 'no_router_name'),
- ovn_const.OVN_GW_PORT_EXT_ID_KEY:
- router.get('gw_port_id') or '',
ovn_const.OVN_REV_NUM_EXT_ID_KEY: str(utils.get_revision_number(
router, ovn_const.TYPE_ROUTERS)),
ovn_const.OVN_AZ_HINTS_EXT_ID_KEY:
','.join(common_utils.get_az_hints(router)),
- ovn_const.OVN_GW_NETWORK_EXT_ID_KEY: gw_net_id,
}
def create_router(self, context, router, add_external_gateway=True):
@@ -1498,13 +1490,8 @@ class OVNClient(object):
def delete_router(self, context, router_id):
"""Delete a logical router."""
lrouter_name = utils.ovn_name(router_id)
- ovn_router = self._nb_idl.get_lrouter(lrouter_name)
- gw_network_id = ovn_router.external_ids.get(
- ovn_const.OVN_GW_NETWORK_EXT_ID_KEY) if ovn_router else None
- router_dict = {'id': router_id, 'gw_network_id': gw_network_id}
with self._nb_idl.transaction(check_error=True) as txn:
txn.add(self._nb_idl.delete_lrouter(lrouter_name))
- self._qos_driver.delete_router(txn, router_dict)
db_rev.delete_revision(context, router_id, ovn_const.TYPE_ROUTERS)
def get_candidates_for_scheduling(self, physnet, cms=None,
@@ -1914,9 +1901,12 @@ class OVNClient(object):
def create_provnet_port(self, network_id, segment, txn=None):
tag = segment.get(segment_def.SEGMENTATION_ID, [])
physnet = segment.get(segment_def.PHYSICAL_NETWORK)
+ fdb_enabled = ('true' if ovn_conf.is_learn_fdb_enabled()
+ else 'false')
options = {'network_name': physnet,
ovn_const.LSP_OPTIONS_MCAST_FLOOD_REPORTS: 'true',
- ovn_const.LSP_OPTIONS_MCAST_FLOOD: 'false'}
+ ovn_const.LSP_OPTIONS_MCAST_FLOOD: 'false',
+ ovn_const.LSP_OPTIONS_LOCALNET_LEARN_FDB: fdb_enabled}
cmd = self._nb_idl.create_lswitch_port(
lport_name=utils.ovn_provnet_port_name(segment['id']),
lswitch_name=utils.ovn_name(network_id),
@@ -2336,7 +2326,7 @@ class OVNClient(object):
mport_updated = False
if subnet['ip_version'] == const.IP_VERSION_4:
mport_updated = self.update_metadata_port(
- context, network['id'], subnet=subnet)
+ context, network, subnet=subnet)
if subnet['ip_version'] == const.IP_VERSION_6 or not mport_updated:
# NOTE(ralonsoh): if IPv4 but the metadata port has not been
# updated, the DHPC options register has not been created.
@@ -2356,7 +2346,7 @@ class OVNClient(object):
subnet['id'])['subnet']
if subnet['enable_dhcp'] or ovn_subnet:
- self.update_metadata_port(context, network['id'], subnet=subnet)
+ self.update_metadata_port(context, network, subnet=subnet)
check_rev_cmd = self._nb_idl.check_revision_number(
subnet['id'], subnet, ovn_const.TYPE_SUBNETS)
@@ -2452,8 +2442,9 @@ class OVNClient(object):
if not ovn_conf.is_ovn_metadata_enabled():
return
- if self._find_metadata_port(context, network['id']):
- return
+ metadata_port = self._find_metadata_port(context, network['id'])
+ if metadata_port:
+ return metadata_port
# Create a neutron port for DHCP/metadata services
filters = {'network_id': [network['id']]}
@@ -2468,16 +2459,19 @@ class OVNClient(object):
}
}
# TODO(boden): rehome create_port into neutron-lib
- p_utils.create_port(self._plugin, context, port)
+ return p_utils.create_port(self._plugin, context, port)
- def update_metadata_port(self, context, network_id, subnet=None):
+ def update_metadata_port(self, context, network, subnet=None):
"""Update metadata port.
This function will allocate an IP address for the metadata port of
the given network in all its IPv4 subnets or the given subnet. Returns
"True" if the metadata port has been updated and "False" if OVN
- metadata is disabled or the metadata port does not exist.
+ metadata is disabled or the metadata port does not exist or
+ cannot be created.
"""
+ network_id = network['id']
+
def update_metadata_port_fixed_ips(metadata_port, add_subnet_ids,
del_subnet_ids):
wanted_fixed_ips = [
@@ -2496,11 +2490,11 @@ class OVNClient(object):
if not ovn_conf.is_ovn_metadata_enabled():
return False
- # Retrieve the metadata port of this network
- metadata_port = self._find_metadata_port(context, network_id)
+ # Retrieve or create the metadata port of this network
+ metadata_port = self.create_metadata_port(context, network)
if not metadata_port:
- LOG.error("Metadata port couldn't be found for network %s",
- network_id)
+ LOG.error("Metadata port could not be found or created "
+ "for network %s", network_id)
return False
port_subnet_ids = set(ip['subnet_id'] for ip in