On Mon, May 30, 2011 at 3:30 PM, Iustin Pop <[email protected]> wrote:
> This is not handled yet, this patch just adds parsing of the incoming
> request.
> ---
>  htools/Ganeti/HTools/IAlloc.hs |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
>
> diff --git a/htools/Ganeti/HTools/IAlloc.hs b/htools/Ganeti/HTools/IAlloc.hs
> index 741a370..091db9d 100644
> --- a/htools/Ganeti/HTools/IAlloc.hs
> +++ b/htools/Ganeti/HTools/IAlloc.hs
> @@ -114,6 +114,13 @@ parseGroup u a = do
>   apol <- extract "alloc_policy"
>   return (u, Group.create name u apol)
>
> +parseTargetGroups :: [(String, JSValue)] -- ^ The JSON object

The JSON object containing what? The group list?

> +                  -> Group.List          -- ^ The existing groups
> +                  -> Result [Gdx]
> +parseTargetGroups req map_g = do
> +  group_uuids <- fromObjWithDefault req "target_groups" []
> +  mapM (liftM Group.idx . Container.findByName map_g) group_uuids
> +
>  -- | Top-level parser.
>  parseData :: String         -- ^ The JSON message as received from Ganeti
>           -> Result Request -- ^ A (possible valid) request
> @@ -143,6 +150,8 @@ parseData body = do
>   ctags <- extrObj "cluster_tags"
>   cdata <- mergeData [] [] [] (ClusterData gl nl il ctags)
>   let map_n = cdNodes cdata
> +      map_i = cdInstances cdata
> +      map_g = cdGroups cdata
>   optype <- extrReq "type"
>   rqtype <-
>       case () of
> @@ -167,6 +176,23 @@ parseData body = do
>                 ex_nodes <- mapM (Container.findByName map_n) ex_names
>                 let ex_ndx = map Node.idx ex_nodes
>                 return $ Evacuate ex_ndx
> +          | optype == C.iallocatorModeMreloc ->
> +              do
> +                rl_names <- extrReq "instances"
> +                rl_insts <- mapM (Container.findByName map_i) rl_names
> +                let rl_idx = map Instance.idx rl_insts
> +                rl_mode <- do
> +                   case extrReq "reloc_mode" of
> +                     Ok s | s == C.iallocatorMrelocKeep -> return KeepGroup
> +                          | s == C.iallocatorMrelocChange ->
> +                              do
> +                                tg_groups <- parseTargetGroups request map_g
> +                                return $ ChangeGroup tg_groups
> +                          | s == C.iallocatorMrelocAny -> return AnyGroup
> +                          | otherwise -> Bad $ "Invalid relocate mode " ++ s
> +                     Bad x -> Bad x
> +                return $ MultiReloc rl_idx rl_mode
> +
>           | otherwise -> fail ("Invalid request type '" ++ optype ++ "'")
>   return $ Request rqtype cdata
>
> --
> 1.7.3.1
>
>



-- 
Guido Trotter
Google - Corporate Computing Services SRE

Google Ireland Ltd. : Registered in Ireland with company number 368047.
Gordon House, Barrow Street, Dublin 4, Ireland.

Reply via email to