On Thu, Jul 09, 2015 at 04:11:28PM +0200, 'Klaus Aehlig' via ganeti-devel wrote:
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


LGTM

Reply via email to