+ $ "Didn't receive an answer by all MonDs, " ++ dName dc
+ ++ "'s data will be ignored."
+ tell $ All False
+ return (nl,il)
-- | Query all MonDs for all Data Collector. Return the cluster enriched
-- by dynamic data, as well as a bit indicating wether all collectors
-- could be queried successfully.
-queryAllMonDDCs :: ClusterData -> Options -> IO (ClusterData, Bool)
+queryAllMonDDCs :: ClusterData -> Options -> WriterT All IO ClusterData
queryAllMonDDCs cdata opts = do
map_mDD <-
case optMonDFile opts of
Nothing -> return Nothing
Just fp -> do
- monDData_contents <- readFile fp
- monDData <- exitIfBad "can't parse MonD data"
+ monDData_contents <- liftIO $ readFile fp
+ monDData <- liftIO . exitIfBad "can't parse MonD data"
. pMonDData $ monDData_contents
return . Just $ Map.fromList monDData
- let query (cluster, ok) collector = do
- (cluster', ok') <- queryAllMonDs map_mDD cluster collector
- return (cluster', ok && ok')
let (ClusterData _ nl il _ _) = cdata
- ((nl', il'), ok) <- foldM query ((nl, il), True) (collectors opts)
- return (cdata {cdNodes = nl', cdInstances = il'}, ok)
+ (nl', il') <- foldM (queryAllMonDs map_mDD) (nl, il) (collectors opts)
+ return $ cdata {cdNodes = nl', cdInstances = il'}
diff --git a/src/Ganeti/HTools/ExtLoader.hs b/src/Ganeti/HTools/ExtLoader.hs
index a922d54..cae481a 100644
--- a/src/Ganeti/HTools/ExtLoader.hs
+++ b/src/Ganeti/HTools/ExtLoader.hs
@@ -43,8 +43,10 @@ module Ganeti.HTools.ExtLoader
) where
import Control.Monad
+import Control.Monad.Writer (runWriterT)
import Control.Exception
import Data.Maybe (isJust, fromJust)
+import Data.Monoid (getAll)
import System.FilePath
import System.IO
import System.Time (getClockTime)
@@ -124,10 +126,11 @@ loadExternalData opts = do
ldresult = input_data >>= (if ignoreDynU then clearDynU else return)
>>= mergeData eff_u exTags selInsts exInsts now
cdata <- exitIfBad "failed to load data, aborting" ldresult
- (cdata', ok) <- if optMonD opts
- then MonD.queryAllMonDDCs cdata opts
- else return (cdata, True)
- exitWhen (optMonDExitMissing opts && not ok) "Not all required data
available"
+ (cdata', ok) <- runWriterT $ if optMonD opts
+ then MonD.queryAllMonDDCs cdata opts
+ else return cdata
+ exitWhen (optMonDExitMissing opts && not (getAll ok))
+ "Not all required data available"
let (fix_msgs, nl) = checkData (cdNodes cdata') (cdInstances cdata')
unless (optVerbose opts == 0) $ maybeShowWarnings fix_msgs
diff --git a/src/Ganeti/HTools/Program/Hail.hs
b/src/Ganeti/HTools/Program/Hail.hs
index 1d57f17..db1be29 100644
--- a/src/Ganeti/HTools/Program/Hail.hs
+++ b/src/Ganeti/HTools/Program/Hail.hs
@@ -39,6 +39,7 @@ module Ganeti.HTools.Program.Hail
) where
import Control.Monad
+import Control.Monad.Writer (runWriterT)
import Data.Maybe (fromMaybe, isJust)
import System.IO
@@ -87,9 +88,9 @@ wrapReadRequest opts args = do
return $ Request rqt cdata
else do
let Request rqt cdata = r1
- (cdata', _) <- if optMonD opts
- then MonD.queryAllMonDDCs cdata opts
- else return (cdata, True)
+ (cdata', _) <- runWriterT $ if optMonD opts
+ then MonD.queryAllMonDDCs cdata opts
+ else return cdata
return $ Request rqt cdata'
-- | Main function.
--
Klaus Aehlig
Google Germany GmbH, Dienerstr. 12, 80331 Muenchen
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores