Revision a41c337e
b/htools/Ganeti/Query/Query.hs | ||
---|---|---|
67 | 67 |
import Ganeti.Query.Node |
68 | 68 |
import Ganeti.Query.Group |
69 | 69 |
import Ganeti.Objects |
70 |
import Ganeti.Utils |
|
70 | 71 |
|
71 | 72 |
-- * Helper functions |
72 | 73 |
|
... | ... | |
145 | 146 |
-> Bool -- ^ Whether to collect live data |
146 | 147 |
-> Query -- ^ The query (item, fields, filter) |
147 | 148 |
-> IO (Result QueryResult) -- ^ Result |
149 |
query cfg live qry = queryInner cfg live qry $ getRequestedNames qry |
|
148 | 150 |
|
149 |
query cfg live (Query QRNode fields qfilter) = runResultT $ do |
|
151 |
-- | Inner query execution function. |
|
152 |
queryInner :: ConfigData -- ^ The current configuration |
|
153 |
-> Bool -- ^ Whether to collect live data |
|
154 |
-> Query -- ^ The query (item, fields, filter) |
|
155 |
-> [String] -- ^ Requested names |
|
156 |
-> IO (Result QueryResult) -- ^ Result |
|
157 |
|
|
158 |
queryInner cfg live (Query QRNode fields qfilter) wanted = runResultT $ do |
|
150 | 159 |
cfilter <- resultT $ compileFilter nodeFieldsMap qfilter |
151 | 160 |
let selected = getSelectedFields nodeFieldsMap fields |
152 | 161 |
(fdefs, fgetters) = unzip selected |
153 |
nodes = Map.elems . fromContainer $ configNodes cfg |
|
154 | 162 |
live' = live && needsLiveData fgetters |
163 |
nodes <- resultT $ case wanted of |
|
164 |
[] -> Ok . Map.elems . fromContainer $ configNodes cfg |
|
165 |
_ -> mapM (getNode cfg) wanted |
|
155 | 166 |
-- runs first pass of the filter, without a runtime context; this |
156 | 167 |
-- will limit the nodes that we'll contact for runtime data |
157 | 168 |
fnodes <- resultT $ filterM (\n -> evaluateFilter cfg Nothing n cfilter) nodes |
... | ... | |
162 | 173 |
nruntimes |
163 | 174 |
return QueryResult { qresFields = fdefs, qresData = fdata } |
164 | 175 |
|
165 |
query cfg _ (Query QRGroup fields qfilter) = return $ do
|
|
176 |
queryInner cfg _ (Query QRGroup fields qfilter) wanted = return $ do
|
|
166 | 177 |
-- FIXME: want_diskparams is defaulted to false and not taken as parameter |
167 | 178 |
-- This is because the type for DiskParams is right now too generic for merges |
168 | 179 |
-- (or else I cannot see how to do this with curent implementation) |
169 | 180 |
cfilter <- compileFilter groupFieldsMap qfilter |
170 | 181 |
let selected = getSelectedFields groupFieldsMap fields |
171 | 182 |
(fdefs, fgetters) = unzip selected |
172 |
groups = Map.elems . fromContainer $ configNodegroups cfg |
|
183 |
groups <- case wanted of |
|
184 |
[] -> Ok . Map.elems . fromContainer $ configNodegroups cfg |
|
185 |
_ -> mapM (getGroup cfg) wanted |
|
173 | 186 |
-- there is no live data for groups, so filtering is much simpler |
174 | 187 |
fgroups <- filterM (\n -> evaluateFilter cfg Nothing n cfilter) groups |
175 | 188 |
let fdata = map (\node -> |
176 | 189 |
map (execGetter cfg GroupRuntime node) fgetters) fgroups |
177 | 190 |
return QueryResult {qresFields = fdefs, qresData = fdata } |
178 | 191 |
|
179 |
query _ _ (Query qkind _ _) =
|
|
192 |
queryInner _ _ (Query qkind _ _) _ =
|
|
180 | 193 |
return . Bad $ "Query '" ++ show qkind ++ "' not supported" |
181 | 194 |
|
182 | 195 |
-- | Query fields call. |
Also available in: Unified diff