NSXv: Adding more rotuer driver notifications

Change Ifbfa959526c5b5e3add94708d96517935e5cb3fa introduces event
notifications specific to NSXv routers.
Currently we're missing two notification calls in attach_router
and detach_router for exclusive and shared rotuers, these are called
when updating from one router type to the other.

This patch also relocates the notification (before router services
removed from edge) in router_interface_remove to be called before
actually deleting the interface on the edge.
This is needed since some callbacks require the interface to exists in order to
complete it's action (e.g - cleaning RouterID from the
edge dynamic routing section)

Change-Id: Ifb11abfc315faf7b34f2fb35972744b855138cb9
This commit is contained in:
Roey Chen 2017-04-12 08:50:34 -07:00
parent cc9b311dc9
commit a2e05bc255
2 changed files with 16 additions and 13 deletions

View File

@ -78,6 +78,8 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
def detach_router(self, context, router_id, router):
LOG.debug("Detach exclusive router id %s", router_id)
router_db = self.plugin._get_router(context, router_id)
self._notify_before_router_edge_association(context, router_db)
self.edge_manager.unbind_router_on_edge(context, router_id)
if self.plugin.metadata_proxy_handler:
az = self.get_router_az_by_id(context, router_id)
@ -192,7 +194,7 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
# Update static routes in all.
self.plugin._update_routes(context, router_id, newnexthop)
if new_ext_net_id:
if new_ext_net_id or force_update:
self._notify_after_router_edge_association(context, router)
def add_router_interface(self, context, router_id, interface_info):

View File

@ -95,6 +95,8 @@ class RouterSharedDriver(router_driver.RouterBaseDriver):
if not edge_id:
return
router_db = self.plugin._get_router(context, router_id)
self._notify_before_router_edge_association(context, router_db)
with locking.LockManager.get_lock(str(edge_id)):
self._remove_router_services_on_edge(context, router_id)
self._unbind_router_on_edge(context, router_id)
@ -108,6 +110,7 @@ class RouterSharedDriver(router_driver.RouterBaseDriver):
LOG.debug("Shared router %s attached to edge %s", router_id, edge_id)
with locking.LockManager.get_lock(str(edge_id)):
self._add_router_services_on_available_edge(context, router_id)
self._notify_after_router_edge_association(context, router_db)
def delete_router(self, context, router_id):
# make sure that the router binding is cleaned up
@ -850,23 +853,25 @@ class RouterSharedDriver(router_driver.RouterBaseDriver):
return info
def remove_router_interface(self, context, router_id, interface_info):
detach = False
edge_id = edge_utils.get_router_edge_id(context, router_id)
with locking.LockManager.get_lock('nsx-shared-router-pool'):
info = super(
nsx_v.NsxVPluginV2, self.plugin).remove_router_interface(
context, router_id, interface_info)
subnet = self.plugin.get_subnet(context, info['subnet_id'])
network_id = subnet['network_id']
ports = self.plugin._get_router_interface_ports_by_network(
context, router_id, network_id)
if not ports:
router = self.plugin._get_router(context, router_id)
self._notify_before_router_edge_association(context, router)
with locking.LockManager.get_lock(str(edge_id)):
subnet = self.plugin.get_subnet(context, info['subnet_id'])
network_id = subnet['network_id']
router_ids = self.edge_manager.get_routers_on_same_edge(
context, router_id)
self._update_nat_rules_on_routers(context, router_id,
router_ids)
self._update_subnets_and_dnat_firewall_on_routers(
context, router_id, router_ids, allow_external=True)
ports = self.plugin._get_router_interface_ports_by_network(
context, router_id, network_id)
if not ports:
edge_utils.delete_interface(self.nsx_v, context,
router_id, network_id)
@ -874,7 +879,9 @@ class RouterSharedDriver(router_driver.RouterBaseDriver):
# router
if not self.plugin._get_internal_network_ids_by_router(
context, router_id):
detach = True
self._remove_router_services_on_edge(context,
router_id)
self._unbind_router_on_edge(context, router_id)
else:
address_groups = self.plugin._get_address_groups(
context, router_id, network_id)
@ -882,12 +889,6 @@ class RouterSharedDriver(router_driver.RouterBaseDriver):
router_id,
network_id,
address_groups)
if detach:
router = self.plugin._get_router(context, router_id)
self._notify_before_router_edge_association(context, router)
with locking.LockManager.get_lock(str(edge_id)):
self._remove_router_services_on_edge(context, router_id)
self._unbind_router_on_edge(context, router_id)
return info
def _update_edge_router(self, context, router_id):