Deprecate nova.hooks

This emits a warning message when hooks are used to ensure that admins
understand that this facility is deprecated in Nova going forward. It
also removes the links to the meager documentation on hooks to ensure
no one finds these by accident and starts using them. Also add a
comment to the code file itself incase someone ends up in it from
other searches.

Change-Id: I31b1223a0dc3fdffe356a816b591fdd88a31483a
This commit is contained in:
Sean Dague 2016-02-29 15:49:20 -05:00
parent 10da208f02
commit 7be5644270
4 changed files with 13 additions and 59 deletions

View File

@ -1,57 +0,0 @@
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):
....

View File

@ -153,7 +153,6 @@ Open Development.
i18n
filter_scheduler
rpc
hooks
block_device_mapping
addmethod.openstackapi
conductor

View File

@ -16,6 +16,9 @@
"""Decorator and config option definitions for adding custom code (hooks)
around callables.
NOTE: as of Nova 13.0 hooks are DEPRECATED and will be removed in the
near future. You should not build any new code using this facility.
Any method may have the 'add_hook' decorator applied, which yields the
ability to invoke Hook objects before or after the method. (i.e. pre and
post)
@ -47,7 +50,7 @@ import functools
from oslo_log import log as logging
import stevedore
from nova.i18n import _, _LE
from nova.i18n import _, _LE, _LW
LOG = logging.getLogger(__name__)
NS = 'nova.hooks'
@ -82,6 +85,8 @@ class HookManager(stevedore.hook.HookManager):
obj = e.obj
hook_method = getattr(obj, method_type, None)
if hook_method:
LOG.warning(_LW("Hooks are deprecated as of Nova 13.0 and "
"will be removed in a future release"))
LOG.debug("Running %(name)s %(type)s-hook: %(obj)s",
{'name': name, 'type': method_type, 'obj': obj})
try:

View File

@ -0,0 +1,7 @@
---
deprecations:
- Deprecate the use of nova.hooks. This facility used to let
arbitrary out of tree code be executed around certain internal
actions, but is unsuitable for having a well maintained
API. Anyone using this facility should bring forward their use
cases in the Newton cycle as nova-specs.