Add generic customization hooks via decorator.
Hooks add the ability to insert custom code around operations that declare a named hook: e.g. @hooks.add_hooks('create_instance') def create_instance(....): .... The above hook allows Hook objects to be run 'pre' and 'post' the execution of create_instance() Hook objects are discovered via the setuptools entry point group 'nova.hooks'. Change-Id: I3961df12ef415085de7459438967edacc34500c2
This commit is contained in:
parent
be3088b0bc
commit
e99653b60c
|
@ -0,0 +1,57 @@
|
||||||
|
Hooks
|
||||||
|
=====
|
||||||
|
|
||||||
|
Hooks provide a mechanism to extend Nova with custom code through a plugin
|
||||||
|
mechanism.
|
||||||
|
|
||||||
|
Named hooks are added to nova code via a decorator that will lazily load
|
||||||
|
plugin code matching the name. The loading works via setuptools
|
||||||
|
`entry points`_.
|
||||||
|
|
||||||
|
.. _`entry points`: http://packages.python.org/distribute/pkg_resources.html#entry-points
|
||||||
|
|
||||||
|
What are hooks good for?
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Hooks are good for anchoring your custom code to Nova internal APIs.
|
||||||
|
|
||||||
|
What are hooks NOT good for?
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Hooks should not be used when API stability is a key factor. Internal APIs may
|
||||||
|
change. Consider using a notification driver if this is important to you.
|
||||||
|
|
||||||
|
Declaring hooks in the Nova codebase
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
The following example declares a *resize_hook* around the *resize_instance* method::
|
||||||
|
|
||||||
|
from nova import hooks
|
||||||
|
|
||||||
|
@hooks.add_hook("resize_hook")
|
||||||
|
def resize_instance(self, context, instance, a=1, b=2):
|
||||||
|
...
|
||||||
|
|
||||||
|
Hook objects can now be attached via entry points to the *resize_hook*.
|
||||||
|
|
||||||
|
Adding hook object code
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
1. Setup a Python package with a setup.py file.
|
||||||
|
2. Add the following to the setup.py setup call::
|
||||||
|
|
||||||
|
entry_points = [
|
||||||
|
'nova.hooks': [
|
||||||
|
'resize_hook': your_package.hooks.YourHookClass,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
3. *YourHookClass* should be an object with *pre* and/or *post* methods::
|
||||||
|
|
||||||
|
class YourHookClass(object):
|
||||||
|
|
||||||
|
def pre(self, *args, **kwargs):
|
||||||
|
....
|
||||||
|
|
||||||
|
def post(self, rv, *args, **kwargs):
|
||||||
|
....
|
|
@ -43,6 +43,7 @@ Background Concepts for Nova
|
||||||
filter_scheduler
|
filter_scheduler
|
||||||
multinic
|
multinic
|
||||||
rpc
|
rpc
|
||||||
|
hooks
|
||||||
|
|
||||||
Other Resources
|
Other Resources
|
||||||
---------------
|
---------------
|
||||||
|
|
Loading…
Reference in New Issue