diff options
| author | Brian Elliott <brian.elliott@rackspace.com> | 2012-11-16 15:45:59 +0000 |
|---|---|---|
| committer | Brian Elliott <brian.elliott@rackspace.com> | 2012-11-30 20:47:53 +0000 |
| commit | e937a53065377ecb7c30372ce880bd3d358f4572 (patch) | |
| tree | bfd55c165f34c98d14d17bde3a71ecf9845231ff /doc/source | |
| parent | 18bc8abd031f294c69941bd0401738b664f14bf0 (diff) | |
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
Diffstat (limited to 'doc/source')
| -rw-r--r-- | doc/source/devref/hooks.rst | 57 | ||||
| -rw-r--r-- | doc/source/devref/index.rst | 1 |
2 files changed, 58 insertions, 0 deletions
diff --git a/doc/source/devref/hooks.rst b/doc/source/devref/hooks.rst new file mode 100644 index 000000000..a53e37352 --- /dev/null +++ b/doc/source/devref/hooks.rst @@ -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): + .... diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst index 239848c62..0b7883f7b 100644 --- a/doc/source/devref/index.rst +++ b/doc/source/devref/index.rst @@ -43,6 +43,7 @@ Background Concepts for Nova filter_scheduler multinic rpc + hooks Other Resources --------------- |
