Commit 0fa481f5 authored by Andrea Spadaccini's avatar Andrea Spadaccini
Browse files

Add RunLocalHooks decorator

Add the RunLocalHooks decorator, that allows the execution of hooks
locally. Also, add a RunLocalHooks method to HooksRunner, to adapt the
signature of HooksRunner.RunHooks to the one expected by HooksMaster,
and also to check that the hooks are being executed locally.
Signed-off-by: default avatarAndrea Spadaccini <>
Reviewed-by: default avatarMichael Hanselmann <>
parent 949dcb1d
......@@ -60,6 +60,7 @@ from ganeti import ssconf
from ganeti import serializer
from ganeti import netutils
from ganeti import runtime
from ganeti import mcpu
_BOOT_ID_PATH = "/proc/sys/kernel/random/boot_id"
......@@ -249,6 +250,39 @@ def GetMasterInfo():
def RunLocalHooks(hook_opcode, hooks_path, env_builder_fn):
"""Decorator that runs hooks before and after the decorated function.
@type hook_opcode: string
@param hook_opcode: opcode of the hook
@type hooks_path: string
@param hooks_path: path of the hooks
@type env_builder_fn: function
@param env_builder_fn: function that returns a dictionary containing the
environment variables for the hooks.
@raise RPCFail: in case of pre-hook failure
def decorator(fn):
def wrapper(*args, **kwargs):
_, myself = ssconf.GetMasterAndMyself()
nodes = ([myself], [myself]) # these hooks run locally
cfg = _GetConfig()
hr = HooksRunner()
hm = mcpu.HooksMaster(hook_opcode, hooks_path, nodes, hr.RunLocalHooks,
None, env_builder_fn, logging.warning,
cfg.GetClusterName(), cfg.GetMasterNode())
result = fn(*args, **kwargs)
return result
return wrapper
return decorator
def ActivateMasterIp():
"""Activate the IP address of the master daemon.
......@@ -3425,6 +3459,20 @@ class HooksRunner(object):
# constant
self._BASE_DIR = hooks_base_dir # pylint: disable=C0103
def RunLocalHooks(self, node_list, hpath, phase, env):
"""Check that the hooks will be run only locally and then run them.
assert len(node_list) == 1
node = node_list[0]
_, myself = ssconf.GetMasterAndMyself()
assert node == myself
results = self.RunHooks(hpath, phase, env)
# Return values in the form expected by HooksMaster
return {node: (None, False, results)}
def RunHooks(self, hpath, phase, env):
"""Run the scripts in the hooks directory.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment