[Pkg-ganeti-devel] [ganeti] 60/165: Make queryAllMonDDCs return if it succeeded

Apollon Oikonomopoulos apoikos at moszumanska.debian.org
Tue Aug 11 13:53:13 UTC 2015


This is an automated email from the git hooks/post-receive script.

apoikos pushed a commit to branch master
in repository ganeti.

commit b5126340a9af8e195f4c4a0b3f5bf534a17cb245
Author: Klaus Aehlig <aehlig at google.com>
Date:   Mon Feb 23 18:02:47 2015 +0100

    Make queryAllMonDDCs return if it succeeded
    
    Querying collectors might fail and for some collectors
    the information might be incomplete. In this case, it might
    be useful to continue with he information available, but this
    is not necessarily the case. Therefore, provide the information
    if the dynamic data collection was successful.
    
    Signed-off-by: Klaus Aehlig <aehlig at google.com>
    Reviewed-by: Petr Pudlak <pudlak at google.com>
---
 src/Ganeti/HTools/Backend/MonD.hs | 22 ++++++++++++++--------
 src/Ganeti/HTools/ExtLoader.hs    |  7 ++++---
 src/Ganeti/HTools/Program/Hail.hs |  6 ++++--
 3 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/Ganeti/HTools/Backend/MonD.hs b/src/Ganeti/HTools/Backend/MonD.hs
index bc85ff4..744d52d 100644
--- a/src/Ganeti/HTools/Backend/MonD.hs
+++ b/src/Ganeti/HTools/Backend/MonD.hs
@@ -44,6 +44,7 @@ module Ganeti.HTools.Backend.MonD
   ) where
 
 import Control.Monad
+import Control.Monad.Writer
 import qualified Data.List as L
 import qualified Data.IntMap as IntMap
 import qualified Data.Map as Map
@@ -67,7 +68,7 @@ import Ganeti.HTools.Loader (ClusterData(..))
 import Ganeti.HTools.Types
 import Ganeti.HTools.CLI
 import Ganeti.JSON
-import Ganeti.Logging (logWarning)
+import Ganeti.Logging.Lifted (logWarning)
 import Ganeti.Utils (exitIfBad)
 
 -- * General definitions
@@ -265,11 +266,12 @@ queryAMonD m dc node =
       Nothing -> fromCurl dc node
       Just m' -> return $ fromFile dc node m'
 
--- | Query all MonDs for a single Data Collector.
+-- | Query all MonDs for a single Data Collector. Return the updated
+-- cluster, as well as a bit inidicating wether the collector succeeded.
 queryAllMonDs :: Maybe MapMonDData -> (Node.List, Instance.List)
-                 -> DataCollector -> IO (Node.List, Instance.List)
+                 -> DataCollector -> WriterT All IO (Node.List, Instance.List)
 queryAllMonDs m (nl, il) dc = do
-  elems <- mapM (queryAMonD m dc) (Container.elems nl)
+  elems <- liftIO $ mapM (queryAMonD m dc) (Container.elems nl)
   let elems' = catMaybes elems
   if length elems == length elems'
     then
@@ -278,21 +280,25 @@ queryAllMonDs m (nl, il) dc = do
         Ok (nl', il') -> return (nl', il')
         Bad s -> do
           logWarning s
+          tell $ All False
           return (nl, il)
     else do
       logWarning $ "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.
-queryAllMonDDCs :: ClusterData -> Options -> IO ClusterData
+-- | 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 -> 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 (ClusterData _ nl il _ _) = cdata
diff --git a/src/Ganeti/HTools/ExtLoader.hs b/src/Ganeti/HTools/ExtLoader.hs
index cdc81eb..aebaeb3 100644
--- a/src/Ganeti/HTools/ExtLoader.hs
+++ b/src/Ganeti/HTools/ExtLoader.hs
@@ -43,6 +43,7 @@ module Ganeti.HTools.ExtLoader
   ) where
 
 import Control.Monad
+import Control.Monad.Writer (runWriterT)
 import Control.Exception
 import Data.Maybe (isJust, fromJust)
 import System.FilePath
@@ -124,9 +125,9 @@ 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' <- if optMonD opts
-              then MonD.queryAllMonDDCs cdata opts
-              else return cdata
+  (cdata', _) <- runWriterT $ if optMonD opts
+                                then MonD.queryAllMonDDCs cdata opts
+                                else return cdata
   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 2a398ad..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,8 +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
+      (cdata', _) <- runWriterT $ if optMonD opts
+                                    then MonD.queryAllMonDDCs cdata opts
+                                    else return cdata
       return $ Request rqt cdata'
 
 -- | Main function.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ganeti/ganeti.git



More information about the Pkg-ganeti-devel mailing list