Revision 8e527d04 src/Ganeti/Rpc.hs
b/src/Ganeti/Rpc.hs | ||
---|---|---|
34 | 34 |
, explainRpcError |
35 | 35 |
, executeRpcCall |
36 | 36 |
, executeRpcCalls |
37 |
, rpcErrors |
|
37 | 38 |
, logRpcErrors |
38 | 39 |
|
39 | 40 |
, rpcCallName |
... | ... | |
86 | 87 |
import qualified Codec.Compression.Zlib as Zlib |
87 | 88 |
import qualified Data.ByteString.Lazy.Char8 as BL |
88 | 89 |
import qualified Data.Map as Map |
89 |
import Data.Maybe (fromMaybe) |
|
90 |
import Data.Maybe (fromMaybe, mapMaybe)
|
|
90 | 91 |
import qualified Text.JSON as J |
91 | 92 |
import Text.JSON.Pretty (pp_value) |
92 | 93 |
import qualified Data.ByteString.Base64.Lazy as Base64 |
... | ... | |
209 | 210 |
J.JSString msg -> Left $ RpcResultError (J.fromJSString msg) |
210 | 211 |
_ -> Left . JsonDecodeError $ show (pp_value jerr) |
211 | 212 |
|
213 |
-- | Scan the list of results produced by executeRpcCall and extract |
|
214 |
-- all the RPC errors. |
|
215 |
rpcErrors :: [(a, ERpcError b)] -> [(a, RpcError)] |
|
216 |
rpcErrors = |
|
217 |
let rpcErr (node, Left err) = Just (node, err) |
|
218 |
rpcErr _ = Nothing |
|
219 |
in mapMaybe rpcErr |
|
220 |
|
|
212 | 221 |
-- | Scan the list of results produced by executeRpcCall and log all the RPC |
213 |
-- errors. |
|
214 |
logRpcErrors :: [(a, ERpcError b)] -> IO () |
|
215 |
logRpcErrors allElems = |
|
216 |
let logOneRpcErr (_, Right _) = return () |
|
217 |
logOneRpcErr (_, Left err) = |
|
218 |
logError $ "Error in the RPC HTTP reply: " ++ show err |
|
219 |
in mapM_ logOneRpcErr allElems |
|
222 |
-- errors. Returns the list of errors for further processing. |
|
223 |
logRpcErrors :: (MonadLog m, Show a) => [(a, ERpcError b)] |
|
224 |
-> m [(a, RpcError)] |
|
225 |
logRpcErrors rs = |
|
226 |
let logOneRpcErr (node, err) = |
|
227 |
logError $ "Error in the RPC HTTP reply from '" ++ |
|
228 |
show node ++ "': " ++ show err |
|
229 |
errs = rpcErrors rs |
|
230 |
in mapM_ logOneRpcErr errs >> return errs |
|
220 | 231 |
|
221 | 232 |
-- | Get options for RPC call |
222 | 233 |
getOptionsForCall :: (Rpc a b) => FilePath -> FilePath -> a -> [CurlOption] |
... | ... | |
258 | 269 |
-- now parse the replies |
259 | 270 |
let results'' = zipWith parseHttpReply calls results' |
260 | 271 |
pairedList = zip nodes results'' |
261 |
logRpcErrors pairedList |
|
272 |
_ <- logRpcErrors pairedList
|
|
262 | 273 |
return pairedList |
263 | 274 |
|
264 | 275 |
-- | Execute an RPC call for many nodes in parallel. |
Also available in: Unified diff