Hi!

On Mon, 15 Jun 2015 at 18:16 'Klaus Aehlig' via ganeti-devel <
[email protected]> wrote:

> On disk convertion to DRBD, a new secondary node has to be found.
>

typo: conversion (?)


> Add a function doing this search in a way similar to what instance
> allocation does: all possible placements are considered and the
> one resulting in the best cluster metrics is taken.
>
> To have a uniform interface, use the same signature as all allocation
> functions, even though the group list is not needed (we have to take
> the group of the primary node anyway).
>
> Signed-off-by: Klaus Aehlig <[email protected]>
> ---
>  Makefile.am                                    |  1 +
>  src/Ganeti/HTools/Cluster/AllocateSecondary.hs | 70
> ++++++++++++++++++++++++++
>  2 files changed, 71 insertions(+)
>  create mode 100644 src/Ganeti/HTools/Cluster/AllocateSecondary.hs
>
> diff --git a/Makefile.am b/Makefile.am
> index b1e3064..fc66e93 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -909,6 +909,7 @@ HS_LIB_SRCS = \
>         src/Ganeti/HTools/Backend/Text.hs \
>         src/Ganeti/HTools/CLI.hs \
>         src/Ganeti/HTools/Cluster.hs \
> +       src/Ganeti/HTools/Cluster/AllocateSecondary.hs \
>         src/Ganeti/HTools/Cluster/AllocationSolution.hs \
>         src/Ganeti/HTools/Cluster/Evacuate.hs \
>         src/Ganeti/HTools/Cluster/Metrics.hs \
> diff --git a/src/Ganeti/HTools/Cluster/AllocateSecondary.hs
> b/src/Ganeti/HTools/Cluster/AllocateSecondary.hs
> new file mode 100644
> index 0000000..a00d0e8
> --- /dev/null
> +++ b/src/Ganeti/HTools/Cluster/AllocateSecondary.hs
> @@ -0,0 +1,70 @@
> +{-| Implementation of finding a secondary for disk template conversion
> +
> +-}
> +
> +{-
> +
> +Copyright (C) 2015 Google Inc.
> +All rights reserved.
> +
> +Redistribution and use in source and binary forms, with or without
> +modification, are permitted provided that the following conditions are
> +met:
> +
> +1. Redistributions of source code must retain the above copyright notice,
> +this list of conditions and the following disclaimer.
> +
> +2. Redistributions in binary form must reproduce the above copyright
> +notice, this list of conditions and the following disclaimer in the
> +documentation and/or other materials provided with the distribution.
> +
> +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
> +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
> +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
> +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +-}
> +
> +module Ganeti.HTools.Cluster.AllocateSecondary
> +  ( tryAllocateSecondary
> +  ) where
> +
> +import Control.Monad (unless)
> +
> +import Ganeti.BasicTypes
> +import Ganeti.HTools.AlgorithmParams (AlgorithmOptions(..))
> +import qualified Ganeti.HTools.Cluster as Cluster
> +import Ganeti.HTools.Cluster.AllocationSolution (AllocSolution)
> +import qualified Ganeti.HTools.Container as Container
> +import qualified Ganeti.HTools.Group as Group
> +import qualified Ganeti.HTools.Instance as Instance
> +import qualified Ganeti.HTools.Node as Node
> +import Ganeti.HTools.Types
> +
> +tryAllocateSecondary :: AlgorithmOptions
> +                     -> Group.List    -- ^ The cluster groups
> +                     -> Node.List     -- ^ The node list (cluster-wide,
> +                                      -- not per group)
> +                     -> Instance.List -- ^ Instance list (cluster-wide)
> +                     -> Idx
> +                     -> Result AllocSolution
> +tryAllocateSecondary opts _ nl il idx = do
> +  let inst = Container.find idx il
> +  unless (Instance.sNode inst < 0)
> +    $ fail "Instance already has a secondary"
> +  let pidx = Instance.pNode inst
> +      pnode = Container.find pidx nl
> +      pnode' = Node.removePri pnode inst
> +      nl' = Container.add pidx pnode' nl
> +      inst' = inst { Instance.diskTemplate = DTDrbd8 }
> +      gidx = Node.group pnode'
> +      sidxs = filter (/= pidx) . Container.keys
> +              $ Container.filter ((==) gidx . Node.group) nl'
> +  Cluster.tryAlloc opts nl' il inst' $ Right [(pidx, sidxs)]
> --
> 2.2.0.rc0.207.ga3a616c
>
>
Rest LGTM, no need to resend.

Reply via email to