From ce6a0b539484f08b1034a6e36f47b48f7b2f573e Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Thu, 7 Jul 2011 18:48:30 +0200
Subject: [PATCH] htools: implement post-alloc cluster status display
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This patch changes the IAllocator result formatting workflow to return
the final node list, which can be then used to display the final node
status tooβ€”currently only the initial status can be shown, which is
only half useful.

Note that as the FIXME in the code says, doing this right for the
evacuate mode is hard; however, as that mode is deprecated, we can
live it for the moment.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>
---
 htools/Ganeti/HTools/IAlloc.hs | 27 +++++++++++++++++----------
 htools/hail.hs                 |  6 +++++-
 2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/htools/Ganeti/HTools/IAlloc.hs b/htools/Ganeti/HTools/IAlloc.hs
index 121294689..598c82fb5 100644
--- a/htools/Ganeti/HTools/IAlloc.hs
+++ b/htools/Ganeti/HTools/IAlloc.hs
@@ -50,7 +50,7 @@ import Ganeti.HTools.Utils
 import Ganeti.HTools.Types
 
 -- | Type alias for the result of an IAllocator call.
-type IAllocResult = (String, JSValue)
+type IAllocResult = (String, JSValue, Node.List)
 
 -- | Parse the basic specifications of an instance.
 --
@@ -229,7 +229,12 @@ formatEvacuate as = do
   when (null elems) $ fail info
   let sols = map (\(_, inst, nl, _) -> Instance.name inst : map Node.name nl)
              elems
-  return (info, showJSON sols)
+      -- FIXME: head elems is certainly not correct here, since we
+      -- don't always concat the elems and lists in the same order;
+      -- however, as the old evacuate mode is deprecated, we can leave
+      -- it like this for the moment
+      (head_nl, _, _, _) = head elems
+  return (info, showJSON sols, head_nl)
 
 -- | Convert allocation/relocation results into the result format.
 formatAllocate :: Cluster.AllocSolution -> Result IAllocResult
@@ -237,7 +242,7 @@ formatAllocate as = do
   let info = describeSolution as
   case Cluster.asSolutions as of
     [] -> fail info
-    (_, _, nodes, _):[] -> return (info, showJSON $ map (Node.name) nodes)
+    (nl, _, nodes, _):[] -> return (info, showJSON $ map (Node.name) nodes, nl)
     _ -> fail "Internal error: multiple allocation solutions"
 
 -- | Convert a node-evacuation/change group result.
@@ -246,7 +251,7 @@ formatNodeEvac :: Group.List
                -> Instance.List
                -> (Node.List, Instance.List, Cluster.EvacSolution)
                -> Result IAllocResult
-formatNodeEvac gl nl il (_, _, es) =
+formatNodeEvac gl nl il (fin_nl, _, es) =
     let iname = Instance.name . flip Container.find il
         nname = Node.name . flip Container.find nl
         gname = Group.name . flip Container.find gl
@@ -257,7 +262,7 @@ formatNodeEvac gl nl il (_, _, es) =
         moved  = length mes
         info = show failed ++ " instances failed to move and " ++ show moved ++
                " were moved successfully"
-    in Ok (info, showJSON (mes, fes, Cluster.esOpCodes es))
+    in Ok (info, showJSON (mes, fes, Cluster.esOpCodes es), fin_nl)
 
 -- | Process a request and return new node lists
 processRequest :: Request -> Result IAllocResult
@@ -298,10 +303,12 @@ readRequest opts args = do
    else return r1)
 
 -- | Main iallocator pipeline.
-runIAllocator :: Request -> String
+runIAllocator :: Request -> (Maybe Node.List, String)
 runIAllocator request =
-  let (ok, info, result) =
+  let (ok, info, result, nl) =
           case processRequest request of
-            Ok (msg, r) -> (True, "Request successful: " ++ msg, r)
-            Bad msg -> (False, "Request failed: " ++ msg, JSArray [])
-  in  formatResponse ok info result
+            Ok (msg, r, nl) -> (True, "Request successful: " ++ msg, r,
+                                Just nl)
+            Bad msg -> (False, "Request failed: " ++ msg, JSArray [], Nothing)
+      rstring = formatResponse ok info result
+  in (nl, rstring)
diff --git a/htools/hail.hs b/htools/hail.hs
index d283b0813..2491f1588 100644
--- a/htools/hail.hs
+++ b/htools/hail.hs
@@ -71,5 +71,9 @@ main = do
          hPutStrLn stderr $ Cluster.printNodes (cdNodes cdata)
                        (fromJust shownodes)
 
-  let resp = runIAllocator request
+  let (maybe_nl, resp) = runIAllocator request
+      fin_nl = maybe (cdNodes cdata) id maybe_nl
   putStrLn resp
+  when (isJust shownodes) $ do
+         hPutStrLn stderr "Final cluster status:"
+         hPutStrLn stderr $ Cluster.printNodes fin_nl (fromJust shownodes)
-- 
GitLab