On Tue, Mar 6, 2012 at 11:59 PM, Iustin Pop <[email protected]> wrote:
> This brings together all previous pieces and allows balancing to work
> (with the known caveats related to disk space calculation) for shared
> storage disk templates.
> ---
>  htools/Ganeti/HTools/Cluster.hs |   20 +++++++++++++++++++-
>  htools/Ganeti/HTools/Types.hs   |    2 ++
>  2 files changed, 21 insertions(+), 1 deletions(-)
>
> diff --git a/htools/Ganeti/HTools/Cluster.hs b/htools/Ganeti/HTools/Cluster.hs
> index e2ec8b8..7c225f7 100644
> --- a/htools/Ganeti/HTools/Cluster.hs
> +++ b/htools/Ganeti/HTools/Cluster.hs
> @@ -391,6 +391,17 @@ applyMove nl inst Failover =
>                 new_inst, old_sdx, old_pdx)
>   in new_nl
>
> +-- Failover to any (fa)
> +applyMove nl inst (FailoverToAny new_pdx) =
> +  let (old_pdx, old_sdx, old_p, _) = instanceNodes nl inst
> +      tgt_n = Container.find new_pdx nl
> +      !new_nl = do -- Maybe monad
> +        new_p <- Node.addPriEx (Node.offline old_p) tgt_n inst
> +        let new_inst = Instance.setPri inst new_pdx
> +        return (Container.addTwo old_pdx (Node.removePri old_p inst)
> +                new_pdx new_p nl, new_inst, new_pdx, old_sdx)
> +  in new_nl
> +

Can we have a bit more verbose variable names and explanations here?

>  -- Replace the primary (f:, r:np, f)
>  applyMove nl inst (ReplacePrimary new_pdx) =
>   let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
> @@ -516,7 +527,10 @@ possibleMoves :: MirrorType -- ^ The mirroring type of 
> the instance
>
>  possibleMoves MirrorNone _ _ _ = []
>
> -possibleMoves MirrorExternal _ _ _ = []
> +possibleMoves MirrorExternal _ False _ = []
> +
> +possibleMoves MirrorExternal _ True tdx =
> +  [ FailoverToAny tdx ]
>
>  possibleMoves MirrorInternal _ False tdx =
>   [ ReplaceSecondary tdx ]
> @@ -1215,12 +1229,14 @@ computeMoves :: Instance.Instance -- ^ The instance 
> to be moved
>  computeMoves i inam mv c d =
>   case mv of
>     Failover -> ("f", [mig])
> +    FailoverToAny _ -> (printf "fa:%s" c, [mig_any])
>     FailoverAndReplace _ -> (printf "f r:%s" d, [mig, rep d])
>     ReplaceSecondary _ -> (printf "r:%s" d, [rep d])
>     ReplaceAndFailover _ -> (printf "r:%s f" c, [rep c, mig])
>     ReplacePrimary _ -> (printf "f r:%s f" c, [mig, rep c, mig])
>   where morf = if Instance.isRunning i then "migrate" else "failover"
>         mig = printf "%s -f %s" morf inam::String
> +        mig_any = printf "%s -f -n %s %s" morf c inam
>         rep n = printf "replace-disks -n %s %s" n inam
>
>  -- | Converts a placement to string format.
> @@ -1374,10 +1390,12 @@ iMoveToJob nl il idx move =
>       iname = Instance.name inst
>       lookNode  = Just . Container.nameOf nl
>       opF = OpCodes.OpInstanceMigrate iname True False True Nothing
> +      opFA n = OpCodes.OpInstanceMigrate iname True False True (lookNode n)
>       opR n = OpCodes.OpInstanceReplaceDisks iname (lookNode n)
>               OpCodes.ReplaceNewSecondary [] Nothing
>   in case move of
>        Failover -> [ opF ]
> +       FailoverToAny np -> [ opFA np ]
>        ReplacePrimary np -> [ opF, opR np, opF ]
>        ReplaceSecondary ns -> [ opR ns ]
>        ReplaceAndFailover np -> [ opR np, opF ]
> diff --git a/htools/Ganeti/HTools/Types.hs b/htools/Ganeti/HTools/Types.hs
> index b2d2082..9db018c 100644
> --- a/htools/Ganeti/HTools/Types.hs
> +++ b/htools/Ganeti/HTools/Types.hs
> @@ -296,6 +296,8 @@ type Placement = (Idx, Ndx, Ndx, IMove, Score)
>
>  -- | An instance move definition.
>  data IMove = Failover                -- ^ Failover the instance (f)
> +           | FailoverToAny Ndx       -- ^ Failover to a random node
> +                                     -- (fa:np), for shared storage
>            | ReplacePrimary Ndx      -- ^ Replace primary (f, r:np, f)
>            | ReplaceSecondary Ndx    -- ^ Replace secondary (r:ns)
>            | ReplaceAndFailover Ndx  -- ^ Replace secondary, failover (r:np, 
> f)

Thanks,

Guido

Reply via email to