TVD: improve get subnets
1. ensure that only the as_provider supported plugins are used for metadata requests 2. make sure that we filter subnets according to the relevant project type Change-Id: I51a0a4453ee1f0e356c9b27bf4da3d81c865a39c
This commit is contained in:
parent
b9b099af92
commit
64fe03c77a
@ -56,6 +56,7 @@ from vmware_nsx.db import (
|
||||
routertype as rt_rtr)
|
||||
from vmware_nsx.db import db as nsx_db
|
||||
from vmware_nsx.db import nsx_portbindings_db as pbin_db
|
||||
from vmware_nsx.extensions import advancedserviceproviders as as_providers
|
||||
from vmware_nsx.extensions import projectpluginmap
|
||||
from vmware_nsx.plugins.common import plugin as nsx_plugin_common
|
||||
from vmware_nsx.plugins.dvs import plugin as dvs
|
||||
@ -127,6 +128,7 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
||||
def init_plugins(self):
|
||||
# initialize all supported plugins
|
||||
self.plugins = {}
|
||||
self.as_providers = {}
|
||||
|
||||
try:
|
||||
self.plugins[projectpluginmap.NsxPlugins.NSX_T] = t.NsxV3Plugin()
|
||||
@ -160,6 +162,10 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
||||
self.default_plugin)
|
||||
raise nsx_exc.NsxPluginException(err_msg=msg)
|
||||
|
||||
for k, val in self.plugins.items():
|
||||
if "advanced-service-providers" in val.supported_extension_aliases:
|
||||
self.as_providers[k] = val
|
||||
|
||||
LOG.info("NSX-TVD plugin will use %s as the default plugin",
|
||||
self.default_plugin)
|
||||
|
||||
@ -394,22 +400,32 @@ class NsxTVDPlugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
||||
|
||||
def get_subnets(self, context, filters=None, fields=None, sorts=None,
|
||||
limit=None, marker=None, page_reverse=False):
|
||||
# The subnets is tricky as the metadata requests make use of the
|
||||
# get subnet. So there are two use cases here:
|
||||
# 1. that the metadata request returns a value
|
||||
# 2. that this is a general subnet query.
|
||||
# If none found then we return default plugin subnets
|
||||
default_plugin_subnets = []
|
||||
for plugin in self.plugins.values():
|
||||
subnets = plugin.get_subnets(context, filters=filters,
|
||||
fields=fields, sorts=sorts,
|
||||
limit=limit, marker=marker,
|
||||
page_reverse=page_reverse)
|
||||
if subnets:
|
||||
return subnets
|
||||
if self.plugins[self.default_plugin] == plugin:
|
||||
default_plugin_subnets = subnets
|
||||
return default_plugin_subnets
|
||||
# Check if we need to invoke metadata search. Here we are unable to
|
||||
# filter according to projects as this is from the nova api service
|
||||
# so we invoke on all plugins that support this extension
|
||||
if ((fields and as_providers.ADV_SERVICE_PROVIDERS in fields)
|
||||
or (filters and filters.get(as_providers.ADV_SERVICE_PROVIDERS))):
|
||||
for plugin in self.as_providers.values():
|
||||
subnets = plugin.get_subnets(context, filters=filters,
|
||||
fields=fields, sorts=sorts,
|
||||
limit=limit, marker=marker,
|
||||
page_reverse=page_reverse)
|
||||
if subnets:
|
||||
return subnets
|
||||
return []
|
||||
else:
|
||||
# Read project plugin to filter relevant projects according to
|
||||
# plugin
|
||||
req_p = self._get_plugin_from_project(context, context.project_id)
|
||||
filters = filters or {}
|
||||
subnets = super(NsxTVDPlugin, self).get_subnets(
|
||||
context, filters=filters, fields=fields, sorts=sorts,
|
||||
limit=limit, marker=marker, page_reverse=page_reverse)
|
||||
for subnet in subnets[:]:
|
||||
p = self._get_plugin_from_project(context, subnet['tenant_id'])
|
||||
if p != req_p:
|
||||
subnets.remove(subnet)
|
||||
return subnets
|
||||
|
||||
def delete_subnet(self, context, id):
|
||||
db_subnet = self._get_subnet(context, id)
|
||||
|
Loading…
x
Reference in New Issue
Block a user