neutron-lib/neutron_lib/services/base.py
Boden R c2756c3d98 Formalize base service classes
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
2017-03-06 09:02:44 -07:00

88 lines
2.6 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
import six
class WorkerBase(object):
@property
def _workers(self):
try:
return self.__workers
except AttributeError:
self.__workers = []
return self.__workers
def get_workers(self):
"""Returns a collection NeutronWorker instances needed by this service.
"""
return list(self._workers)
def add_worker(self, worker):
"""Adds NeutronWorker needed for this service
If a object needs to define workers thread/processes outside of API/RPC
workers then it will call this method to register worker. Should be
called on initialization stage before running services
"""
self._workers.append(worker)
def add_workers(self, workers):
"""Adds NeutronWorker list needed for this service
The same as add_worker but adds a list of workers
"""
self._workers.extend(workers)
@six.add_metaclass(abc.ABCMeta)
class ServicePluginBase(WorkerBase):
"""Define base interface for any Advanced Service plugin."""
supported_extension_aliases = []
@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, ServicePluginBase).
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
@abc.abstractmethod
def get_plugin_type(self):
"""Return one of predefined service types.
"""
pass
@abc.abstractmethod
def get_plugin_description(self):
"""Return string description of the plugin."""
pass