General comment: since the word "glob" has a surprising number of meanings,
consider using "is_global" instead to make the code more readable.

On Tue, Nov 10, 2015 at 3:56 PM, 'Oleg Ponomarev' via ganeti-devel <
[email protected]> wrote:

> Add the *glob* argument to the RunPhase function. With *glob* set to
> True, HooksMaster runs global hooks instead of per-opcode's hooks. The
> global hooks should be placed in the "global" subdirectory of the hooks
> directory.
>
> Signed-off-by: Oleg Ponomarev <[email protected]>
> ---
>  lib/hooksmaster.py      | 24 ++++++++++++++++++------
>  src/Ganeti/Constants.hs |  5 +++++
>  2 files changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/lib/hooksmaster.py b/lib/hooksmaster.py
> index c23d857..221e589 100644
> --- a/lib/hooksmaster.py
> +++ b/lib/hooksmaster.py
> @@ -56,7 +56,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,
> prepare_post_nodes_fn,
> -               log_fn, htype=None, cluster_name=None, master_name=None):
> +               log_fn, htype=None, cluster_name=None, master_name=None,
> +               job_id=None):
>

Please add a doclint entry for the job_id.


>      """Base class for hooks masters.
>
>      This class invokes the execution of hooks according to the behaviour
> @@ -105,6 +106,7 @@ class HooksMaster(object):
>      self.htype = htype
>      self.cluster_name = cluster_name
>      self.master_name = master_name
> +    self.job_id = job_id
>
>      self.pre_env = self._BuildEnv(constants.HOOKS_PHASE_PRE)
>      (self.pre_nodes, self.post_nodes) = nodes
> @@ -151,7 +153,8 @@ class HooksMaster(object):
>
>      return env
>
> -  def _RunWrapper(self, node_list, hpath, phase, phase_env):
> +  def _RunWrapper(self, node_list, hpath, phase, phase_env, glob=False,
> +                  post_status=None):
>      """Simple wrapper over self.callfn.
>
>      This method fixes the environment before executing the hooks.
> @@ -175,6 +178,12 @@ class HooksMaster(object):
>      if self.master_name is not None:
>        env["GANETI_MASTER"] = self.master_name
>
> +    if self.job_id and glob:
> +      env["GANETI_JOB_ID"] = self.job_id
> +    if phase == constants.HOOKS_PHASE_POST and glob:
> +      assert post_status is not None
> +      env["GANETI_POST_STATUS"] = post_status
> +
>      if phase_env:
>        env = utils.algo.JoinDisjointDicts(env, phase_env)
>
> @@ -186,7 +195,7 @@ class HooksMaster(object):
>
>      return self.hooks_execution_fn(node_list, hpath, phase, env)
>
> -  def RunPhase(self, phase, node_names=None):
> +  def RunPhase(self, phase, node_names=None, glob=False,
> post_status=None):
>      """Run all the scripts for a phase.
>
>      This is the main function of the HookMaster.
> @@ -198,6 +207,7 @@ class HooksMaster(object):
>          L{constants.HOOKS_PHASE_PRE}; it denotes the hooks phase
>      @param node_names: overrides the predefined list of nodes for the
> given
>          phase
> +    @param glob: whether global or per-opcode hooks should be executed
>

Also the post_status, please.


>      @return: the processed results of the hooks multi-node rpc call
>      @raise errors.HooksFailure: on communication failure to the nodes
>      @raise errors.HooksAbort: on failure of one of the hooks
> @@ -222,7 +232,9 @@ class HooksMaster(object):
>        # even attempt to run, or this LU doesn't do hooks at all
>        return
>
> -    results = self._RunWrapper(node_names, self.hooks_path, phase, env)
> +    hooks_path = constants.GLOBAL_HOOKS_DIR if glob else self.hooks_path
> +    results = self._RunWrapper(node_names, hooks_path, phase, env, glob,
> +                               post_status)
>      if not results:
>        msg = "Communication Failure"
>        if phase == constants.HOOKS_PHASE_PRE:
> @@ -272,7 +284,7 @@ class HooksMaster(object):
>      self._RunWrapper(nodes, hpath, phase, self.pre_env)
>
>    @staticmethod
> -  def BuildFromLu(hooks_execution_fn, lu):
> +  def BuildFromLu(hooks_execution_fn, lu, job_id=None):
>      if lu.HPATH is None:
>        nodes = (None, None)
>      else:
> @@ -290,4 +302,4 @@ class HooksMaster(object):
>      return HooksMaster(lu.op.OP_ID, lu.HPATH, nodes, hooks_execution_fn,
>                         _RpcResultsToHooksResults, lu.BuildHooksEnv,
>                         lu.PreparePostHookNodes, lu.LogWarning, lu.HTYPE,
> -                       cluster_name, master_name)
> +                       cluster_name, master_name, job_id)
> diff --git a/src/Ganeti/Constants.hs b/src/Ganeti/Constants.hs
> index 86c8c95..180ff4d 100644
> --- a/src/Ganeti/Constants.hs
> +++ b/src/Ganeti/Constants.hs
> @@ -724,6 +724,11 @@ hooksPhasePre = "pre"
>  hooksVersion :: Int
>  hooksVersion = 2
>
> +-- * Global hooks related constants
> +
> +globalHooksDir :: String
> +globalHooksDir = "global"
> +
>  -- * Hooks subject type (what object type does the LU deal with)
>
>  htypeCluster :: String
> --
> 2.6.0.rc2.230.g3dd15c0
>
>
Hrvoje Ribicic
Ganeti Engineering
Google Germany GmbH
Dienerstr. 12, 80331, München

Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg

Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind,
leiten Sie diese bitte nicht weiter, informieren Sie den Absender und
löschen Sie die E-Mail und alle Anhänge. Vielen Dank.

This e-mail is confidential. If you are not the right addressee please do
not forward it, please inform the sender, and please erase this e-mail
including any attachments. Thanks.

Reply via email to