c2756c3d98
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
88 lines
2.6 KiB
Python
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
|