Merge "use core resource attribute constants from neutron-lib"

This commit is contained in:
Jenkins 2017-07-05 00:21:50 +00:00 committed by Gerrit Code Review
commit 7b4ad21cb5
33 changed files with 147 additions and 122 deletions

View File

@ -14,6 +14,10 @@
# under the License.
from neutron_lib.api import converters as lib_converters
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib import constants
from neutron_lib.db import constants as db_const
@ -22,18 +26,10 @@ from neutron_lib.db import constants as db_const
SHARED = 'shared'
# Define constants for base resource name
NETWORK = 'network'
NETWORKS = '%ss' % NETWORK
PORT = 'port'
PORTS = '%ss' % PORT
SUBNET = 'subnet'
SUBNETS = '%ss' % SUBNET
SUBNETPOOL = 'subnetpool'
SUBNETPOOLS = '%ss' % SUBNETPOOL
CORE_RESOURCES = {'network': 'networks',
'subnet': 'subnets',
'subnetpool': 'subnetpools',
'port': 'ports'}
CORE_RESOURCES = {net_def.RESOURCE_NAME: net_def.COLLECTION_NAME,
subnet_def.RESOURCE_NAME: subnet_def.COLLECTION_NAME,
subnetpool_def.RESOURCE_NAME: subnetpool_def.COLLECTION_NAME,
port_def.RESOURCE_NAME: port_def.COLLECTION_NAME}
# Note: a default of ATTR_NOT_SPECIFIED indicates that an
# attribute is not required, but will be generated by the plugin
# if it is not specified. Particularly, a value of ATTR_NOT_SPECIFIED
@ -58,7 +54,7 @@ CORE_RESOURCES = {'network': 'networks',
# mechanism, ie: there might be rules which refer to this attribute.
RESOURCE_ATTRIBUTE_MAP = {
NETWORKS: {
net_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
@ -88,7 +84,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'required_by_policy': True,
'enforce_policy': True},
},
PORTS: {
port_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
@ -134,7 +130,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'status': {'allow_post': False, 'allow_put': False,
'is_visible': True},
},
SUBNETS: {
subnet_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
@ -215,7 +211,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'required_by_policy': True,
'enforce_policy': True},
},
SUBNETPOOLS: {
subnetpool_def.COLLECTION_NAME: {
'id': {'allow_post': False,
'allow_put': False,
'validate': {'type:uuid': None},
@ -282,7 +278,7 @@ RESOURCE_ATTRIBUTE_MAP = {
# Identify the attribute used by a resource to reference another resource
RESOURCE_FOREIGN_KEYS = {
NETWORKS: 'network_id'
net_def.COLLECTION_NAME: 'network_id'
}

View File

@ -12,11 +12,11 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib import constants
from oslo_utils import uuidutils
from neutron._i18n import _
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 api as db_api
@ -119,7 +119,7 @@ class AddressScopeDbMixin(ext_address_scope.AddressScopePluginBase):
address_scope.delete()
@staticmethod
@resource_extend.extends([attr.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_address_scope(network_res, network_db):
network_res[ext_address_scope.IPV4_ADDRESS_SCOPE] = None
network_res[ext_address_scope.IPV6_ADDRESS_SCOPE] = None

View File

@ -13,9 +13,9 @@
# under the License.
#
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api import validators
from neutron.api.v2 import attributes as attr
from neutron.common import utils
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils
@ -65,7 +65,7 @@ class AllowedAddressPairsMixin(object):
for pair in pairs]
@staticmethod
@resource_extend.extends([attr.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_allowed_address_pairs(port_res, port_db):
# If port_db is provided, allowed address pairs will be accessed via
# sqlalchemy models. As they're loaded together with ports this

View File

@ -11,9 +11,9 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.plugins import directory
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend
from neutron.extensions import availability_zone as az_ext
from neutron.extensions import network_availability_zone as net_az
@ -24,7 +24,7 @@ class NetworkAvailabilityZoneMixin(net_az.NetworkAvailabilityZonePluginBase):
"""Mixin class to enable network's availability zone attributes."""
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_availability_zone(net_res, net_db):
net_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list(
net_db[az_ext.AZ_HINTS])

View File

@ -15,6 +15,10 @@
import functools
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.api import validators
from neutron_lib import constants
from neutron_lib import exceptions as n_exc
@ -23,7 +27,6 @@ from oslo_config import cfg
from oslo_log import log as logging
from sqlalchemy.orm import exc
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import exceptions
from neutron.db import _model_query as model_query
@ -154,7 +157,7 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
# The shared attribute for a subnet is the same as its parent network
res['shared'] = self._is_network_shared(context, subnet.rbac_entries)
# Call auxiliary extend functions, if any
resource_extend.apply_funcs(attributes.SUBNETS, res, subnet)
resource_extend.apply_funcs(subnet_def.COLLECTION_NAME, res, subnet)
return db_utils.resource_fields(res, fields)
def _make_subnetpool_dict(self, subnetpool, fields=None):
@ -173,7 +176,8 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
'ip_version': subnetpool['ip_version'],
'default_quota': subnetpool['default_quota'],
'address_scope_id': subnetpool['address_scope_id']}
resource_extend.apply_funcs(attributes.SUBNETPOOLS, res, subnetpool)
resource_extend.apply_funcs(
subnetpool_def.COLLECTION_NAME, res, subnetpool)
return db_utils.resource_fields(res, fields)
def _make_port_dict(self, port, fields=None,
@ -192,7 +196,7 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
"device_owner": port["device_owner"]}
# Call auxiliary extend functions, if any
if process_extensions:
resource_extend.apply_funcs(attributes.PORTS, res, port)
resource_extend.apply_funcs(port_def.COLLECTION_NAME, res, port)
return db_utils.resource_fields(res, fields)
def _get_network(self, context, id):
@ -276,7 +280,7 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
res['shared'] = self._is_network_shared(context, network.rbac_entries)
# Call auxiliary extend functions, if any
if process_extensions:
resource_extend.apply_funcs(attributes.NETWORKS, res, network)
resource_extend.apply_funcs(net_def.COLLECTION_NAME, res, network)
return db_utils.resource_fields(res, fields)
def _is_network_shared(self, context, rbac_entries):

View File

@ -16,6 +16,8 @@
import functools
import netaddr
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.api import validators
from neutron_lib.callbacks import events
from neutron_lib.callbacks import exceptions
@ -37,7 +39,6 @@ from sqlalchemy import not_
from neutron._i18n import _, _LE, _LI
from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import exceptions as n_exc
from neutron.common import ipv6_utils
@ -947,7 +948,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
if auto_subnet:
# special flag to avoid re-allocation on auto subnets
fixed.append({'subnet_id': sub_id, 'delete_subnet': True})
data = {attributes.PORT: {'fixed_ips': fixed}}
data = {port_def.RESOURCE_NAME: {'fixed_ips': fixed}}
self.update_port(context, port_id, data)
except exc.PortNotFound:
# port is gone
@ -1159,7 +1160,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
for key in ['min_prefixlen', 'max_prefixlen', 'default_prefixlen']:
updated['key'] = str(updated[key])
resource_extend.apply_funcs(attributes.SUBNETPOOLS,
resource_extend.apply_funcs(subnetpool_def.COLLECTION_NAME,
updated, orig_sp.db_obj)
return updated

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api import validators
from neutron_lib.callbacks import events
from neutron_lib.callbacks import registry
@ -24,7 +25,6 @@ from neutron_lib.plugins import directory
from sqlalchemy.sql import expression as expr
from neutron._i18n import _
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
@ -84,7 +84,7 @@ class External_net_db_mixin(object):
context, network_id=net_id)
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_l3(network_res, network_db):
# Comparing with None for converting uuid into bool
network_res[external_net.EXTERNAL] = network_db.external is not None

View File

@ -14,9 +14,8 @@
# under the License.
from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext
from neutron_lib.api.definitions import port as port_def
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend
from neutron.db import api as db_api
from neutron.objects.port.extensions import extra_dhcp_opt as obj_extra_dhcp
@ -118,7 +117,7 @@ class ExtraDhcpOptMixin(object):
return bool(dopts)
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_extra_dhcp_opt(res, port):
res[edo_ext.EXTRADHCPOPTS] = [{'opt_name': dho.opt_name,
'opt_value': dho.opt_value,

View File

@ -16,6 +16,7 @@
import functools
import netaddr
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import portbindings
from neutron_lib.api.definitions import provider_net as providernet
from neutron_lib.api import validators
@ -35,7 +36,6 @@ from sqlalchemy import exc as sql_exc
from sqlalchemy import orm
from neutron._i18n import _, _LE, _LI, _LW
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import utils as n_utils
from neutron.db import _utils as db_utils
@ -698,7 +698,7 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin,
port[portbindings.HOST_ID] = host
try:
self._core_plugin.update_port(admin_ctx, port['id'],
{attributes.PORT: port})
{port_def.RESOURCE_NAME: port})
except (orm.exc.StaleDataError, orm.exc.ObjectDeletedError,
n_exc.PortNotFound):
# Take concurrently deleted interfaces in to account

View File

@ -13,6 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib import constants
from neutron_lib.db import constants as db_const
from neutron_lib.db import model_base
@ -20,7 +24,6 @@ import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy import sql
from neutron.api.v2 import attributes as attr
from neutron.db.network_dhcp_agent_binding import models as ndab_model
from neutron.db import rbac_db_models
from neutron.db import standard_attr
@ -106,7 +109,7 @@ class Port(standard_attr.HasStandardAttributes, model_base.BASEV2,
name='uniq_ports0network_id0mac_address'),
model_base.BASEV2.__table_args__
)
api_collections = [attr.PORTS]
api_collections = [port_def.COLLECTION_NAME]
def __init__(self, id=None, tenant_id=None, project_id=None, name=None,
network_id=None, mac_address=None, admin_state_up=None,
@ -198,7 +201,7 @@ class Subnet(standard_attr.HasStandardAttributes, model_base.BASEV2,
rbac_db_models.NetworkRBAC, lazy='subquery', uselist=True,
foreign_keys='Subnet.network_id',
primaryjoin='Subnet.network_id==NetworkRBAC.object_id')
api_collections = [attr.SUBNETS]
api_collections = [subnet_def.COLLECTION_NAME]
class SubnetPoolPrefix(model_base.BASEV2):
@ -235,7 +238,7 @@ class SubnetPool(standard_attr.HasStandardAttributes, model_base.BASEV2,
backref='subnetpools',
cascade='all, delete, delete-orphan',
lazy='subquery')
api_collections = [attr.SUBNETPOOLS]
api_collections = [subnetpool_def.COLLECTION_NAME]
class Network(standard_attr.HasStandardAttributes, model_base.BASEV2,
@ -256,4 +259,4 @@ class Network(standard_attr.HasStandardAttributes, model_base.BASEV2,
dhcp_agents = orm.relationship(
'Agent', lazy='subquery', viewonly=True,
secondary=ndab_model.NetworkDhcpAgentBinding.__table__)
api_collections = [attr.NETWORKS]
api_collections = [net_def.COLLECTION_NAME]

View File

@ -13,9 +13,9 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import port as port_def
from neutron_lib.plugins import directory
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend
@ -34,7 +34,7 @@ class PortBindingBaseMixin(object):
port_res.update(self.base_binding_dict)
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_binding(port_res, port_db):
plugin = directory.get_plugin()
if not isinstance(plugin, PortBindingBaseMixin):

View File

@ -13,11 +13,11 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import portbindings
from neutron_lib.api import validators
from neutron_lib.plugins import directory
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 api as db_api
@ -103,7 +103,7 @@ class PortBindingMixin(portbindings_base.PortBindingBaseMixin):
self._extend_port_dict_binding_host(port_res, host)
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_binding(port_res, port_db):
plugin = directory.get_plugin()
if not isinstance(plugin, PortBindingMixin):

View File

@ -12,12 +12,13 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import port_security as psec
from neutron_lib.api import validators
from neutron_lib.plugins import directory
from neutron_lib.utils import net
from neutron.api.v2 import attributes as attrs
from neutron.db import _resource_extend as resource_extend
from neutron.db import portsecurity_db_common
@ -26,7 +27,8 @@ from neutron.db import portsecurity_db_common
class PortSecurityDbMixin(portsecurity_db_common.PortSecurityDbCommon):
@staticmethod
@resource_extend.extends([attrs.NETWORKS, attrs.PORTS])
@resource_extend.extends([net_def.COLLECTION_NAME,
port_def.COLLECTION_NAME])
def _extend_port_security_dict(response_data, db_data):
plugin = directory.get_plugin()
if ('port-security' in

View File

@ -13,6 +13,7 @@
# under the License.
import netaddr
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api import validators
from neutron_lib.callbacks import events
from neutron_lib.callbacks import exceptions
@ -27,7 +28,6 @@ import six
from sqlalchemy.orm import scoped_session
from neutron._i18n import _
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import utils
from neutron.db import _model_query as model_query
@ -701,7 +701,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
**kwargs)
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_security_group(port_res, port_db):
# Security group bindings will be retrieved from the SQLAlchemy
# model. As they're loaded eagerly with ports because of the

View File

@ -16,7 +16,8 @@
# TODO(ihrachys): consider renaming the module since now it does not contain
# any models at all
from neutron.api.v2 import attributes
from neutron_lib.api.definitions import subnet as subnet_def
from neutron.db import _resource_extend as resource_extend
@ -25,7 +26,7 @@ class SubnetServiceTypeMixin(object):
"""Mixin class to extend subnet with service type attribute"""
@staticmethod
@resource_extend.extends([attributes.SUBNETS])
@resource_extend.extends([subnet_def.COLLECTION_NAME])
def _extend_subnet_service_types(subnet_res, subnet_db):
subnet_res['service_types'] = [service_type['service_type'] for
service_type in

View File

@ -12,7 +12,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron.api.v2 import attributes
from neutron_lib.api.definitions import network as net_def
from neutron.db import _resource_extend as resource_extend
from neutron.extensions import vlantransparent
@ -22,7 +23,7 @@ class Vlantransparent_db_mixin(object):
"""Mixin class to add vlan transparent methods to db_base_plugin_v2."""
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_vlan_transparent(network_res, network_db):
network_res[vlantransparent.VLANTRANSPARENT] = (
network_db.vlan_transparent)

View File

@ -15,6 +15,8 @@
import abc
from neutron_lib.api import converters
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.api import extensions as api_extensions
from neutron_lib import constants
from neutron_lib.db import constants as db_const
@ -64,14 +66,14 @@ RESOURCE_ATTRIBUTE_MAP = {
'validate': {'type:values': [4, 6]},
'is_visible': True},
},
attr.SUBNETPOOLS: {
subnetpool_def.COLLECTION_NAME: {
ADDRESS_SCOPE_ID: {'allow_post': True,
'allow_put': True,
'default': constants.ATTR_NOT_SPECIFIED,
'validate': {'type:uuid_or_none': None},
'is_visible': True}
},
attr.NETWORKS: {
net_def.COLLECTION_NAME: {
IPV4_ADDRESS_SCOPE: {'allow_post': False,
'allow_put': False,
'is_visible': True},

View File

@ -12,14 +12,13 @@
# under the License.
from neutron_lib.api import converters
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api import extensions
from neutron_lib import constants
from neutron.api.v2 import attributes
EXTENDED_ATTRIBUTES_2_0 = {
attributes.SUBNETS: {
subnet_def.COLLECTION_NAME: {
'use_default_subnetpool': {'allow_post': True,
'allow_put': False,
'default': False,

View File

@ -15,6 +15,7 @@
import re
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api import extensions
from neutron_lib.api import validators
from neutron_lib import exceptions as n_exc
@ -22,7 +23,6 @@ from oslo_config import cfg
import six
from neutron._i18n import _
from neutron.api.v2 import attributes as attr
from neutron.extensions import l3
DNS_LABEL_MAX_LEN = 63
@ -226,7 +226,7 @@ EXTENDED_ATTRIBUTES_2_0 = {
'validate': {'type:dns_domain': FQDN_MAX_LEN},
'is_visible': True},
},
attr.NETWORKS: {
net_def.COLLECTION_NAME: {
DNSDOMAIN: {'allow_post': True, 'allow_put': True,
'default': '',
'convert_to': convert_to_lowercase,

View File

@ -12,9 +12,9 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api import extensions
from neutron.api.v2 import attributes
IP_ALLOCATION = 'ip_allocation'
IP_ALLOCATION_IMMEDIATE = 'immediate'
@ -23,7 +23,7 @@ IP_ALLOCATION_NONE = 'none'
# Attribute Map
RESOURCE_ATTRIBUTE_MAP = {
attributes.PORTS: {
port_def.COLLECTION_NAME: {
IP_ALLOCATION: {'allow_post': False,
'allow_put': False,
'is_visible': True, },

View File

@ -17,13 +17,13 @@ import six
from neutron_lib.api import converters
from neutron_lib.api.definitions import provider_net as providernet
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api import extensions as api_extensions
from neutron_lib import constants
from neutron_lib.db import constants as db_const
from neutron_lib.plugins import directory
from neutron.api import extensions
from neutron.api.v2 import attributes
from neutron.api.v2 import base
SEGMENT = 'segment'
@ -80,7 +80,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'validate': {'type:string_or_none': DESC_LEN},
'is_visible': True},
},
attributes.SUBNETS: {
subnet_def.COLLECTION_NAME: {
SEGMENT_ID: {'allow_post': True,
'allow_put': False,
'default': None,

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api import extensions
from neutron_lib.api import validators
from neutron_lib import constants
@ -18,7 +19,6 @@ import six
import webob.exc
from neutron._i18n import _
from neutron.api.v2 import attributes
# List for service plugins to register their own prefixes
@ -57,7 +57,7 @@ validators.add_validator('type:validate_subnet_service_types',
EXTENDED_ATTRIBUTES_2_0 = {
attributes.SUBNETS: {
subnet_def.COLLECTION_NAME: {
'service_types': {'allow_post': True,
'allow_put': True,
'default': constants.ATTR_NOT_SPECIFIED,

View File

@ -13,6 +13,7 @@
import abc
from neutron_lib.api.definitions import network
from neutron_lib.api import extensions as api_extensions
from neutron_lib.api import validators
from neutron_lib import exceptions
@ -23,7 +24,6 @@ import webob.exc
from neutron._i18n import _
from neutron.api import extensions
from neutron.api.v2 import attributes
from neutron.api.v2 import base
from neutron.api.v2 import resource as api_resource
from neutron.common import rpc as n_rpc
@ -37,7 +37,7 @@ TAG_PLUGIN_TYPE = 'TAG'
TAG_SUPPORTED_RESOURCES = {
# We shouldn't add new resources here. If more resources need to be tagged,
# we must add them in new extension.
attributes.NETWORKS: attributes.NETWORK,
network.COLLECTION_NAME: network.RESOURCE_NAME,
}
TAG_ATTRIBUTE_MAP = {

View File

@ -11,11 +11,13 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.api import extensions as api_extensions
from neutron_lib.plugins import directory
from neutron.api import extensions
from neutron.api.v2 import attributes
from neutron.api.v2 import base
from neutron.api.v2 import resource as api_resource
from neutron.extensions import l3
@ -24,9 +26,9 @@ from neutron.extensions import tag as tag_base
TAG_SUPPORTED_RESOURCES = {
# We shouldn't add new resources here. If more resources need to be tagged,
# we must add them in new extension.
attributes.SUBNETS: attributes.SUBNET,
attributes.PORTS: attributes.PORT,
attributes.SUBNETPOOLS: attributes.SUBNETPOOL,
subnet_def.COLLECTION_NAME: subnet_def.RESOURCE_NAME,
port_def.COLLECTION_NAME: port_def.RESOURCE_NAME,
subnetpool_def.COLLECTION_NAME: subnetpool_def.RESOURCE_NAME,
l3.ROUTERS: l3.ROUTER,
}

View File

@ -21,6 +21,9 @@ import contextlib
import hashlib
from neutron_lib.api import attributes as lib_attrs
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib import constants as n_const
from neutron_lib import exceptions
from oslo_config import cfg
@ -166,21 +169,21 @@ def _fixup_res_dict(context, attr_name, res_dict, check_allow_post=True):
def create_network(core_plugin, context, net, check_allow_post=True):
net_data = _fixup_res_dict(context, attributes.NETWORKS,
net_data = _fixup_res_dict(context, net_def.COLLECTION_NAME,
net.get('network', {}),
check_allow_post=check_allow_post)
return core_plugin.create_network(context, {'network': net_data})
def create_subnet(core_plugin, context, subnet, check_allow_post=True):
subnet_data = _fixup_res_dict(context, attributes.SUBNETS,
subnet_data = _fixup_res_dict(context, subnet_def.COLLECTION_NAME,
subnet.get('subnet', {}),
check_allow_post=check_allow_post)
return core_plugin.create_subnet(context, {'subnet': subnet_data})
def create_port(core_plugin, context, port, check_allow_post=True):
port_data = _fixup_res_dict(context, attributes.PORTS,
port_data = _fixup_res_dict(context, port_def.COLLECTION_NAME,
port.get('port', {}),
check_allow_post=check_allow_post)
return core_plugin.create_port(context, {'port': port_data})

View File

@ -15,9 +15,12 @@
from eventlet import greenthread
from neutron_lib.api.definitions import extra_dhcp_opt as edo_ext
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import port_security as psec
from neutron_lib.api.definitions import portbindings
from neutron_lib.api.definitions import provider_net
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api import validators
from neutron_lib.callbacks import events
from neutron_lib.callbacks import exceptions
@ -48,7 +51,6 @@ from neutron.api.rpc.handlers import dvr_rpc
from neutron.api.rpc.handlers import metadata_rpc
from neutron.api.rpc.handlers import resources_rpc
from neutron.api.rpc.handlers import securitygroups_rpc
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import rpc as n_rpc
from neutron.common import topics
@ -349,7 +351,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
port['status'] = const.PORT_STATUS_DOWN
super(Ml2Plugin, self).update_port(
mech_context._plugin_context, port_id,
{attributes.PORT: {'status': const.PORT_STATUS_DOWN}})
{port_def.RESOURCE_NAME: {'status': const.PORT_STATUS_DOWN}})
if port['device_owner'] == const.DEVICE_OWNER_DVR_INTERFACE:
binding.vif_type = portbindings.VIF_TYPE_UNBOUND
@ -606,7 +608,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
return {}
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _ml2_extend_port_dict_binding(port_res, port_db):
plugin = directory.get_plugin()
# None when called during unit tests for other plugins.
@ -617,21 +619,21 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# attributes for the resources to add those attributes to the result.
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _ml2_md_extend_network_dict(result, netdb):
plugin = directory.get_plugin()
session = plugin._object_session_or_new_session(netdb)
plugin.extension_manager.extend_network_dict(session, netdb, result)
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _ml2_md_extend_port_dict(result, portdb):
plugin = directory.get_plugin()
session = plugin._object_session_or_new_session(portdb)
plugin.extension_manager.extend_port_dict(session, portdb, result)
@staticmethod
@resource_extend.extends([attributes.SUBNETS])
@resource_extend.extends([subnet_def.COLLECTION_NAME])
def _ml2_md_extend_subnet_dict(result, subnetdb):
plugin = directory.get_plugin()
session = plugin._object_session_or_new_session(subnetdb)
@ -755,12 +757,12 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
return min(mtus) if mtus else 0
def _before_create_network(self, context, network):
net_data = network[attributes.NETWORK]
net_data = network[net_def.RESOURCE_NAME]
registry.notify(resources.NETWORK, events.BEFORE_CREATE, self,
context=context, network=net_data)
def _create_network_db(self, context, network):
net_data = network[attributes.NETWORK]
net_data = network[net_def.RESOURCE_NAME]
tenant_id = net_data['tenant_id']
with db_api.context_manager.writer.using(context):
net_db = self.create_network_db(context, network)
@ -820,13 +822,14 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def create_network_bulk(self, context, networks):
objects = self._create_bulk_ml2(attributes.NETWORK, context, networks)
objects = self._create_bulk_ml2(
net_def.RESOURCE_NAME, context, networks)
return [obj['result'] for obj in objects]
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def update_network(self, context, id, network):
net_data = network[attributes.NETWORK]
net_data = network[net_def.RESOURCE_NAME]
provider._raise_if_updates_provider_attributes(net_data)
with db_api.context_manager.writer.using(context):
@ -961,7 +964,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
result, net_db, ipam_sub = self._create_subnet_precommit(
context, subnet)
self.extension_manager.process_create_subnet(
context, subnet[attributes.SUBNET], result)
context, subnet[subnet_def.RESOURCE_NAME], result)
network = self._make_network_dict(net_db, context=context)
self.type_manager.extend_network_dict_provider(context, network)
network[api.MTU] = self._get_network_mtu(network)
@ -997,7 +1000,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def create_subnet_bulk(self, context, subnets):
objects = self._create_bulk_ml2(attributes.SUBNET, context, subnets)
objects = self._create_bulk_ml2(
subnet_def.RESOURCE_NAME, context, subnets)
return [obj['result'] for obj in objects]
@utils.transaction_guard
@ -1007,7 +1011,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
updated_subnet, original_subnet = self._update_subnet_precommit(
context, id, subnet)
self.extension_manager.process_update_subnet(
context, subnet[attributes.SUBNET], updated_subnet)
context, subnet[subnet_def.RESOURCE_NAME], updated_subnet)
updated_subnet = self.get_subnet(context, id)
mech_context = driver_context.SubnetContext(
self, context, updated_subnet, network=None,
@ -1057,7 +1061,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# TODO(yalei) - will be simplified after security group and address pair be
# converted to ext driver too.
def _portsec_ext_port_create_processing(self, context, port_data, port):
attrs = port[attributes.PORT]
attrs = port[port_def.RESOURCE_NAME]
port_security = ((port_data.get(psec.PORTSECURITY) is None) or
port_data[psec.PORTSECURITY])
@ -1091,7 +1095,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
provisioning_blocks.DHCP_ENTITY)
def _before_create_port(self, context, port):
attrs = port[attributes.PORT]
attrs = port[port_def.RESOURCE_NAME]
if not attrs.get('status'):
attrs['status'] = const.PORT_STATUS_DOWN
@ -1102,7 +1106,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
self._ensure_default_security_group(context, attrs['tenant_id'])
def _create_port_db(self, context, port):
attrs = port[attributes.PORT]
attrs = port[port_def.RESOURCE_NAME]
with db_api.context_manager.writer.using(context):
dhcp_opts = attrs.get(edo_ext.EXTRADHCPOPTS, [])
port_db = self.create_port_db(context, port)
@ -1166,7 +1170,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def create_port_bulk(self, context, ports):
objects = self._create_bulk_ml2(attributes.PORT, context, ports)
objects = self._create_bulk_ml2(port_def.RESOURCE_NAME, context, ports)
return [obj['result'] for obj in objects]
# TODO(yalei) - will be simplified after security group and address pair be
@ -1215,7 +1219,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def update_port(self, context, id, port):
attrs = port[attributes.PORT]
attrs = port[port_def.RESOURCE_NAME]
need_port_update_notify = False
bound_mech_contexts = []
with db_api.context_manager.writer.using(context):
@ -1371,7 +1375,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
@utils.transaction_guard
@db_api.retry_if_session_inactive()
def update_distributed_port_binding(self, context, id, port):
attrs = port[attributes.PORT]
attrs = port[port_def.RESOURCE_NAME]
host = attrs and attrs.get(portbindings.HOST_ID)
host_set = validators.is_attr_set(host)

View File

@ -14,6 +14,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.callbacks import events
from neutron_lib.callbacks import registry
from neutron_lib.callbacks import resources
@ -23,7 +24,6 @@ from neutron_lib.plugins import directory
from oslo_log import log as logging
from neutron._i18n import _, _LE
from neutron.api.v2 import attributes
from neutron.common import exceptions as c_exc
from neutron.db import _resource_extend as resource_extend
from neutron.db import _utils as db_utils
@ -108,7 +108,7 @@ class AutoAllocatedTopologyMixin(common_db_mixin.CommonDbMixin):
return self._l3_plugin
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_external_network_default(net_res, net_db):
"""Add is_default field to 'show' response."""
if net_db.external is not None:

View File

@ -16,6 +16,9 @@
from keystoneauth1 import loading as ks_loading
import netaddr
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.callbacks import events
from neutron_lib.callbacks import registry
from neutron_lib.callbacks import resources
@ -27,7 +30,6 @@ from oslo_config import cfg
from oslo_log import log
from neutron._i18n import _, _LE, _LI
from neutron.api.v2 import attributes
from neutron.common import exceptions as n_exc
from neutron.db import _resource_extend as resource_extend
from neutron.db import api as db_api
@ -61,7 +63,7 @@ class Plugin(db.SegmentDbMixin, segment.SegmentPluginBase):
self.nova_updater = NovaSegmentNotifier()
@staticmethod
@resource_extend.extends([attributes.NETWORKS])
@resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_binding(network_res, network_db):
if not directory.get_plugin('segments'):
return
@ -73,12 +75,12 @@ class Plugin(db.SegmentDbMixin, segment.SegmentPluginBase):
network_res[l2_adjacency.L2_ADJACENCY] = is_adjacent
@staticmethod
@resource_extend.extends([attributes.SUBNETS])
@resource_extend.extends([subnet_def.COLLECTION_NAME])
def _extend_subnet_dict_binding(subnet_res, subnet_db):
subnet_res['segment_id'] = subnet_db.get('segment_id')
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_binding(port_res, port_db):
if not directory.get_plugin('segments'):
return

View File

@ -14,11 +14,14 @@
import functools
from neutron_lib.api.definitions import network as net_def
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import subnet as subnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.plugins import directory
from oslo_log import helpers as log_helpers
from sqlalchemy.orm import exc
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 api as db_api
@ -36,10 +39,10 @@ from neutron.objects import tag as tag_obj
resource_model_map = {
# When we'll add other resources, we must add new extension for them
# if we don't have better discovery mechanism instead of it.
attributes.NETWORKS: models_v2.Network,
attributes.SUBNETS: models_v2.Subnet,
attributes.PORTS: models_v2.Port,
attributes.SUBNETPOOLS: models_v2.SubnetPool,
net_def.COLLECTION_NAME: models_v2.Network,
subnet_def.COLLECTION_NAME: models_v2.Subnet,
port_def.COLLECTION_NAME: models_v2.Port,
subnetpool_def.COLLECTION_NAME: models_v2.SubnetPool,
l3_ext.ROUTERS: l3_model.Router,
}

View File

@ -14,6 +14,7 @@
import copy
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import portbindings
from neutron_lib.callbacks import events
from neutron_lib.callbacks import registry
@ -24,7 +25,6 @@ from neutron_lib.services import base as service_base
from oslo_log import log as logging
from oslo_utils import uuidutils
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend
from neutron.db import api as db_api
from neutron.db import common_db_mixin
@ -66,7 +66,7 @@ class TrunkPlugin(service_base.ServicePluginBase,
self.check_compatibility()
@staticmethod
@resource_extend.extends([attributes.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_trunk_details(port_res, port_db):
"""Add trunk details to a port."""
if port_db.trunk_port:

View File

@ -15,9 +15,9 @@
from webob import exc as web_exc
from neutron_lib.api.definitions import data_plane_status as dps_lib
from neutron_lib.api.definitions import port as port_def
from neutron_lib import constants
from neutron.api.v2 import attributes as attrs
from neutron.db import _resource_extend as resource_extend
from neutron.db import data_plane_status_db as dps_db
from neutron.db import db_base_plugin_v2
@ -48,7 +48,7 @@ class DataPlaneStatusExtensionTestPlugin(db_base_plugin_v2.NeutronDbPluginV2,
supported_extension_aliases = ["data-plane-status"]
@staticmethod
@resource_extend.extends([attrs.PORTS])
@resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_data_plane_status(port_res, port_db):
return dps_db.DataPlaneStatusMixin._extend_port_data_plane_status(
port_res, port_db)
@ -77,7 +77,7 @@ class DataPlaneStatusExtensionTestCase(
def test_update_port_data_plane_status(self):
with self.port() as port:
data = {'port': {'data_plane_status': constants.ACTIVE}}
req = self.new_update_request(attrs.PORTS,
req = self.new_update_request(port_def.COLLECTION_NAME,
data,
port['port']['id'])
res = req.get_response(self.api)
@ -87,7 +87,8 @@ class DataPlaneStatusExtensionTestCase(
def test_port_create_data_plane_status_default_none(self):
with self.port(name='port1') as port:
req = self.new_show_request(attrs.PORTS, port['port']['id'])
req = self.new_show_request(
port_def.COLLECTION_NAME, port['port']['id'])
res = self.deserialize(self.fmt, req.get_response(self.api))
self.assertIsNone(res['port'][dps_lib.DATA_PLANE_STATUS])
@ -102,10 +103,10 @@ class DataPlaneStatusExtensionTestCase(
def test_port_update_preserves_data_plane_status(self):
with self.port(name='port1') as port:
res = self._update(attrs.PORTS, port['port']['id'],
res = self._update(port_def.COLLECTION_NAME, port['port']['id'],
{'port': {dps_lib.DATA_PLANE_STATUS:
constants.ACTIVE}})
res = self._update(attrs.PORTS, port['port']['id'],
res = self._update(port_def.COLLECTION_NAME, port['port']['id'],
{'port': {'name': 'port2'}})
self.assertEqual(res['port']['name'], 'port2')
self.assertEqual(res['port'][dps_lib.DATA_PLANE_STATUS],
@ -113,7 +114,7 @@ class DataPlaneStatusExtensionTestCase(
def test_port_update_with_invalid_data_plane_status(self):
with self.port(name='port1') as port:
self._update(attrs.PORTS, port['port']['id'],
self._update(port_def.COLLECTION_NAME, port['port']['id'],
{'port': {dps_lib.DATA_PLANE_STATUS: "abc"}},
web_exc.HTTPBadRequest.code)
@ -121,7 +122,7 @@ class DataPlaneStatusExtensionTestCase(
expect_notify = set(['port.update.start',
'port.update.end'])
with self.port(name='port1') as port:
self._update(attrs.PORTS, port['port']['id'],
self._update(port_def.COLLECTION_NAME, port['port']['id'],
{'port': {dps_lib.DATA_PLANE_STATUS:
constants.ACTIVE}})
notify = set(n['event_type'] for n in fake_notifier.NOTIFICATIONS)

View File

@ -15,6 +15,7 @@
import mock
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import portbindings
from neutron_lib.api.definitions import provider_net as pnet
from neutron_lib import constants
@ -25,7 +26,6 @@ from neutron_lib.plugins import directory
from oslo_serialization import jsonutils
import testtools
from neutron.api.v2 import attributes
from neutron.common import constants as n_const
from neutron.common import topics
from neutron.db import agents_db
@ -237,7 +237,7 @@ class TestL2PopulationRpcTestCase(test_plugin.Ml2PluginV2TestCase):
else:
port[portbindings.HOST_ID] = self.agent2['host']
plugin.update_port(self.adminContext, port['id'],
{attributes.PORT: port})
{port_def.RESOURCE_NAME: port})
def _get_first_interface(self, net_id, router_id):
plugin = directory.get_plugin()

View File

@ -15,11 +15,11 @@
import mock
from neutron_lib.api.definitions import data_plane_status as dps_lib
from neutron_lib.api.definitions import port as port_def
from neutron_lib import constants
from neutron_lib import context
from neutron_lib.plugins import directory
from neutron.api.v2 import attributes as attrs
from neutron.plugins.ml2 import config
from neutron.plugins.ml2.extensions import data_plane_status
from neutron.tests.unit.plugins.ml2 import test_plugin
@ -47,7 +47,8 @@ class DataPlaneStatusSML2ExtDriverTestCase(test_plugin.Ml2PluginV2TestCase):
def test_show_port_has_data_plane_status(self):
with self.port() as port:
req = self.new_show_request(attrs.PORTS, port['port']['id'],
req = self.new_show_request(port_def.COLLECTION_NAME,
port['port']['id'],
self.fmt)
p = self.deserialize(self.fmt, req.get_response(self.api))
self.assertIsNone(p['port'][dps_lib.DATA_PLANE_STATUS])
@ -57,7 +58,8 @@ class DataPlaneStatusSML2ExtDriverTestCase(test_plugin.Ml2PluginV2TestCase):
admin_ctx = context.get_admin_context()
p = {'port': {dps_lib.DATA_PLANE_STATUS: constants.ACTIVE}}
self.plugin.update_port(admin_ctx, port['port']['id'], p)
req = self.new_show_request(attrs.PORTS, port['port']['id'])
req = self.new_show_request(
port_def.COLLECTION_NAME, port['port']['id'])
res = self.deserialize(self.fmt, req.get_response(self.api))
self.assertEqual(res['port'][dps_lib.DATA_PLANE_STATUS],
constants.ACTIVE)