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.
