From 1d3c810b1b0cf4864f901ed3c0dc76b70a9053a7 Mon Sep 17 00:00:00 2001 From: Adit Sarfaty Date: Wed, 24 Aug 2016 11:57:05 +0300 Subject: [PATCH] NSX|V delete metadata ports upon deleting the dhcp edge For some unknown reason, not all metadata ports are deleted when the last network is removed from a dhcp edge, and it is being free. Adding a call to the md_proxy cleanup_router_edge should fi it and log the event. Change-Id: Icabeba5fd6d0287df3b5e05cd54b5b2ec644211b --- vmware_nsx/plugins/nsx_v/md_proxy.py | 18 +++++++++++++----- vmware_nsx/plugins/nsx_v/vshield/edge_utils.py | 6 ++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/vmware_nsx/plugins/nsx_v/md_proxy.py b/vmware_nsx/plugins/nsx_v/md_proxy.py index b09bb2a013..5cc001e83e 100644 --- a/vmware_nsx/plugins/nsx_v/md_proxy.py +++ b/vmware_nsx/plugins/nsx_v/md_proxy.py @@ -23,7 +23,7 @@ from neutron_lib import constants from oslo_config import cfg from oslo_log import log as logging -from vmware_nsx._i18n import _, _LE +from vmware_nsx._i18n import _, _LE, _LW from vmware_nsx.common import exceptions as nsxv_exc from vmware_nsx.common import locking from vmware_nsx.common import nsxv_constants @@ -681,13 +681,21 @@ class NsxVMetadataProxyHandler(object): proxy_lb=False, context=context) - def cleanup_router_edge(self, rtr_id): + def cleanup_router_edge(self, rtr_id, warn=False): filters = { 'network_id': [self.internal_net], 'device_id': [rtr_id]} ports = self.nsxv_plugin.get_ports(self.context, filters=filters) if ports: - self.nsxv_plugin.delete_port( - self.context, ports[0]['id'], - l3_port_check=False) + if warn: + LOG.warning(_LW("cleanup_router_edge found port %(port)s for " + "router %(router)s - deleting it now."), + {'port': ports[0]['id'], 'router': rtr_id}) + try: + self.nsxv_plugin.delete_port( + self.context, ports[0]['id'], + l3_port_check=False) + except Exception as e: + LOG.error(_LE("Failed to delete md_proxy port %(port)s: " + "%(e)s"), {'port': ports[0]['id'], 'e': e}) diff --git a/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py b/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py index a7603ec6f6..f5c768cdd5 100644 --- a/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py +++ b/vmware_nsx/plugins/nsx_v/vshield/edge_utils.py @@ -715,6 +715,12 @@ class EdgeManager(object): def _free_dhcp_edge_appliance(self, context, network_id): router_id = (vcns_const.DHCP_EDGE_PREFIX + network_id)[:36] + + # if there are still metadata ports on this edge - delete them now + metadata_proxy_handler = self.plugin.metadata_proxy_handler + if metadata_proxy_handler: + metadata_proxy_handler.cleanup_router_edge(router_id, warn=True) + self._free_edge_appliance(context, router_id) def _build_lrouter_name(self, router_id, router_name):