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