Revision a861d322
b/src/Ganeti/Query/Instance.hs | ||
---|---|---|
140 | 140 |
[ (FieldDefinition "disk_usage" "DiskUsage" QFTUnit |
141 | 141 |
"Total disk space used by instance on each of its nodes; this is not the\ |
142 | 142 |
\ disk size visible to the instance, but the usage on the node", |
143 |
FieldSimple (rsNormal . getDiskSizeRequirements), QffNormal), |
|
144 |
|
|
145 |
(FieldDefinition "disk.count" "Disks" QFTNumber |
|
143 |
FieldSimple (rsNormal . getDiskSizeRequirements), QffNormal) |
|
144 |
, (FieldDefinition "disk.count" "Disks" QFTNumber |
|
146 | 145 |
"Number of disks", |
147 |
FieldSimple (rsNormal . length . instDisks), QffNormal), |
|
148 |
|
|
149 |
(FieldDefinition "disk.sizes" "Disk_sizes" QFTOther |
|
146 |
FieldSimple (rsNormal . length . instDisks), QffNormal) |
|
147 |
, (FieldDefinition "disk.sizes" "Disk_sizes" QFTOther |
|
150 | 148 |
"List of disk sizes", |
151 |
FieldSimple (rsNormal . map diskSize . instDisks), QffNormal), |
|
152 |
|
|
153 |
(FieldDefinition "disk.spindles" "Disk_spindles" QFTOther |
|
149 |
FieldSimple (rsNormal . map diskSize . instDisks), QffNormal) |
|
150 |
, (FieldDefinition "disk.spindles" "Disk_spindles" QFTOther |
|
154 | 151 |
"List of disk spindles", |
155 | 152 |
FieldSimple (rsNormal . map (MaybeForJSON . diskSpindles) . |
156 | 153 |
instDisks), |
157 |
QffNormal), |
|
158 |
|
|
159 |
(FieldDefinition "disk.names" "Disk_names" QFTOther |
|
154 |
QffNormal) |
|
155 |
, (FieldDefinition "disk.names" "Disk_names" QFTOther |
|
160 | 156 |
"List of disk names", |
161 | 157 |
FieldSimple (rsNormal . map (MaybeForJSON . diskName) . |
162 | 158 |
instDisks), |
163 |
QffNormal), |
|
164 |
|
|
165 |
(FieldDefinition "disk.uuids" "Disk_UUIDs" QFTOther |
|
159 |
QffNormal) |
|
160 |
, (FieldDefinition "disk.uuids" "Disk_UUIDs" QFTOther |
|
166 | 161 |
"List of disk UUIDs", |
167 | 162 |
FieldSimple (rsNormal . map diskUuid . instDisks), QffNormal) |
168 | 163 |
] ++ |
... | ... | |
171 | 166 |
fillNumberFields C.maxDisks |
172 | 167 |
[ (fieldDefinitionCompleter "disk.size/%d" "Disk/%d" QFTUnit |
173 | 168 |
"Disk size of %s disk", |
174 |
getFillableField instDisks diskSize, QffNormal), |
|
175 |
|
|
176 |
(fieldDefinitionCompleter "disk.spindles/%d" "DiskSpindles/%d" QFTNumber |
|
169 |
getFillableField instDisks diskSize, QffNormal) |
|
170 |
, (fieldDefinitionCompleter "disk.spindles/%d" "DiskSpindles/%d" QFTNumber |
|
177 | 171 |
"Spindles of %s disk", |
178 |
getFillableOptionalField instDisks diskSpindles, QffNormal), |
|
179 |
|
|
180 |
(fieldDefinitionCompleter "disk.name/%d" "DiskName/%d" QFTText |
|
172 |
getFillableOptionalField instDisks diskSpindles, QffNormal) |
|
173 |
, (fieldDefinitionCompleter "disk.name/%d" "DiskName/%d" QFTText |
|
181 | 174 |
"Name of %s disk", |
182 |
getFillableOptionalField instDisks diskName, QffNormal), |
|
183 |
|
|
184 |
(fieldDefinitionCompleter "disk.uuid/%d" "DiskUUID/%d" QFTText |
|
175 |
getFillableOptionalField instDisks diskName, QffNormal) |
|
176 |
, (fieldDefinitionCompleter "disk.uuid/%d" "DiskUUID/%d" QFTText |
|
185 | 177 |
"UUID of %s disk", |
186 | 178 |
getFillableField instDisks diskUuid, QffNormal) |
187 | 179 |
] ++ |
188 | 180 |
|
181 |
-- Aggregate nic parameter fields |
|
182 |
[ (FieldDefinition "nic.count" "NICs" QFTNumber |
|
183 |
"Number of network interfaces", |
|
184 |
FieldSimple (rsNormal . length . instNics), QffNormal) |
|
185 |
, (FieldDefinition "nic.macs" "NIC_MACs" QFTOther |
|
186 |
(nicAggDescPrefix ++ "MAC address"), |
|
187 |
FieldSimple (rsNormal . map nicMac . instNics), QffNormal) |
|
188 |
, (FieldDefinition "nic.ips" "NIC_IPs" QFTOther |
|
189 |
(nicAggDescPrefix ++ "IP address"), |
|
190 |
FieldSimple (rsNormal . map (MaybeForJSON . nicIp) . instNics), |
|
191 |
QffNormal) |
|
192 |
, (FieldDefinition "nic.names" "NIC_Names" QFTOther |
|
193 |
(nicAggDescPrefix ++ "name"), |
|
194 |
FieldSimple (rsNormal . map (MaybeForJSON . nicName) . instNics), |
|
195 |
QffNormal) |
|
196 |
, (FieldDefinition "nic.uuids" "NIC_UUIDs" QFTOther |
|
197 |
(nicAggDescPrefix ++ "UUID"), |
|
198 |
FieldSimple (rsNormal . map nicUuid . instNics), QffNormal) |
|
199 |
, (FieldDefinition "nic.modes" "NIC_modes" QFTOther |
|
200 |
(nicAggDescPrefix ++ "mode"), |
|
201 |
FieldConfig (\cfg -> rsNormal . map |
|
202 |
(nicpMode . fillNicParamsFromConfig cfg . nicNicparams) |
|
203 |
. instNics), |
|
204 |
QffNormal) |
|
205 |
, (FieldDefinition "nic.bridges" "NIC_bridges" QFTOther |
|
206 |
(nicAggDescPrefix ++ "bridge"), |
|
207 |
FieldConfig (\cfg -> rsNormal . map (MaybeForJSON . getNicBridge . |
|
208 |
fillNicParamsFromConfig cfg . nicNicparams) . instNics), |
|
209 |
QffNormal) |
|
210 |
, (FieldDefinition "nic.links" "NIC_links" QFTOther |
|
211 |
(nicAggDescPrefix ++ "link"), |
|
212 |
FieldConfig (\cfg -> rsNormal . map |
|
213 |
(nicpLink . fillNicParamsFromConfig cfg . nicNicparams) |
|
214 |
. instNics), |
|
215 |
QffNormal) |
|
216 |
, (FieldDefinition "nic.networks" "NIC_networks" QFTOther |
|
217 |
"List containing each interface's network", |
|
218 |
FieldSimple (rsNormal . map (MaybeForJSON . nicNetwork) . instNics), |
|
219 |
QffNormal) |
|
220 |
, (FieldDefinition "nic.networks.names" "NIC_networks_names" QFTOther |
|
221 |
"List containing the name of each interface's network", |
|
222 |
FieldConfig (\cfg -> rsNormal . map |
|
223 |
(\x -> MaybeForJSON (getNetworkName cfg <$> nicNetwork x)) |
|
224 |
. instNics), |
|
225 |
QffNormal) |
|
226 |
] ++ |
|
227 |
|
|
228 |
-- Per-nic parameter fields |
|
229 |
fillNumberFields C.maxNics |
|
230 |
[ (fieldDefinitionCompleter "nic.ip/%d" "NicIP/%d" QFTText |
|
231 |
("IP address" ++ nicDescSuffix), |
|
232 |
getFillableOptionalField instNics nicIp, QffNormal) |
|
233 |
, (fieldDefinitionCompleter "nic.uuid/%d" "NicUUID/%d" QFTText |
|
234 |
("UUID address" ++ nicDescSuffix), |
|
235 |
getFillableField instNics nicUuid, QffNormal) |
|
236 |
, (fieldDefinitionCompleter "nic.mac/%d" "NicMAC/%d" QFTText |
|
237 |
("MAC address" ++ nicDescSuffix), |
|
238 |
getFillableField instNics nicMac, QffNormal) |
|
239 |
, (fieldDefinitionCompleter "nic.name/%d" "NicName/%d" QFTText |
|
240 |
("Name address" ++ nicDescSuffix), |
|
241 |
getFillableOptionalField instNics nicName, QffNormal) |
|
242 |
, (fieldDefinitionCompleter "nic.network/%d" "NicNetwork/%d" QFTText |
|
243 |
("Network" ++ nicDescSuffix), |
|
244 |
getFillableOptionalField instNics nicNetwork, QffNormal) |
|
245 |
, (fieldDefinitionCompleter "nic.mode/%d" "NicMode/%d" QFTText |
|
246 |
("Mode" ++ nicDescSuffix), |
|
247 |
getFillableNicField nicpMode, QffNormal) |
|
248 |
, (fieldDefinitionCompleter "nic.link/%d" "NicLink/%d" QFTText |
|
249 |
("Link" ++ nicDescSuffix), |
|
250 |
getFillableNicField nicpLink, QffNormal) |
|
251 |
, (fieldDefinitionCompleter "nic.network.name/%d" "NicNetworkName/%d" QFTText |
|
252 |
("Network name" ++ nicDescSuffix), |
|
253 |
getFillableNicNetworkNameField, QffNormal) |
|
254 |
, (fieldDefinitionCompleter "nic.bridge/%d" "NicBridge/%d" QFTText |
|
255 |
("Bridge" ++ nicDescSuffix), |
|
256 |
getOptionalFillableNicField getNicBridge, QffNormal) |
|
257 |
] ++ |
|
258 |
|
|
189 | 259 |
-- Live fields using special getters |
190 | 260 |
[ (FieldDefinition "status" "Status" QFTText |
191 | 261 |
statusDocText, |
... | ... | |
205 | 275 |
|
206 | 276 |
-- * Helper functions for node property retrieval |
207 | 277 |
|
208 |
-- | Creates a function which produces a FieldGetter when fed an index. Works |
|
278 |
-- | Constant suffix of network interface field descriptions. |
|
279 |
nicDescSuffix ::String |
|
280 |
nicDescSuffix = " of %s network interface" |
|
281 |
|
|
282 |
-- | Almost-constant suffix of aggregate network interface field descriptions. |
|
283 |
nicAggDescPrefix ::String |
|
284 |
nicAggDescPrefix = "List containing each network interface's " |
|
285 |
|
|
286 |
-- | Given a network name id, returns the network's name. |
|
287 |
getNetworkName :: ConfigData -> String -> NonEmptyString |
|
288 |
getNetworkName cfg = networkName . (Map.!) (fromContainer $ configNetworks cfg) |
|
289 |
|
|
290 |
-- | Gets the bridge of a NIC. |
|
291 |
getNicBridge :: FilledNicParams -> Maybe String |
|
292 |
getNicBridge nicParams |
|
293 |
| nicpMode nicParams == NMBridged = Just $ nicpLink nicParams |
|
294 |
| otherwise = Nothing |
|
295 |
|
|
296 |
-- | Fill partial NIC params by using the defaults from the configuration. |
|
297 |
fillNicParamsFromConfig :: ConfigData -> PartialNicParams -> FilledNicParams |
|
298 |
fillNicParamsFromConfig cfg = fillNicParams (getDefaultNicParams cfg) |
|
299 |
|
|
300 |
-- | Retrieves the default network interface parameters. |
|
301 |
getDefaultNicParams :: ConfigData -> FilledNicParams |
|
302 |
getDefaultNicParams cfg = |
|
303 |
(Map.!) (fromContainer . clusterNicparams . configCluster $ cfg) C.ppDefault |
|
304 |
|
|
305 |
-- | Returns a field that retrieves a given NIC's network name. |
|
306 |
getFillableNicNetworkNameField :: Int -> FieldGetter Instance Runtime |
|
307 |
getFillableNicNetworkNameField index = |
|
308 |
FieldConfig (\cfg inst -> rsMaybeUnavail $ do |
|
309 |
nicObj <- maybeAt index $ instNics inst |
|
310 |
nicNetworkId <- nicNetwork nicObj |
|
311 |
return $ getNetworkName cfg nicNetworkId) |
|
312 |
|
|
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) |
|
320 |
|
|
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 |
|
328 |
(map nicNicparams . instNics) (\x _ -> getDefaultNicParams x) fillNicParams |
|
329 |
|
|
330 |
-- | Creates a function which produces a 'FieldGetter' when fed an index. Works |
|
331 |
-- for fields that should be filled out through the use of a default. |
|
332 |
getFillableFieldWithDefault :: (J.JSON c) |
|
333 |
=> (Instance -> [a]) -- ^ Extracts a list of incomplete objects |
|
334 |
-> (ConfigData -> Instance -> b) -- ^ Extracts the default object |
|
335 |
-> (b -> a -> b) -- ^ Fills the default object |
|
336 |
-> (b -> Maybe c) -- ^ Extracts an obj property |
|
337 |
-> Int -- ^ Index in list to use |
|
338 |
-> FieldGetter Instance Runtime -- ^ Result |
|
339 |
getFillableFieldWithDefault |
|
340 |
listGetter defaultGetter fillFn propertyGetter index = |
|
341 |
FieldConfig (\cfg inst -> rsMaybeUnavail $ do |
|
342 |
incompleteObj <- maybeAt index $ listGetter inst |
|
343 |
let defaultObj = defaultGetter cfg inst |
|
344 |
completeObj = fillFn defaultObj incompleteObj |
|
345 |
propertyGetter completeObj) |
|
346 |
|
|
347 |
-- | Creates a function which produces a 'FieldGetter' when fed an index. Works |
|
209 | 348 |
-- for fields that may not return a value, expressed through the Maybe monad. |
210 | 349 |
getFillableOptionalField :: (J.JSON b) |
211 | 350 |
=> (Instance -> [a]) -- ^ Extracts a list of objects |
... | ... | |
218 | 357 |
obj <- maybeAt index $ extractor inst |
219 | 358 |
optPropertyGetter obj) |
220 | 359 |
|
221 |
-- | Creates a function which produces a FieldGetter when fed an index.
|
|
360 |
-- | Creates a function which produces a 'FieldGetter' when fed an index.
|
|
222 | 361 |
-- Works only for fields that surely return a value. |
223 | 362 |
getFillableField :: (J.JSON b) |
224 |
=> (Instance -> [a]) -- ^ Extracts a list of objects
|
|
225 |
-> (a -> b) -- ^ Gets a property from an object
|
|
226 |
-> Int -- ^ Index in list to use
|
|
227 |
-> FieldGetter Instance Runtime -- ^ Result
|
|
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 |
|
228 | 367 |
getFillableField extractor propertyGetter index = |
229 | 368 |
let optPropertyGetter = Just . propertyGetter |
230 | 369 |
in getFillableOptionalField extractor optPropertyGetter index |
Also available in: Unified diff