Stop using CommonDbMixin apis

Commit I5b804e09e630d88d551271d9731cc1f65c065259 changed/removed some of the
methods in CommonDbMixin.
As a result the way the plugins register the different extend-dict methods has changed,
and now uses a decorator.
Also those extend-dict callbacks are static methods which do not receive 'self', and
this caused some additional changes.

Change-Id: If99da0ea1e37792bd531ef92b0bbb880d2b05b8a
Depends-on: I5b804e09e630d88d551271d9731cc1f65c065259
This commit is contained in:
Adit Sarfaty 2017-04-24 12:06:23 +03:00
parent 11d3da3ef5
commit 8548f110ac
17 changed files with 250 additions and 203 deletions

View File

@ -25,6 +25,7 @@ from oslo_service import loopingcall
from oslo_utils import timeutils from oslo_utils import timeutils
import six import six
from neutron.db import _model_query as model_query
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.db.models import external_net as external_net_db from neutron.db.models import external_net as external_net_db
from neutron.db.models import l3 as l3_db from neutron.db.models import l3 as l3_db
@ -336,7 +337,7 @@ class NsxSynchronizer(object):
if not scan_missing: if not scan_missing:
filters['id'] = neutron_net_ids filters['id'] = neutron_net_ids
networks = self._plugin._get_collection( networks = model_query.get_collection(
ctx, models_v2.Network, self._plugin._make_network_dict, ctx, models_v2.Network, self._plugin._make_network_dict,
filters=filters) filters=filters)
@ -416,7 +417,7 @@ class NsxSynchronizer(object):
# Fetch neutron routers from database # Fetch neutron routers from database
filters = ({} if scan_missing else filters = ({} if scan_missing else
{'id': neutron_router_mappings.keys()}) {'id': neutron_router_mappings.keys()})
routers = self._plugin._get_collection( routers = model_query.get_collection(
ctx, l3_db.Router, self._plugin._make_router_dict, ctx, l3_db.Router, self._plugin._make_router_dict,
filters=filters) filters=filters)
for router in routers: for router in routers:
@ -518,7 +519,7 @@ class NsxSynchronizer(object):
external_net_db.ExternalNetwork, external_net_db.ExternalNetwork,
(models_v2.Network.id == (models_v2.Network.id ==
external_net_db.ExternalNetwork.network_id))] external_net_db.ExternalNetwork.network_id))]
ports = self._plugin._get_collection( ports = model_query.get_collection(
ctx, models_v2.Port, self._plugin._make_port_dict, ctx, models_v2.Port, self._plugin._make_port_dict,
filters=filters) filters=filters)
for port in ports: for port in ports:

View File

@ -22,8 +22,8 @@ from sqlalchemy import sql
from neutron.api.v2 import attributes from neutron.api.v2 import attributes
from neutron.common import utils as n_utils from neutron.common import utils as n_utils
from neutron.db import _resource_extend as resource_extend
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.db import db_base_plugin_v2
from neutron.db.models import securitygroup as securitygroups_db from neutron.db.models import securitygroup as securitygroups_db
from neutron.extensions import securitygroup as ext_sg from neutron.extensions import securitygroup as ext_sg
from neutron_lib.api import validators from neutron_lib.api import validators
@ -59,6 +59,7 @@ class NsxExtendedSecurityGroupProperties(model_base.BASEV2):
uselist=False, cascade='delete')) uselist=False, cascade='delete'))
@resource_extend.has_resource_extenders
class ExtendedSecurityGroupPropertiesMixin(object): class ExtendedSecurityGroupPropertiesMixin(object):
# NOTE(arosen): here we add a relationship so that from the ports model # NOTE(arosen): here we add a relationship so that from the ports model
@ -345,39 +346,34 @@ class ExtendedSecurityGroupPropertiesMixin(object):
sg_id): sg_id):
raise sg_policy.PolicySecurityGroupDeleteNotAdmin(id=sg_id) raise sg_policy.PolicySecurityGroupDeleteNotAdmin(id=sg_id)
def _extend_security_group_with_properties(self, sg_res, sg_db): @staticmethod
@resource_extend.extends([ext_sg.SECURITYGROUPS])
def _extend_security_group_with_properties(sg_res, sg_db):
if sg_db.ext_properties: if sg_db.ext_properties:
sg_res[sg_logging.LOGGING] = sg_db.ext_properties.logging sg_res[sg_logging.LOGGING] = sg_db.ext_properties.logging
sg_res[provider_sg.PROVIDER] = sg_db.ext_properties.provider sg_res[provider_sg.PROVIDER] = sg_db.ext_properties.provider
sg_res[sg_policy.POLICY] = sg_db.ext_properties.policy sg_res[sg_policy.POLICY] = sg_db.ext_properties.policy
def _extend_port_dict_provider_security_group(self, port_res, port_db): @staticmethod
# NOTE(arosen): this method overrides the one in the base @resource_extend.extends([attributes.PORTS])
# security group db class. The reason this is needed is because def _extend_port_dict_provider_security_group(port_res, port_db):
# we are storing provider security groups in the same security # Add the provider sg list to the port.
# groups db model. We need to do this here to remove the provider # later we will remove those from the regular sg list
# security groups and put those on the port resource as their
# own attribute.
# Security group bindings will be retrieved from the SQLAlchemy
# model. As they're loaded eagerly with ports because of the
# joined load they will not cause an extra query.
provider_groups = [] provider_groups = []
not_provider_groups = []
for sec_group_mapping in port_db.security_groups: for sec_group_mapping in port_db.security_groups:
if sec_group_mapping.extended_grp.provider is True: if sec_group_mapping.extended_grp.provider is True:
provider_groups.append(sec_group_mapping['security_group_id']) provider_groups.append(sec_group_mapping['security_group_id'])
else:
not_provider_groups.append(
sec_group_mapping['security_group_id'])
port_res[ext_sg.SECURITYGROUPS] = not_provider_groups
port_res[provider_sg.PROVIDER_SECURITYGROUPS] = provider_groups port_res[provider_sg.PROVIDER_SECURITYGROUPS] = provider_groups
return port_res return port_res
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( @staticmethod
attributes.PORTS, ['_extend_port_dict_provider_security_group']) def _remove_provider_security_groups_from_list(port_res):
# Remove provider security groups from the list of regular security
# groups of the result port
if (ext_sg.SECURITYGROUPS not in port_res or
provider_sg.PROVIDER_SECURITYGROUPS not in port_res):
return
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( port_res[ext_sg.SECURITYGROUPS] = list(
ext_sg.SECURITYGROUPS, ['_extend_security_group_with_properties']) set(port_res[ext_sg.SECURITYGROUPS]) -
set(port_res[provider_sg.PROVIDER_SECURITYGROUPS]))

View File

@ -17,8 +17,8 @@ from neutron_lib.db import model_base
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy import orm from sqlalchemy import orm
from neutron.db import _resource_extend as resource_extend
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.db import db_base_plugin_v2
from neutron.db.models import securitygroup from neutron.db.models import securitygroup
from neutron.extensions import securitygroup as ext_sg from neutron.extensions import securitygroup as ext_sg
from neutron_lib.api import validators from neutron_lib.api import validators
@ -52,6 +52,7 @@ class NsxExtendedSecurityGroupRuleProperties(model_base.BASEV2):
uselist=False, cascade='delete')) uselist=False, cascade='delete'))
@resource_extend.has_resource_extenders
class ExtendedSecurityGroupRuleMixin(object): class ExtendedSecurityGroupRuleMixin(object):
def _check_local_ip_prefix(self, context, rule): def _check_local_ip_prefix(self, context, rule):
@ -81,10 +82,9 @@ class ExtendedSecurityGroupRuleMixin(object):
rule_res[ext_local_ip.LOCAL_IP_PREFIX] = ( rule_res[ext_local_ip.LOCAL_IP_PREFIX] = (
rule_req[ext_local_ip.LOCAL_IP_PREFIX]) rule_req[ext_local_ip.LOCAL_IP_PREFIX])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( @staticmethod
ext_sg.SECURITYGROUPRULES, ['_extend_security_group_rule_with_params']) @resource_extend.extends([ext_sg.SECURITYGROUPRULES])
def _extend_security_group_rule_with_params(sg_rule_res, sg_rule_db):
def _extend_security_group_rule_with_params(self, sg_rule_res, sg_rule_db):
if sg_rule_db.ext_properties: if sg_rule_db.ext_properties:
sg_rule_res[ext_local_ip.LOCAL_IP_PREFIX] = ( sg_rule_res[ext_local_ip.LOCAL_IP_PREFIX] = (
sg_rule_db.ext_properties.local_ip_prefix) sg_rule_db.ext_properties.local_ip_prefix)

View File

@ -16,9 +16,10 @@
from sqlalchemy.orm import exc from sqlalchemy.orm import exc
from neutron.api.v2 import attributes from neutron.api.v2 import attributes
from neutron.db import _model_query as model_query
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.db import db_base_plugin_v2
from oslo_log import log as logging from oslo_log import log as logging
@ -28,6 +29,7 @@ from vmware_nsx.extensions import maclearning as mac
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@resource_extend.has_resource_extenders
class MacLearningDbMixin(object): class MacLearningDbMixin(object):
"""Mixin class for mac learning.""" """Mixin class for mac learning."""
@ -36,18 +38,17 @@ class MacLearningDbMixin(object):
mac.MAC_LEARNING: port[mac.MAC_LEARNING]} mac.MAC_LEARNING: port[mac.MAC_LEARNING]}
return db_utils.resource_fields(res, fields) return db_utils.resource_fields(res, fields)
def _extend_port_mac_learning_state(self, port_res, port_db): @staticmethod
@resource_extend.extends([attributes.PORTS])
def _extend_port_mac_learning_state(port_res, port_db):
state = port_db.mac_learning_state state = port_db.mac_learning_state
if state and state.mac_learning_enabled: if state and state.mac_learning_enabled:
port_res[mac.MAC_LEARNING] = state.mac_learning_enabled port_res[mac.MAC_LEARNING] = state.mac_learning_enabled
# Register dict extend functions for ports
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attributes.PORTS, ['_extend_port_mac_learning_state'])
def _update_mac_learning_state(self, context, port_id, enabled): def _update_mac_learning_state(self, context, port_id, enabled):
try: try:
query = self._model_query(context, nsx_models.MacLearningState) query = model_query.query_with_hooks(
context, nsx_models.MacLearningState)
state = query.filter( state = query.filter(
nsx_models.MacLearningState.port_id == port_id).one() nsx_models.MacLearningState.port_id == port_id).one()
state.update({mac.MAC_LEARNING: enabled}) state.update({mac.MAC_LEARNING: enabled})

View File

@ -14,6 +14,7 @@
from sqlalchemy.orm import exc as sa_orm_exc from sqlalchemy.orm import exc as sa_orm_exc
from neutron.db import _model_query as model_query
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.plugins.common import utils from neutron.plugins.common import utils
@ -97,7 +98,8 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase):
def _get_network_gateway(self, context, gw_id): def _get_network_gateway(self, context, gw_id):
try: try:
gw = self._get_by_id(context, nsx_models.NetworkGateway, gw_id) gw = model_query.get_by_id(context, nsx_models.NetworkGateway,
gw_id)
except sa_orm_exc.NoResultFound: except sa_orm_exc.NoResultFound:
raise GatewayNotFound(gateway_id=gw_id) raise GatewayNotFound(gateway_id=gw_id)
return gw return gw
@ -172,9 +174,9 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase):
for k, v in six.iteritems(mapping_info): for k, v in six.iteritems(mapping_info):
if v and k != NETWORK_ID: if v and k != NETWORK_ID:
filters[k] = [v] filters[k] = [v]
query = self._get_collection_query(context, query = model_query.get_collection_query(context,
nsx_models.NetworkConnection, nsx_models.NetworkConnection,
filters) filters)
return query.one() if only_one else query.all() return query.one() if only_one else query.all()
def _unset_default_network_gateways(self, context): def _unset_default_network_gateways(self, context):
@ -265,12 +267,12 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase):
page_reverse=False): page_reverse=False):
marker_obj = self._get_marker_obj( marker_obj = self._get_marker_obj(
context, 'network_gateway', limit, marker) context, 'network_gateway', limit, marker)
return self._get_collection(context, nsx_models.NetworkGateway, return model_query.get_collection(context, nsx_models.NetworkGateway,
self._make_network_gateway_dict, self._make_network_gateway_dict,
filters=filters, fields=fields, filters=filters, fields=fields,
sorts=sorts, limit=limit, sorts=sorts, limit=limit,
marker_obj=marker_obj, marker_obj=marker_obj,
page_reverse=page_reverse) page_reverse=page_reverse)
def connect_network(self, context, network_gateway_id, def connect_network(self, context, network_gateway_id,
network_mapping_info): network_mapping_info):
@ -396,14 +398,14 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase):
def _get_gateway_device(self, context, device_id): def _get_gateway_device(self, context, device_id):
try: try:
return self._get_by_id(context, return model_query.get_by_id(context,
nsx_models.NetworkGatewayDevice, nsx_models.NetworkGatewayDevice,
device_id) device_id)
except sa_orm_exc.NoResultFound: except sa_orm_exc.NoResultFound:
raise GatewayDeviceNotFound(device_id=device_id) raise GatewayDeviceNotFound(device_id=device_id)
def _is_device_in_use(self, context, device_id): def _is_device_in_use(self, context, device_id):
query = self._get_collection_query( query = model_query.get_collection_query(
context, nsx_models.NetworkGatewayDeviceReference, context, nsx_models.NetworkGatewayDeviceReference,
{'id': [device_id]}) {'id': [device_id]})
return query.first() return query.first()

View File

@ -13,25 +13,25 @@
# under the License. # under the License.
# #
from neutron.db import db_base_plugin_v2
from neutron.extensions import l3
from oslo_log import log as logging from oslo_log import log as logging
from neutron.db import _resource_extend as resource_extend
from vmware_nsx.db import nsxv_models from vmware_nsx.db import nsxv_models
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@resource_extend.has_resource_extenders
class NsxRouterMixin(object): class NsxRouterMixin(object):
"""Mixin class to enable nsx router support.""" """Mixin class to enable nsx router support."""
nsx_attributes = [] nsx_attributes = []
def _extend_nsx_router_dict(self, router_res, router_db): @staticmethod
def _extend_nsx_router_dict(router_res, router_db, nsx_attributes):
nsx_attrs = router_db['nsx_attributes'] nsx_attrs = router_db['nsx_attributes']
# Return False if nsx attributes are not definied for this for attr in nsx_attributes:
# neutron router
for attr in self.nsx_attributes:
name = attr['name'] name = attr['name']
default = attr['default'] default = attr['default']
router_res[name] = ( router_res[name] = (
@ -61,7 +61,3 @@ class NsxRouterMixin(object):
name, default) name, default)
LOG.debug("Nsx router extension successfully processed " LOG.debug("Nsx router extension successfully processed "
"for router:%s", router_db['id']) "for router:%s", router_db['id'])
# Register dict extend functions for ports
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
l3.ROUTERS, ['_extend_nsx_router_dict'])

View File

@ -16,9 +16,10 @@
from sqlalchemy.orm import exc from sqlalchemy.orm import exc
from neutron.api.v2 import attributes as attr from neutron.api.v2 import attributes as attr
from neutron.db import _model_query as model_query
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import api as db_api from neutron.db import api as db_api
from neutron.db import db_base_plugin_v2
from neutron.db import models_v2 from neutron.db import models_v2
from oslo_log import log from oslo_log import log
@ -30,6 +31,7 @@ from vmware_nsx.extensions import qos_queue as qos
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@resource_extend.has_resource_extenders
class QoSDbMixin(qos.QueuePluginBase): class QoSDbMixin(qos.QueuePluginBase):
"""Mixin class to add queues.""" """Mixin class to add queues."""
@ -54,19 +56,20 @@ class QoSDbMixin(qos.QueuePluginBase):
def _get_qos_queue(self, context, queue_id): def _get_qos_queue(self, context, queue_id):
try: try:
return self._get_by_id(context, nsx_models.QoSQueue, queue_id) return model_query.get_by_id(context, nsx_models.QoSQueue,
queue_id)
except exc.NoResultFound: except exc.NoResultFound:
raise qos.QueueNotFound(id=queue_id) raise qos.QueueNotFound(id=queue_id)
def get_qos_queues(self, context, filters=None, fields=None, sorts=None, def get_qos_queues(self, context, filters=None, fields=None, sorts=None,
limit=None, marker=None, page_reverse=False): limit=None, marker=None, page_reverse=False):
marker_obj = self._get_marker_obj(context, 'qos_queue', limit, marker) marker_obj = self._get_marker_obj(context, 'qos_queue', limit, marker)
return self._get_collection(context, nsx_models.QoSQueue, return model_query.get_collection(context, nsx_models.QoSQueue,
self._make_qos_queue_dict, self._make_qos_queue_dict,
filters=filters, fields=fields, filters=filters, fields=fields,
sorts=sorts, limit=limit, sorts=sorts, limit=limit,
marker_obj=marker_obj, marker_obj=marker_obj,
page_reverse=page_reverse) page_reverse=page_reverse)
def delete_qos_queue(self, context, queue_id): def delete_qos_queue(self, context, queue_id):
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
@ -83,12 +86,14 @@ class QoSDbMixin(qos.QueuePluginBase):
queue_id=queue_id)) queue_id=queue_id))
def _get_port_queue_bindings(self, context, filters=None, fields=None): def _get_port_queue_bindings(self, context, filters=None, fields=None):
return self._get_collection(context, nsx_models.PortQueueMapping, return model_query.get_collection(context,
self._make_port_queue_binding_dict, nsx_models.PortQueueMapping,
filters=filters, fields=fields) self._make_port_queue_binding_dict,
filters=filters, fields=fields)
def _delete_port_queue_mapping(self, context, port_id): def _delete_port_queue_mapping(self, context, port_id):
query = self._model_query(context, nsx_models.PortQueueMapping) query = model_query.query_with_hooks(context,
nsx_models.PortQueueMapping)
try: try:
binding = query.filter( binding = query.filter(
nsx_models.PortQueueMapping.port_id == port_id).one() nsx_models.PortQueueMapping.port_id == port_id).one()
@ -110,9 +115,11 @@ class QoSDbMixin(qos.QueuePluginBase):
queue_id=queue_id)) queue_id=queue_id))
def _get_network_queue_bindings(self, context, filters=None, fields=None): def _get_network_queue_bindings(self, context, filters=None, fields=None):
return self._get_collection(context, nsx_models.NetworkQueueMapping, return model_query.get_collection(
self._make_network_queue_binding_dict, context,
filters=filters, fields=fields) nsx_models.NetworkQueueMapping,
self._make_network_queue_binding_dict,
filters=filters, fields=fields)
def _delete_network_queue_mapping(self, context, network_id): def _delete_network_queue_mapping(self, context, network_id):
query = self._model_query(context, nsx_models.NetworkQueueMapping) query = self._model_query(context, nsx_models.NetworkQueueMapping)
@ -121,24 +128,15 @@ class QoSDbMixin(qos.QueuePluginBase):
if binding: if binding:
context.session.delete(binding) context.session.delete(binding)
def _extend_dict_qos_queue(self, obj_res, obj_db): @staticmethod
@resource_extend.extends([attr.NETWORKS])
@resource_extend.extends([attr.PORTS])
def _extend_dict_qos_queue(obj_res, obj_db):
queue_mapping = obj_db['qos_queue'] queue_mapping = obj_db['qos_queue']
if queue_mapping: if queue_mapping:
obj_res[qos.QUEUE] = queue_mapping.get('queue_id') obj_res[qos.QUEUE] = queue_mapping.get('queue_id')
return obj_res return obj_res
def _extend_port_dict_qos_queue(self, port_res, port_db):
self._extend_dict_qos_queue(port_res, port_db)
def _extend_network_dict_qos_queue(self, network_res, network_db):
self._extend_dict_qos_queue(network_res, network_db)
# Register dict extend functions for networks and ports
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.NETWORKS, ['_extend_network_dict_qos_queue'])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.PORTS, ['_extend_port_dict_qos_queue'])
def _make_qos_queue_dict(self, queue, fields=None): def _make_qos_queue_dict(self, queue, fields=None):
res = {'id': queue['id'], res = {'id': queue['id'],
'name': queue.get('name'), 'name': queue.get('name'),
@ -203,9 +201,9 @@ class QoSDbMixin(qos.QueuePluginBase):
filters = {'device_id': [port.get('device_id')], filters = {'device_id': [port.get('device_id')],
'network_id': [network['network_id'] for 'network_id': [network['network_id'] for
network in networks_with_same_queue]} network in networks_with_same_queue]}
query = self._model_query(context, models_v2.Port.id) query = model_query.query_with_hooks(context, models_v2.Port.id)
query = self._apply_filters_to_query(query, models_v2.Port, model_query.apply_filters(query, models_v2.Port,
filters) filters, context)
ports_ids = [p[0] for p in query] ports_ids = [p[0] for p in query]
if ports_ids: if ports_ids:
# shared queue already exists find the queue id # shared queue already exists find the queue id

View File

@ -16,7 +16,7 @@
from sqlalchemy.orm import exc from sqlalchemy.orm import exc
from neutron.api.v2 import attributes as attr from neutron.api.v2 import attributes as attr
from neutron.db import db_base_plugin_v2 from neutron.db import _resource_extend as resource_extend
from oslo_db import exception as db_exc from oslo_db import exception as db_exc
from oslo_log import log as logging from oslo_log import log as logging
@ -27,15 +27,15 @@ from vmware_nsx.extensions import vnicindex as vnicidx
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@resource_extend.has_resource_extenders
class VnicIndexDbMixin(object): class VnicIndexDbMixin(object):
def _extend_port_vnic_index_binding(self, port_res, port_db): @staticmethod
@resource_extend.extends([attr.PORTS])
def _extend_port_vnic_index_binding(port_res, port_db):
state = port_db.vnic_index state = port_db.vnic_index
port_res[vnicidx.VNIC_INDEX] = state.index if state else None port_res[vnicidx.VNIC_INDEX] = state.index if state else None
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.PORTS, ['_extend_port_vnic_index_binding'])
def _get_port_vnic_index(self, context, port_id): def _get_port_vnic_index(self, context, port_id):
"""Returns the vnic index for the given port. """Returns the vnic index for the given port.
If the port is not associated with any vnic then return None If the port is not associated with any vnic then return None

View File

@ -15,6 +15,11 @@
# under the License. # under the License.
# #
# Note: this import should be here in order to appear before NeutronDbPluginV2
# in each of the plugins. If not: security-group/-rule will not have all the
# relevant extend dict registries.
from neutron.db.models import securitygroup # noqa
from vmware_nsx.plugins.dvs import plugin as dvs from vmware_nsx.plugins.dvs import plugin as dvs
from vmware_nsx.plugins.nsx_mh import plugin as nsx_mh from vmware_nsx.plugins.nsx_mh import plugin as nsx_mh
from vmware_nsx.plugins.nsx_v import plugin as nsx_v from vmware_nsx.plugins.nsx_v import plugin as nsx_v

View File

@ -15,12 +15,12 @@
import uuid import uuid
from neutron_lib import context as n_context
from oslo_log import log as logging from oslo_log import log as logging
from oslo_utils import excutils from oslo_utils import excutils
from neutron.api import extensions as neutron_extensions from neutron.api import extensions as neutron_extensions
from neutron.api.v2 import attributes as attr from neutron.api.v2 import attributes as attr
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import agentschedulers_db from neutron.db import agentschedulers_db
from neutron.db import allowedaddresspairs_db as addr_pair_db from neutron.db import allowedaddresspairs_db as addr_pair_db
@ -62,6 +62,7 @@ from vmware_nsx.dvs import dvs_utils
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@resource_extend.has_resource_extenders
class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin, class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
agentschedulers_db.DhcpAgentSchedulerDbMixin, agentschedulers_db.DhcpAgentSchedulerDbMixin,
db_base_plugin_v2.NeutronDbPluginV2, db_base_plugin_v2.NeutronDbPluginV2,
@ -104,11 +105,9 @@ class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
self._dvs = dvs.SingleDvsManager() self._dvs = dvs.SingleDvsManager()
self.setup_dhcpmeta_access() self.setup_dhcpmeta_access()
# Register extend dict methods for port resources. @staticmethod
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( @resource_extend.extends([attr.PORTS])
attr.PORTS, ['_ext_extend_port_dict']) def _extend_port_dict_binding(result, portdb):
def _extend_port_dict_binding(self, portdb, result):
result[pbin.VIF_TYPE] = nsx_constants.VIF_TYPE_DVS result[pbin.VIF_TYPE] = nsx_constants.VIF_TYPE_DVS
port_attr = portdb.get('nsx_port_attributes') port_attr = portdb.get('nsx_port_attributes')
if port_attr: if port_attr:
@ -117,14 +116,8 @@ class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
result[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL result[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL
result[pbin.VIF_DETAILS] = { result[pbin.VIF_DETAILS] = {
# TODO(rkukura): Replace with new VIF security details # TODO(rkukura): Replace with new VIF security details
pbin.CAP_PORT_FILTER: # security-groups extension supported by this plugin
'security-group' in self.supported_extension_aliases} pbin.CAP_PORT_FILTER: True}
def _ext_extend_port_dict(self, result, portdb):
ctx = n_context.get_admin_context()
with db_api.context_manager.writer.using(ctx):
self._extend_port_dict_binding(portdb,
result)
def _extend_network_dict_provider(self, context, network, def _extend_network_dict_provider(self, context, network,
multiprovider=None, bindings=None): multiprovider=None, bindings=None):
@ -202,7 +195,7 @@ class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
net_db = self._get_network(context, new_net['id']) net_db = self._get_network(context, new_net['id'])
net_db['vlan_transparent'] = trunk_mode net_db['vlan_transparent'] = trunk_mode
net_data['vlan_transparent'] = trunk_mode net_data['vlan_transparent'] = trunk_mode
self._apply_dict_extend_functions('networks', net_data, net_db) resource_extend.apply_funcs('networks', net_data, net_db)
nsx_db.add_network_binding( nsx_db.add_network_binding(
context.session, new_net['id'], context.session, new_net['id'],
@ -223,7 +216,7 @@ class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
net_model = self._get_network(context, net_data['id']) net_model = self._get_network(context, net_data['id'])
self._apply_dict_extend_functions('networks', new_net, net_model) resource_extend.apply_funcs('networks', new_net, net_model)
self.handle_network_dhcp_access(context, new_net, self.handle_network_dhcp_access(context, new_net,
action='create_network') action='create_network')
@ -397,7 +390,7 @@ class NsxDvsV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
port_model = self._get_port(context, port_data['id']) port_model = self._get_port(context, port_data['id'])
self._apply_dict_extend_functions('ports', port_data, port_model) resource_extend.apply_funcs('ports', port_data, port_model)
self.handle_port_dhcp_access(context, port_data, action='create_port') self.handle_port_dhcp_access(context, port_data, action='create_port')
return port_data return port_data

View File

@ -32,6 +32,8 @@ import webob.exc
from neutron.api import extensions as neutron_extensions from neutron.api import extensions as neutron_extensions
from neutron.api.v2 import attributes as attr from neutron.api.v2 import attributes as attr
from neutron.api.v2 import base from neutron.api.v2 import base
from neutron.db import _model_query as model_query
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import agentschedulers_db from neutron.db import agentschedulers_db
from neutron.db import allowedaddresspairs_db as addr_pair_db from neutron.db import allowedaddresspairs_db as addr_pair_db
@ -1005,7 +1007,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
net_model = self._get_network(context, new_net['id']) net_model = self._get_network(context, new_net['id'])
self._apply_dict_extend_functions('networks', new_net, net_model) resource_extend.apply_funcs('networks', new_net, net_model)
self.handle_network_dhcp_access(context, new_net, self.handle_network_dhcp_access(context, new_net,
action='create_network') action='create_network')
return new_net return new_net
@ -1197,7 +1199,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
port_model = self._get_port(context, neutron_port_id) port_model = self._get_port(context, neutron_port_id)
self._apply_dict_extend_functions('ports', port_data, port_model) resource_extend.apply_funcs('ports', port_data, port_model)
self.handle_port_dhcp_access(context, port_data, action='create_port') self.handle_port_dhcp_access(context, port_data, action='create_port')
return port_data return port_data
@ -2155,7 +2157,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
LOG.error("Rolling back database changes for gateway device %s " LOG.error("Rolling back database changes for gateway device %s "
"because of an error in the NSX backend", device_id) "because of an error in the NSX backend", device_id)
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
query = self._model_query( query = model_query.query_with_hooks(
context, nsx_models.NetworkGatewayDevice).filter( context, nsx_models.NetworkGatewayDevice).filter(
nsx_models.NetworkGatewayDevice.id == device_id) nsx_models.NetworkGatewayDevice.id == device_id)
if is_create: if is_create:
@ -2191,7 +2193,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# set NSX GW device in neutron database and update status # set NSX GW device in neutron database and update status
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
query = self._model_query( query = model_query.query_with_hooks(
context, nsx_models.NetworkGatewayDevice).filter( context, nsx_models.NetworkGatewayDevice).filter(
nsx_models.NetworkGatewayDevice.id == neutron_id) nsx_models.NetworkGatewayDevice.id == neutron_id)
query.update({'status': device_status, query.update({'status': device_status,
@ -2230,7 +2232,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
nsx_id) nsx_id)
# update status # update status
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
query = self._model_query( query = model_query.query_with_hooks(
context, nsx_models.NetworkGatewayDevice).filter( context, nsx_models.NetworkGatewayDevice).filter(
nsx_models.NetworkGatewayDevice.id == neutron_id) nsx_models.NetworkGatewayDevice.id == neutron_id)
query.update({'status': device_status}, query.update({'status': device_status},
@ -2265,7 +2267,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# TODO(salv-orlando): Asynchronous sync for gateway device status # TODO(salv-orlando): Asynchronous sync for gateway device status
# Update status in database # Update status in database
with db_api.context_manager.writer.using(context): with db_api.context_manager.writer.using(context):
query = self._model_query( query = model_query.query_with_hooks(
context, nsx_models.NetworkGatewayDevice).filter( context, nsx_models.NetworkGatewayDevice).filter(
nsx_models.NetworkGatewayDevice.id == device_id) nsx_models.NetworkGatewayDevice.id == device_id)
query.update({'status': device_status}, query.update({'status': device_status},

View File

@ -38,6 +38,7 @@ from neutron.common import ipv6_utils
from neutron.common import rpc as n_rpc from neutron.common import rpc as n_rpc
from neutron.common import topics from neutron.common import topics
from neutron.common import utils as n_utils from neutron.common import utils as n_utils
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import address_scope_db from neutron.db import address_scope_db
from neutron.db import agents_db from neutron.db import agents_db
@ -136,6 +137,7 @@ ROUTER_SIZE = routersize.ROUTER_SIZE
VALID_EDGE_SIZES = routersize.VALID_EDGE_SIZES VALID_EDGE_SIZES = routersize.VALID_EDGE_SIZES
@resource_extend.has_resource_extenders
class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin, class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
agents_db.AgentDbMixin, agents_db.AgentDbMixin,
db_base_plugin_v2.NeutronDbPluginV2, db_base_plugin_v2.NeutronDbPluginV2,
@ -289,16 +291,6 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# Bind QoS notifications # Bind QoS notifications
qos_driver.register(self) qos_driver.register(self)
# Register extend dict methods for network and port resources.
# Each extension driver that supports extend attribute for the resources
# can add those attribute to the result.
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.NETWORKS, ['_ext_extend_network_dict'])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.PORTS, ['_ext_extend_port_dict'])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attr.SUBNETS, ['_ext_extend_subnet_dict'])
def init_complete(self, resource, event, trigger, **kwargs): def init_complete(self, resource, event, trigger, **kwargs):
has_metadata_cfg = ( has_metadata_cfg = (
cfg.CONF.nsxv.nova_metadata_ips cfg.CONF.nsxv.nova_metadata_ips
@ -378,24 +370,34 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# Bind FWaaS callbacks to the driver # Bind FWaaS callbacks to the driver
self.fwaas_callbacks = fwaas_callbacks.NsxvFwaasCallbacks() self.fwaas_callbacks = fwaas_callbacks.NsxvFwaasCallbacks()
def _ext_extend_network_dict(self, result, netdb): @staticmethod
@resource_extend.extends([attr.NETWORKS])
def _ext_extend_network_dict(result, netdb):
ctx = n_context.get_admin_context() ctx = n_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_network_dict( plugin._extension_manager.extend_network_dict(
ctx.session, netdb, result) ctx.session, netdb, result)
def _ext_extend_port_dict(self, result, portdb): @staticmethod
@resource_extend.extends([attr.PORTS])
def _ext_extend_port_dict(result, portdb):
ctx = n_context.get_admin_context() ctx = n_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_port_dict( plugin._extension_manager.extend_port_dict(
ctx.session, portdb, result) ctx.session, portdb, result)
self._extend_port_dict_binding(portdb,
result)
def _ext_extend_subnet_dict(self, result, subnetdb): @staticmethod
@resource_extend.extends([attr.SUBNETS])
def _ext_extend_subnet_dict(result, subnetdb):
ctx = n_context.get_admin_context() ctx = n_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_subnet_dict( plugin._extension_manager.extend_subnet_dict(
ctx.session, subnetdb, result) ctx.session, subnetdb, result)
def _create_security_group_container(self): def _create_security_group_container(self):
@ -448,6 +450,13 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
r["distributed"] = False r["distributed"] = False
r["router_type"] = router_type r["router_type"] = router_type
@staticmethod
@resource_extend.extends([l3.ROUTERS])
def _extend_nsx_router_dict(router_res, router_db):
router_type_obj = rt_rtr.RouterType_mixin()
router_type_obj._extend_nsx_router_dict(
router_res, router_db, router_type_obj.nsx_attributes)
def _create_cluster_default_fw_section(self): def _create_cluster_default_fw_section(self):
section_name = 'OS Cluster Security Group section' section_name = 'OS Cluster Security Group section'
@ -1229,7 +1238,7 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
net_model = self._get_network(context, new_net['id']) net_model = self._get_network(context, new_net['id'])
self._apply_dict_extend_functions('networks', new_net, net_model) resource_extend.apply_funcs('networks', new_net, net_model)
return new_net return new_net
def _update_qos_on_created_network(self, context, net_data): def _update_qos_on_created_network(self, context, net_data):
@ -1741,7 +1750,16 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
port_model = self._get_port(context, port_data['id']) port_model = self._get_port(context, port_data['id'])
self._apply_dict_extend_functions('ports', port_data, port_model) resource_extend.apply_funcs('ports', port_data, port_model)
self._remove_provider_security_groups_from_list(port_data)
return port_data
def _make_port_dict(self, port, fields=None,
process_extensions=True):
port_data = super(NsxVPluginV2, self)._make_port_dict(
port, fields=fields,
process_extensions=process_extensions)
self._remove_provider_security_groups_from_list(port_data)
return port_data return port_data
def _get_port_subnet_mask(self, context, port): def _get_port_subnet_mask(self, context, port):
@ -2190,7 +2208,9 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
self._delete_dhcp_static_binding(context, neutron_db_port) self._delete_dhcp_static_binding(context, neutron_db_port)
def _extend_port_dict_binding(self, portdb, result): @staticmethod
@resource_extend.extends([attr.PORTS])
def _extend_nsx_port_dict_binding(result, portdb):
result[pbin.VIF_TYPE] = nsx_constants.VIF_TYPE_DVS result[pbin.VIF_TYPE] = nsx_constants.VIF_TYPE_DVS
port_attr = portdb.get('nsx_port_attributes') port_attr = portdb.get('nsx_port_attributes')
if port_attr: if port_attr:
@ -2199,8 +2219,8 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
result[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL result[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL
result[pbin.VIF_DETAILS] = { result[pbin.VIF_DETAILS] = {
# TODO(rkukura): Replace with new VIF security details # TODO(rkukura): Replace with new VIF security details
pbin.CAP_PORT_FILTER: # security-groups extension supported by this plugin
'security-group' in self.supported_extension_aliases} pbin.CAP_PORT_FILTER: True}
def delete_subnet(self, context, id): def delete_subnet(self, context, id):
subnet = self._get_subnet(context, id) subnet = self._get_subnet(context, id)
@ -2460,10 +2480,9 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
self._update_subnet_dhcp_status(subnet, context) self._update_subnet_dhcp_status(subnet, context)
return subnet return subnet
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( @staticmethod
attr.SUBNETS, ['_extend_subnet_dict_extended_attributes']) @resource_extend.extends([attr.SUBNETS])
def _extend_subnet_dict_extended_attributes(subnet_res, subnet_db):
def _extend_subnet_dict_extended_attributes(self, subnet_res, subnet_db):
subnet_attr = subnet_db.get('nsxv_subnet_attributes') subnet_attr = subnet_db.get('nsxv_subnet_attributes')
if subnet_attr: if subnet_attr:
subnet_res['dns_search_domain'] = subnet_attr.dns_search_domain subnet_res['dns_search_domain'] = subnet_attr.dns_search_domain
@ -3027,10 +3046,9 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
super(NsxVPluginV2, self).delete_router(context, id) super(NsxVPluginV2, self).delete_router(context, id)
router_driver.delete_router(context, id) router_driver.delete_router(context, id)
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( @staticmethod
attr.NETWORKS, ['_extend_availability_zone_hints']) @resource_extend.extends([attr.NETWORKS])
def _extend_availability_zone_hints(net_res, net_db):
def _extend_availability_zone_hints(self, net_res, net_db):
net_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list( net_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list(
net_db[az_ext.AZ_HINTS]) net_db[az_ext.AZ_HINTS])
@ -3078,12 +3096,11 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
if validators.is_attr_set(r.get('flavor_id')): if validators.is_attr_set(r.get('flavor_id')):
router_db.flavor_id = r['flavor_id'] router_db.flavor_id = r['flavor_id']
def add_flavor_id(plugin, router_res, router_db): @staticmethod
@resource_extend.extends([l3.ROUTERS])
def add_flavor_id(router_res, router_db):
router_res['flavor_id'] = router_db['flavor_id'] router_res['flavor_id'] = router_db['flavor_id']
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
l3.ROUTERS, [add_flavor_id])
def get_router(self, context, id, fields=None): def get_router(self, context, id, fields=None):
router = super(NsxVPluginV2, self).get_router(context, id, fields) router = super(NsxVPluginV2, self).get_router(context, id, fields)
if router.get("distributed") and 'router_type' in router: if router.get("distributed") and 'router_type' in router:

View File

@ -22,6 +22,7 @@ from neutron.api.rpc.handlers import metadata_rpc
from neutron.api.v2 import attributes from neutron.api.v2 import attributes
from neutron.common import rpc as n_rpc from neutron.common import rpc as n_rpc
from neutron.common import topics from neutron.common import topics
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils from neutron.db import _utils as db_utils
from neutron.db import address_scope_db from neutron.db import address_scope_db
from neutron.db import agents_db from neutron.db import agents_db
@ -64,6 +65,7 @@ from neutron_lib.callbacks import resources
from neutron_lib import constants as const from neutron_lib import constants as const
from neutron_lib import context as q_context from neutron_lib import context as q_context
from neutron_lib import exceptions as n_exc from neutron_lib import exceptions as n_exc
from neutron_lib.plugins import directory
from neutron_lib.utils import helpers from neutron_lib.utils import helpers
from oslo_config import cfg from oslo_config import cfg
from oslo_db import exception as db_exc from oslo_db import exception as db_exc
@ -119,6 +121,7 @@ NSX_V3_EXCLUDED_PORT_NSGROUP_NAME = 'neutron_excluded_port_nsgroup'
# this needs to be above securitygroups_db.SecurityGroupDbMixin. # this needs to be above securitygroups_db.SecurityGroupDbMixin.
# FIXME(arosen): we can solve this inheritance order issue by just mixining in # FIXME(arosen): we can solve this inheritance order issue by just mixining in
# the classes into a new class to handle the order correctly. # the classes into a new class to handle the order correctly.
@resource_extend.has_resource_extenders
class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin, class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
extended_security_group.ExtendedSecurityGroupPropertiesMixin, extended_security_group.ExtendedSecurityGroupPropertiesMixin,
addr_pair_db.AllowedAddressPairsMixin, addr_pair_db.AllowedAddressPairsMixin,
@ -242,17 +245,6 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# Register NSXv3 trunk driver to support trunk extensions # Register NSXv3 trunk driver to support trunk extensions
self.trunk_driver = trunk_driver.NsxV3TrunkDriver.create(self) self.trunk_driver = trunk_driver.NsxV3TrunkDriver.create(self)
# Register extend dict methods for network and port resources.
# Each extension driver that supports extend attribute for the resources
# can add those attribute to the result.
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attributes.NETWORKS, ['_ext_extend_network_dict',
'_extend_availability_zone_hints'])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attributes.PORTS, ['_ext_extend_port_dict'])
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
attributes.SUBNETS, ['_ext_extend_subnet_dict'])
def init_availability_zones(self): def init_availability_zones(self):
# availability zones are supported only with native dhcp # availability zones are supported only with native dhcp
# if not - the default az will be loaded and used internally only # if not - the default az will be loaded and used internally only
@ -320,7 +312,8 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
for az in self.get_azs_list(): for az in self.get_azs_list():
az.translate_configured_names_to_uuids(self.nsxlib) az.translate_configured_names_to_uuids(self.nsxlib)
def _extend_port_dict_binding(self, context, port_data): def _extend_nsx_port_dict_binding(self, context, port_data):
# Not using the register api for this because we need the context
port_data[pbin.VIF_TYPE] = pbin.VIF_TYPE_OVS port_data[pbin.VIF_TYPE] = pbin.VIF_TYPE_OVS
port_data[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL port_data[pbin.VNIC_TYPE] = pbin.VNIC_NORMAL
if 'network_id' in port_data: if 'network_id' in port_data:
@ -557,22 +550,34 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return self.conn.consume_in_threads() return self.conn.consume_in_threads()
def _ext_extend_network_dict(self, result, netdb): @staticmethod
@resource_extend.extends([attributes.NETWORKS])
def _ext_extend_network_dict(result, netdb):
ctx = q_context.get_admin_context() ctx = q_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_network_dict( plugin._extension_manager.extend_network_dict(
ctx.session, netdb, result) ctx.session, netdb, result)
def _ext_extend_port_dict(self, result, portdb): @staticmethod
@resource_extend.extends([attributes.PORTS])
def _ext_extend_port_dict(result, portdb):
ctx = q_context.get_admin_context() ctx = q_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_port_dict( plugin._extension_manager.extend_port_dict(
ctx.session, portdb, result) ctx.session, portdb, result)
def _ext_extend_subnet_dict(self, result, subnetdb): @staticmethod
@resource_extend.extends([attributes.SUBNETS])
def _ext_extend_subnet_dict(result, subnetdb):
ctx = q_context.get_admin_context() ctx = q_context.get_admin_context()
# get the core plugin as this is a static method with no 'self'
plugin = directory.get_plugin()
with db_api.context_manager.writer.using(ctx): with db_api.context_manager.writer.using(ctx):
self._extension_manager.extend_subnet_dict( plugin._extension_manager.extend_subnet_dict(
ctx.session, subnetdb, result) ctx.session, subnetdb, result)
def _validate_provider_create(self, context, network_data, az): def _validate_provider_create(self, context, network_data, az):
@ -829,7 +834,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
net_model = self._get_network(context, created_net['id']) net_model = self._get_network(context, created_net['id'])
self._apply_dict_extend_functions('networks', created_net, net_model) resource_extend.apply_funcs('networks', created_net, net_model)
if qos_consts.QOS_POLICY_ID in net_data: if qos_consts.QOS_POLICY_ID in net_data:
# attach the policy to the network in neutron DB # attach the policy to the network in neutron DB
@ -2041,7 +2046,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# sgids is a set() so we need to | it in. # sgids is a set() so we need to | it in.
if provider_groups: if provider_groups:
sgids = list(set(sgids) | set(provider_groups)) sgids = list(set(sgids) | set(provider_groups))
self._extend_port_dict_binding(context, port_data) self._extend_nsx_port_dict_binding(context, port_data)
if validators.is_attr_set(port_data.get(mac_ext.MAC_LEARNING)): if validators.is_attr_set(port_data.get(mac_ext.MAC_LEARNING)):
if is_psec_on: if is_psec_on:
msg = _('Mac learning requires that port security be ' msg = _('Mac learning requires that port security be '
@ -2105,7 +2110,8 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# this extra lookup is necessary to get the # this extra lookup is necessary to get the
# latest db model for the extension functions # latest db model for the extension functions
port_model = self._get_port(context, port_data['id']) port_model = self._get_port(context, port_data['id'])
self._apply_dict_extend_functions('ports', port_data, port_model) resource_extend.apply_funcs('ports', port_data, port_model)
self._remove_provider_security_groups_from_list(port_data)
# Add Mac/IP binding to native DHCP server and neutron DB. # Add Mac/IP binding to native DHCP server and neutron DB.
if cfg.CONF.nsx_v3.native_dhcp_metadata: if cfg.CONF.nsx_v3.native_dhcp_metadata:
@ -2436,7 +2442,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
context, updated_port) context, updated_port)
self._process_portbindings_create_and_update( self._process_portbindings_create_and_update(
context, port['port'], updated_port) context, port['port'], updated_port)
self._extend_port_dict_binding(context, updated_port) self._extend_nsx_port_dict_binding(context, updated_port)
mac_learning_state = updated_port.get(mac_ext.MAC_LEARNING) mac_learning_state = updated_port.get(mac_ext.MAC_LEARNING)
if mac_learning_state is not None: if mac_learning_state is not None:
if port_security and mac_learning_state: if port_security and mac_learning_state:
@ -2505,8 +2511,9 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
return updated_port return updated_port
def _extend_get_port_dict_binding(self, context, port): def _extend_get_port_dict_qos_and_binding(self, context, port):
self._extend_port_dict_binding(context, port) # Not using the register api for this because we need the context
self._extend_nsx_port_dict_binding(context, port)
# add the qos policy id from the DB # add the qos policy id from the DB
if 'id' in port: if 'id' in port:
@ -2515,8 +2522,11 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
def get_port(self, context, id, fields=None): def get_port(self, context, id, fields=None):
port = super(NsxV3Plugin, self).get_port(context, id, fields=None) port = super(NsxV3Plugin, self).get_port(context, id, fields=None)
self._extend_get_port_dict_binding(context, port) if 'id' in port:
port_model = self._get_port(context, port['id'])
resource_extend.apply_funcs('ports', port, port_model)
self._extend_get_port_dict_qos_and_binding(context, port)
self._remove_provider_security_groups_from_list(port)
return db_utils.resource_fields(port, fields) return db_utils.resource_fields(port, fields)
def get_ports(self, context, filters=None, fields=None, def get_ports(self, context, filters=None, fields=None,
@ -2530,7 +2540,11 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
limit, marker, page_reverse)) limit, marker, page_reverse))
# Add port extensions # Add port extensions
for port in ports: for port in ports:
self._extend_get_port_dict_binding(context, port) if 'id' in port:
port_model = self._get_port(context, port['id'])
resource_extend.apply_funcs('ports', port, port_model)
self._extend_get_port_dict_qos_and_binding(context, port)
self._remove_provider_security_groups_from_list(port)
return (ports if not fields else return (ports if not fields else
[db_utils.resource_fields(port, fields) for port in ports]) [db_utils.resource_fields(port, fields) for port in ports])
@ -3520,7 +3534,9 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
# Validate against the configured AZs # Validate against the configured AZs
return self.validate_obj_azs(availability_zones) return self.validate_obj_azs(availability_zones)
def _extend_availability_zone_hints(self, net_res, net_db): @staticmethod
@resource_extend.extends([attributes.NETWORKS])
def _extend_availability_zone_hints(net_res, net_db):
net_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list( net_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list(
net_db[az_ext.AZ_HINTS]) net_db[az_ext.AZ_HINTS])
if cfg.CONF.nsx_v3.native_dhcp_metadata: if cfg.CONF.nsx_v3.native_dhcp_metadata:

View File

@ -27,6 +27,7 @@ from oslo_log import log as logging
from vmware_nsx.common import utils as com_utils from vmware_nsx.common import utils as com_utils
from vmware_nsx.db import db as nsx_db from vmware_nsx.db import db as nsx_db
from vmware_nsx.db import extended_security_group as extended_secgroup from vmware_nsx.db import extended_security_group as extended_secgroup
from vmware_nsx.db import extended_security_group_rule as extend_sg_rule
from vmware_nsx.db import nsx_models from vmware_nsx.db import nsx_models
from vmware_nsx.db import nsxv_db from vmware_nsx.db import nsxv_db
from vmware_nsx.db import nsxv_models from vmware_nsx.db import nsxv_models
@ -44,7 +45,8 @@ LOG = logging.getLogger(__name__)
class NeutronSecurityGroupDB( class NeutronSecurityGroupDB(
utils.NeutronDbClient, utils.NeutronDbClient,
securitygroups_db.SecurityGroupDbMixin, securitygroups_db.SecurityGroupDbMixin,
extended_secgroup.ExtendedSecurityGroupPropertiesMixin): extended_secgroup.ExtendedSecurityGroupPropertiesMixin,
extend_sg_rule.ExtendedSecurityGroupRuleMixin):
def __init__(self): def __init__(self):
super(NeutronSecurityGroupDB, self) super(NeutronSecurityGroupDB, self)

View File

@ -37,7 +37,7 @@ PLUGIN_NAME = ('vmware_nsx.tests.unit.extensions.'
class ProviderSecurityGroupTestPlugin( class ProviderSecurityGroupTestPlugin(
db_base_plugin_v2.NeutronDbPluginV2, db_base_plugin_v2.NeutronDbPluginV2,
extended_security_group.ExtendedSecurityGroupPropertiesMixin, extended_security_group.ExtendedSecurityGroupPropertiesMixin,
securitygroups_db.SecurityGroupDbMixin): securitygroups_db.SecurityGroupDbMixin):
supported_extension_aliases = ["security-group", supported_extension_aliases = ["security-group",
"provider-security-group"] "provider-security-group"]
@ -97,6 +97,14 @@ class ProviderSecurityGroupTestPlugin(
context, port, original_port, updated_port) context, port, original_port, updated_port)
return self.get_port(context, id) return self.get_port(context, id)
def _make_port_dict(self, port, fields=None, process_extensions=True):
port_data = super(
ProviderSecurityGroupTestPlugin, self)._make_port_dict(
port, fields=fields,
process_extensions=process_extensions)
self._remove_provider_security_groups_from_list(port_data)
return port_data
def delete_security_group(self, context, id): def delete_security_group(self, context, id):
self._prevent_non_admin_delete_provider_sg(context, id) self._prevent_non_admin_delete_provider_sg(context, id)
super(ProviderSecurityGroupTestPlugin, super(ProviderSecurityGroupTestPlugin,

View File

@ -5023,7 +5023,7 @@ class TestRouterFlavorTestCase(extension.ExtensionTestCase,
FLAVOR_PLUGIN = 'neutron.services.flavors.flavors_plugin.FlavorsPlugin' FLAVOR_PLUGIN = 'neutron.services.flavors.flavors_plugin.FlavorsPlugin'
def _mock_add_flavor_id(self, resource_type, router_res, router_db): def _mock_add_flavor_id(dummy, router_res, router_db):
# this function is a registered callback so we can't mock it # this function is a registered callback so we can't mock it
# in a regular way. # in a regular way.
# need to change behavior for this test suite only, since # need to change behavior for this test suite only, since

View File

@ -26,14 +26,14 @@ from neutron.common import config as neutron_config
from neutron.db import servicetype_db # noqa from neutron.db import servicetype_db # noqa
from neutron.quota import resource_registry from neutron.quota import resource_registry
from neutron.tests import base from neutron.tests import base
from neutron.tests.unit.api import test_extensions
from neutron_lib.callbacks import registry from neutron_lib.callbacks import registry
from vmware_nsx._i18n import _ from vmware_nsx._i18n import _
from vmware_nsx.common import config # noqa from vmware_nsx.common import config # noqa
from vmware_nsx.db import nsxv_db from vmware_nsx.db import nsxv_db
from vmware_nsx.dvs import dvs_utils from vmware_nsx.dvs import dvs_utils
import vmware_nsx.shell.admin.plugins.nsxv.resources.utils as utils from vmware_nsx.shell.admin.plugins.nsxv.resources import utils as nsxv_utils
from vmware_nsx.shell.admin.plugins.nsxv3.resources import utils as nsxv3_utils
from vmware_nsx.shell import resources from vmware_nsx.shell import resources
from vmware_nsx.tests import unit as vmware from vmware_nsx.tests import unit as vmware
from vmware_nsx.tests.unit.nsx_v import test_plugin as test_v_plugin from vmware_nsx.tests.unit.nsx_v import test_plugin as test_v_plugin
@ -137,8 +137,20 @@ class TestNsxvAdminUtils(AbstractTestAdminUtils,
'NsxVPluginWrapper.count_spawn_jobs', 'NsxVPluginWrapper.count_spawn_jobs',
return_value=0).start() return_value=0).start()
self._plugin = nsxv_utils.NsxVPluginWrapper()
mock_nm_get_plugin = mock.patch(
"neutron_lib.plugins.directory.get_plugin")
self.mock_nm_get_plugin = mock_nm_get_plugin.start()
self.mock_nm_get_plugin.return_value = self._plugin
# Create a router to make sure we have deployed an edge # Create a router to make sure we have deployed an edge
self.create_router() self.router = self.create_router()
def tearDown(self):
if self.router and self.router.get('id'):
edgeapi = nsxv_utils.NeutronDbClient()
self._plugin.delete_router(edgeapi.context, self.router['id'])
super(TestNsxvAdminUtils, self).tearDown()
def test_nsxv_resources(self): def test_nsxv_resources(self):
self._test_resources(resources.nsxv_resources) self._test_resources(resources.nsxv_resources)
@ -149,26 +161,18 @@ class TestNsxvAdminUtils(AbstractTestAdminUtils,
self._test_resource('edges', 'nsx-update', **args) self._test_resource('edges', 'nsx-update', **args)
def create_router(self): def create_router(self):
# Global configuration to support router creation without messing up
# the plugin wrapper
cfg.CONF.set_override('track_quota_usage', False,
group='QUOTAS')
ext_mgr = test_v_plugin.TestL3ExtensionManager()
ext_api = test_extensions.setup_extensions_middleware(ext_mgr)
# Create an exclusive router (with an edge) # Create an exclusive router (with an edge)
tenant_id = uuidutils.generate_uuid() tenant_id = uuidutils.generate_uuid()
data = {'router': {'tenant_id': tenant_id}} data = {'router': {'tenant_id': tenant_id}}
data['router']['name'] = 'dummy' data['router']['name'] = 'dummy'
data['router']['admin_state_up'] = True data['router']['admin_state_up'] = True
data['router']['router_type'] = 'exclusive' data['router']['router_type'] = 'exclusive'
router_req = self.new_create_request('routers', data, self.fmt)
res = router_req.get_response(ext_api) edgeapi = nsxv_utils.NeutronDbClient()
r = self.deserialize(self.fmt, res) return self._plugin.create_router(edgeapi.context, data)
return r
def get_edge_id(self): def get_edge_id(self):
edgeapi = utils.NeutronDbClient() edgeapi = nsxv_utils.NeutronDbClient()
bindings = nsxv_db.get_nsxv_router_bindings(edgeapi.context.session) bindings = nsxv_db.get_nsxv_router_bindings(edgeapi.context.session)
for binding in bindings: for binding in bindings:
if binding.edge_id: if binding.edge_id:
@ -251,6 +255,12 @@ class TestNsxv3AdminUtils(AbstractTestAdminUtils,
return_value=[{'id': uuidutils.generate_uuid()}]) return_value=[{'id': uuidutils.generate_uuid()}])
super(TestNsxv3AdminUtils, self)._init_mock_plugin() super(TestNsxv3AdminUtils, self)._init_mock_plugin()
self._plugin = nsxv3_utils.NsxV3PluginWrapper()
mock_nm_get_plugin = mock.patch(
"neutron_lib.plugins.directory.get_plugin")
self.mock_nm_get_plugin = mock_nm_get_plugin.start()
self.mock_nm_get_plugin.return_value = self._plugin
def _get_plugin_name(self): def _get_plugin_name(self):
return 'nsxv3' return 'nsxv3'