From 79731e21c505c78a3c403508d6fbda68fae84753 Mon Sep 17 00:00:00 2001 From: Michele Tartara <mtartara@google.com> Date: Tue, 30 Apr 2013 12:17:54 +0000 Subject: [PATCH] Add global status field to the instance status collector The global status is computed from the statuses of the single instances. The output json format is adapted to include this piece of information, as prescribed by the design document. Signed-off-by: Michele Tartara <mtartara@google.com> Reviewed-by: Klaus Aehlig <aehlig@google.com> --- src/Ganeti/DataCollectors/InstStatus.hs | 15 ++++++++++++++- src/Ganeti/DataCollectors/InstStatusTypes.hs | 6 ++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Ganeti/DataCollectors/InstStatus.hs b/src/Ganeti/DataCollectors/InstStatus.hs index 3566c5762..bf92d2dc4 100644 --- a/src/Ganeti/DataCollectors/InstStatus.hs +++ b/src/Ganeti/DataCollectors/InstStatus.hs @@ -36,6 +36,7 @@ module Ganeti.DataCollectors.InstStatus import Control.Exception.Base +import Data.List import Data.Maybe import qualified Data.Map as Map import Network.BSD (getHostName) @@ -179,6 +180,17 @@ buildStatus domains uptimes inst = do trail status +-- | Compute the status code and message, given the current DRBD data +-- The final state will have the code corresponding to the worst code of +-- all the devices, and the error message given from the concatenation of the +-- non-empty error messages. +computeGlobalStatus :: [InstStatus] -> DCStatus +computeGlobalStatus instStatusList = + let dcstatuses = map iStatStatus instStatusList + statuses = map (\s -> (dcStatusCode s, dcStatusMessage s)) dcstatuses + (code, strList) = foldr mergeStatuses (DCSCOk, [""]) statuses + in DCStatus code $ intercalate "\n" strList + -- | Build the report of this data collector, containing all the information -- about the status of the instances. buildInstStatusReport :: Maybe String -> Maybe Int -> IO DCReport @@ -190,7 +202,8 @@ buildInstStatusReport srvAddr srvPort = do uptimes <- getUptimeInfo let primaryInst = fst inst iStatus <- mapM (buildStatus domains uptimes) primaryInst - let jsonReport = J.showJSON iStatus + let globalStatus = computeGlobalStatus iStatus + jsonReport = J.showJSON $ ReportData iStatus globalStatus buildReport dcName dcVersion dcFormatVersion dcCategory dcKind jsonReport -- | Main function. diff --git a/src/Ganeti/DataCollectors/InstStatusTypes.hs b/src/Ganeti/DataCollectors/InstStatusTypes.hs index 84c2ef139..5803c3d81 100644 --- a/src/Ganeti/DataCollectors/InstStatusTypes.hs +++ b/src/Ganeti/DataCollectors/InstStatusTypes.hs @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA module Ganeti.DataCollectors.InstStatusTypes ( InstStatus(..) + , ReportData(..) ) where @@ -47,3 +48,8 @@ $(buildObject "InstStatus" "iStat" , simpleField "state_reason" [t| ReasonTrail |] , simpleField "status" [t| DCStatus |] ]) + +$(buildObject "ReportData" "rData" + [ simpleField "instances" [t| [InstStatus] |] + , simpleField "status" [t| DCStatus |] + ]) -- GitLab