From f89235f10d793d8be50414b80f22f523afd7ed27 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Tue, 1 Dec 2009 11:47:15 +0100
Subject: [PATCH] Read cluster tags in the LUXI backend

---
 Ganeti/HTools/Luxi.hs | 20 ++++++++++++++++++--
 Ganeti/Luxi.hs        |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/Ganeti/HTools/Luxi.hs b/Ganeti/HTools/Luxi.hs
index f60cce09a..a54740597 100644
--- a/Ganeti/HTools/Luxi.hs
+++ b/Ganeti/HTools/Luxi.hs
@@ -38,7 +38,7 @@ import Ganeti.HTools.Loader
 import Ganeti.HTools.Types
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
-import Ganeti.HTools.Utils (fromJVal, annotateResult)
+import Ganeti.HTools.Utils (fromJVal, annotateResult, tryFromObj, asJSObject)
 
 -- * Utility functions
 
@@ -75,6 +75,10 @@ queryInstancesMsg =
         use_locking = JSBool False
     in JSArray [nnames, fields, use_locking]
 
+-- | The input data for cluster query
+queryClusterInfoMsg :: JSValue
+queryClusterInfoMsg = JSArray []
+
 -- | Wraper over callMethod doing node query.
 queryNodes :: L.Client -> IO (Result JSValue)
 queryNodes = L.callMethod L.QueryNodes queryNodesMsg
@@ -83,6 +87,9 @@ queryNodes = L.callMethod L.QueryNodes queryNodesMsg
 queryInstances :: L.Client -> IO (Result JSValue)
 queryInstances = L.callMethod L.QueryInstances queryInstancesMsg
 
+queryClusterInfo :: L.Client -> IO (Result JSValue)
+queryClusterInfo = L.callMethod L.QueryClusterInfo queryClusterInfoMsg
+
 -- | Parse a instance list in JSON format.
 getInstances :: NameAssoc
              -> JSValue
@@ -140,6 +147,13 @@ parseNode (JSArray [ name, mtotal, mnode, mfree, dtotal, dfree
 
 parseNode v = fail ("Invalid node query result: " ++ show v)
 
+getClusterTags :: JSValue -> Result [String]
+getClusterTags v = do
+  let errmsg = "Parsing cluster info"
+  obj <- annotateResult errmsg $ asJSObject v
+  tags <- tryFromObj errmsg (fromJSObject obj) "tag"
+  return tags
+
 -- * Main loader functionality
 
 -- | Builds the cluster data from an URL.
@@ -152,10 +166,12 @@ loadData master =
        (\s -> do
           nodes <- queryNodes s
           instances <- queryInstances s
+          cinfo <- queryClusterInfo s
           return $ do -- Result monad
             node_data <- nodes >>= getNodes
             let (node_names, node_idx) = assignIndices node_data
             inst_data <- instances >>= getInstances node_names
             let (_, inst_idx) = assignIndices inst_data
-            return (node_idx, inst_idx, [])
+            ctags <- cinfo >>= getClusterTags
+            return (node_idx, inst_idx, ctags)
        )
diff --git a/Ganeti/Luxi.hs b/Ganeti/Luxi.hs
index 707341281..0468a4df1 100644
--- a/Ganeti/Luxi.hs
+++ b/Ganeti/Luxi.hs
@@ -63,6 +63,7 @@ withTimeout secs descr action = do
 data LuxiOp = QueryInstances
             | QueryNodes
             | QueryJobs
+            | QueryClusterInfo
             | SubmitManyJobs
 
 -- | The serialisation of LuxiOps into strings in messages.
@@ -70,6 +71,7 @@ strOfOp :: LuxiOp -> String
 strOfOp QueryNodes = "QueryNodes"
 strOfOp QueryInstances = "QueryInstances"
 strOfOp QueryJobs = "QueryJobs"
+strOfOp QueryClusterInfo = "QueryClusterInfo"
 strOfOp SubmitManyJobs = "SubmitManyJobs"
 
 -- | The end-of-message separator.
-- 
GitLab