Convert Cluster.loadData to Result return
[ganeti-local] / Ganeti / HTools / Cluster.hs
index 0d14d15..73060a1 100644 (file)
@@ -15,6 +15,7 @@ module Ganeti.HTools.Cluster
     , Solution(..)
     , Table(..)
     , Removal
     , Solution(..)
     , Table(..)
     , Removal
+    , Score
     -- * Generic functions
     , totalResources
     -- * First phase functions
     -- * Generic functions
     , totalResources
     -- * First phase functions
@@ -202,7 +203,7 @@ those nodes.
 computeBadItems :: NodeList -> InstanceList ->
                    ([Node.Node], [Instance.Instance])
 computeBadItems nl il =
 computeBadItems :: NodeList -> InstanceList ->
                    ([Node.Node], [Instance.Instance])
 computeBadItems nl il =
-  let bad_nodes = verifyN1 $ Container.elems nl
+  let bad_nodes = verifyN1 $ filter (not . Node.offline) $ Container.elems nl
       bad_instances = map (\idx -> Container.find idx il) $
                       sort $ nub $ concat $
                       map (\ n -> (Node.slist n) ++ (Node.plist n)) bad_nodes
       bad_instances = map (\idx -> Container.find idx il) $
                       sort $ nub $ concat $
                       map (\ n -> (Node.slist n) ++ (Node.plist n)) bad_nodes
@@ -343,11 +344,10 @@ applyMove nl inst Failover =
         old_s = Container.find old_sdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
         old_s = Container.find old_sdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
-        new_p = Node.addPri int_s inst
-        new_s = Node.addSec int_p inst old_sdx
-        new_nl = if isNothing(new_p) || isNothing(new_s) then Nothing
-                 else Just $ Container.addTwo old_pdx (fromJust new_s)
-                      old_sdx (fromJust new_p) nl
+        new_nl = do -- Maybe monad
+          new_p <- Node.addPri int_s inst
+          new_s <- Node.addSec int_p inst old_sdx
+          return $ Container.addTwo old_pdx new_s old_sdx new_p nl
     in (new_nl, Instance.setBoth inst old_sdx old_pdx, old_sdx, old_pdx)
 
 -- Replace the primary (f:, r:np, f)
     in (new_nl, Instance.setBoth inst old_sdx old_pdx, old_sdx, old_pdx)
 
 -- Replace the primary (f:, r:np, f)
@@ -359,12 +359,11 @@ applyMove nl inst (ReplacePrimary new_pdx) =
         tgt_n = Container.find new_pdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
         tgt_n = Container.find new_pdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
-        new_p = Node.addPri tgt_n inst
-        new_s = Node.addSec int_s inst new_pdx
-        new_nl = if isNothing(new_p) || isNothing(new_s) then Nothing
-                 else Just $ Container.add new_pdx (fromJust new_p) $
-                      Container.addTwo old_pdx int_p
-                               old_sdx (fromJust new_s) nl
+        new_nl = do -- Maybe monad
+          new_p <- Node.addPri tgt_n inst
+          new_s <- Node.addSec int_s inst new_pdx
+          return $ Container.add new_pdx new_p $
+                 Container.addTwo old_pdx int_p old_sdx new_s nl
     in (new_nl, Instance.setPri inst new_pdx, new_pdx, old_sdx)
 
 -- Replace the secondary (r:ns)
     in (new_nl, Instance.setPri inst new_pdx, new_pdx, old_sdx)
 
 -- Replace the secondary (r:ns)
@@ -374,10 +373,9 @@ applyMove nl inst (ReplaceSecondary new_sdx) =
         old_s = Container.find old_sdx nl
         tgt_n = Container.find new_sdx nl
         int_s = Node.removeSec old_s inst
         old_s = Container.find old_sdx nl
         tgt_n = Container.find new_sdx nl
         int_s = Node.removeSec old_s inst
-        new_s = Node.addSec tgt_n inst old_pdx
-        new_nl = if isNothing(new_s) then Nothing
-                 else Just $ Container.addTwo new_sdx (fromJust new_s)
-                      old_sdx int_s nl
+        new_nl = Node.addSec tgt_n inst old_pdx >>=
+                 \new_s -> return $ Container.addTwo new_sdx
+                           new_s old_sdx int_s nl
     in (new_nl, Instance.setSec inst new_sdx, old_pdx, new_sdx)
 
 -- Replace the secondary and failover (r:np, f)
     in (new_nl, Instance.setSec inst new_sdx, old_pdx, new_sdx)
 
 -- Replace the secondary and failover (r:np, f)
@@ -389,12 +387,11 @@ applyMove nl inst (ReplaceAndFailover new_pdx) =
         tgt_n = Container.find new_pdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
         tgt_n = Container.find new_pdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
-        new_p = Node.addPri tgt_n inst
-        new_s = Node.addSec int_p inst new_pdx
-        new_nl = if isNothing(new_p) || isNothing(new_s) then Nothing
-                 else Just $ Container.add new_pdx (fromJust new_p) $
-                      Container.addTwo old_pdx (fromJust new_s)
-                               old_sdx int_s nl
+        new_nl = do -- Maybe monad
+          new_p <- Node.addPri tgt_n inst
+          new_s <- Node.addSec int_p inst new_pdx
+          return $ Container.add new_pdx new_p $
+                 Container.addTwo old_pdx new_s old_sdx int_s nl
     in (new_nl, Instance.setBoth inst new_pdx old_pdx, new_pdx, old_pdx)
 
 -- Failver and replace the secondary (f, r:ns)
     in (new_nl, Instance.setBoth inst new_pdx old_pdx, new_pdx, old_pdx)
 
 -- Failver and replace the secondary (f, r:ns)
@@ -406,12 +403,11 @@ applyMove nl inst (FailoverAndReplace new_sdx) =
         tgt_n = Container.find new_sdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
         tgt_n = Container.find new_sdx nl
         int_p = Node.removePri old_p inst
         int_s = Node.removeSec old_s inst
-        new_p = Node.addPri int_s inst
-        new_s = Node.addSec tgt_n inst old_sdx
-        new_nl = if isNothing(new_p) || isNothing(new_s) then Nothing
-                 else Just $ Container.add new_sdx (fromJust new_s) $
-                      Container.addTwo old_sdx (fromJust new_p)
-                               old_pdx int_p nl
+        new_nl = do -- Maybe monad
+          new_p <- Node.addPri int_s inst
+          new_s <- Node.addSec tgt_n inst old_sdx
+          return $ Container.add new_sdx new_s $
+                 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)
 
 checkSingleStep :: Table -- ^ The original table
     in (new_nl, Instance.setBoth inst old_sdx new_sdx, old_sdx, new_sdx)
 
 checkSingleStep :: Table -- ^ The original table
@@ -750,17 +746,21 @@ stripSuffix suffix lst =
     and massages it into the correct format. -}
 loadData :: String -- ^ Node data in text format
          -> String -- ^ Instance data in text format
     and massages it into the correct format. -}
 loadData :: String -- ^ Node data in text format
          -> String -- ^ Instance data in text format
-         -> (Container.Container Node.Node,
-             Container.Container Instance.Instance,
-             String, NameList, NameList)
+         -> Result (Container.Container Node.Node,
+                    Container.Container Instance.Instance,
+                    String, NameList, NameList)
 loadData ndata idata =
     let
     {- node file: name t_mem n_mem f_mem t_disk f_disk -}
         (ktn, nl) = loadTabular ndata
 loadData ndata idata =
     let
     {- node file: name t_mem n_mem f_mem t_disk f_disk -}
         (ktn, nl) = loadTabular ndata
-                    (\ (name:tm:nm:fm:td:fd:[]) ->
+                    (\ (name:tm:nm:fm:td:fd:fo:[]) ->
                          (name,
                          (name,
-                          Node.create (read tm) (read nm)
-                                  (read fm) (read td) (read fd)))
+                          if any (== "?") [tm,nm,fm,td,fd] || fo == "Y" then
+                              Node.create 0 0 0 0 0 True
+                          else
+                              Node.create (read tm) (read nm) (read fm)
+                                      (read td) (read fd) False
+                         ))
                     Node.setIdx
     {- instance file: name mem disk status pnode snode -}
         (kti, il) = loadTabular idata
                     Node.setIdx
     {- instance file: name mem disk status pnode snode -}
         (kti, il) = loadTabular idata
@@ -781,7 +781,7 @@ loadData ndata idata =
         stn = stripSuffix common_suffix xtn
         sti = stripSuffix common_suffix xti
     in
         stn = stripSuffix common_suffix xtn
         sti = stripSuffix common_suffix xti
     in
-      (nl3, il3, common_suffix, stn, sti)
+      Ok (nl3, il3, common_suffix, stn, sti)
 
 -- | Compute the amount of memory used by primary instances on a node.
 nodeImem :: Node.Node -> InstanceList -> Int
 
 -- | Compute the amount of memory used by primary instances on a node.
 nodeImem :: Node.Node -> InstanceList -> Int