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

Reply via email to