Remove _standard_attr_segment_lib and use definition from neutron-lib

It is available in Neutron lib since version 1.16 so pretty long time
now.

Also use segment api definition from neutron-lib, it's available
since version 1.19.0. The api definition from neutron-lib also
avoids circulary dependency b/w standard-attr-segment and segment
extension[1].

[1] https://review.opendev.org/c/openstack/neutron-lib/+/577866

Change-Id: I13699f8c494a15d8bb9e13f767f2725f7cab9f4f
Related-Bug: #1765008
This commit is contained in:
Slawek Kaplonski 2021-06-05 12:31:49 +02:00 committed by yatinkarel
parent 6349d1be38
commit 3ac4b0d634
7 changed files with 18 additions and 153 deletions

View File

@ -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

View File

@ -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(

View File

@ -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 = {}

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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()