Revision 3b89cb1b src/Ganeti/Query/Instance.hs

b/src/Ganeti/Query/Instance.hs
163 163
  ] ++
164 164

  
165 165
  -- Per-disk parameter fields
166
  fillNumberFields C.maxDisks
166
  instantiateIndexedFields C.maxDisks
167 167
  [ (fieldDefinitionCompleter "disk.size/%d" "Disk/%d" QFTUnit
168 168
     "Disk size of %s disk",
169
     getFillableField instDisks diskSize, QffNormal)
169
     getIndexedField instDisks diskSize, QffNormal)
170 170
  , (fieldDefinitionCompleter "disk.spindles/%d" "DiskSpindles/%d" QFTNumber
171 171
     "Spindles of %s disk",
172
     getFillableOptionalField instDisks diskSpindles, QffNormal)
172
     getIndexedOptionalField instDisks diskSpindles, QffNormal)
173 173
  , (fieldDefinitionCompleter "disk.name/%d" "DiskName/%d" QFTText
174 174
     "Name of %s disk",
175
     getFillableOptionalField instDisks diskName, QffNormal)
175
     getIndexedOptionalField instDisks diskName, QffNormal)
176 176
  , (fieldDefinitionCompleter "disk.uuid/%d" "DiskUUID/%d" QFTText
177 177
     "UUID of %s disk",
178
     getFillableField instDisks diskUuid, QffNormal)
178
     getIndexedField instDisks diskUuid, QffNormal)
179 179
  ] ++
180 180

  
181 181
  -- Aggregate nic parameter fields
......
226 226
  ] ++
227 227

  
228 228
  -- Per-nic parameter fields
229
  fillNumberFields C.maxNics
229
  instantiateIndexedFields C.maxNics
230 230
  [ (fieldDefinitionCompleter "nic.ip/%d" "NicIP/%d" QFTText
231 231
     ("IP address" ++ nicDescSuffix),
232
     getFillableOptionalField instNics nicIp, QffNormal)
232
     getIndexedOptionalField instNics nicIp, QffNormal)
233 233
  , (fieldDefinitionCompleter "nic.uuid/%d" "NicUUID/%d" QFTText
234 234
     ("UUID address" ++ nicDescSuffix),
235
     getFillableField instNics nicUuid, QffNormal)
235
     getIndexedField instNics nicUuid, QffNormal)
236 236
  , (fieldDefinitionCompleter "nic.mac/%d" "NicMAC/%d" QFTText
237 237
     ("MAC address" ++ nicDescSuffix),
238
     getFillableField instNics nicMac, QffNormal)
238
     getIndexedField instNics nicMac, QffNormal)
239 239
  , (fieldDefinitionCompleter "nic.name/%d" "NicName/%d" QFTText
240 240
     ("Name address" ++ nicDescSuffix),
241
     getFillableOptionalField instNics nicName, QffNormal)
241
     getIndexedOptionalField instNics nicName, QffNormal)
242 242
  , (fieldDefinitionCompleter "nic.network/%d" "NicNetwork/%d" QFTText
243 243
     ("Network" ++ nicDescSuffix),
244
     getFillableOptionalField instNics nicNetwork, QffNormal)
244
     getIndexedOptionalField instNics nicNetwork, QffNormal)
245 245
  , (fieldDefinitionCompleter "nic.mode/%d" "NicMode/%d" QFTText
246 246
     ("Mode" ++ nicDescSuffix),
247
     getFillableNicField nicpMode, QffNormal)
247
     getIndexedNicField nicpMode, QffNormal)
248 248
  , (fieldDefinitionCompleter "nic.link/%d" "NicLink/%d" QFTText
249 249
     ("Link" ++ nicDescSuffix),
250
     getFillableNicField nicpLink, QffNormal)
250
     getIndexedNicField nicpLink, QffNormal)
251 251
  , (fieldDefinitionCompleter "nic.network.name/%d" "NicNetworkName/%d" QFTText
252 252
     ("Network name" ++ nicDescSuffix),
253
     getFillableNicNetworkNameField, QffNormal)
253
     getIndexedNicNetworkNameField, QffNormal)
254 254
  , (fieldDefinitionCompleter "nic.bridge/%d" "NicBridge/%d" QFTText
255 255
     ("Bridge" ++ nicDescSuffix),
256
     getOptionalFillableNicField getNicBridge, QffNormal)
256
     getOptionalIndexedNicField getNicBridge, QffNormal)
257 257
  ] ++
258 258

  
259 259
  -- Live fields using special getters
......
303 303
  (Map.!) (fromContainer . clusterNicparams . configCluster $ cfg) C.ppDefault
304 304

  
305 305
-- | Returns a field that retrieves a given NIC's network name.
306
getFillableNicNetworkNameField :: Int -> FieldGetter Instance Runtime
307
getFillableNicNetworkNameField index =
306
getIndexedNicNetworkNameField :: Int -> FieldGetter Instance Runtime
307
getIndexedNicNetworkNameField index =
308 308
  FieldConfig (\cfg inst -> rsMaybeUnavail $ do
309 309
    nicObj <- maybeAt index $ instNics inst
310 310
    nicNetworkId <- nicNetwork nicObj
311 311
    return $ getNetworkName cfg nicNetworkId)
312 312

  
313 313
-- | Gets a fillable NIC field.
314
getFillableNicField :: (J.JSON a)
315
                    => (FilledNicParams -> a)
316
                    -> Int
317
                    -> FieldGetter Instance Runtime
318
getFillableNicField getter =
319
  getOptionalFillableNicField (\x -> Just . getter $ x)
314
getIndexedNicField :: (J.JSON a)
315
                   => (FilledNicParams -> a)
316
                   -> Int
317
                   -> FieldGetter Instance Runtime
318
getIndexedNicField getter =
319
  getOptionalIndexedNicField (\x -> Just . getter $ x)
320 320

  
321 321
-- | Gets an optional fillable NIC field.
322
getOptionalFillableNicField :: (J.JSON a)
323
                            => (FilledNicParams -> Maybe a)
324
                            -> Int
325
                            -> FieldGetter Instance Runtime
326
getOptionalFillableNicField =
327
  getFillableFieldWithDefault
322
getOptionalIndexedNicField :: (J.JSON a)
323
                           => (FilledNicParams -> Maybe a)
324
                           -> Int
325
                           -> FieldGetter Instance Runtime
326
getOptionalIndexedNicField =
327
  getIndexedFieldWithDefault
328 328
    (map nicNicparams . instNics) (\x _ -> getDefaultNicParams x) fillNicParams
329 329

  
330 330
-- | Creates a function which produces a 'FieldGetter' when fed an index. Works
331 331
-- for fields that should be filled out through the use of a default.
332
getFillableFieldWithDefault :: (J.JSON c)
332
getIndexedFieldWithDefault :: (J.JSON c)
333 333
  => (Instance -> [a])             -- ^ Extracts a list of incomplete objects
334 334
  -> (ConfigData -> Instance -> b) -- ^ Extracts the default object
335 335
  -> (b -> a -> b)                 -- ^ Fills the default object
336 336
  -> (b -> Maybe c)                -- ^ Extracts an obj property
337 337
  -> Int                           -- ^ Index in list to use
338 338
  -> FieldGetter Instance Runtime  -- ^ Result
339
getFillableFieldWithDefault
339
getIndexedFieldWithDefault
340 340
  listGetter defaultGetter fillFn propertyGetter index =
341 341
  FieldConfig (\cfg inst -> rsMaybeUnavail $ do
342 342
                              incompleteObj <- maybeAt index $ listGetter inst
......
346 346

  
347 347
-- | Creates a function which produces a 'FieldGetter' when fed an index. Works
348 348
-- for fields that may not return a value, expressed through the Maybe monad.
349
getFillableOptionalField :: (J.JSON b)
350
                         => (Instance -> [a]) -- ^ Extracts a list of objects
351
                         -> (a -> Maybe b)    -- ^ Possibly gets a property
352
                                              -- from an object
353
                         -> Int               -- ^ Index in list to use
354
                         -> FieldGetter Instance Runtime -- ^ Result
355
getFillableOptionalField extractor optPropertyGetter index =
349
getIndexedOptionalField :: (J.JSON b)
350
                        => (Instance -> [a]) -- ^ Extracts a list of objects
351
                        -> (a -> Maybe b)    -- ^ Possibly gets a property
352
                                             -- from an object
353
                        -> Int               -- ^ Index in list to use
354
                        -> FieldGetter Instance Runtime -- ^ Result
355
getIndexedOptionalField extractor optPropertyGetter index =
356 356
  FieldSimple(\inst -> rsMaybeUnavail $ do
357 357
                         obj <- maybeAt index $ extractor inst
358 358
                         optPropertyGetter obj)
359 359

  
360 360
-- | Creates a function which produces a 'FieldGetter' when fed an index.
361 361
-- Works only for fields that surely return a value.
362
getFillableField :: (J.JSON b)
363
                 => (Instance -> [a]) -- ^ Extracts a list of objects
364
                 -> (a -> b)          -- ^ Gets a property from an object
365
                 -> Int               -- ^ Index in list to use
366
                 -> FieldGetter Instance Runtime -- ^ Result
367
getFillableField extractor propertyGetter index =
362
getIndexedField :: (J.JSON b)
363
                => (Instance -> [a]) -- ^ Extracts a list of objects
364
                -> (a -> b)          -- ^ Gets a property from an object
365
                -> Int               -- ^ Index in list to use
366
                -> FieldGetter Instance Runtime -- ^ Result
367
getIndexedField extractor propertyGetter index =
368 368
  let optPropertyGetter = Just . propertyGetter
369
  in getFillableOptionalField extractor optPropertyGetter index
369
  in getIndexedOptionalField extractor optPropertyGetter index
370 370

  
371 371
-- | Retrieves a value from an array at an index, using the Maybe monad to
372 372
-- indicate failure.
......
404 404
fillIncompleteFields (iDef, iGet, mode) firstVal secondVal =
405 405
  (iDef firstVal secondVal, iGet firstVal, mode)
406 406

  
407
-- | Given fields that describe lists, fill their definitions with appropriate
408
-- index representations.
409
fillNumberFields :: (Integral t1)
410
                 => Int
411
                 -> [(t1 -> String -> FieldDefinition,
412
                      t1 -> FieldGetter a b,
413
                      QffMode)]
414
                 -> FieldList a b
415
fillNumberFields numFills fieldsToFill = do
416
  index <- take numFills [0..]
417
  field <- fieldsToFill
407
-- | Given indexed fields that describe lists, complete / instantiate them for
408
-- a given list size.
409
instantiateIndexedFields :: (Show t1, Integral t1)
410
                         => Int            -- ^ The size of the list
411
                         -> [(t1 -> String -> FieldDefinition,
412
                              t1 -> FieldGetter a b,
413
                              QffMode)]    -- ^ The indexed fields
414
                         -> FieldList a b  -- ^ A list of complete fields
415
instantiateIndexedFields listSize fields = do
416
  index <- take listSize [0..]
417
  field <- fields
418 418
  return . fillIncompleteFields field index . formatOrdinal $ index + 1
419 419

  
420 420
-- * Various helper functions for property retrieval

Also available in: Unified diff