Hi!

On Mon, 15 Jun 2015 at 18:16 'Klaus Aehlig' via ganeti-devel <
[email protected]> wrote:

> Make hail parse and handle requests to allocate a secondary node for
> an instance to be converted to DRBD.
>
> Signed-off-by: Klaus Aehlig <[email protected]>
> ---
>  src/Ganeti/HTools/Backend/IAlloc.hs | 23 +++++++++++++++++++++++
>  src/Ganeti/HTools/Loader.hs         |  3 +++
>  2 files changed, 26 insertions(+)
>
> diff --git a/src/Ganeti/HTools/Backend/IAlloc.hs
> b/src/Ganeti/HTools/Backend/IAlloc.hs
> index ac83a7f..d704950 100644
> --- a/src/Ganeti/HTools/Backend/IAlloc.hs
> +++ b/src/Ganeti/HTools/Backend/IAlloc.hs
> @@ -53,6 +53,7 @@ import Text.JSON (JSObject, JSValue(JSArray),
>  import Ganeti.BasicTypes
>  import qualified Ganeti.HTools.Cluster as Cluster
>  import qualified Ganeti.HTools.Cluster.AllocationSolution as AllocSol
> +import qualified Ganeti.HTools.Cluster.AllocateSecondary as AllocSecondary
>  import qualified Ganeti.HTools.Cluster.Evacuate as Evacuate
>  import qualified Ganeti.HTools.Container as Container
>  import qualified Ganeti.HTools.Group as Group
> @@ -275,6 +276,11 @@ parseData now body = do
>                                   return (io, Cluster.AllocDetails
>                                                 req_nodes rgn))
>                return $ MultiAllocate prqs
> +        | optype == C.iallocatorModeAllocateSecondary ->
> +            do
> +              rname <- extrReq "name"
> +              ridx  <- lookupInstance kti rname
> +              return $ AllocateSecondary ridx
>          | otherwise -> fail ("Invalid request type '" ++ optype ++ "'")
>    return (msgs, Request rqtype cdata)
>
> @@ -306,6 +312,20 @@ formatAllocate il as = do
>          let il' = Container.add (Instance.idx inst) inst il
>          return (info, showJSON $ map Node.name nodes, nl, il')
>
> +-- | Convert allocation/relocation results into the result format.
> +formatAllocateSecondary :: Instance.List
> +                        -> AllocSol.GenericAllocSolution a
> +                        -> Result IAllocResult
> +formatAllocateSecondary il as = do
> +  let info = describeSolution as
> +  case AllocSol.asSolution as of
> +    Nothing -> fail info
> +    Just (nl, inst, [_, snode], _) ->
> +      do
> +        let il' = Container.add (Instance.idx inst) inst il
> +        return (info, showJSON $ Node.name snode, nl, il')
> +    _ -> fail $ "Internal error (not a DRBD allocation); info was: " ++
> info
> +
>  -- | Convert multi allocation results into the result format.
>  formatMultiAlloc :: ( Node.List, Instance.List
>                      , Cluster.GenericAllocSolutionList a)
> @@ -445,6 +465,9 @@ processRequest opts request =
>                  formatNodeEvac gl nl il
>         MultiAllocate xies ->
>           Cluster.allocList opts gl nl il xies [] >>= formatMultiAlloc
> +       AllocateSecondary xi ->
> +         AllocSecondary.tryAllocateSecondary opts gl nl il xi
> +           >>= formatAllocateSecondary il
>
>  -- | Reads the request from the data file(s).
>  readRequest :: FilePath -> IO Request
> diff --git a/src/Ganeti/HTools/Loader.hs b/src/Ganeti/HTools/Loader.hs
> index 5162ada..35f3e9f 100644
> --- a/src/Ganeti/HTools/Loader.hs
> +++ b/src/Ganeti/HTools/Loader.hs
> @@ -87,6 +87,9 @@ request-specific fields.
>  data RqType
>    = Allocate Instance.Instance Cluster.AllocDetails (Maybe [String])
>      -- ^ A new instance allocation, maybe with allocation restrictions
> +  | AllocateSecondary Idx                             -- ^ Find a suitable
> +                                                      -- secondary node
> for disk
> +                                                      -- conversion
>    | Relocate Idx Int [Ndx]                            -- ^ Choose a new
>                                                        --   secondary node
>    | NodeEvacuate [Idx] EvacMode                       -- ^ node-evacuate
> mode
> --
> 2.2.0.rc0.207.ga3a616c
>
>
LGTM, thanks

Reply via email to