From 1f236bb32c8bbb214cefa47f50b7ab8a085caffa Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Thu, 3 Aug 2017 00:56:28 -0700 Subject: [PATCH] NSX|V: skip metadata proxy subnets for BGP updates Ensure that metadata routes and IP's are are not used when updating BGP Change-Id: I83b5c57a77f38b95dab14fc9584b9e276438d5a3 --- vmware_nsx/plugins/nsx_v/md_proxy.py | 3 +++ .../services/dynamic_routing/nsx_v/driver.py | 24 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/vmware_nsx/plugins/nsx_v/md_proxy.py b/vmware_nsx/plugins/nsx_v/md_proxy.py index 33879a7f67..6a23bbbe28 100644 --- a/vmware_nsx/plugins/nsx_v/md_proxy.py +++ b/vmware_nsx/plugins/nsx_v/md_proxy.py @@ -742,3 +742,6 @@ class NsxVMetadataProxyHandler(object): except Exception as e: LOG.error("Failed to delete md_proxy port %(port)s: " "%(e)s", {'port': ports[0]['id'], 'e': e}) + + def is_md_subnet(self, subnet_id): + return self.internal_subnet == subnet_id diff --git a/vmware_nsx/services/dynamic_routing/nsx_v/driver.py b/vmware_nsx/services/dynamic_routing/nsx_v/driver.py index badfe8bc53..9464b0baef 100644 --- a/vmware_nsx/services/dynamic_routing/nsx_v/driver.py +++ b/vmware_nsx/services/dynamic_routing/nsx_v/driver.py @@ -165,6 +165,16 @@ class NSXvBgpDriver(object): edge_router_dict[edge_id]['no_snat_routers'].append(router_id) return edge_router_dict + def _get_md_proxy_for_router(self, context, router_id): + binding = nsxv_db.get_nsxv_router_binding(context.session, + router_id) + md_proxy = None + if binding: + az_name = binding['availability_zone'] + md_proxy = self._core_plugin.get_metadata_proxy_handler( + az_name) + return md_proxy + def _query_tenant_subnets(self, context, router_ids): # Query subnets attached to all of routers attached to same edge subnets = [] @@ -174,8 +184,12 @@ class NSXvBgpDriver(object): int_ports = self._core_plugin.get_ports(context, filters=filters, fields=['fixed_ips']) + # We need to skip metadata subnets + md_proxy = self._get_md_proxy_for_router(context, router_id) for p in int_ports: subnet_id = p['fixed_ips'][0]['subnet_id'] + if md_proxy and md_proxy.is_md_subnet(subnet_id): + continue subnet = self._core_plugin.get_subnet(context, subnet_id) subnets.append({'id': subnet_id, 'cidr': subnet['cidr']}) @@ -618,6 +632,9 @@ class NSXvBgpDriver(object): if not bgp_binding: return + # Need to ensure that we do not use the metadata IP's + md_proxy = self._get_md_proxy_for_router(context, router_id) + routers_ids = ( self._core_plugin.edge_manager.get_routers_on_same_edge( context, router_id)) @@ -629,8 +646,11 @@ class NSXvBgpDriver(object): filters = {'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW], 'device_id': routers_ids} edge_gw_ports = self._core_plugin.get_ports(context, filters=filters) - alt_bgp_identifiers = [p['fixed_ips'][0]['ip_address'] - for p in edge_gw_ports] + alt_bgp_identifiers = [ + p['fixed_ips'][0]['ip_address'] for p in edge_gw_ports + if (not md_proxy or + not md_proxy.is_md_subnet( + p['fixed_ips'][0]['subnet_id']))] if alt_bgp_identifiers: # Shared router, only remove prefixes and redistribution # rules.