A common operation, also for our HTTP-speaking daemons, is to return a piece of JSON. So factor out a method for this purpose, so that it can be reused later.
Signed-off-by: Klaus Aehlig <[email protected]> --- src/Ganeti/Monitoring/Server.hs | 14 +++++++------- src/Ganeti/Utils/Http.hs | 5 +++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Ganeti/Monitoring/Server.hs b/src/Ganeti/Monitoring/Server.hs index 5076195..333d0d1 100644 --- a/src/Ganeti/Monitoring/Server.hs +++ b/src/Ganeti/Monitoring/Server.hs @@ -46,7 +46,7 @@ import Control.DeepSeq (force) import Control.Exception.Base (evaluate) import Control.Monad import Control.Monad.IO.Class -import Data.ByteString.Char8 (pack, unpack) +import Data.ByteString.Char8 (unpack) import Data.Maybe (fromMaybe) import Data.List (find) import Data.Monoid (mempty) @@ -70,7 +70,7 @@ import qualified Ganeti.Constants as C import qualified Ganeti.ConstantUtils as CU import Ganeti.Runtime import Ganeti.Utils (getCurrentTimeUSec) -import Ganeti.Utils.Http (httpConfFromOpts, error404) +import Ganeti.Utils.Http (httpConfFromOpts, error404, plainJSON) -- * Types and constants definitions @@ -100,12 +100,12 @@ prepMain opts _ = httpConfFromOpts GanetiMond opts -- | Reply to the supported API version numbers query. versionQ :: Snap () -versionQ = writeBS . pack $ J.encode [latestAPIVersion] +versionQ = plainJSON [latestAPIVersion] -- | Version 1 of the monitoring HTTP API. version1Api :: MVar CollectorMap -> MVar ConfigAccess -> Snap () version1Api mvar mvarConfig = - let returnNull = writeBS . pack $ J.encode J.JSNull :: Snap () + let returnNull = plainJSON J.JSNull in ifTop returnNull <|> route [ ("list", listHandler mvarConfig) @@ -148,7 +148,7 @@ dcListItem dc = listHandler :: MVar ConfigAccess -> Snap () listHandler mvarConfig = dir "collectors" $ do collectors' <- liftIO $ activeCollectors mvarConfig - writeBS . pack . J.encode $ map dcListItem collectors' + plainJSON $ map dcListItem collectors' -- | Handler for returning data collector reports. reportHandler :: MVar CollectorMap -> MVar ConfigAccess -> Snap () @@ -164,7 +164,7 @@ allReports :: MVar CollectorMap -> MVar ConfigAccess -> Snap () allReports mvar mvarConfig = do collectors' <- liftIO $ activeCollectors mvarConfig reports <- mapM (liftIO . getReport mvar) collectors' - writeBS . pack . J.encode $ reports + plainJSON reports -- | Takes the CollectorMap and a DataCollector and returns the report for this -- collector. @@ -215,7 +215,7 @@ oneReport mvar mvarConfig = do Just col -> return col Nothing -> fail "Unable to find the requested collector" dcr <- liftIO $ getReport mvar collector - writeBS . pack . J.encode $ dcr + plainJSON dcr -- | The function implementing the HTTP API of the monitoring agent. monitoringApi :: MVar CollectorMap -> MVar ConfigAccess -> Snap () diff --git a/src/Ganeti/Utils/Http.hs b/src/Ganeti/Utils/Http.hs index 9b67f61..670b939 100644 --- a/src/Ganeti/Utils/Http.hs +++ b/src/Ganeti/Utils/Http.hs @@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. module Ganeti.Utils.Http ( httpConfFromOpts , error404 + , plainJSON ) where import Control.Monad (liftM) @@ -47,6 +48,7 @@ import Snap.Core (Snap, writeBS, modifyResponse, setResponseStatus) import Snap.Http.Server.Config ( Config, ConfigLog(ConfigFileLog), emptyConfig , setAccessLog, setErrorLog, setCompression , setVerbose, setPort, setBind ) +import qualified Text.JSON as J import qualified Ganeti.Constants as C import Ganeti.Daemon (DaemonOptions(..)) @@ -90,3 +92,6 @@ error404 = do modifyResponse $ setResponseStatus 404 "Not found" writeBS "Resource not found" +-- | Return the JSON encoding of an object +plainJSON :: J.JSON a => a -> Snap () +plainJSON = writeBS . pack . J.encode -- 2.4.3.573.g4eafbef
