[Pkg-ganeti-devel] [ganeti] 101/165: Move cluster moves to a separate module

Apollon Oikonomopoulos apoikos at moszumanska.debian.org
Tue Aug 11 13:53:17 UTC 2015


This is an automated email from the git hooks/post-receive script.

apoikos pushed a commit to branch master
in repository ganeti.

commit 6e4d7a924de79328b13869a19623c931b39add93
Author: Klaus Aehlig <aehlig at google.com>
Date:   Mon Apr 13 17:32:34 2015 +0200

    Move cluster moves to a separate module
    
    ...and export applyMoveEx. In this way, other high level operations,
    like global N+1 redunancy can use it while providing functionality
    that will eventually be used by the main cluster operations without
    having to stuff everything into the already overcrowded
    src/Ganeti/HTools/Cluster.hs.
    
    Signed-off-by: Klaus Aehlig <aehlig at google.com>
    Reviewed-by: Petr Pudlak <pudlak at google.com>
---
 Makefile.am                        |   2 +
 src/Ganeti/HTools/Cluster.hs       | 135 +---------------------------
 src/Ganeti/HTools/Cluster/Moves.hs | 177 +++++++++++++++++++++++++++++++++++++
 src/Ganeti/HTools/Loader.hs        |   3 +-
 4 files changed, 182 insertions(+), 135 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 68107f5..08f696a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -142,6 +142,7 @@ HS_DIRS = \
 	src/Ganeti/Hs2Py \
 	src/Ganeti/HTools \
 	src/Ganeti/HTools/Backend \
+	src/Ganeti/HTools/Cluster \
 	src/Ganeti/HTools/Program \
 	src/Ganeti/Hypervisor \
 	src/Ganeti/Hypervisor/Xen \
@@ -904,6 +905,7 @@ HS_LIB_SRCS = \
 	src/Ganeti/HTools/Backend/Text.hs \
 	src/Ganeti/HTools/CLI.hs \
 	src/Ganeti/HTools/Cluster.hs \
+	src/Ganeti/HTools/Cluster/Moves.hs \
 	src/Ganeti/HTools/Container.hs \
 	src/Ganeti/HTools/Dedicated.hs \
 	src/Ganeti/HTools/ExtLoader.hs \
diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs
index 1bebfb1..71ebba7 100644
--- a/src/Ganeti/HTools/Cluster.hs
+++ b/src/Ganeti/HTools/Cluster.hs
@@ -72,7 +72,6 @@ module Ganeti.HTools.Cluster
   , genericAnnotateSolution
   , solutionDescription
   -- * Balacing functions
-  , setInstanceLocationScore
   , doNextBalance
   , tryBalance
   , compCV
@@ -109,12 +108,12 @@ import Data.List
 import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
 import Data.Ord (comparing)
 import Text.Printf (printf)
-import qualified Data.Set as Set
 
 import Ganeti.BasicTypes
 import qualified Ganeti.Constants as C
 import Ganeti.HTools.AlgorithmParams (AlgorithmOptions(..), defaultOptions)
 import qualified Ganeti.HTools.Container as Container
+import Ganeti.HTools.Cluster.Moves (setInstanceLocationScore, applyMoveEx)
 import qualified Ganeti.HTools.Instance as Instance
 import qualified Ganeti.HTools.Nic as Nic
 import qualified Ganeti.HTools.Node as Node
@@ -254,18 +253,6 @@ computeBadItems nl il =
   in
     (bad_nodes, bad_instances)
 
--- | Extracts the node pairs for an instance. This can fail if the
--- instance is single-homed. FIXME: this needs to be improved,
--- together with the general enhancement for handling non-DRBD moves.
-instanceNodes :: Node.List -> Instance.Instance ->
-                 (Ndx, Ndx, Node.Node, Node.Node)
-instanceNodes nl inst =
-  let old_pdx = Instance.pNode inst
-      old_sdx = Instance.sNode inst
-      old_p = Container.find old_pdx nl
-      old_s = Container.find old_sdx nl
-  in (old_pdx, old_sdx, old_p, old_s)
-
 -- | Zero-initializer for the CStats type.
 emptyCStats :: CStats
 emptyCStats = CStats 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
@@ -514,17 +501,6 @@ compCV = compCVNodes . Container.elems
 getOnline :: Node.List -> [Node.Node]
 getOnline = filter (not . Node.offline) . Container.elems
 
--- | Sets the location score of an instance, given its primary
--- and secondary node.
-setInstanceLocationScore :: Instance.Instance -- ^ the original instance
-                         -> Node.Node -- ^ the primary node of the instance
-                         -> Node.Node -- ^ the secondary node of the instance
-                         -> Instance.Instance -- ^ the instance with the
-                                              -- location score updated
-setInstanceLocationScore t p s =
-  t { Instance.locationScore =
-         Set.size $ Node.locationTags p `Set.intersection` Node.locationTags s }
-
 -- * Balancing functions
 
 -- | Compute best table. Note that the ordering of the arguments is important.
@@ -532,115 +508,6 @@ compareTables :: Table -> Table -> Table
 compareTables a@(Table _ _ a_cv _) b@(Table _ _ b_cv _ ) =
   if a_cv > b_cv then b else a
 
--- | Applies an instance move to a given node list and instance.
-applyMoveEx :: Bool -- ^ whether to ignore soft errors
-               -> Node.List -> Instance.Instance
-               -> IMove -> OpResult (Node.List, Instance.Instance, Ndx, Ndx)
--- Failover (f)
-applyMoveEx force nl inst Failover =
-  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
-      int_p = Node.removePri old_p inst
-      int_s = Node.removeSec old_s inst
-      new_nl = do -- OpResult
-        Node.checkMigration old_p old_s
-        new_p <- Node.addPriEx (Node.offline old_p || force) int_s inst
-        new_s <- Node.addSec int_p inst old_sdx
-        let new_inst = Instance.setBoth inst old_sdx old_pdx
-        return (Container.addTwo old_pdx new_s old_sdx new_p nl,
-                new_inst, old_sdx, old_pdx)
-  in new_nl
-
--- Failover to any (fa)
-applyMoveEx force nl inst (FailoverToAny new_pdx) = do
-  let (old_pdx, old_sdx, old_pnode, _) = instanceNodes nl inst
-      new_pnode = Container.find new_pdx nl
-      force_failover = Node.offline old_pnode || force
-  Node.checkMigration old_pnode new_pnode
-  new_pnode' <- Node.addPriEx force_failover new_pnode inst
-  let old_pnode' = Node.removePri old_pnode inst
-      inst' = Instance.setPri inst new_pdx
-      nl' = Container.addTwo old_pdx old_pnode' new_pdx new_pnode' nl
-  return (nl', inst', new_pdx, old_sdx)
-
--- Replace the primary (f:, r:np, f)
-applyMoveEx force nl inst (ReplacePrimary new_pdx) =
-  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
-      tgt_n = Container.find new_pdx nl
-      int_p = Node.removePri old_p inst
-      int_s = Node.removeSec old_s inst
-      new_inst = Instance.setPri (setInstanceLocationScore inst tgt_n int_s)
-                 new_pdx
-      force_p = Node.offline old_p || force
-      new_nl = do -- OpResult
-                  -- check that the current secondary can host the instance
-                  -- during the migration
-        Node.checkMigration old_p old_s
-        Node.checkMigration old_s tgt_n
-        tmp_s <- Node.addPriEx force_p int_s new_inst
-        let tmp_s' = Node.removePri tmp_s new_inst
-        new_p <- Node.addPriEx force_p tgt_n new_inst
-        new_s <- Node.addSecEx force_p tmp_s' new_inst new_pdx
-        return (Container.add new_pdx new_p $
-                Container.addTwo old_pdx int_p old_sdx new_s nl,
-                new_inst, new_pdx, old_sdx)
-  in new_nl
-
--- Replace the secondary (r:ns)
-applyMoveEx force nl inst (ReplaceSecondary new_sdx) =
-  let old_pdx = Instance.pNode inst
-      old_sdx = Instance.sNode inst
-      old_s = Container.find old_sdx nl
-      tgt_n = Container.find new_sdx nl
-      pnode = Container.find old_pdx nl
-      pnode' = Node.removePri pnode inst
-      int_s = Node.removeSec old_s inst
-      force_s = Node.offline old_s || force
-      new_inst = Instance.setSec (setInstanceLocationScore inst pnode tgt_n)
-                 new_sdx
-      new_nl = do
-        new_s <- Node.addSecEx force_s tgt_n new_inst old_pdx
-        pnode'' <- Node.addPriEx True pnode' new_inst
-        return (Container.add old_pdx pnode'' $
-                Container.addTwo new_sdx new_s old_sdx int_s nl,
-                new_inst, old_pdx, new_sdx)
-  in new_nl
-
--- Replace the secondary and failover (r:np, f)
-applyMoveEx force nl inst (ReplaceAndFailover new_pdx) =
-  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
-      tgt_n = Container.find new_pdx nl
-      int_p = Node.removePri old_p inst
-      int_s = Node.removeSec old_s inst
-      new_inst = Instance.setBoth (setInstanceLocationScore inst int_s tgt_n)
-                 new_pdx old_pdx
-      force_s = Node.offline old_s || force
-      new_nl = do -- OpResult
-        Node.checkMigration old_p tgt_n
-        new_p <- Node.addPriEx force tgt_n new_inst
-        new_s <- Node.addSecEx force_s int_p new_inst new_pdx
-        return (Container.add new_pdx new_p $
-                Container.addTwo old_pdx new_s old_sdx int_s nl,
-                new_inst, new_pdx, old_pdx)
-  in new_nl
-
--- Failver and replace the secondary (f, r:ns)
-applyMoveEx force nl inst (FailoverAndReplace new_sdx) =
-  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
-      tgt_n = Container.find new_sdx nl
-      int_p = Node.removePri old_p inst
-      int_s = Node.removeSec old_s inst
-      force_p = Node.offline old_p || force
-      new_inst = Instance.setBoth (setInstanceLocationScore inst int_s tgt_n)
-                 old_sdx new_sdx
-      new_nl = do -- OpResult
-        Node.checkMigration old_p old_s
-        new_p <- Node.addPriEx force_p int_s new_inst
-        new_s <- Node.addSecEx force_p tgt_n new_inst old_sdx
-        return (Container.add new_sdx new_s $
-                Container.addTwo old_sdx new_p old_pdx int_p nl,
-                new_inst, old_sdx, new_sdx)
-  in new_nl
-
 -- | Tries to allocate an instance on one given node.
 allocateOnSingle :: AlgorithmOptions
                  -> Node.List -> Instance.Instance -> Ndx
diff --git a/src/Ganeti/HTools/Cluster/Moves.hs b/src/Ganeti/HTools/Cluster/Moves.hs
new file mode 100644
index 0000000..67c9f3b
--- /dev/null
+++ b/src/Ganeti/HTools/Cluster/Moves.hs
@@ -0,0 +1,177 @@
+{-| Implementation of instance moves in a cluster.
+
+-}
+
+{-
+
+Copyright (C) 2009, 2010, 2011, 2012, 2013 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.Moves
+  ( applyMoveEx
+  , setInstanceLocationScore
+  ) where
+
+import qualified Data.Set as Set
+
+import Ganeti.HTools.Types
+import qualified Ganeti.HTools.Container as Container
+import qualified Ganeti.HTools.Instance as Instance
+import qualified Ganeti.HTools.Node as Node
+
+-- | Extracts the node pairs for an instance. This can fail if the
+-- instance is single-homed. FIXME: this needs to be improved,
+-- together with the general enhancement for handling non-DRBD moves.
+instanceNodes :: Node.List -> Instance.Instance ->
+                 (Ndx, Ndx, Node.Node, Node.Node)
+instanceNodes nl inst =
+  let old_pdx = Instance.pNode inst
+      old_sdx = Instance.sNode inst
+      old_p = Container.find old_pdx nl
+      old_s = Container.find old_sdx nl
+  in (old_pdx, old_sdx, old_p, old_s)
+
+-- | Sets the location score of an instance, given its primary
+-- and secondary node.
+setInstanceLocationScore :: Instance.Instance -- ^ the original instance
+                         -> Node.Node -- ^ the primary node of the instance
+                         -> Node.Node -- ^ the secondary node of the instance
+                         -> Instance.Instance -- ^ the instance with the
+                                              -- location score updated
+setInstanceLocationScore t p s =
+  t { Instance.locationScore =
+         Set.size $ Node.locationTags p `Set.intersection` Node.locationTags s }
+
+-- | Applies an instance move to a given node list and instance.
+applyMoveEx :: Bool -- ^ whether to ignore soft errors
+               -> Node.List -> Instance.Instance
+               -> IMove -> OpResult (Node.List, Instance.Instance, Ndx, Ndx)
+-- Failover (f)
+applyMoveEx force nl inst Failover =
+  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
+      int_p = Node.removePri old_p inst
+      int_s = Node.removeSec old_s inst
+      new_nl = do -- OpResult
+        Node.checkMigration old_p old_s
+        new_p <- Node.addPriEx (Node.offline old_p || force) int_s inst
+        new_s <- Node.addSec int_p inst old_sdx
+        let new_inst = Instance.setBoth inst old_sdx old_pdx
+        return (Container.addTwo old_pdx new_s old_sdx new_p nl,
+                new_inst, old_sdx, old_pdx)
+  in new_nl
+
+-- Failover to any (fa)
+applyMoveEx force nl inst (FailoverToAny new_pdx) = do
+  let (old_pdx, old_sdx, old_pnode, _) = instanceNodes nl inst
+      new_pnode = Container.find new_pdx nl
+      force_failover = Node.offline old_pnode || force
+  Node.checkMigration old_pnode new_pnode
+  new_pnode' <- Node.addPriEx force_failover new_pnode inst
+  let old_pnode' = Node.removePri old_pnode inst
+      inst' = Instance.setPri inst new_pdx
+      nl' = Container.addTwo old_pdx old_pnode' new_pdx new_pnode' nl
+  return (nl', inst', new_pdx, old_sdx)
+
+-- Replace the primary (f:, r:np, f)
+applyMoveEx force nl inst (ReplacePrimary new_pdx) =
+  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
+      tgt_n = Container.find new_pdx nl
+      int_p = Node.removePri old_p inst
+      int_s = Node.removeSec old_s inst
+      new_inst = Instance.setPri (setInstanceLocationScore inst tgt_n int_s)
+                 new_pdx
+      force_p = Node.offline old_p || force
+      new_nl = do -- OpResult
+                  -- check that the current secondary can host the instance
+                  -- during the migration
+        Node.checkMigration old_p old_s
+        Node.checkMigration old_s tgt_n
+        tmp_s <- Node.addPriEx force_p int_s new_inst
+        let tmp_s' = Node.removePri tmp_s new_inst
+        new_p <- Node.addPriEx force_p tgt_n new_inst
+        new_s <- Node.addSecEx force_p tmp_s' new_inst new_pdx
+        return (Container.add new_pdx new_p $
+                Container.addTwo old_pdx int_p old_sdx new_s nl,
+                new_inst, new_pdx, old_sdx)
+  in new_nl
+
+-- Replace the secondary (r:ns)
+applyMoveEx force nl inst (ReplaceSecondary new_sdx) =
+  let old_pdx = Instance.pNode inst
+      old_sdx = Instance.sNode inst
+      old_s = Container.find old_sdx nl
+      tgt_n = Container.find new_sdx nl
+      pnode = Container.find old_pdx nl
+      pnode' = Node.removePri pnode inst
+      int_s = Node.removeSec old_s inst
+      force_s = Node.offline old_s || force
+      new_inst = Instance.setSec (setInstanceLocationScore inst pnode tgt_n)
+                 new_sdx
+      new_nl = do
+        new_s <- Node.addSecEx force_s tgt_n new_inst old_pdx
+        pnode'' <- Node.addPriEx True pnode' new_inst
+        return (Container.add old_pdx pnode'' $
+                Container.addTwo new_sdx new_s old_sdx int_s nl,
+                new_inst, old_pdx, new_sdx)
+  in new_nl
+
+-- Replace the secondary and failover (r:np, f)
+applyMoveEx force nl inst (ReplaceAndFailover new_pdx) =
+  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
+      tgt_n = Container.find new_pdx nl
+      int_p = Node.removePri old_p inst
+      int_s = Node.removeSec old_s inst
+      new_inst = Instance.setBoth (setInstanceLocationScore inst int_s tgt_n)
+                 new_pdx old_pdx
+      force_s = Node.offline old_s || force
+      new_nl = do -- OpResult
+        Node.checkMigration old_p tgt_n
+        new_p <- Node.addPriEx force tgt_n new_inst
+        new_s <- Node.addSecEx force_s int_p new_inst new_pdx
+        return (Container.add new_pdx new_p $
+                Container.addTwo old_pdx new_s old_sdx int_s nl,
+                new_inst, new_pdx, old_pdx)
+  in new_nl
+
+-- Failver and replace the secondary (f, r:ns)
+applyMoveEx force nl inst (FailoverAndReplace new_sdx) =
+  let (old_pdx, old_sdx, old_p, old_s) = instanceNodes nl inst
+      tgt_n = Container.find new_sdx nl
+      int_p = Node.removePri old_p inst
+      int_s = Node.removeSec old_s inst
+      force_p = Node.offline old_p || force
+      new_inst = Instance.setBoth (setInstanceLocationScore inst int_s tgt_n)
+                 old_sdx new_sdx
+      new_nl = do -- OpResult
+        Node.checkMigration old_p old_s
+        new_p <- Node.addPriEx force_p int_s new_inst
+        new_s <- Node.addSecEx force_p tgt_n new_inst old_sdx
+        return (Container.add new_sdx new_s $
+                Container.addTwo old_sdx new_p old_pdx int_p nl,
+                new_inst, old_sdx, new_sdx)
+  in new_nl
diff --git a/src/Ganeti/HTools/Loader.hs b/src/Ganeti/HTools/Loader.hs
index 4cc3544..e08cce0 100644
--- a/src/Ganeti/HTools/Loader.hs
+++ b/src/Ganeti/HTools/Loader.hs
@@ -67,6 +67,7 @@ import qualified Ganeti.HTools.Instance as Instance
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Group as Group
 import qualified Ganeti.HTools.Cluster as Cluster
+import qualified Ganeti.HTools.Cluster.Moves as Moves
 
 import Ganeti.BasicTypes
 import qualified Ganeti.HTools.Tags as Tags
@@ -169,7 +170,7 @@ setLocationScore :: Node.List -> Instance.Instance -> Instance.Instance
 setLocationScore nl inst =
   let pnode = Container.find (Instance.pNode inst) nl
       snode = Container.find (Instance.sNode inst) nl
-  in Cluster.setInstanceLocationScore inst pnode snode
+  in Moves.setInstanceLocationScore inst pnode snode
 
 -- | For each instance, add its index to its primary and secondary nodes.
 fixNodes :: Node.List

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ganeti/ganeti.git



More information about the Pkg-ganeti-devel mailing list