diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index efa381ac50e..530bcd98681 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -20,6 +20,7 @@ import itertools import netaddr from neutron_lib.api.definitions import ip_allocation as ipalloc_apidef from neutron_lib.api.definitions import portbindings +from neutron_lib.api.definitions import segment from neutron_lib.api import validators from neutron_lib import constants as const from neutron_lib.db import api as db_api @@ -35,7 +36,6 @@ from neutron._i18n import _ from neutron.common import ipv6_utils from neutron.db import db_base_plugin_common from neutron.db import models_v2 -from neutron.extensions import segment from neutron.ipam import exceptions as ipam_exceptions from neutron.ipam import utils as ipam_utils from neutron.objects import address_scope as addr_scope_obj diff --git a/neutron/db/models/segment.py b/neutron/db/models/segment.py index ec353932e26..05f3d6132fc 100644 --- a/neutron/db/models/segment.py +++ b/neutron/db/models/segment.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import segment from neutron_lib.db import constants as db_const from neutron_lib.db import model_base from neutron_lib.db import standard_attr @@ -21,7 +22,6 @@ import sqlalchemy as sa from sqlalchemy import orm from neutron.db import models_v2 -from neutron.extensions import segment # Some standalone plugins need a DB table to store provider @@ -51,7 +51,7 @@ class NetworkSegment(standard_attr.HasStandardAttributes, backref=orm.backref("segments", lazy='subquery', cascade='delete')) - api_collections = [segment.SEGMENTS] + api_collections = [segment.COLLECTION_NAME] __table_args__ = ( sa.UniqueConstraint( diff --git a/neutron/extensions/_standard_attr_segment_lib.py b/neutron/extensions/_standard_attr_segment_lib.py deleted file mode 100644 index cc39443d3c1..00000000000 --- a/neutron/extensions/_standard_attr_segment_lib.py +++ /dev/null @@ -1,30 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -TODO(hongbin): This module should be deleted once neutron-lib containing -https://review.opendev.org/#/c/562331/ change is released. -""" - - -ALIAS = 'standard-attr-segment' -IS_SHIM_EXTENSION = True -IS_STANDARD_ATTR_EXTENSION = True -NAME = 'Standard Attribute Segment Extension' -DESCRIPTION = 'Add standard attributes to Segment resource' -UPDATED_TIMESTAMP = '2018-04-09T10:00:00-00:00' -RESOURCE_ATTRIBUTE_MAP = {} -SUB_RESOURCE_ATTRIBUTE_MAP = {} -ACTION_MAP = {} -REQUIRED_EXTENSIONS = [] -OPTIONAL_EXTENSIONS = [] -ACTION_STATUS = {} diff --git a/neutron/extensions/segment.py b/neutron/extensions/segment.py index 2d38c52cb32..8d15716cd52 100644 --- a/neutron/extensions/segment.py +++ b/neutron/extensions/segment.py @@ -14,138 +14,33 @@ import abc -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.definitions import segment as apidef 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 base -from neutron.extensions import _standard_attr_segment_lib as stdattrseg_apidef -from neutron.extensions import standardattrdescription as ext_stddesc - -SEGMENT = 'segment' -SEGMENTS = '%ss' % SEGMENT -SEGMENT_ID = 'segment_id' - -NETWORK_TYPE = 'network_type' -PHYSICAL_NETWORK = 'physical_network' -SEGMENTATION_ID = 'segmentation_id' -NAME_LEN = db_const.NAME_FIELD_SIZE -DESC_LEN = db_const.DESCRIPTION_FIELD_SIZE - -# Attribute Map -RESOURCE_ATTRIBUTE_MAP = { - SEGMENTS: { - 'id': {'allow_post': False, - 'allow_put': False, - 'validate': {'type:uuid': None}, - 'is_filter': True, - 'is_sort_key': True, - 'is_visible': True, - 'primary_key': True}, - 'tenant_id': {'allow_post': True, - 'allow_put': False, - 'validate': {'type:string': - db_const.PROJECT_ID_FIELD_SIZE}, - 'is_sort_key': True, - 'is_visible': False}, - 'network_id': {'allow_post': True, - 'allow_put': False, - 'validate': {'type:uuid': None}, - 'is_filter': True, - 'is_sort_key': True, - 'is_visible': True}, - PHYSICAL_NETWORK: {'allow_post': True, - 'allow_put': False, - 'default': constants.ATTR_NOT_SPECIFIED, - 'validate': {'type:string': - providernet.PHYSICAL_NETWORK_MAX_LEN}, - 'is_filter': True, - 'is_sort_key': True, - 'is_visible': True}, - NETWORK_TYPE: {'allow_post': True, - 'allow_put': False, - 'validate': {'type:string': - providernet.NETWORK_TYPE_MAX_LEN}, - 'is_filter': True, - 'is_sort_key': True, - 'is_visible': True}, - SEGMENTATION_ID: {'allow_post': True, - 'allow_put': False, - 'default': constants.ATTR_NOT_SPECIFIED, - 'convert_to': converters.convert_to_int, - 'is_sort_key': True, - 'is_visible': True}, - 'name': {'allow_post': True, - 'allow_put': True, - 'default': constants.ATTR_NOT_SPECIFIED, - 'validate': {'type:string_or_none': NAME_LEN}, - 'is_filter': True, - 'is_sort_key': True, - 'is_visible': True} - }, - subnet_def.COLLECTION_NAME: { - SEGMENT_ID: {'allow_post': True, - 'allow_put': False, - 'default': None, - 'validate': {'type:uuid_or_none': None}, - 'is_filter': True, - 'is_visible': True, }, - }, -} -class Segment(api_extensions.ExtensionDescriptor): +class Segment(api_extensions.APIExtensionDescriptor): """Extension class supporting Segments.""" - @classmethod - def get_name(cls): - return "Segment" - - @classmethod - def get_alias(cls): - return "segment" - - @classmethod - def get_description(cls): - return "Segments extension." - - @classmethod - def get_updated(cls): - return "2016-02-24T17:00:00-00:00" + api_definition = apidef @classmethod def get_resources(cls): """Returns Extended Resource for service type management.""" - resource_attributes = RESOURCE_ATTRIBUTE_MAP[SEGMENTS] + attr_map = apidef.RESOURCE_ATTRIBUTE_MAP[apidef.COLLECTION_NAME] controller = base.create_resource( - SEGMENTS, - SEGMENT, - directory.get_plugin(SEGMENTS), - resource_attributes, + apidef.COLLECTION_NAME, + apidef.RESOURCE_NAME, + directory.get_plugin(apidef.COLLECTION_NAME), + attr_map, allow_pagination=True, allow_sorting=True) - return [extensions.ResourceExtension(SEGMENTS, + return [extensions.ResourceExtension(apidef.COLLECTION_NAME, controller, - attr_map=resource_attributes)] - - def update_attributes_map(self, attributes): - super(Segment, self).update_attributes_map( - attributes, extension_attrs_map=RESOURCE_ATTRIBUTE_MAP) - - def get_extended_resources(self, version): - if version == "2.0": - return RESOURCE_ATTRIBUTE_MAP - else: - return {} - - def get_required_extensions(self): - return [ext_stddesc.Standardattrdescription.get_alias(), - stdattrseg_apidef.ALIAS] + attr_map=attr_map)] class SegmentPluginBase(object, metaclass=abc.ABCMeta): @@ -247,7 +142,7 @@ class SegmentPluginBase(object, metaclass=abc.ABCMeta): @classmethod def get_plugin_type(cls): - return SEGMENTS + return apidef.COLLECTION_NAME @classmethod def is_loaded(cls): diff --git a/neutron/extensions/standard_attr_segment.py b/neutron/extensions/standard_attr_segment.py index 002019b017a..e5bc37e63c3 100644 --- a/neutron/extensions/standard_attr_segment.py +++ b/neutron/extensions/standard_attr_segment.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from neutron.extensions import _standard_attr_segment_lib as apidef +from neutron_lib.api.definitions import standard_attr_segment as apidef from neutron_lib.api import extensions diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index c00e115db11..35ea24b6a56 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.api.definitions import segment as extension from neutron_lib.callbacks import events from neutron_lib.callbacks import registry from neutron_lib.callbacks import resources @@ -31,7 +32,6 @@ from oslo_utils import uuidutils from neutron.common import utils from neutron.db import segments_db as db -from neutron.extensions import segment as extension from neutron import manager from neutron.objects import base as base_obj from neutron.objects import network diff --git a/neutron/tests/unit/extensions/test_segment.py b/neutron/tests/unit/extensions/test_segment.py index 45ea5cd6212..906532ab016 100644 --- a/neutron/tests/unit/extensions/test_segment.py +++ b/neutron/tests/unit/extensions/test_segment.py @@ -63,7 +63,7 @@ class SegmentTestExtensionManager(object): def get_resources(self): ext_segment.Segment().update_attributes_map( - {ext_segment.SEGMENTS: ext_stddesc.DESCRIPTION_BODY}) + {seg_apidef.COLLECTION_NAME: ext_stddesc.DESCRIPTION_BODY}) return ext_segment.Segment.get_resources() def get_actions(self): @@ -1865,7 +1865,7 @@ class TestNovaSegmentNotifier(SegmentAwareIpamTestCase): # Need notifier here self.patch_notifier.stop() self._mock_keystone_auth() - self.segments_plugin = directory.get_plugin(ext_segment.SEGMENTS) + self.segments_plugin = directory.get_plugin(seg_apidef.COLLECTION_NAME) nova_updater = self.segments_plugin.nova_updater nova_updater.p_client = mock.MagicMock()