From a6a344c7b57d0b234fd67c6e05b8ae9cd9f9f219 Mon Sep 17 00:00:00 2001 From: Boden R Date: Fri, 3 Mar 2017 06:27:13 -0700 Subject: [PATCH] Consume ServicePluginBase from neutron-lib Neutron lib now contains ServicePluginBase [1]. In accordance with the discussion in [2], this patch: - Removes ServicePluginBase from neutron and replaces all uses with neutron-lib. - Removes PluginInterface; the plugin interface for extensions is ServicePluginBase; that's what's used by everyone today. - Updates a few UTs, based on the above. NB: A subsequent patch will address the WorkerSupportServiceMixin so its untouched herein. NeutronLibImpact [1] I2b1131ac53e9bfeb42a92f9ef134be6ff4cfe5a3 [2] https://review.openstack.org/#/c/424151/ Change-Id: I1e8f2ee6a96df9ba07dae37f1a80e61ad20693cc --- neutron/api/extensions.py | 26 -------- neutron/extensions/metering.py | 2 +- neutron/extensions/qos.py | 2 +- neutron/extensions/tag.py | 2 +- neutron/services/flavors/flavors_plugin.py | 3 +- .../services/l3_router/l3_router_plugin.py | 2 +- neutron/services/loki/loki_plugin.py | 2 +- neutron/services/revisions/revision_plugin.py | 2 +- neutron/services/service_base.py | 25 -------- .../services/timestamp/timestamp_plugin.py | 3 +- neutron/services/trunk/plugin.py | 2 +- neutron/tests/unit/api/test_extensions.py | 59 +++++-------------- neutron/tests/unit/dummy_plugin.py | 2 +- neutron/tests/unit/extension_stubs.py | 10 +++- neutron/tests/unit/extensions/foxinsocks.py | 3 +- 15 files changed, 37 insertions(+), 108 deletions(-) diff --git a/neutron/api/extensions.py b/neutron/api/extensions.py index 5d67e4a82c1..0d5a7222ecf 100644 --- a/neutron/api/extensions.py +++ b/neutron/api/extensions.py @@ -13,7 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import abc import collections import imp import os @@ -60,31 +59,6 @@ def register_custom_supported_check(alias, f, plugin_agnostic=False): _PLUGIN_AGNOSTIC_EXTENSIONS.add(alias) -@six.add_metaclass(abc.ABCMeta) -class PluginInterface(object): - - @classmethod - def __subclasshook__(cls, klass): - """Checking plugin class. - - The __subclasshook__ method is a class method - that will be called every time a class is tested - using issubclass(klass, PluginInterface). - In that case, it will check that every method - marked with the abstractmethod decorator is - provided by the plugin class. - """ - - if not cls.__abstractmethods__: - return NotImplemented - - for method in cls.__abstractmethods__: - if any(method in base.__dict__ for base in klass.__mro__): - continue - return NotImplemented - return True - - class ActionExtensionController(wsgi.Controller): def __init__(self, application): diff --git a/neutron/extensions/metering.py b/neutron/extensions/metering.py index 5f09c89fc18..fa0f67abdad 100644 --- a/neutron/extensions/metering.py +++ b/neutron/extensions/metering.py @@ -18,12 +18,12 @@ from neutron_lib.api import converters from neutron_lib.api import extensions from neutron_lib.db import constants as db_const from neutron_lib import exceptions as nexception +from neutron_lib.services import base as service_base import six from neutron._i18n import _ from neutron.api.v2 import resource_helper from neutron.plugins.common import constants -from neutron.services import service_base class MeteringLabelNotFound(nexception.NotFound): diff --git a/neutron/extensions/qos.py b/neutron/extensions/qos.py index dcd3797b3f4..81a55477fa4 100644 --- a/neutron/extensions/qos.py +++ b/neutron/extensions/qos.py @@ -21,6 +21,7 @@ from neutron_lib.api import converters from neutron_lib.api import extensions as api_extensions from neutron_lib.db import constants as db_const from neutron_lib.plugins import directory +from neutron_lib.services import base as service_base import six from neutron.api import extensions @@ -30,7 +31,6 @@ from neutron.common import constants as common_constants from neutron.objects.qos import rule as rule_object from neutron.plugins.common import constants from neutron.services.qos import qos_consts -from neutron.services import service_base QOS_PREFIX = "/qos" diff --git a/neutron/extensions/tag.py b/neutron/extensions/tag.py index 90392f07f22..ab5a3c7a4aa 100644 --- a/neutron/extensions/tag.py +++ b/neutron/extensions/tag.py @@ -17,6 +17,7 @@ from neutron_lib.api import extensions as api_extensions from neutron_lib.api import validators from neutron_lib import exceptions from neutron_lib.plugins import directory +from neutron_lib.services import base as service_base import six import webob.exc @@ -26,7 +27,6 @@ from neutron.api.v2 import attributes from neutron.api.v2 import base from neutron.api.v2 import resource as api_resource from neutron.common import rpc as n_rpc -from neutron.services import service_base TAG = 'tag' diff --git a/neutron/services/flavors/flavors_plugin.py b/neutron/services/flavors/flavors_plugin.py index e82d30c4b0f..917c614807b 100644 --- a/neutron/services/flavors/flavors_plugin.py +++ b/neutron/services/flavors/flavors_plugin.py @@ -13,9 +13,10 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.services import base as service_base + from neutron.db import flavors_db from neutron.plugins.common import constants -from neutron.services import service_base class FlavorsPlugin(service_base.ServicePluginBase, diff --git a/neutron/services/l3_router/l3_router_plugin.py b/neutron/services/l3_router/l3_router_plugin.py index 6e521816a20..e1e7649be61 100644 --- a/neutron/services/l3_router/l3_router_plugin.py +++ b/neutron/services/l3_router/l3_router_plugin.py @@ -14,6 +14,7 @@ # under the License. from neutron_lib import constants as n_const +from neutron_lib.services import base as service_base from oslo_config import cfg from oslo_log import helpers as log_helpers from oslo_utils import importutils @@ -36,7 +37,6 @@ from neutron.extensions import l3 from neutron.quota import resource_registry from neutron import service from neutron.services.l3_router.service_providers import driver_controller -from neutron.services import service_base class L3RouterPlugin(service_base.ServicePluginBase, diff --git a/neutron/services/loki/loki_plugin.py b/neutron/services/loki/loki_plugin.py index f239892a769..c4b86a7d793 100644 --- a/neutron/services/loki/loki_plugin.py +++ b/neutron/services/loki/loki_plugin.py @@ -15,8 +15,8 @@ import random import time from neutron.db import api as db_api -from neutron.services import service_base +from neutron_lib.services import base as service_base from oslo_db import exception as db_exc from oslo_log import log as logging from sqlalchemy.orm import session as se diff --git a/neutron/services/revisions/revision_plugin.py b/neutron/services/revisions/revision_plugin.py index 853704e4242..8a3bda06d8f 100644 --- a/neutron/services/revisions/revision_plugin.py +++ b/neutron/services/revisions/revision_plugin.py @@ -11,6 +11,7 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.services import base as service_base from oslo_log import log as logging import sqlalchemy from sqlalchemy.orm import exc @@ -20,7 +21,6 @@ from neutron._i18n import _, _LW from neutron.db import _resource_extend as resource_extend from neutron.db import api as db_api from neutron.db import standard_attr -from neutron.services import service_base LOG = logging.getLogger(__name__) diff --git a/neutron/services/service_base.py b/neutron/services/service_base.py index 60676475b5b..21b34ad54ff 100644 --- a/neutron/services/service_base.py +++ b/neutron/services/service_base.py @@ -13,42 +13,17 @@ # License for the specific language governing permissions and limitations # under the License. -import abc - from oslo_log import log as logging from oslo_utils import excutils from oslo_utils import importutils -import six from neutron._i18n import _LE, _LI -from neutron.api import extensions from neutron.db import servicetype_db as sdb from neutron.services import provider_configuration as pconf -from neutron import worker as neutron_worker LOG = logging.getLogger(__name__) -@six.add_metaclass(abc.ABCMeta) -class ServicePluginBase(extensions.PluginInterface, - neutron_worker.WorkerSupportServiceMixin): - """Define base interface for any Advanced Service plugin.""" - supported_extension_aliases = [] - - @abc.abstractmethod - def get_plugin_type(self): - """Return one of predefined service types. - - See neutron/plugins/common/constants.py - """ - pass - - @abc.abstractmethod - def get_plugin_description(self): - """Return string description of the plugin.""" - pass - - def load_drivers(service_type, plugin): """Loads drivers for specific service. diff --git a/neutron/services/timestamp/timestamp_plugin.py b/neutron/services/timestamp/timestamp_plugin.py index a1926ac0e82..29e00332729 100644 --- a/neutron/services/timestamp/timestamp_plugin.py +++ b/neutron/services/timestamp/timestamp_plugin.py @@ -12,12 +12,13 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron_lib.services import base as service_base + from neutron.db import _model_query as model_query from neutron.db import _resource_extend as resource_extend from neutron.db import models_v2 from neutron.db import standard_attr from neutron.objects import base as base_obj -from neutron.services import service_base from neutron.services.timestamp import timestamp_db as ts_db diff --git a/neutron/services/trunk/plugin.py b/neutron/services/trunk/plugin.py index 641fbed9bfc..7b21f24eb69 100644 --- a/neutron/services/trunk/plugin.py +++ b/neutron/services/trunk/plugin.py @@ -15,6 +15,7 @@ import copy from neutron_lib import context +from neutron_lib.services import base as service_base from oslo_log import log as logging from oslo_utils import uuidutils @@ -29,7 +30,6 @@ from neutron.db import db_base_plugin_common from neutron.extensions import portbindings from neutron.objects import base as objects_base from neutron.objects import trunk as trunk_objects -from neutron.services import service_base from neutron.services.trunk import callbacks from neutron.services.trunk import constants from neutron.services.trunk import drivers diff --git a/neutron/tests/unit/api/test_extensions.py b/neutron/tests/unit/api/test_extensions.py index 71c601a2370..e30eda125c3 100644 --- a/neutron/tests/unit/api/test_extensions.py +++ b/neutron/tests/unit/api/test_extensions.py @@ -13,13 +13,13 @@ # License for the specific language governing permissions and limitations # under the License. -import abc import copy import fixtures import mock from neutron_lib import constants as lib_const from neutron_lib.plugins import directory +from neutron_lib.services import base as service_base from oslo_config import cfg from oslo_log import log as logging from oslo_serialization import jsonutils @@ -85,7 +85,7 @@ class ExtensionsTestApp(base_wsgi.Router): super(ExtensionsTestApp, self).__init__(mapper) -class FakePluginWithExtension(object): +class FakePluginWithExtension(service_base.ServicePluginBase): """A fake plugin used only for extension testing in this file.""" supported_extension_aliases = ["FOXNSOX"] @@ -93,6 +93,12 @@ class FakePluginWithExtension(object): def method_to_support_foxnsox_extension(self, context): self._log("method_to_support_foxnsox_extension", context) + def get_plugin_type(self): + pass + + def get_plugin_description(self): + pass + class ExtensionPathTest(base.BaseTestCase): @@ -128,47 +134,6 @@ class ExtensionPathTest(base.BaseTestCase): self.assertEqual(path, '%s:path1' % self.base_path) -class PluginInterfaceTest(base.BaseTestCase): - def test_issubclass_hook(self): - class A(object): - def f(self): - pass - - class B(extensions.PluginInterface): - @abc.abstractmethod - def f(self): - pass - - self.assertTrue(issubclass(A, B)) - - def test_issubclass_hook_class_without_abstract_methods(self): - class A(object): - def f(self): - pass - - class B(extensions.PluginInterface): - def f(self): - pass - - self.assertFalse(issubclass(A, B)) - - def test_issubclass_hook_not_all_methods_implemented(self): - class A(object): - def f(self): - pass - - class B(extensions.PluginInterface): - @abc.abstractmethod - def f(self): - pass - - @abc.abstractmethod - def g(self): - pass - - self.assertFalse(issubclass(A, B)) - - class ResourceExtensionTest(base.BaseTestCase): class ResourceExtensionController(wsgi.Controller): @@ -752,13 +717,19 @@ class PluginAwareExtensionManagerTest(base.BaseTestCase): def test_extensions_are_loaded_for_plugin_with_expected_interface(self): - class PluginWithExpectedInterface(object): + class PluginWithExpectedInterface(service_base.ServicePluginBase): """Implements get_foo method as expected by extension.""" supported_extension_aliases = ["supported_extension"] def get_foo(self, bar=None): pass + def get_plugin_type(self): + pass + + def get_plugin_description(self): + pass + plugin_info = {lib_const.CORE: PluginWithExpectedInterface()} with mock.patch("neutron.api.extensions.PluginAwareExtensionManager." "check_if_plugin_extensions_loaded"): diff --git a/neutron/tests/unit/dummy_plugin.py b/neutron/tests/unit/dummy_plugin.py index e180cb84809..eb566d4f1b7 100644 --- a/neutron/tests/unit/dummy_plugin.py +++ b/neutron/tests/unit/dummy_plugin.py @@ -15,6 +15,7 @@ from neutron_lib import exceptions from neutron_lib.plugins import directory +from neutron_lib.services import base as service_base from oslo_utils import uuidutils from neutron.api import extensions @@ -22,7 +23,6 @@ from neutron.api.v2 import base from neutron.db import servicetype_db from neutron.extensions import servicetype from neutron.plugins.common import constants -from neutron.services import service_base RESOURCE_NAME = "dummy" diff --git a/neutron/tests/unit/extension_stubs.py b/neutron/tests/unit/extension_stubs.py index ab0e19c4363..83ca64b2ac0 100644 --- a/neutron/tests/unit/extension_stubs.py +++ b/neutron/tests/unit/extension_stubs.py @@ -16,8 +16,8 @@ import abc from neutron_lib.api import extensions as api_extensions +from neutron_lib.services import base -from neutron.api import extensions from neutron import wsgi @@ -67,12 +67,18 @@ class ExtensionExpectingPluginInterface(StubExtension): return StubPluginInterface -class StubPluginInterface(extensions.PluginInterface): +class StubPluginInterface(base.ServicePluginBase): @abc.abstractmethod def get_foo(self, bar=None): pass + def get_plugin_type(self): + pass + + def get_plugin_description(self): + pass + class StubBaseAppController(wsgi.Controller): diff --git a/neutron/tests/unit/extensions/foxinsocks.py b/neutron/tests/unit/extensions/foxinsocks.py index e63d6ff15b2..b39c847362d 100644 --- a/neutron/tests/unit/extensions/foxinsocks.py +++ b/neutron/tests/unit/extensions/foxinsocks.py @@ -16,6 +16,7 @@ import abc from neutron_lib.api import extensions as api_extensions +from neutron_lib.services import base from oslo_serialization import jsonutils import six @@ -30,7 +31,7 @@ class FoxInSocksController(wsgi.Controller): @six.add_metaclass(abc.ABCMeta) -class FoxInSocksPluginInterface(extensions.PluginInterface): +class FoxInSocksPluginInterface(base.ServicePluginBase): @abc.abstractmethod def method_to_support_foxnsox_extension(self):