On Tue, Mar 4, 2014 at 8:18 AM, Thomas Thrainer <[email protected]> wrote:
> This method can be used to alter the list of node UUIDs on which post
> hooks are executed. PreparePostHookNodes is called after Exec, so LUs
> can use data only known after the execution of the LU.
>
> Signed-off-by: Thomas Thrainer <[email protected]>
> ---
>  lib/backend.py     |  2 +-
>  lib/cmdlib/base.py | 26 ++++++++++++++++++++++++++
>  lib/hooksmaster.py | 15 ++++++++++++---
>  3 files changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/lib/backend.py b/lib/backend.py
> index 558610b..6aac4e1 100644
> --- a/lib/backend.py
> +++ b/lib/backend.py
> @@ -332,7 +332,7 @@ def RunLocalHooks(hook_opcode, hooks_path, 
> env_builder_fn):
>        cfg = _GetConfig()
>        hr = HooksRunner()
>        hm = hooksmaster.HooksMaster(hook_opcode, hooks_path, nodes,
> -                                   hr.RunLocalHooks, None, env_fn,
> +                                   hr.RunLocalHooks, None, env_fn, None,
>                                     logging.warning, cfg.GetClusterName(),
>                                     cfg.GetMasterNode())
>        hm.RunPhase(constants.HOOKS_PHASE_PRE)
> diff --git a/lib/cmdlib/base.py b/lib/cmdlib/base.py
> index 46f5a37..1738fa0 100644
> --- a/lib/cmdlib/base.py
> +++ b/lib/cmdlib/base.py
> @@ -283,6 +283,26 @@ class LogicalUnit(object):
>      """
>      raise NotImplementedError
>
> +  def PreparePostHookNodes(self, post_hook_node_uuids):
> +    """Extend list of nodes to run the post LU hook.
> +
> +    This method allows LUs to change the list of node UUIDs on which the
> +    post hook should run after the LU has been executed but before the post
> +    hook is run.
> +
> +    @type post_hook_node_uuids: list
> +    @param post_hook_node_uuids: The initial list of node UUIDs to run the
> +      post hook on, as returned by L{BuildHooksNodes}.
> +    @rtype: list
> +    @return: list of node UUIDs on which the post hook should run. The 
> default
> +      implementation returns the passed in C{post_hook_node_uuids}, but
> +      custom implementations can choose to alter the list.
> +    """

Missing newline before """: the style police will shout at you :-)


> +    # For consistency wih HooksCallBack we ignore the could be a function
> +    # warning
> +    # pylint: disable=R0201
> +    return post_hook_node_uuids
> +
>    def HooksCallBack(self, phase, hook_results, feedback_fn, lu_result):
>      """Notify the LU about the results of its hooks.
>
> @@ -401,6 +421,12 @@ class NoHooksLU(LogicalUnit): # pylint: disable=W0223
>      """
>      raise AssertionError("BuildHooksNodes called for NoHooksLU")
>
> +  def PreparePostHookNodes(self, post_hook_node_uuids):
> +    """Empty PreparePostHookNodes for NoHooksLU.
> +
> +    """
> +    raise AssertionError("PreparePostHookNodes called for NoHooksLU")
> +
>
>  class Tasklet:
>    """Tasklet base class.
> diff --git a/lib/hooksmaster.py b/lib/hooksmaster.py
> index 515a2a8..1d4c351 100644
> --- a/lib/hooksmaster.py
> +++ b/lib/hooksmaster.py
> @@ -46,8 +46,8 @@ def _RpcResultsToHooksResults(rpc_results):
>
>  class HooksMaster(object):
>    def __init__(self, opcode, hooks_path, nodes, hooks_execution_fn,
> -               hooks_results_adapt_fn, build_env_fn, log_fn, htype=None,
> -               cluster_name=None, master_name=None):
> +               hooks_results_adapt_fn, build_env_fn, prepare_post_nodes_fn,
> +               log_fn, htype=None, cluster_name=None, master_name=None):
>      """Base class for hooks masters.
>
>      This class invokes the execution of hooks according to the behaviour
> @@ -70,6 +70,11 @@ class HooksMaster(object):
>      @type build_env_fn: function that returns a dictionary having strings as
>        keys
>      @param build_env_fn: function that builds the environment for the hooks
> +    @type prepare_post_nodes_fn: function that take a list of node UUIDs and
> +      returns a list of node UUIDs
> +    @param prepare_post_nodes_fn: function that is invoked right before
> +      executing post hooks and can change the list of node UUIDs to run the 
> post
> +      hooks on
>      @type log_fn: function that accepts a string
>      @param log_fn: logging function
>      @type htype: string or None
> @@ -86,6 +91,7 @@ class HooksMaster(object):
>      self.hooks_execution_fn = hooks_execution_fn
>      self.hooks_results_adapt_fn = hooks_results_adapt_fn
>      self.build_env_fn = build_env_fn
> +    self.prepare_post_nodes_fn = prepare_post_nodes_fn
>      self.log_fn = log_fn
>      self.htype = htype
>      self.cluster_name = cluster_name
> @@ -195,6 +201,8 @@ class HooksMaster(object):
>      elif phase == constants.HOOKS_PHASE_POST:
>        if node_names is None:
>          node_names = self.post_nodes
> +        if node_names is not None and self.prepare_post_nodes_fn is not None:
> +          node_names = 
> frozenset(self.prepare_post_nodes_fn(list(node_names)))
>        env = self._BuildEnv(phase)
>      else:
>        raise AssertionError("Unknown phase '%s'" % phase)
> @@ -277,4 +285,5 @@ class HooksMaster(object):
>
>      return HooksMaster(lu.op.OP_ID, lu.HPATH, nodes, hooks_execution_fn,
>                         _RpcResultsToHooksResults, lu.BuildHooksEnv,
> -                       lu.LogWarning, lu.HTYPE, cluster_name, master_name)
> +                       lu.PreparePostHookNodes, lu.LogWarning, lu.HTYPE,
> +                       cluster_name, master_name)
> --
> 1.9.0.279.gdc9e3eb
>

Rest LGTM, thanks.

Michele

-- 
Google Germany GmbH
Dienerstr. 12
80331 München

Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores

Reply via email to