Allow the service plugin to import the extension

I hit this circular import which made it so that I couldn't import the
extension from db.py within the service plugin because the extension
imports the plugin.  This seems backwards to me.  The extension is the
interface and should pretty much stand alone shouldn't it?  The
service plugin is the implementation and should be free to import it
at will.

This patch fixes the circular import issue.

Change-Id: I3b84496bf65578b02b43bbffb227db9bb9879288
Partially-implements: bp/routed-networks
This commit is contained in:
James Anziano 2016-05-12 14:21:30 +00:00
parent 1ce8ce9546
commit c937b571c8
4 changed files with 21 additions and 22 deletions

View File

@ -22,7 +22,7 @@ from neutron.api import extensions
from neutron.api.v2 import attributes from neutron.api.v2 import attributes
from neutron.api.v2 import base from neutron.api.v2 import base
from neutron.extensions import providernet from neutron.extensions import providernet
from neutron.services.segments import plugin from neutron import manager
SEGMENT = 'segment' SEGMENT = 'segment'
SEGMENTS = '%ss' % SEGMENT SEGMENTS = '%ss' % SEGMENT
@ -103,7 +103,7 @@ class Segment(extensions.ExtensionDescriptor):
controller = base.create_resource( controller = base.create_resource(
SEGMENTS, SEGMENTS,
SEGMENT, SEGMENT,
plugin.Plugin.get_instance(), manager.NeutronManager.get_service_plugins()[SEGMENTS],
resource_attributes) resource_attributes)
return [extensions.ResourceExtension(SEGMENTS, return [extensions.ResourceExtension(SEGMENTS,
controller, controller,
@ -210,3 +210,9 @@ class SegmentPluginBase(object):
value. Each result returned by this function will have value. Each result returned by this function will have
matched one of the values for each key in filters. matched one of the values for each key in filters.
""" """
def get_plugin_description(self):
return "Network Segments"
def get_plugin_type(self):
return SEGMENTS

View File

@ -30,6 +30,7 @@ from neutron.api.v2 import attributes
from neutron.db import common_db_mixin from neutron.db import common_db_mixin
from neutron.db import model_base from neutron.db import model_base
from neutron.db import segments_db as db from neutron.db import segments_db as db
from neutron.extensions import segment as extension
from neutron.services.segments import exceptions from neutron.services.segments import exceptions
@ -91,12 +92,11 @@ class SegmentDbMixin(common_db_mixin.CommonDbMixin):
segment_id = segment.get('id') or uuidutils.generate_uuid() segment_id = segment.get('id') or uuidutils.generate_uuid()
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
network_id = segment['network_id'] network_id = segment['network_id']
# FIXME couldn't use constants because of a circular import problem physical_network = segment[extension.PHYSICAL_NETWORK]
physical_network = segment['physical_network']
if physical_network == constants.ATTR_NOT_SPECIFIED: if physical_network == constants.ATTR_NOT_SPECIFIED:
physical_network = None physical_network = None
network_type = segment['network_type'] network_type = segment[extension.NETWORK_TYPE]
segmentation_id = segment['segmentation_id'] segmentation_id = segment[extension.SEGMENTATION_ID]
if segmentation_id == constants.ATTR_NOT_SPECIFIED: if segmentation_id == constants.ATTR_NOT_SPECIFIED:
segmentation_id = None segmentation_id = None
args = {'id': segment_id, args = {'id': segment_id,

View File

@ -15,10 +15,11 @@
# under the License. # under the License.
from neutron.extensions import segment
from neutron.services.segments import db from neutron.services.segments import db
class Plugin(db.SegmentDbMixin): class Plugin(db.SegmentDbMixin, segment.SegmentPluginBase):
_instance = None _instance = None
@ -29,9 +30,3 @@ class Plugin(db.SegmentDbMixin):
if cls._instance is None: if cls._instance is None:
cls._instance = cls() cls._instance = cls()
return cls._instance return cls._instance
def get_plugin_description(self):
return "Network Segments"
def get_plugin_type(self):
return "segments"

View File

@ -29,8 +29,9 @@ from neutron.services.segments import db
from neutron.tests.common import helpers from neutron.tests.common import helpers
from neutron.tests.unit.db import test_db_base_plugin_v2 from neutron.tests.unit.db import test_db_base_plugin_v2
DB_PLUGIN_KLASS = ('neutron.tests.unit.extensions.test_segment.' SERVICE_PLUGIN_KLASS = 'neutron.services.segments.plugin.Plugin'
'SegmentTestPlugin') TEST_PLUGIN_KLASS = (
'neutron.tests.unit.extensions.test_segment.SegmentTestPlugin')
class SegmentTestExtensionManager(object): class SegmentTestExtensionManager(object):
@ -53,9 +54,10 @@ class SegmentTestExtensionManager(object):
class SegmentTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): class SegmentTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):
def setUp(self, plugin=None, service_plugins=None): def setUp(self, plugin=None):
if not plugin: if not plugin:
plugin = DB_PLUGIN_KLASS plugin = TEST_PLUGIN_KLASS
service_plugins = {'segments_plugin_name': SERVICE_PLUGIN_KLASS}
ext_mgr = SegmentTestExtensionManager() ext_mgr = SegmentTestExtensionManager()
super(SegmentTestCase, self).setUp(plugin=plugin, ext_mgr=ext_mgr, super(SegmentTestCase, self).setUp(plugin=plugin, ext_mgr=ext_mgr,
service_plugins=service_plugins) service_plugins=service_plugins)
@ -285,11 +287,7 @@ class HostSegmentMappingTestCase(SegmentTestCase):
group='ml2') group='ml2')
if not plugin: if not plugin:
plugin = 'neutron.plugins.ml2.plugin.Ml2Plugin' plugin = 'neutron.plugins.ml2.plugin.Ml2Plugin'
segments_plugin = ('neutron.tests.unit.extensions.test_segment.' super(HostSegmentMappingTestCase, self).setUp(plugin=plugin)
'SegmentTestPlugin')
service_plugins = {'segments_plugin_name': segments_plugin}
super(HostSegmentMappingTestCase, self).setUp(
plugin=plugin, service_plugins=service_plugins)
def _get_segments_for_host(self, host): def _get_segments_for_host(self, host):
ctx = context.get_admin_context() ctx = context.get_admin_context()