
The PluginInterface and WorkerSupportServiceMixin classes were rehomed to neutron-lib recently [1] and included a private version of the respective classes. Based on the existing usages of such [2][3], this patch: - Renames WorkerSupportServiceMixin as WorkerBase making it public for consumption [2]. - Collapses _PluginInterface into ServicePluginBase making the definition more compact and understandable. - Formalizes the use of ServicePluginBase by updating the docstring in ExtensionDescriptor to indicate an instance of ServicePluginBase is used for plugin interfaces. This is kosher as existing uses today all return extension plugin interfaces that are subclasses of ServicePluginBase and not PluginInterface. Also see related neutron consumption patch [4]. [1] https://review.openstack.org/412519/ [2] http://codesearch.openstack.org/?q=WorkerSupportServiceMixin [3] http://codesearch.openstack.org/?q=PluginInterface [4] https://review.openstack.org/#/c/441129 Change-Id: I722252b845a4396f1b193459b22e4352c93241e6
93 lines
2.5 KiB
Python
93 lines
2.5 KiB
Python
# 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.
|
|
|
|
import abc
|
|
|
|
from neutron_lib.services import base
|
|
from neutron_lib.tests import _base as test_base
|
|
|
|
|
|
class _Worker(base.WorkerBase):
|
|
pass
|
|
|
|
|
|
class Test_WorkerSupportServiceMixin(test_base.BaseTestCase):
|
|
|
|
def setUp(self):
|
|
super(Test_WorkerSupportServiceMixin, self).setUp()
|
|
self.worker = _Worker()
|
|
|
|
def test_allocate_workers(self):
|
|
self.assertEqual([], self.worker.get_workers())
|
|
|
|
def test_add_worker(self):
|
|
workers = [object(), object()]
|
|
for w in workers:
|
|
self.worker.add_worker(w)
|
|
|
|
self.assertSequenceEqual(workers, self.worker.get_workers())
|
|
|
|
def test_add_workers(self):
|
|
workers = [object(), object(), object()]
|
|
self.worker.add_workers(workers)
|
|
|
|
self.assertSequenceEqual(workers, self.worker.get_workers())
|
|
|
|
|
|
class TestPluginInterface(test_base.BaseTestCase):
|
|
|
|
class ServicePluginStub(base.ServicePluginBase):
|
|
def get_plugin_type(self):
|
|
pass
|
|
|
|
def get_plugin_description(self):
|
|
pass
|
|
|
|
def test_issubclass_hook(self):
|
|
class A(TestPluginInterface.ServicePluginStub):
|
|
def f(self):
|
|
pass
|
|
|
|
class B(base.ServicePluginBase):
|
|
@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(base.ServicePluginBase):
|
|
def f(self):
|
|
pass
|
|
|
|
self.assertFalse(issubclass(A, B))
|
|
|
|
def test_issubclass_hook_not_all_methods_implemented(self):
|
|
class A(TestPluginInterface.ServicePluginStub):
|
|
def f(self):
|
|
pass
|
|
|
|
class B(base.ServicePluginBase):
|
|
@abc.abstractmethod
|
|
def f(self):
|
|
pass
|
|
|
|
@abc.abstractmethod
|
|
def g(self):
|
|
pass
|
|
|
|
self.assertFalse(issubclass(A, B))
|