That is, make the luxi backend not ask for the operational memory,
but only for the backend parameter, if this option is given.
Signed-off-by: Klaus Aehlig <[email protected]>
---
src/Ganeti/HTools/Backend/Luxi.hs | 33 ++++++++++++++++++---------------
src/Ganeti/HTools/ExtLoader.hs | 2 +-
src/Ganeti/HTools/Program/Hscan.hs | 2 +-
src/Ganeti/MaintD/Server.hs | 2 +-
4 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/src/Ganeti/HTools/Backend/Luxi.hs
b/src/Ganeti/HTools/Backend/Luxi.hs
index aeb3fe9..215fd5c 100644
--- a/src/Ganeti/HTools/Backend/Luxi.hs
+++ b/src/Ganeti/HTools/Backend/Luxi.hs
@@ -135,24 +135,25 @@ queryGroups :: L.Client -> IO (Result JSValue)
queryGroups = liftM errToResult . L.callMethod queryGroupsMsg
-- | Parse a instance list in JSON format.
-getInstances :: NameAssoc
+getInstances :: Bool
+ -> NameAssoc
-> JSValue
-> Result [(String, Instance.Instance)]
-getInstances ktn arr = L.extractArray arr >>= mapM (parseInstance ktn)
+getInstances sor ktn arr = L.extractArray arr >>= mapM (parseInstance sor ktn)
-- | Construct an instance from a JSON object.
-parseInstance :: NameAssoc
+parseInstance :: Bool
+ -> NameAssoc
-> [(JSValue, JSValue)]
-> Result (String, Instance.Instance)
-parseInstance ktn [ name, disk, mem, vcpus
- , status, pnode, snodes, tags, oram
- , auto_balance, disk_template, su
- , dsizes, dspindles, forthcoming ] = do
+parseInstance sor ktn
+ [ name, disk, mem, vcpus, status, pnode, snodes, tags, oram
+ , auto_balance, disk_template, su, dsizes, dspindles, forthcoming ] = do
xname <- annotateResult "Parsing new instance" (L.fromJValWithStatus name)
let convert a = genericConvert "Instance" xname a
xdisk <- convert "disk_usage" disk
- xmem <- case oram of -- FIXME: remove the "guessing"
- (_, JSRational _ _) -> convert "oper_ram" oram
+ xmem <- case (sor, oram) of -- FIXME: remove the "guessing"
+ (False, (_, JSRational _ _)) -> convert "oper_ram" oram
_ -> convert "be/memory" mem
xvcpus <- convert "be/vcpus" vcpus
xpnode <- convert "pnode" pnode >>= lookupNode ktn xname
@@ -174,7 +175,7 @@ parseInstance ktn [ name, disk, mem, vcpus
xforthcoming
return (xname, inst)
-parseInstance _ v = fail ("Invalid instance query result: " ++ show v)
+parseInstance _ _ v = fail ("Invalid instance query result: " ++ show v)
-- | Parse a node list in JSON format.
getNodes :: NameAssoc -> JSValue -> Result [(String, Node.Node)]
@@ -276,20 +277,22 @@ readData master =
-- | Converts the output of 'readData' into the internal cluster
-- representation.
-parseData :: (Result JSValue, Result JSValue, Result JSValue, Result JSValue)
+parseData :: Bool
+ -> (Result JSValue, Result JSValue, Result JSValue, Result JSValue)
-> Result ClusterData
-parseData (groups, nodes, instances, cinfo) = do
+parseData sor (groups, nodes, instances, cinfo) = do
group_data <- groups >>= getGroups
let (group_names, group_idx) = assignIndices group_data
node_data <- nodes >>= getNodes group_names
let (node_names, node_idx) = assignIndices node_data
- inst_data <- instances >>= getInstances node_names
+ inst_data <- instances >>= getInstances sor node_names
let (_, inst_idx) = assignIndices inst_data
(ctags, cpol, master) <- cinfo >>= getClusterData
node_idx' <- setMaster node_names node_idx master
return (ClusterData group_idx node_idx' inst_idx ctags cpol)
-- | Top level function for data loading.
-loadData :: String -- ^ Unix socket to use as source
+loadData :: Bool -- ^ use only state-of-record data
+ -> String -- ^ Unix socket to use as source
-> IO (Result ClusterData)
-loadData = fmap parseData . readData
+loadData sor = fmap (parseData sor) . readData
diff --git a/src/Ganeti/HTools/ExtLoader.hs b/src/Ganeti/HTools/ExtLoader.hs
index b322cb3..64972ef 100644
--- a/src/Ganeti/HTools/ExtLoader.hs
+++ b/src/Ganeti/HTools/ExtLoader.hs
@@ -114,7 +114,7 @@ loadExternalData opts = do
input_data <-
case () of
_ | setRapi -> wrapIO $ Rapi.loadData mhost
- | setLuxi -> wrapIO . Luxi.loadData $ fromJust lsock
+ | setLuxi -> wrapIO . Luxi.loadData (optSoR opts) $ fromJust lsock
| setSim -> Simu.loadData simdata
| setFile -> wrapIO . Text.loadData $ fromJust tfile
| setIAllocSrc -> wrapIO . IAlloc.loadData $ fromJust iallocsrc
diff --git a/src/Ganeti/HTools/Program/Hscan.hs
b/src/Ganeti/HTools/Program/Hscan.hs
index 1fb6a55..f7fdaf3 100644
--- a/src/Ganeti/HTools/Program/Hscan.hs
+++ b/src/Ganeti/HTools/Program/Hscan.hs
@@ -163,7 +163,7 @@ main opts clusters = do
def_socket <- Path.defaultQuerySocket
let lsock = fromMaybe def_socket (optLuxi opts)
let name = local
- input_data <- Luxi.loadData lsock
+ input_data <- Luxi.loadData (optSoR opts) lsock
result <- writeData nlen name opts input_data
unless result . exitWith $ ExitFailure 2
diff --git a/src/Ganeti/MaintD/Server.hs b/src/Ganeti/MaintD/Server.hs
index 670d2bb..313b924 100644
--- a/src/Ganeti/MaintD/Server.hs
+++ b/src/Ganeti/MaintD/Server.hs
@@ -107,7 +107,7 @@ loadClusterData :: ResultT String IO ClusterData
loadClusterData = do
now <- liftIO getClockTime
socket <- liftIO Path.defaultQuerySocket
- either_inp <- liftIO . tryIOError $ Luxi.loadData socket
+ either_inp <- liftIO . tryIOError $ Luxi.loadData False socket
input_data <- mkResultT $ case either_inp of
Left e -> do
let msg = show e