Files
nova/doc/source/devref/hooks.rst
Brian Elliott e937a53065 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
2012-11-30 20:47:53 +00:00

1.5 KiB

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.

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):
            ....