58 lines
1.5 KiB
ReStructuredText
Raw Normal View History

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://pythonhosted.org/setuptools/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):
....