Refactor reading live data in htools
authorBernardo Dal Seno <bdalseno@google.com>
Tue, 4 Jun 2013 16:38:11 +0000 (18:38 +0200)
committerJose A. Lopes <jabolopes@google.com>
Wed, 4 Dec 2013 14:51:17 +0000 (15:51 +0100)
This simplifies different handling of individual items.

Cherry-picked from 8c72f7119f50a11661aacba2a1abffdfdc6f7cfa.

Signed-off-by: Jose A. Lopes <jabolopes@google.com>
Reviewed-by: Thomas Thrainer <thomasth@google.com>

src/Ganeti/HTools/Backend/IAlloc.hs
src/Ganeti/HTools/Backend/Luxi.hs
src/Ganeti/HTools/Backend/Rapi.hs
src/Ganeti/HTools/Loader.hs

index 22dad86..c421b5f 100644 (file)
@@ -130,20 +130,18 @@ parseNode ktg n a = do
   vm_capable  <- annotateResult desc $ maybeFromObj a "vm_capable"
   let vm_capable' = fromMaybe True vm_capable
   gidx <- lookupGroup ktg n guuid
-  node <- if offline || drained || not vm_capable'
-            then return $ Node.create n 0 0 0 0 0 0 True 0 gidx
-            else do
-              mtotal <- extract "total_memory"
-              mnode  <- extract "reserved_memory"
-              mfree  <- extract "free_memory"
-              dtotal <- extract "total_disk"
-              dfree  <- extract "free_disk"
-              ctotal <- extract "total_cpus"
-              ndparams <- extract "ndparams" >>= asJSObject
-              spindles <- tryFromObj desc (fromJSObject ndparams)
-                          "spindle_count"
-              return $ Node.create n mtotal mnode mfree
-                     dtotal dfree ctotal False spindles gidx
+  ndparams <- extract "ndparams" >>= asJSObject
+  spindles <- tryFromObj desc (fromJSObject ndparams) "spindle_count"
+  let live = not offline && not drained && vm_capable'
+      lvextract def = eitherLive live def . extract
+  mtotal <- lvextract 0.0 "total_memory"
+  mnode  <- lvextract 0 "reserved_memory"
+  mfree  <- lvextract 0 "free_memory"
+  dtotal <- lvextract 0.0 "total_disk"
+  dfree  <- lvextract 0 "free_disk"
+  ctotal <- lvextract 0.0 "total_cpus"
+  let node = Node.create n mtotal mnode mfree dtotal dfree ctotal (not live)
+             spindles gidx
   return (n, node)
 
 -- | Parses a group as found in the cluster group list.
index 71ef347..728054e 100644 (file)
@@ -194,17 +194,16 @@ parseNode ktg [ name, mtotal, mnode, mfree, dtotal, dfree
   xvm_capable <- convert "vm_capable" vm_capable
   xspindles <- convert "spindles" spindles
   xgdx   <- convert "group.uuid" g_uuid >>= lookupGroup ktg xname
-  node <- if xoffline || xdrained || not xvm_capable
-            then return $ Node.create xname 0 0 0 0 0 0 True xspindles xgdx
-            else do
-              xmtotal  <- convert "mtotal" mtotal
-              xmnode   <- convert "mnode" mnode
-              xmfree   <- convert "mfree" mfree
-              xdtotal  <- convert "dtotal" dtotal
-              xdfree   <- convert "dfree" dfree
-              xctotal  <- convert "ctotal" ctotal
-              return $ Node.create xname xmtotal xmnode xmfree
-                     xdtotal xdfree xctotal False xspindles xgdx
+  let live = not xoffline && not xdrained && xvm_capable
+      lvconvert def n d = eitherLive live def $ convert n d
+  xmtotal <- lvconvert 0.0 "mtotal" mtotal
+  xmnode <- lvconvert 0 "mnode" mnode
+  xmfree <- lvconvert 0 "mfree" mfree
+  xdtotal <- lvconvert 0.0 "dtotal" dtotal
+  xdfree <- lvconvert 0 "dfree" dfree
+  xctotal <- lvconvert 0.0 "ctotal" ctotal
+  let node = Node.create xname xmtotal xmnode xmfree xdtotal xdfree
+             xctotal (not live) xspindles xgdx
   return (xname, node)
 
 parseNode _ v = fail ("Invalid node query result: " ++ show v)
index 0672e70..d078a79 100644 (file)
@@ -157,17 +157,16 @@ parseNode ktg a = do
   spindles <- tryFromObj desc (fromJSObject ndparams) "spindle_count"
   guuid   <- annotateResult desc $ maybeFromObj a "group.uuid"
   guuid' <-  lookupGroup ktg name (fromMaybe defaultGroupID guuid)
-  node <- if offline || drained || not vm_cap'
-            then return $ Node.create name 0 0 0 0 0 0 True 0 guuid'
-            else do
-              mtotal  <- extract "mtotal"
-              mnode   <- extract "mnode"
-              mfree   <- extract "mfree"
-              dtotal  <- extract "dtotal"
-              dfree   <- extract "dfree"
-              ctotal  <- extract "ctotal"
-              return $ Node.create name mtotal mnode mfree
-                     dtotal dfree ctotal False spindles guuid'
+  let live = not offline && not drained && vm_cap'
+      lvextract def = eitherLive live def . extract
+  mtotal <- lvextract 0.0 "mtotal"
+  mnode <- lvextract 0 "mnode"
+  mfree <- lvextract 0 "mfree"
+  dtotal <- lvextract 0.0 "dtotal"
+  dfree <- lvextract 0 "dfree"
+  ctotal <- lvextract 0.0 "ctotal"
+  let node = Node.create name mtotal mnode mfree dtotal dfree ctotal (not live)
+             spindles guuid'
   return (name, node)
 
 -- | Construct a group from a JSON object.
index 49109ab..07c7de7 100644 (file)
@@ -34,6 +34,7 @@ module Ganeti.HTools.Loader
   , lookupNode
   , lookupInstance
   , lookupGroup
+  , eitherLive
   , commonSuffix
   , RqType(..)
   , Request(..)
@@ -332,3 +333,8 @@ nodeIdsk node il =
   let rfind = flip Container.find il
   in sum . map (Instance.dsk . rfind)
        $ Node.pList node ++ Node.sList node
+
+-- | Get live information or a default value
+eitherLive :: (Monad m) => Bool -> a -> m a -> m a
+eitherLive True _ live_data = live_data
+eitherLive False def_data _ = return def_data