use core resource attribute constants from neutron-lib

neutron-lib now contains the API definitions for neutron's core
resources. This patch removes the constant core resource and collection
variables and uses them from lib. Subsequent patches will consume the
actual core resource attribute definitions.

NeutronLibImpact

Change-Id: Ia9afdf620cd538b2aa420593277d6403a45c996b
This commit is contained in:
Boden R 2017-05-23 12:16:25 -06:00
parent b1dd13abfb
commit 62576cabf7
33 changed files with 147 additions and 122 deletions

View File

@ -14,6 +14,10 @@
# under the License. # under the License.
from neutron_lib.api import converters as lib_converters 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 import constants
from neutron_lib.db import constants as db_const from neutron_lib.db import constants as db_const
@ -22,18 +26,10 @@ from neutron_lib.db import constants as db_const
SHARED = 'shared' SHARED = 'shared'
# Define constants for base resource name # Define constants for base resource name
NETWORK = 'network' CORE_RESOURCES = {net_def.RESOURCE_NAME: net_def.COLLECTION_NAME,
NETWORKS = '%ss' % NETWORK subnet_def.RESOURCE_NAME: subnet_def.COLLECTION_NAME,
PORT = 'port' subnetpool_def.RESOURCE_NAME: subnetpool_def.COLLECTION_NAME,
PORTS = '%ss' % PORT port_def.RESOURCE_NAME: port_def.COLLECTION_NAME}
SUBNET = 'subnet'
SUBNETS = '%ss' % SUBNET
SUBNETPOOL = 'subnetpool'
SUBNETPOOLS = '%ss' % SUBNETPOOL
CORE_RESOURCES = {'network': 'networks',
'subnet': 'subnets',
'subnetpool': 'subnetpools',
'port': 'ports'}
# Note: a default of ATTR_NOT_SPECIFIED indicates that an # Note: a default of ATTR_NOT_SPECIFIED indicates that an
# attribute is not required, but will be generated by the plugin # attribute is not required, but will be generated by the plugin
# if it is not specified. Particularly, a value of ATTR_NOT_SPECIFIED # 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. # mechanism, ie: there might be rules which refer to this attribute.
RESOURCE_ATTRIBUTE_MAP = { RESOURCE_ATTRIBUTE_MAP = {
NETWORKS: { net_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False, 'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None}, 'validate': {'type:uuid': None},
'is_visible': True, 'is_visible': True,
@ -88,7 +84,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'required_by_policy': True, 'required_by_policy': True,
'enforce_policy': True}, 'enforce_policy': True},
}, },
PORTS: { port_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False, 'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None}, 'validate': {'type:uuid': None},
'is_visible': True, 'is_visible': True,
@ -134,7 +130,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'status': {'allow_post': False, 'allow_put': False, 'status': {'allow_post': False, 'allow_put': False,
'is_visible': True}, 'is_visible': True},
}, },
SUBNETS: { subnet_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'allow_put': False, 'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None}, 'validate': {'type:uuid': None},
'is_visible': True, 'is_visible': True,
@ -215,7 +211,7 @@ RESOURCE_ATTRIBUTE_MAP = {
'required_by_policy': True, 'required_by_policy': True,
'enforce_policy': True}, 'enforce_policy': True},
}, },
SUBNETPOOLS: { subnetpool_def.COLLECTION_NAME: {
'id': {'allow_post': False, 'id': {'allow_post': False,
'allow_put': False, 'allow_put': False,
'validate': {'type:uuid': None}, 'validate': {'type:uuid': None},
@ -282,7 +278,7 @@ RESOURCE_ATTRIBUTE_MAP = {
# Identify the attribute used by a resource to reference another resource # Identify the attribute used by a resource to reference another resource
RESOURCE_FOREIGN_KEYS = { 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 # License for the specific language governing permissions and limitations
# under the License. # under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib import constants from neutron_lib import constants
from oslo_utils import uuidutils from oslo_utils import uuidutils
from neutron._i18n import _ 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 _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
@ -119,7 +119,7 @@ class AddressScopeDbMixin(ext_address_scope.AddressScopePluginBase):
address_scope.delete() address_scope.delete()
@staticmethod @staticmethod
@resource_extend.extends([attr.NETWORKS]) @resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_address_scope(network_res, network_db): def _extend_network_dict_address_scope(network_res, network_db):
network_res[ext_address_scope.IPV4_ADDRESS_SCOPE] = None network_res[ext_address_scope.IPV4_ADDRESS_SCOPE] = None
network_res[ext_address_scope.IPV6_ADDRESS_SCOPE] = None network_res[ext_address_scope.IPV6_ADDRESS_SCOPE] = None

View File

@ -13,9 +13,9 @@
# under the License. # under the License.
# #
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api import validators from neutron_lib.api import validators
from neutron.api.v2 import attributes as attr
from neutron.common import utils from neutron.common import utils
from neutron.db import _resource_extend as resource_extend 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
@ -65,7 +65,7 @@ class AllowedAddressPairsMixin(object):
for pair in pairs] for pair in pairs]
@staticmethod @staticmethod
@resource_extend.extends([attr.PORTS]) @resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_allowed_address_pairs(port_res, port_db): def _extend_port_dict_allowed_address_pairs(port_res, port_db):
# If port_db is provided, allowed address pairs will be accessed via # If port_db is provided, allowed address pairs will be accessed via
# sqlalchemy models. As they're loaded together with ports this # 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 # License for the specific language governing permissions and limitations
# under the License. # under the License.
from neutron_lib.api.definitions import network as net_def
from neutron_lib.plugins import directory from neutron_lib.plugins import directory
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend from neutron.db import _resource_extend as resource_extend
from neutron.extensions import availability_zone as az_ext from neutron.extensions import availability_zone as az_ext
from neutron.extensions import network_availability_zone as net_az 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.""" """Mixin class to enable network's availability zone attributes."""
@staticmethod @staticmethod
@resource_extend.extends([attributes.NETWORKS]) @resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_availability_zone(net_res, net_db): def _extend_availability_zone(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])

View File

@ -15,6 +15,10 @@
import functools 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.api import validators
from neutron_lib import constants from neutron_lib import constants
from neutron_lib import exceptions as n_exc 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 oslo_log import log as logging
from sqlalchemy.orm import exc from sqlalchemy.orm import exc
from neutron.api.v2 import attributes
from neutron.common import constants as n_const from neutron.common import constants as n_const
from neutron.common import exceptions from neutron.common import exceptions
from neutron.db import _model_query as model_query 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 # The shared attribute for a subnet is the same as its parent network
res['shared'] = self._is_network_shared(context, subnet.rbac_entries) res['shared'] = self._is_network_shared(context, subnet.rbac_entries)
# Call auxiliary extend functions, if any # 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) return db_utils.resource_fields(res, fields)
def _make_subnetpool_dict(self, subnetpool, fields=None): def _make_subnetpool_dict(self, subnetpool, fields=None):
@ -173,7 +176,8 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
'ip_version': subnetpool['ip_version'], 'ip_version': subnetpool['ip_version'],
'default_quota': subnetpool['default_quota'], 'default_quota': subnetpool['default_quota'],
'address_scope_id': subnetpool['address_scope_id']} '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) return db_utils.resource_fields(res, fields)
def _make_port_dict(self, port, fields=None, def _make_port_dict(self, port, fields=None,
@ -192,7 +196,7 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
"device_owner": port["device_owner"]} "device_owner": port["device_owner"]}
# Call auxiliary extend functions, if any # Call auxiliary extend functions, if any
if process_extensions: 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) return db_utils.resource_fields(res, fields)
def _get_network(self, context, id): 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) res['shared'] = self._is_network_shared(context, network.rbac_entries)
# Call auxiliary extend functions, if any # Call auxiliary extend functions, if any
if process_extensions: 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) return db_utils.resource_fields(res, fields)
def _is_network_shared(self, context, rbac_entries): def _is_network_shared(self, context, rbac_entries):

View File

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

View File

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

View File

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

View File

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

View File

@ -13,6 +13,10 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import constants
from neutron_lib.db import constants as db_const from neutron_lib.db import constants as db_const
from neutron_lib.db import model_base from neutron_lib.db import model_base
@ -20,7 +24,6 @@ import sqlalchemy as sa
from sqlalchemy import orm from sqlalchemy import orm
from sqlalchemy import sql 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.network_dhcp_agent_binding import models as ndab_model
from neutron.db import rbac_db_models from neutron.db import rbac_db_models
from neutron.db import standard_attr from neutron.db import standard_attr
@ -106,7 +109,7 @@ class Port(standard_attr.HasStandardAttributes, model_base.BASEV2,
name='uniq_ports0network_id0mac_address'), name='uniq_ports0network_id0mac_address'),
model_base.BASEV2.__table_args__ 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, def __init__(self, id=None, tenant_id=None, project_id=None, name=None,
network_id=None, mac_address=None, admin_state_up=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, rbac_db_models.NetworkRBAC, lazy='subquery', uselist=True,
foreign_keys='Subnet.network_id', foreign_keys='Subnet.network_id',
primaryjoin='Subnet.network_id==NetworkRBAC.object_id') primaryjoin='Subnet.network_id==NetworkRBAC.object_id')
api_collections = [attr.SUBNETS] api_collections = [subnet_def.COLLECTION_NAME]
class SubnetPoolPrefix(model_base.BASEV2): class SubnetPoolPrefix(model_base.BASEV2):
@ -235,7 +238,7 @@ class SubnetPool(standard_attr.HasStandardAttributes, model_base.BASEV2,
backref='subnetpools', backref='subnetpools',
cascade='all, delete, delete-orphan', cascade='all, delete, delete-orphan',
lazy='subquery') lazy='subquery')
api_collections = [attr.SUBNETPOOLS] api_collections = [subnetpool_def.COLLECTION_NAME]
class Network(standard_attr.HasStandardAttributes, model_base.BASEV2, class Network(standard_attr.HasStandardAttributes, model_base.BASEV2,
@ -256,4 +259,4 @@ class Network(standard_attr.HasStandardAttributes, model_base.BASEV2,
dhcp_agents = orm.relationship( dhcp_agents = orm.relationship(
'Agent', lazy='subquery', viewonly=True, 'Agent', lazy='subquery', viewonly=True,
secondary=ndab_model.NetworkDhcpAgentBinding.__table__) 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 # License for the specific language governing permissions and limitations
# under the License. # under the License.
from neutron_lib.api.definitions import port as port_def
from neutron_lib.plugins import directory from neutron_lib.plugins import directory
from neutron.api.v2 import attributes
from neutron.db import _resource_extend as resource_extend from neutron.db import _resource_extend as resource_extend
@ -34,7 +34,7 @@ class PortBindingBaseMixin(object):
port_res.update(self.base_binding_dict) port_res.update(self.base_binding_dict)
@staticmethod @staticmethod
@resource_extend.extends([attributes.PORTS]) @resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_binding(port_res, port_db): def _extend_port_dict_binding(port_res, port_db):
plugin = directory.get_plugin() plugin = directory.get_plugin()
if not isinstance(plugin, PortBindingBaseMixin): if not isinstance(plugin, PortBindingBaseMixin):

View File

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

View File

@ -12,12 +12,13 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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.definitions import port_security as psec
from neutron_lib.api import validators from neutron_lib.api import validators
from neutron_lib.plugins import directory from neutron_lib.plugins import directory
from neutron_lib.utils import net 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 _resource_extend as resource_extend
from neutron.db import portsecurity_db_common from neutron.db import portsecurity_db_common
@ -26,7 +27,8 @@ from neutron.db import portsecurity_db_common
class PortSecurityDbMixin(portsecurity_db_common.PortSecurityDbCommon): class PortSecurityDbMixin(portsecurity_db_common.PortSecurityDbCommon):
@staticmethod @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): def _extend_port_security_dict(response_data, db_data):
plugin = directory.get_plugin() plugin = directory.get_plugin()
if ('port-security' in if ('port-security' in

View File

@ -13,6 +13,7 @@
# under the License. # under the License.
import netaddr import netaddr
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api import validators from neutron_lib.api import validators
from neutron_lib.callbacks import events from neutron_lib.callbacks import events
from neutron_lib.callbacks import exceptions from neutron_lib.callbacks import exceptions
@ -27,7 +28,6 @@ import six
from sqlalchemy.orm import scoped_session from sqlalchemy.orm import scoped_session
from neutron._i18n import _ from neutron._i18n import _
from neutron.api.v2 import attributes
from neutron.common import constants as n_const from neutron.common import constants as n_const
from neutron.common import utils from neutron.common import utils
from neutron.db import _model_query as model_query from neutron.db import _model_query as model_query
@ -701,7 +701,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
**kwargs) **kwargs)
@staticmethod @staticmethod
@resource_extend.extends([attributes.PORTS]) @resource_extend.extends([port_def.COLLECTION_NAME])
def _extend_port_dict_security_group(port_res, port_db): def _extend_port_dict_security_group(port_res, port_db):
# Security group bindings will be retrieved from the SQLAlchemy # Security group bindings will be retrieved from the SQLAlchemy
# model. As they're loaded eagerly with ports because of the # 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 # TODO(ihrachys): consider renaming the module since now it does not contain
# any models at all # 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 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""" """Mixin class to extend subnet with service type attribute"""
@staticmethod @staticmethod
@resource_extend.extends([attributes.SUBNETS]) @resource_extend.extends([subnet_def.COLLECTION_NAME])
def _extend_subnet_service_types(subnet_res, subnet_db): def _extend_subnet_service_types(subnet_res, subnet_db):
subnet_res['service_types'] = [service_type['service_type'] for subnet_res['service_types'] = [service_type['service_type'] for
service_type in service_type in

View File

@ -12,7 +12,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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.db import _resource_extend as resource_extend
from neutron.extensions import vlantransparent 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.""" """Mixin class to add vlan transparent methods to db_base_plugin_v2."""
@staticmethod @staticmethod
@resource_extend.extends([attributes.NETWORKS]) @resource_extend.extends([net_def.COLLECTION_NAME])
def _extend_network_dict_vlan_transparent(network_res, network_db): def _extend_network_dict_vlan_transparent(network_res, network_db):
network_res[vlantransparent.VLANTRANSPARENT] = ( network_res[vlantransparent.VLANTRANSPARENT] = (
network_db.vlan_transparent) network_db.vlan_transparent)

View File

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

View File

@ -12,14 +12,13 @@
# under the License. # under the License.
from neutron_lib.api import converters 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.api import extensions
from neutron_lib import constants from neutron_lib import constants
from neutron.api.v2 import attributes
EXTENDED_ATTRIBUTES_2_0 = { EXTENDED_ATTRIBUTES_2_0 = {
attributes.SUBNETS: { subnet_def.COLLECTION_NAME: {
'use_default_subnetpool': {'allow_post': True, 'use_default_subnetpool': {'allow_post': True,
'allow_put': False, 'allow_put': False,
'default': False, 'default': False,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -21,6 +21,9 @@ import contextlib
import hashlib import hashlib
from neutron_lib.api import attributes as lib_attrs 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 constants as n_const
from neutron_lib import exceptions from neutron_lib import exceptions
from oslo_config import cfg 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): 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', {}), net.get('network', {}),
check_allow_post=check_allow_post) check_allow_post=check_allow_post)
return core_plugin.create_network(context, {'network': net_data}) return core_plugin.create_network(context, {'network': net_data})
def create_subnet(core_plugin, context, subnet, check_allow_post=True): 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', {}), subnet.get('subnet', {}),
check_allow_post=check_allow_post) check_allow_post=check_allow_post)
return core_plugin.create_subnet(context, {'subnet': subnet_data}) return core_plugin.create_subnet(context, {'subnet': subnet_data})
def create_port(core_plugin, context, port, check_allow_post=True): 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', {}), port.get('port', {}),
check_allow_post=check_allow_post) check_allow_post=check_allow_post)
return core_plugin.create_port(context, {'port': port_data}) return core_plugin.create_port(context, {'port': port_data})

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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