Hi!

On Tue, Oct 7, 2014 at 4:53 PM, 'Klaus Aehlig' via ganeti-devel <
ganeti-devel@googlegroups.com> wrote:

> Provide two functions getMigRestrictions and getRecvMigRestrictions.
> The first computes the migration restrictions, given the the cluster
> tags and the tags of a node. The second computes the set of restrictions
> a node is able to receive, again, given the cluster tags and the node
> tags. Migration is possible if the the migration restrictions of the
> source node are a subset of the set of restrictions the target node
> is able to receive. This is as described in the location awareness
> design document.
>
> Signed-off-by: Klaus Aehlig <aeh...@google.com>
> ---
>  src/Ganeti/HTools/Tags.hs | 54
> ++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 53 insertions(+), 1 deletion(-)
>
> diff --git a/src/Ganeti/HTools/Tags.hs b/src/Ganeti/HTools/Tags.hs
> index ae09bbc..abb090a 100644
> --- a/src/Ganeti/HTools/Tags.hs
> +++ b/src/Ganeti/HTools/Tags.hs
> @@ -43,9 +43,14 @@ module Ganeti.HTools.Tags
>    , autoRepairTagPending
>    , autoRepairTagResult
>    , autoRepairTagSuspended
> +  , getMigRestrictions
> +  , getRecvMigRestrictions
>    ) where
>
> -import Data.List (isPrefixOf)
> +import Control.Monad (guard, (>=>))
> +import Data.List (isPrefixOf, isInfixOf, stripPrefix)
> +import Data.Maybe (mapMaybe)
> +import qualified Data.Set as S
>
>  import qualified Ganeti.HTools.Node as Node
>
> @@ -60,6 +65,14 @@ exTagsPrefix = "htools:iextags:"
>  standbyPrefix :: String
>  standbyPrefix = "htools:standby:"
>
> +-- | The prefix for migration tags
> +migrationPrefix :: String
> +migrationPrefix = "htools:migration:"
> +
> +-- | Prefix of tags allowing migration
> +allowMigrationPrefix :: String
> +allowMigrationPrefix = "htools:allowmigration:"
> +
>  -- | The tag to be added to nodes that were shutdown by hsqueeze.
>  standbyAuto :: String
>  standbyAuto = "htools:standby:auto"
> @@ -86,3 +99,42 @@ autoRepairTagSuspended = autoRepairTagPrefix ++
> "suspend:"
>  hasStandbyTag :: Node.Node -> Bool
>  hasStandbyTag = any (standbyPrefix `isPrefixOf`) . Node.nTags
>
> +-- * Migration restriction tags
> +
> +-- | Given the cluster tags extract the migration restrictions
> +-- from a node tag, as a list.
> +getMigRestrictionsList :: [String] -> [String] -> [String]
> +getMigRestrictionsList ctags ntags =
> +  mapMaybe (stripPrefix migrationPrefix) ctags >>= \ prefix ->
> +  filter (prefix `isPrefixOf`) ntags
> +
> +-- | Given the cluster tags extract the migration restrictions
> +-- from a node tag.
> +getMigRestrictions :: [String] -> [String] -> S.Set String
> +getMigRestrictions ctags = S.fromList . getMigRestrictionsList ctags
> +
> +-- | Maybe split a string on the first single occurence of "::" return
> +-- the parts before and after.
> +splitAtColons :: String -> Maybe (String, String)
> +
> +splitAtColons (':':':':xs) = do
> +  guard $ not ("::" `isInfixOf` xs)
> +  return ("", xs)
> +
> +splitAtColons (x:xs) = do
> +  (as, bs) <- splitAtColons xs
> +  return (x:as, bs)
> +
> +splitAtColons _ = Nothing
> +
> +-- | Get the pairs of allowed migrations from a set of cluster tags.
> +migrations :: [String] -> [(String, String)]
> +migrations = mapMaybe $ stripPrefix allowMigrationPrefix >=> splitAtColons
> +
> +-- | Given the cluster tags, extract the set of migration restrictions
> +-- a node is able to receive from its node tags.
> +getRecvMigRestrictions :: [String] -> [String] -> S.Set String
> +getRecvMigRestrictions ctags ntags =
> +  let migs = migrations ctags
> +      closure tag = (:) tag . map fst $ filter ((==) tag . snd) migs
> +  in S.fromList $ getMigRestrictionsList ctags ntags >>= closure
> --
> 2.1.0.rc2.206.gedb03e5
>
>
LGTM, thanks

-- 
Helga Velroyen | Software Engineer | hel...@google.com |

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

Reply via email to