On Mon, Oct 14, 2013 at 10:25:27AM +0200, Hrvoje Ribicic wrote: > This commit adds the instance network fields. Some of these fields > are also multiplied per-NIC, requiring the reuse of functions from > the previous disk instance fields commit.
'multiplied' ? what does this mean? > > Signed-off-by: Hrvoje Ribicic <[email protected]> > --- > src/Ganeti/Query/Instance.hs | 173 > ++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 169 insertions(+), 4 deletions(-) > > diff --git a/src/Ganeti/Query/Instance.hs b/src/Ganeti/Query/Instance.hs > index 13b8f96..f65c14f 100644 > --- a/src/Ganeti/Query/Instance.hs > +++ b/src/Ganeti/Query/Instance.hs > @@ -203,6 +203,101 @@ instanceFields = > getFillableField instDisks diskUuid, QffNormal) > ] ++ > > + -- Aggregate nic parameter fields > + [ (FieldDefinition "nic.count" "NICs" QFTNumber > + "Number of network interfaces", > + FieldSimple (rsNormal . length . instNics), QffNormal), > + > + (FieldDefinition "nic.macs" "NIC_MACs" QFTOther > + (nicAggDescPrefix ++ "MAC address"), > + FieldSimple (rsNormal . map nicMac . instNics), QffNormal), > + > + (FieldDefinition "nic.ips" "NIC_IPs" QFTOther > + (nicAggDescPrefix ++ "IP address"), > + FieldSimple (rsNormal . map (JSONFriendlyMaybe . nicIp) . instNics), > + QffNormal), > + > + (FieldDefinition "nic.names" "NIC_Names" QFTOther > + (nicAggDescPrefix ++ "name"), > + FieldSimple (rsNormal . map (JSONFriendlyMaybe . nicName) . instNics), > + QffNormal), > + > + (FieldDefinition "nic.uuids" "NIC_UUIDs" QFTOther > + (nicAggDescPrefix ++ "UUID"), > + FieldSimple (rsNormal . map nicUuid . instNics), QffNormal), > + > + (FieldDefinition "nic.modes" "NIC_modes" QFTOther > + (nicAggDescPrefix ++ "mode"), > + FieldConfig (\cfg -> rsNormal . map > + (nicpMode . fillNicParamsFromConfig cfg . nicNicparams) > + . instNics), > + QffNormal), > + > + (FieldDefinition "nic.bridges" "NIC_bridges" QFTOther > + (nicAggDescPrefix ++ "bridge"), > + FieldConfig (\cfg -> rsNormal . map (JSONFriendlyMaybe . getNicBridge . > + fillNicParamsFromConfig cfg . nicNicparams) . instNics), > + QffNormal), > + > + (FieldDefinition "nic.links" "NIC_links" QFTOther > + (nicAggDescPrefix ++ "link"), > + FieldConfig (\cfg -> rsNormal . map > + (nicpLink . fillNicParamsFromConfig cfg . nicNicparams) > + . instNics), > + QffNormal), > + > + (FieldDefinition "nic.networks" "NIC_networks" QFTOther > + "List containing each interface's network", > + FieldSimple (rsNormal . map (JSONFriendlyMaybe . nicNetwork) . > instNics), > + QffNormal), > + > + (FieldDefinition "nic.networks.names" "NIC_networks_names" QFTOther > + "List containing the name of each interface's network", > + FieldConfig (\cfg -> rsNormal . map > + (\x -> JSONFriendlyMaybe (getNetworkName cfg <$> nicNetwork x)) > + . instNics), > + QffNormal) > + ] ++ > + > + -- Per-nic parameter fields > + fillNumberFields C.maxNics > + [ (fieldDefinitionCompleter "nic.ip/%d" "NicIP/%d" QFTText > + ("IP address" ++ nicDescSuffix), > + getFillableOptionalField instNics nicIp, QffNormal), > + > + (fieldDefinitionCompleter "nic.uuid/%d" "NicUUID/%d" QFTText > + ("UUID address" ++ nicDescSuffix), > + getFillableField instNics nicUuid, QffNormal), > + > + (fieldDefinitionCompleter "nic.mac/%d" "NicMAC/%d" QFTText > + ("MAC address" ++ nicDescSuffix), > + getFillableField instNics nicMac, QffNormal), > + > + (fieldDefinitionCompleter "nic.name/%d" "NicName/%d" QFTText > + ("Name address" ++ nicDescSuffix), > + getFillableOptionalField instNics nicName, QffNormal), > + > + (fieldDefinitionCompleter "nic.network/%d" "NicNetwork/%d" QFTText > + ("Network" ++ nicDescSuffix), > + getFillableOptionalField instNics nicNetwork, QffNormal), > + > + (fieldDefinitionCompleter "nic.mode/%d" "NicMode/%d" QFTText > + ("Mode" ++ nicDescSuffix), > + getFillableNicField nicpMode, QffNormal), > + > + (fieldDefinitionCompleter "nic.link/%d" "NicLink/%d" QFTText > + ("Link" ++ nicDescSuffix), > + getFillableNicField nicpLink, QffNormal), > + > + (fieldDefinitionCompleter "nic.network.name/%d" "NicNetworkName/%d" > QFTText > + ("Network name" ++ nicDescSuffix), > + getFillableNicNetworkNameField, QffNormal), > + > + (fieldDefinitionCompleter "nic.bridge/%d" "NicBridge/%d" QFTText > + ("Bridge" ++ nicDescSuffix), > + getOptionalFillableNicField getNicBridge, QffNormal) > + ] ++ > + > -- Live fields using special getters > [ (FieldDefinition "status" "Status" QFTText > statusDocText, > @@ -222,6 +317,76 @@ instanceFields = > tagsFields > > > +-- | Constant suffix of network interface field descriptions. > +nicDescSuffix ::String > +nicDescSuffix = " of %s network interface" > + > +-- | Almost-constant suffix of aggregate network interface field > descriptions. > +nicAggDescPrefix ::String > +nicAggDescPrefix = "List containing each network interface's " > + > +-- | Given a network name id, returns the network's name. > +getNetworkName :: ConfigData -> String -> NonEmptyString > +getNetworkName cfg = networkName . (Map.!) (fromContainer $ configNetworks > cfg) > + > +-- | Gets the bridge of a NIC. > +getNicBridge :: FilledNicParams -> Maybe String > +getNicBridge nicParams = > + if nicpMode nicParams == NMBridged > + then Just $ nicpLink nicParams > + else Nothing Pattern guards ? > + > +-- | Fill partial NIC params by using the defaults from the configuration. > +fillNicParamsFromConfig :: ConfigData -> PartialNicParams -> FilledNicParams > +fillNicParamsFromConfig cfg = fillNicParams (getDefaultNicParams cfg) > + > +-- | Retrieves the default network interface parameters. > +getDefaultNicParams :: ConfigData -> FilledNicParams > +getDefaultNicParams cfg = > + (Map.!) (fromContainer . clusterNicparams . configCluster $ cfg) > C.ppDefault > + > +-- | Returns a field that retrieves a given NIC's network name. > +getFillableNicNetworkNameField :: Int -> FieldGetter Instance Runtime > +getFillableNicNetworkNameField index = > + FieldConfig (\cfg inst -> rsMaybeUnavail $ do > + nicObj <- maybeAt index $ instNics inst > + nicNetworkId <- nicNetwork nicObj > + return $ getNetworkName cfg nicNetworkId) > + > +-- | Gets a fillable NIC field. > +getFillableNicField :: (J.JSON a) > + => (FilledNicParams -> a) > + -> Int > + -> FieldGetter Instance Runtime > +getFillableNicField getter = > + getOptionalFillableNicField (\x -> Just . getter $ x) > + > +-- | Gets an optional fillable NIC field. > +getOptionalFillableNicField :: (J.JSON a) > + => (FilledNicParams -> Maybe a) > + -> Int > + -> FieldGetter Instance Runtime > +getOptionalFillableNicField = > + getFillableFieldWithDefault > + (map nicNicparams . instNics) (\x _ -> getDefaultNicParams x) > fillNicParams > + > +-- | Creates a function which produces a FieldGetter when fed an index. Works > +-- for fields that should be filled out through the use of a default. Quote 'FieldGetter'. > +getFillableFieldWithDefault :: (J.JSON c) > + => (Instance -> [a]) -- ^ Extracts a list of incomplete objects > + -> (ConfigData -> Instance -> b) -- ^ Extracts the default object > + -> (b -> a -> b) -- ^ Fills the default object > + -> (b -> Maybe c) -- ^ Extracts an obj property > + -> Int -- ^ Index in list to use > + -> FieldGetter Instance Runtime -- ^ Result > +getFillableFieldWithDefault > + listGetter defaultGetter fillFn propertyGetter index = > + FieldConfig(\cfg inst -> rsMaybeUnavail $ do > + incompleteObj <- maybeAt index $ listGetter inst > + let defaultObj = defaultGetter cfg inst > + completeObj = fillFn defaultObj > incompleteObj > + propertyGetter completeObj) > + Missing space between 'FieldConfig' and parenthesis. Thanks, Jose > -- | Creates a function which produces a FieldGetter when fed an index. Works > -- for fields that may not return a value, expressed through the Maybe monad. > getFillableOptionalField :: (J.JSON b) > @@ -238,10 +403,10 @@ getFillableOptionalField extractor optPropertyGetter > index = > -- | Creates a function which produces a FieldGetter when fed an index. > -- Works only for fields that surely return a value. > getFillableField :: (J.JSON b) > - => (Instance -> [a]) -- ^ Extracts a list of objects > - -> (a -> b) -- ^ Gets a property from an object > - -> Int -- ^ Index in list to use > - -> FieldGetter Instance Runtime -- ^ Result > + => (Instance -> [a]) -- ^ Extracts a list of objects > + -> (a -> b) -- ^ Gets a property from an object > + -> Int -- ^ Index in list to use > + -> FieldGetter Instance Runtime -- ^ Result > getFillableField extractor propertyGetter index = > let optPropertyGetter = Just . propertyGetter > in getFillableOptionalField extractor optPropertyGetter index > -- > 1.8.4 > -- Jose Antonio Lopes Ganeti Engineering Google Germany GmbH Dienerstr. 12, 80331, München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Graham Law, Christine Elizabeth Flores Steuernummer: 48/725/00206 Umsatzsteueridentifikationsnummer: DE813741370
