From 262a08a2d2cd645032016de106af6eb9c20849d9 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Wed, 27 May 2009 00:17:36 +0100
Subject: [PATCH] Change the module import hierarchy

This patch makes the Types module a base module, and Node/Instance ones
import it, from the previous (opposite) situation. This will allow in
the future to use newtypes for the index and name types.
---
 Ganeti/HTools/CLI.hs       |  4 ++-
 Ganeti/HTools/Cluster.hs   | 68 ++++++++++++++++++--------------------
 Ganeti/HTools/Container.hs | 28 ++++++++++++++++
 Ganeti/HTools/IAlloc.hs    |  5 +--
 Ganeti/HTools/Instance.hs  | 14 +++++++-
 Ganeti/HTools/Loader.hs    | 14 ++++----
 Ganeti/HTools/Node.hs      | 15 +++++++--
 Ganeti/HTools/Types.hs     | 55 +++---------------------------
 hail.hs                    | 26 +++++++--------
 hbal.hs                    |  5 ++-
 hn1.hs                     |  4 +--
 hscan.hs                   | 10 +++---
 12 files changed, 126 insertions(+), 122 deletions(-)

diff --git a/Ganeti/HTools/CLI.hs b/Ganeti/HTools/CLI.hs
index 7a216cc13..fea6037b3 100644
--- a/Ganeti/HTools/CLI.hs
+++ b/Ganeti/HTools/CLI.hs
@@ -28,6 +28,8 @@ import qualified Ganeti.HTools.Version as Version(version)
 import qualified Ganeti.HTools.Rapi as Rapi
 import qualified Ganeti.HTools.Text as Text
 import qualified Ganeti.HTools.Loader as Loader
+import qualified Ganeti.HTools.Instance as Instance
+import qualified Ganeti.HTools.Node as Node
 
 import Ganeti.HTools.Types
 
@@ -98,7 +100,7 @@ shTemplate =
 -- | External tool data loader from a variety of sources
 loadExternalData :: (EToolOptions a) =>
                     a
-                 -> IO (NodeList, InstanceList, String)
+                 -> IO (Node.List, Instance.List, String)
 loadExternalData opts = do
   (env_node, env_inst) <- parseEnv ()
   let nodef = if nodeSet opts then nodeFile opts
diff --git a/Ganeti/HTools/Cluster.hs b/Ganeti/HTools/Cluster.hs
index 9c59616b2..fd0ef1f92 100644
--- a/Ganeti/HTools/Cluster.hs
+++ b/Ganeti/HTools/Cluster.hs
@@ -8,9 +8,7 @@ goes into the "Main" module for the individual binaries.
 module Ganeti.HTools.Cluster
     (
      -- * Types
-     NodeList
-    , InstanceList
-    , NameList
+     NameList
     , Placement
     , Solution(..)
     , Table(..)
@@ -70,7 +68,7 @@ solutionDelta sol = case sol of
                       _ -> -1
 
 -- | A removal set.
-data Removal = Removal NodeList [Instance.Instance]
+data Removal = Removal Node.List [Instance.Instance]
 
 -- | An instance move definition
 data IMove = Failover                -- ^ Failover the instance (f)
@@ -81,7 +79,7 @@ data IMove = Failover                -- ^ Failover the instance (f)
              deriving (Show)
 
 -- | The complete state for the balancing solution
-data Table = Table NodeList InstanceList Score [Placement]
+data Table = Table Node.List Instance.List Score [Placement]
              deriving (Show)
 
 -- General functions
@@ -103,8 +101,8 @@ verifyN1 :: [Node.Node] -> [Node.Node]
 verifyN1 nl = filter Node.failN1 nl
 
 {-| Add an instance and return the new node and instance maps. -}
-addInstance :: NodeList -> Instance.Instance ->
-               Node.Node -> Node.Node -> Maybe NodeList
+addInstance :: Node.List -> Instance.Instance ->
+               Node.Node -> Node.Node -> Maybe Node.List
 addInstance nl idata pri sec =
   let pdx = Node.idx pri
       sdx = Node.idx sec
@@ -116,7 +114,7 @@ addInstance nl idata pri sec =
       return new_nl
 
 -- | Remove an instance and return the new node and instance maps.
-removeInstance :: NodeList -> Instance.Instance -> NodeList
+removeInstance :: Node.List -> Instance.Instance -> Node.List
 removeInstance nl idata =
   let pnode = Instance.pnode idata
       snode = Instance.snode idata
@@ -128,7 +126,7 @@ removeInstance nl idata =
   new_nl
 
 -- | Remove an instance and return the new node map.
-removeInstances :: NodeList -> [Instance.Instance] -> NodeList
+removeInstances :: Node.List -> [Instance.Instance] -> Node.List
 removeInstances = foldl' removeInstance
 
 -- | Compute the total free disk and memory in the cluster.
@@ -148,7 +146,7 @@ It first removes the relocated instances after which it places them on
 their new nodes.
 
  -}
-applySolution :: NodeList -> InstanceList -> [Placement] -> NodeList
+applySolution :: Node.List -> Instance.List -> [Placement] -> Node.List
 applySolution nl il sol =
     let odxes = map (\ (a, b, c, _) -> (Container.find a il,
                                         Node.idx (Container.find b nl),
@@ -200,7 +198,7 @@ bad instance list is the list of primary and secondary instances of
 those nodes.
 
 -}
-computeBadItems :: NodeList -> InstanceList ->
+computeBadItems :: Node.List -> Instance.List ->
                    ([Node.Node], [Instance.Instance])
 computeBadItems nl il =
   let bad_nodes = verifyN1 $ filter (not . Node.offline) $ Container.elems nl
@@ -218,7 +216,7 @@ nodes, since the cluster is known to be not healthy; only the check
 placement can make this shortcut.
 
 -}
-checkRemoval :: NodeList -> [Instance.Instance] -> Maybe Removal
+checkRemoval :: Node.List -> [Instance.Instance] -> Maybe Removal
 checkRemoval nl victims =
   let nx = removeInstances nl victims
       failN1 = verifyN1Check (Container.elems nx)
@@ -230,7 +228,7 @@ checkRemoval nl victims =
 
 
 -- | Computes the removals list for a given depth
-computeRemovals :: NodeList
+computeRemovals :: Node.List
                  -> [Instance.Instance]
                  -> Int
                  -> [Maybe Removal]
@@ -281,7 +279,7 @@ tooHighDelta sol new_delta max_delta =
     solution by recursing until all target instances are placed.
 
 -}
-checkPlacement :: NodeList            -- ^ The current node list
+checkPlacement :: Node.List            -- ^ The current node list
                -> [Instance.Instance] -- ^ List of instances still to place
                -> [Placement]         -- ^ Partial solution until now
                -> Int                 -- ^ The delta of the partial solution
@@ -334,8 +332,8 @@ checkPlacement nl victims current current_delta prev_sol max_delta =
     ) prev_sol nodes
 
 -- | Apply a move
-applyMove :: NodeList -> Instance.Instance
-          -> IMove -> (Maybe NodeList, Instance.Instance, Int, Int)
+applyMove :: Node.List -> Instance.Instance
+          -> IMove -> (Maybe Node.List, Instance.Instance, Int, Int)
 -- Failover (f)
 applyMove nl inst Failover =
     let old_pdx = Instance.pnode inst
@@ -410,16 +408,16 @@ applyMove nl inst (FailoverAndReplace new_sdx) =
                  Container.addTwo old_sdx new_p old_pdx int_p nl
     in (new_nl, Instance.setBoth inst old_sdx new_sdx, old_sdx, new_sdx)
 
-allocateOnSingle :: NodeList -> Instance.Instance -> Node.Node
-                 -> (Maybe NodeList, Instance.Instance)
+allocateOnSingle :: Node.List -> Instance.Instance -> Node.Node
+                 -> (Maybe Node.List, Instance.Instance)
 allocateOnSingle nl inst p =
     let new_pdx = Node.idx p
         new_nl = Node.addPri p inst >>= \new_p ->
                  return $ Container.add new_pdx new_p nl
     in (new_nl, Instance.setBoth inst new_pdx Node.noSecondary)
 
-allocateOnPair :: NodeList -> Instance.Instance -> Node.Node -> Node.Node
-               -> (Maybe NodeList, Instance.Instance)
+allocateOnPair :: Node.List -> Instance.Instance -> Node.Node -> Node.Node
+               -> (Maybe Node.List, Instance.Instance)
 allocateOnPair nl inst tgt_p tgt_s =
     let new_pdx = Node.idx tgt_p
         new_sdx = Node.idx tgt_s
@@ -543,7 +541,7 @@ This is a wrapper over both computeRemovals and
 solutionFromRemovals. In case we have no solution, we return Nothing.
 
 -}
-computeSolution :: NodeList        -- ^ The original node data
+computeSolution :: Node.List        -- ^ The original node data
                 -> [Instance.Instance] -- ^ The list of /bad/ instances
                 -> Int             -- ^ The /depth/ of removals
                 -> Int             -- ^ Maximum number of removals to process
@@ -604,8 +602,8 @@ computeMoves i a b c d =
                       printf "replace-disks -n %s %s" d i])
 
 {-| Converts a placement to string format -}
-printSolutionLine :: NodeList
-                  -> InstanceList
+printSolutionLine :: Node.List
+                  -> Instance.List
                   -> Int
                   -> Int
                   -> Placement
@@ -617,10 +615,10 @@ printSolutionLine nl il nmlen imlen plc pos =
         (i, p, s, c) = plc
         inst = Container.find i il
         inam = Instance.name inst
-        npri = cNameOf nl p
-        nsec = cNameOf nl s
-        opri = cNameOf nl $ Instance.pnode inst
-        osec = cNameOf nl $ Instance.snode inst
+        npri = Container.nameOf nl p
+        nsec = Container.nameOf nl s
+        opri = Container.nameOf nl $ Instance.pnode inst
+        osec = Container.nameOf nl $ Instance.snode inst
         (moves, cmds) =  computeMoves inam opri osec npri nsec
         ostr = (printf "%s:%s" opri osec)::String
         nstr = (printf "%s:%s" npri nsec)::String
@@ -640,20 +638,20 @@ formatCmds cmd_strs =
         zip [1..] cmd_strs
 
 {-| Converts a solution to string format -}
-printSolution :: NodeList
-              -> InstanceList
+printSolution :: Node.List
+              -> Instance.List
               -> [Placement]
               -> ([String], [[String]])
 printSolution nl il sol =
     let
-        nmlen = cMaxNamelen nl
-        imlen = cMaxNamelen il
+        nmlen = Container.maxNameLen nl
+        imlen = Container.maxNameLen il
     in
       unzip $ map (uncurry $ printSolutionLine nl il nmlen imlen) $
             zip sol [1..]
 
 -- | Print the node list.
-printNodes :: NodeList -> String
+printNodes :: Node.List -> String
 printNodes nl =
     let snl = sortBy (compare `on` Node.idx) (Container.elems nl)
         m_name = maximum . map (length . Node.name) $ snl
@@ -667,7 +665,7 @@ printNodes nl =
     in unlines $ (header:map helper snl)
 
 -- | Compute the mem and disk covariance.
-compDetailedCV :: NodeList -> (Double, Double, Double, Double, Double)
+compDetailedCV :: Node.List -> (Double, Double, Double, Double, Double)
 compDetailedCV nl =
     let
         all_nodes = Container.elems nl
@@ -689,12 +687,12 @@ compDetailedCV nl =
     in (mem_cv, dsk_cv, n1_score, res_cv, off_score)
 
 -- | Compute the 'total' variance.
-compCV :: NodeList -> Double
+compCV :: Node.List -> Double
 compCV nl =
     let (mem_cv, dsk_cv, n1_score, res_cv, off_score) = compDetailedCV nl
     in mem_cv + dsk_cv + n1_score + res_cv + off_score
 
-printStats :: NodeList -> String
+printStats :: Node.List -> String
 printStats nl =
     let (mem_cv, dsk_cv, n1_score, res_cv, off_score) = compDetailedCV nl
     in printf "f_mem=%.8f, r_mem=%.8f, f_dsk=%.8f, n1=%.3f, uf=%.3f"
diff --git a/Ganeti/HTools/Container.hs b/Ganeti/HTools/Container.hs
index 079bc41a8..25bc64c0d 100644
--- a/Ganeti/HTools/Container.hs
+++ b/Ganeti/HTools/Container.hs
@@ -25,10 +25,16 @@ module Ganeti.HTools.Container
     -- * Conversion
     , elems
     , keys
+    -- * Element functions
+    , nameOf
+    , maxNameLen
+    , findByName
     ) where
 
 import qualified Data.IntMap as IntMap
 
+import qualified Ganeti.HTools.Types as T
+
 type Key = IntMap.Key
 type Container = IntMap.IntMap
 
@@ -79,3 +85,25 @@ fold = IntMap.fold
 -- | Add or update two elements of the map.
 addTwo :: Key -> a -> Key -> a -> Container a -> Container a
 addTwo k1 v1 k2 v2 c = add k1 v1 $ add k2 v2 c
+
+-- | Compute the name of an element in a container
+nameOf :: (T.Element a) => Container a -> Key -> String
+nameOf c k = T.nameOf $ find k c
+
+-- | Compute the maximum name length in an Element Container
+maxNameLen :: (T.Element a) => Container a -> Int
+maxNameLen = maximum . map (length . T.nameOf) . elems
+
+-- | Find an element by name in a Container; this is a very slow function
+findByName :: (T.Element a, Monad m) =>
+              Container a -> String -> m Key
+findByName c n =
+    let all_elems = elems c
+        result = filter ((== n) . T.nameOf) all_elems
+        nems = length result
+    in
+      if nems /= 1 then
+          fail $ "Wrong number of elems (" ++ (show nems) ++
+                   ") found with name " ++ n
+      else
+          return $ T.idxOf $ head result
diff --git a/Ganeti/HTools/IAlloc.hs b/Ganeti/HTools/IAlloc.hs
index f3fc99687..901f2d4ed 100644
--- a/Ganeti/HTools/IAlloc.hs
+++ b/Ganeti/HTools/IAlloc.hs
@@ -17,6 +17,7 @@ import Text.JSON (JSObject, JSValue(JSBool, JSString, JSArray),
                   makeObj, encodeStrict, decodeStrict,
                   fromJSObject, toJSString)
 --import Text.Printf (printf)
+import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
 import Ganeti.HTools.Loader
@@ -28,7 +29,7 @@ data RqType
     | Relocate Int Int [Int]
     deriving (Show)
 
-data Request = Request RqType NodeList InstanceList String
+data Request = Request RqType Node.List Instance.List String
     deriving (Show)
 
 parseBaseInstance :: String
@@ -110,7 +111,7 @@ parseData body = do
               ridx <- lookupNode kti rname rname
               ex_nodes <- fromObj "relocate_from" request
               let ex_nodes' = map (stripSuffix $ length csf) ex_nodes
-              ex_idex <- mapM (findByName map_n) ex_nodes'
+              ex_idex <- mapM (Container.findByName map_n) ex_nodes'
               return $ Relocate ridx req_nodes ex_idex
         other -> fail $ ("Invalid request type '" ++ other ++ "'")
   return $ Request rqtype map_n map_i csf
diff --git a/Ganeti/HTools/Instance.hs b/Ganeti/HTools/Instance.hs
index 8aecf72b4..f0d77983b 100644
--- a/Ganeti/HTools/Instance.hs
+++ b/Ganeti/HTools/Instance.hs
@@ -6,6 +6,9 @@ intelligence is in the "Node" and "Cluster" modules.
 -}
 module Ganeti.HTools.Instance where
 
+import qualified Ganeti.HTools.Types as T
+import qualified Ganeti.HTools.Container as Container
+
 data Instance = Instance { name :: String   -- ^ the instance name
                          , mem :: Int       -- ^ memory of the instance
                          , dsk :: Int       -- ^ disk size of instance
@@ -18,9 +21,18 @@ data Instance = Instance { name :: String   -- ^ the instance name
                                             -- book-keeping
                          } deriving (Show)
 
+instance T.Element Instance where
+    nameOf  = name
+    idxOf   = idx
+    setName = setName
+    setIdx  = setIdx
+
 -- | A simple name for the int, instance association list
 type AssocList = [(Int, Instance)]
 
+-- | A simple name for an instance map
+type List = Container.Container Instance
+
 create :: String -> Int -> Int -> String -> Int -> Int -> Instance
 create name_init mem_init dsk_init run_init pn sn =
     Instance {
@@ -65,4 +77,4 @@ setIdx t i = t { idx = i }
 
 -- | Changes the name
 -- This is used only during the building of the data structures.
-setName t s = t {name = s}
+setName t s = t { name = s }
diff --git a/Ganeti/HTools/Loader.hs b/Ganeti/HTools/Loader.hs
index 44ae6414c..525cb64dd 100644
--- a/Ganeti/HTools/Loader.hs
+++ b/Ganeti/HTools/Loader.hs
@@ -81,7 +81,7 @@ stripSuffix sflen name = take ((length name) - sflen) name
 mergeData :: (Node.AssocList,
               Instance.AssocList) -- ^ Data from either Text.loadData
                                   -- or Rapi.loadData
-          -> Result (NodeList, InstanceList, String)
+          -> Result (Node.List, Instance.List, String)
 mergeData (nl, il) = do
   let
       nl2 = fixNodes nl il
@@ -92,13 +92,13 @@ mergeData (nl, il) = do
       inst_names = map Instance.name $ Container.elems il3
       common_suffix = longestDomain (node_names ++ inst_names)
       csl = length common_suffix
-      snl = Container.map (\n -> setName n (stripSuffix csl $ name n)) nl3
-      sil = Container.map (\i -> setName i (stripSuffix csl $ name i)) il3
+      snl = Container.map (\n -> setName n (stripSuffix csl $ nameOf n)) nl3
+      sil = Container.map (\i -> setName i (stripSuffix csl $ nameOf i)) il3
   return (snl, sil, common_suffix)
 
 -- | Check cluster data for consistency
-checkData :: NodeList -> InstanceList
-          -> ([String], NodeList)
+checkData :: Node.List -> Instance.List
+          -> ([String], Node.List)
 checkData nl il =
     Container.mapAccum
         (\ msgs node ->
@@ -125,7 +125,7 @@ checkData nl il =
         ) [] nl
 
 -- | Compute the amount of memory used by primary instances on a node.
-nodeImem :: Node.Node -> InstanceList -> Int
+nodeImem :: Node.Node -> Instance.List -> Int
 nodeImem node il =
     let rfind = flip Container.find $ il
     in sum . map Instance.mem .
@@ -133,7 +133,7 @@ nodeImem node il =
 
 -- | Compute the amount of disk used by instances on a node (either primary
 -- or secondary).
-nodeIdsk :: Node.Node -> InstanceList -> Int
+nodeIdsk :: Node.Node -> Instance.List -> Int
 nodeIdsk node il =
     let rfind = flip Container.find $ il
     in sum . map Instance.dsk .
diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs
index aa3eaf401..c1e4ad30c 100644
--- a/Ganeti/HTools/Node.hs
+++ b/Ganeti/HTools/Node.hs
@@ -5,10 +5,10 @@
 -}
 
 module Ganeti.HTools.Node
-    (
-      Node(failN1, name, idx, t_mem, n_mem, f_mem, t_dsk, f_dsk,
+    ( Node(failN1, name, idx, t_mem, n_mem, f_mem, t_dsk, f_dsk,
            p_mem, p_dsk, p_rem,
            plist, slist, offline)
+    , List
     -- * Constructor
     , create
     -- ** Finalization after data loading
@@ -39,6 +39,8 @@ import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Instance as Instance
 import qualified Ganeti.HTools.PeerMap as PeerMap
 
+import qualified Ganeti.HTools.Types as T
+
 data Node = Node { name  :: String -- ^ the node name
                  , t_mem :: Double -- ^ total memory (MiB)
                  , n_mem :: Int    -- ^ node memory (MiB)
@@ -61,9 +63,18 @@ data Node = Node { name  :: String -- ^ the node name
                                    -- score computations
   } deriving (Show)
 
+instance T.Element Node where
+    nameOf = name
+    idxOf = idx
+    setName = setName
+    setIdx = setIdx
+
 -- | A simple name for the int, node association list
 type AssocList = [(Int, Node)]
 
+-- | A simple name for a node map
+type List = Container.Container Node
+
 -- | Constant node index for a non-moveable instance
 noSecondary :: Int
 noSecondary = -1
diff --git a/Ganeti/HTools/Types.hs b/Ganeti/HTools/Types.hs
index 9cbe288a6..a0a83afce 100644
--- a/Ganeti/HTools/Types.hs
+++ b/Ganeti/HTools/Types.hs
@@ -5,30 +5,19 @@
 module Ganeti.HTools.Types
     where
 
-import qualified Ganeti.HTools.Container as Container
-import qualified Ganeti.HTools.Instance as Instance
-import qualified Ganeti.HTools.Node as Node
-
-type NodeList = Container.Container Node.Node
-type InstanceList = Container.Container Instance.Instance
-
 -- | The type used to hold idx-to-name mappings
 type NameList = [(Int, String)]
 
 -- | The type used to hold name-to-idx mappings
 type NameAssoc = [(String, Int)]
 
-type IdxNode = [(Int, Node.Node)]
-type IdxInstance = [(Int, Instance.Instance)]
-
-{-
+{-|
 
 This is similar to the JSON library Result type - *very* similar, but
 we want to use it in multiple places, so we abstract it into a
 mini-library here
 
 -}
-
 data Result a
     = Bad String
     | Ok a
@@ -40,45 +29,9 @@ instance Monad Result where
     return = Ok
     fail = Bad
 
--- | A generic class for nodes and instances
+-- | A generic class for items that have names and indices
 class Element a where
-    name    :: a -> String
-    idx     :: a -> Int
+    nameOf  :: a -> String
+    idxOf   :: a -> Int
     setName :: a -> String -> a
     setIdx  :: a -> Int -> a
-
--- Let's make nodes elements of the cluster
-instance Element Node.Node where
-    name = Node.name
-    idx = Node.idx
-    setName = Node.setName
-    setIdx = Node.setIdx
-
--- And instances too
-instance Element Instance.Instance where
-    name = Instance.name
-    idx = Instance.idx
-    setName = Instance.setName
-    setIdx = Instance.setIdx
-
--- | Compute the name of an element in a container
-cNameOf :: (Element a) => Container.Container a -> Container.Key -> String
-cNameOf c k = name $ Container.find k c
-
--- | Compute the maximum name length in an Element Container
-cMaxNamelen :: (Element a) => Container.Container a -> Int
-cMaxNamelen = maximum . map (length . name) . Container.elems
-
--- | Find an element by name in a Container; this is a very slow function
-findByName :: (Element a, Monad m) =>
-              Container.Container a -> String -> m Container.Key
-findByName c n =
-    let all_elems = Container.elems c
-        result = filter ((== n) . name) all_elems
-        nems = length result
-    in
-      if nems /= 1 then
-          fail $ "Wrong number of elems (" ++ (show nems) ++
-                   ") found with name " ++ n
-      else
-          return $ idx $ head result
diff --git a/hail.hs b/hail.hs
index c9d6f5fb0..9d436f9d8 100644
--- a/hail.hs
+++ b/hail.hs
@@ -51,17 +51,17 @@ options =
       "show help"
     ]
 
--- | Compute online nodes from a NodeList
-getOnline :: NodeList -> [Node.Node]
+-- | Compute online nodes from a Node.List
+getOnline :: Node.List -> [Node.Node]
 getOnline = filter (not . Node.offline) . Container.elems
 
 -- | Try to allocate an instance on the cluster
 tryAlloc :: (Monad m) =>
-            NodeList
-         -> InstanceList
+            Node.List
+         -> Instance.List
          -> Instance.Instance
          -> Int
-         -> m [(Maybe NodeList, [Node.Node])]
+         -> m [(Maybe Node.List, [Node.Node])]
 tryAlloc nl _ inst 2 =
     let all_nodes = getOnline nl
         all_pairs = liftM2 (,) all_nodes all_nodes
@@ -83,17 +83,17 @@ tryAlloc _ _ _ reqn = fail $ "Unsupported number of alllocation \
 
 -- | Try to allocate an instance on the cluster
 tryReloc :: (Monad m) =>
-            NodeList
-         -> InstanceList
+            Node.List
+         -> Instance.List
          -> Int
          -> Int
          -> [Int]
-         -> m [(Maybe NodeList, [Node.Node])]
+         -> m [(Maybe Node.List, [Node.Node])]
 tryReloc nl il xid 1 ex_idx =
     let all_nodes = getOnline nl
         inst = Container.find xid il
         ex_idx' = (Instance.pnode inst):ex_idx
-        valid_nodes = filter (not . flip elem ex_idx' . idx) all_nodes
+        valid_nodes = filter (not . flip elem ex_idx' . idxOf) all_nodes
         valid_idxes = map Node.idx valid_nodes
         sols1 = map (\x -> let (mnl, _, _, _) =
                                     Cluster.applyMove nl inst
@@ -106,8 +106,8 @@ tryReloc _ _ _ reqn _  = fail $ "Unsupported number of relocation \
                                 \destinations required (" ++ (show reqn) ++
                                                   "), only one supported"
 
-filterFails :: (Monad m) => [(Maybe NodeList, [Node.Node])]
-            -> m [(NodeList, [Node.Node])]
+filterFails :: (Monad m) => [(Maybe Node.List, [Node.Node])]
+            -> m [(Node.List, [Node.Node])]
 filterFails sols =
     if null sols then fail "No nodes onto which to allocate at all"
     else let sols' = filter (isJust . fst) sols
@@ -116,7 +116,7 @@ filterFails sols =
             else
                 return $ map (\(x, y) -> (fromJust x, y)) sols'
 
-processResults :: (Monad m) => [(NodeList, [Node.Node])]
+processResults :: (Monad m) => [(Node.List, [Node.Node])]
                -> m (String, [Node.Node])
 processResults sols =
     let sols' = map (\(nl', ns) -> (Cluster.compCV  nl', ns)) sols
@@ -156,7 +156,7 @@ main = do
   let sols = new_nodes >>= filterFails >>= processResults
   let (ok, info, rn) = case sols of
                Ok (info, sn) -> (True, "Request successful: " ++ info,
-                                     map ((++ csf) . name) sn)
+                                     map ((++ csf) . Node.name) sn)
                Bad s -> (False, "Request failed: " ++ s, [])
       resp = formatResponse ok info rn
   putStrLn resp
diff --git a/hbal.hs b/hbal.hs
index 3f217e1a4..5f0f28b8a 100644
--- a/hbal.hs
+++ b/hbal.hs
@@ -21,7 +21,6 @@ import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.CLI as CLI
 
 import Ganeti.HTools.Utils
-import Ganeti.HTools.Types
 
 -- | Command line options structure.
 data Options = Options
@@ -245,8 +244,8 @@ main = do
                       printf "Initial score: %.8f\n" ini_cv)
 
   unless oneline $ putStrLn "Trying to minimize the CV..."
-  let imlen = cMaxNamelen il
-      nmlen = cMaxNamelen nl
+  let imlen = Container.maxNameLen il
+      nmlen = Container.maxNameLen nl
 
   (fin_tbl, cmd_strs) <- iterateDepth ini_tbl (optMaxLength opts)
                          nmlen imlen [] oneline min_cv
diff --git a/hn1.hs b/hn1.hs
index 4b3064e7e..e51f428c2 100644
--- a/hn1.hs
+++ b/hn1.hs
@@ -16,9 +16,9 @@ import Text.Printf (printf)
 
 import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Instance as Instance
+import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Cluster as Cluster
 import qualified Ganeti.HTools.CLI as CLI
-import Ganeti.HTools.Types
 
 -- | Command line options structure.
 data Options = Options
@@ -71,7 +71,7 @@ defaultOptions    = Options
 we find a valid solution or we exceed the maximum depth.
 
 -}
-iterateDepth :: NodeList
+iterateDepth :: Node.List
              -> [Instance.Instance]
              -> Int
              -> Int
diff --git a/hscan.hs b/hscan.hs
index 5189b589d..d77c870e1 100644
--- a/hscan.hs
+++ b/hscan.hs
@@ -73,7 +73,7 @@ options =
     ]
 
 -- | Generate node file data from node objects
-serializeNodes :: Cluster.NodeList -> String -> String
+serializeNodes :: Node.List -> String -> String
 serializeNodes nl csf =
     let nodes = Container.elems nl
         nlines = map
@@ -91,7 +91,7 @@ serializeNodes nl csf =
     in unlines nlines
 
 -- | Generate instance file data from instance objects
-serializeInstances :: Cluster.NodeList -> Cluster.InstanceList
+serializeInstances :: Node.List -> Instance.List
                    -> String -> String
 serializeInstances nl il csf =
     let instances = Container.elems il
@@ -99,8 +99,8 @@ serializeInstances nl il csf =
                  (\inst ->
                       let
                           iname = Instance.name inst ++ csf
-                          pnode = cNameOf nl $ Instance.pnode inst
-                          snode = cNameOf nl $ Instance.snode inst
+                          pnode = Container.nameOf nl $ Instance.pnode inst
+                          snode = Container.nameOf nl $ Instance.snode inst
                       in
                         printf "%s|%d|%d|%s|%s|%s"
                                iname (Instance.mem inst) (Instance.dsk inst)
@@ -111,7 +111,7 @@ serializeInstances nl il csf =
     in unlines nlines
 
 -- | Return a one-line summary of cluster state
-printCluster :: Cluster.NodeList -> Cluster.InstanceList
+printCluster :: Node.List -> Instance.List
              -> String
 printCluster nl il =
     let (bad_nodes, bad_instances) = Cluster.computeBadItems nl il
-- 
GitLab