Ian Wells c8d15c9bcc Remove six
Six is Python 2 and 3 compatibility.  It is no longer needed now that
we're purely py3.

Change-Id: I28a6f8539b3b3ce35221728ec631380a18c921b3
2020-07-27 23:15:31 +00:00

80 lines
2.2 KiB
Python

# Copyright (c) 2018 Cisco Systems, Inc.
# All Rights Reserved.
#
# 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.
from abc import ABC, abstractmethod
class HookManager(object):
"""Extension hooks
An extension may provide hook-in points where specific events
within the extension can be tapped into. Initialisation of an
extension creates a list of hooks in its __init__ call, and
after all extension have been created all extensions will
receive an 'initialize' call that will allow each extension
to hook into the hook points provided by others or by
the base system.
The entity hosting the extension may also provide hooks.
"""
def __init__(self):
self.hooks = {}
def call(self, name, *args, **kwargs):
for f in self.hooks[name]:
f(*args, **kwargs)
def create(self, name):
"""Called by an extension to advertise a hook"""
self.hooks[name] = []
def attach(self, name, call):
"""Called by an extension to use a hook from another"""
self.hooks[name].append(call)
class ExtensionBase(ABC):
def __init__(self):
self.hooks = HookManager()
def deps(self):
"""List of plugin dependencies by name
This plugin requires the dependencies, and may hook to
them.
"""
return []
def initialize(self, manager):
"""Add cross-references to other extensions if required"""
pass
class VPPAgentExtensionBase(ExtensionBase):
@abstractmethod
def run(self, host, client_factory, vpp_forwarder):
"""Begin threads watching etcd."""
pass
class MechDriverExtensionBase(ExtensionBase):
@abstractmethod
def run(self, communicator):
pass