From a41c337ecf0f506ec4d0e9d0be4bc8f80bdc28bd Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Wed, 3 Oct 2012 00:43:46 +0100 Subject: [PATCH] Use the new name filtering behaviour in query We do this not quite generically, which means we have to add another layer in the call chain, and rename the current query function, plus add special-case code for each query type. Hopefully we will be able to improve on this in the future. A (good) side effect of this patch is that we get the desired ordering when names are requested, matching the Python code. Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: Agata Murawska <agatamurawska@google.com> --- htools/Ganeti/Query/Query.hs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/htools/Ganeti/Query/Query.hs b/htools/Ganeti/Query/Query.hs index 613474310..68b100c76 100644 --- a/htools/Ganeti/Query/Query.hs +++ b/htools/Ganeti/Query/Query.hs @@ -67,6 +67,7 @@ import Ganeti.Query.Types import Ganeti.Query.Node import Ganeti.Query.Group import Ganeti.Objects +import Ganeti.Utils -- * Helper functions @@ -145,13 +146,23 @@ query :: ConfigData -- ^ The current configuration -> Bool -- ^ Whether to collect live data -> Query -- ^ The query (item, fields, filter) -> IO (Result QueryResult) -- ^ Result +query cfg live qry = queryInner cfg live qry $ getRequestedNames qry -query cfg live (Query QRNode fields qfilter) = runResultT $ do +-- | Inner query execution function. +queryInner :: ConfigData -- ^ The current configuration + -> Bool -- ^ Whether to collect live data + -> Query -- ^ The query (item, fields, filter) + -> [String] -- ^ Requested names + -> IO (Result QueryResult) -- ^ Result + +queryInner cfg live (Query QRNode fields qfilter) wanted = runResultT $ do cfilter <- resultT $ compileFilter nodeFieldsMap qfilter let selected = getSelectedFields nodeFieldsMap fields (fdefs, fgetters) = unzip selected - nodes = Map.elems . fromContainer $ configNodes cfg live' = live && needsLiveData fgetters + nodes <- resultT $ case wanted of + [] -> Ok . Map.elems . fromContainer $ configNodes cfg + _ -> mapM (getNode cfg) wanted -- runs first pass of the filter, without a runtime context; this -- will limit the nodes that we'll contact for runtime data fnodes <- resultT $ filterM (\n -> evaluateFilter cfg Nothing n cfilter) nodes @@ -162,21 +173,23 @@ query cfg live (Query QRNode fields qfilter) = runResultT $ do nruntimes return QueryResult { qresFields = fdefs, qresData = fdata } -query cfg _ (Query QRGroup fields qfilter) = return $ do +queryInner cfg _ (Query QRGroup fields qfilter) wanted = return $ do -- FIXME: want_diskparams is defaulted to false and not taken as parameter -- This is because the type for DiskParams is right now too generic for merges -- (or else I cannot see how to do this with curent implementation) cfilter <- compileFilter groupFieldsMap qfilter let selected = getSelectedFields groupFieldsMap fields (fdefs, fgetters) = unzip selected - groups = Map.elems . fromContainer $ configNodegroups cfg + groups <- case wanted of + [] -> Ok . Map.elems . fromContainer $ configNodegroups cfg + _ -> mapM (getGroup cfg) wanted -- there is no live data for groups, so filtering is much simpler fgroups <- filterM (\n -> evaluateFilter cfg Nothing n cfilter) groups let fdata = map (\node -> map (execGetter cfg GroupRuntime node) fgetters) fgroups return QueryResult {qresFields = fdefs, qresData = fdata } -query _ _ (Query qkind _ _) = +queryInner _ _ (Query qkind _ _) _ = return . Bad $ "Query '" ++ show qkind ++ "' not supported" -- | Query fields call. -- GitLab