Revision d6f05205 src/Ganeti/Rpc.hs
b/src/Ganeti/Rpc.hs | ||
---|---|---|
44 | 44 |
|
45 | 45 |
, rpcResultFill |
46 | 46 |
|
47 |
, Compressed |
|
48 |
, packCompressed |
|
49 |
, toCompressed |
|
50 |
, getCompressed |
|
51 |
|
|
47 | 52 |
, RpcCallInstanceInfo(..) |
48 | 53 |
, InstanceState(..) |
49 | 54 |
, InstanceInfo(..) |
... | ... | |
84 | 89 |
) where |
85 | 90 |
|
86 | 91 |
import Control.Arrow (second) |
87 |
import qualified Codec.Compression.Zlib as Zlib
|
|
92 |
import Control.Monad
|
|
88 | 93 |
import qualified Data.ByteString.Lazy.Char8 as BL |
89 | 94 |
import qualified Data.Map as Map |
90 | 95 |
import Data.Maybe (fromMaybe, mapMaybe) |
... | ... | |
98 | 103 |
|
99 | 104 |
import Ganeti.BasicTypes |
100 | 105 |
import qualified Ganeti.Constants as C |
106 |
import Ganeti.Codec |
|
107 |
import Ganeti.Curl.Multi |
|
101 | 108 |
import Ganeti.JSON |
102 | 109 |
import Ganeti.Logging |
103 | 110 |
import Ganeti.Objects |
104 | 111 |
import Ganeti.THH |
105 | 112 |
import Ganeti.THH.Field |
106 | 113 |
import Ganeti.Types |
107 |
import Ganeti.Curl.Multi |
|
108 | 114 |
import Ganeti.Utils |
109 | 115 |
|
110 | 116 |
-- * Base RPC functionality and types |
... | ... | |
295 | 301 |
fromJSValueToRes :: (J.JSON a) => J.JSValue -> (a -> b) -> ERpcError b |
296 | 302 |
fromJSValueToRes val = fromJResultToRes (J.readJSON val) |
297 | 303 |
|
304 |
-- | An opaque data type for representing data that should be compressed |
|
305 |
-- over the wire. |
|
306 |
-- |
|
307 |
-- On Python side it is decompressed by @backend._Decompress@. |
|
308 |
newtype Compressed = Compressed { getCompressed :: BL.ByteString } |
|
309 |
deriving (Eq, Ord, Show) |
|
310 |
|
|
311 |
-- TODO Add a unit test for all octets |
|
312 |
instance J.JSON Compressed where |
|
313 |
showJSON = J.showJSON |
|
314 |
. (,) C.rpcEncodingZlibBase64 |
|
315 |
. Base64.encode . compressZlib . getCompressed |
|
316 |
readJSON = J.readJSON >=> decompress |
|
317 |
where |
|
318 |
decompress (enc, cont) |
|
319 |
| enc == C.rpcEncodingNone = |
|
320 |
return $ Compressed cont |
|
321 |
| enc == C.rpcEncodingZlibBase64 = |
|
322 |
liftM Compressed |
|
323 |
. either fail return . decompressZlib |
|
324 |
<=< either (fail . ("Base64: " ++)) return . Base64.decode |
|
325 |
$ cont |
|
326 |
| otherwise = |
|
327 |
fail $ "Unknown RPC encoding type: " ++ show enc |
|
328 |
|
|
329 |
packCompressed :: BL.ByteString -> Compressed |
|
330 |
packCompressed = Compressed |
|
331 |
|
|
332 |
toCompressed :: String -> Compressed |
|
333 |
toCompressed = packCompressed . BL.pack |
|
334 |
|
|
298 | 335 |
-- * RPC calls and results |
299 | 336 |
|
300 | 337 |
-- ** Instance info |
... | ... | |
594 | 631 |
rpcCallAcceptOffline _ = False |
595 | 632 |
rpcCallData _ call = J.encode |
596 | 633 |
( rpcCallJobqueueUpdateFileName call |
597 |
, ( C.rpcEncodingZlibBase64 |
|
598 |
, BL.unpack . Base64.encode . Zlib.compress . BL.pack |
|
599 |
$ rpcCallJobqueueUpdateContent call |
|
600 |
) |
|
634 |
, toCompressed $ rpcCallJobqueueUpdateContent call |
|
601 | 635 |
) |
602 | 636 |
|
603 | 637 |
instance Rpc RpcCallJobqueueUpdate RpcResultJobQueueUpdate where |
Also available in: Unified diff