module Ganeti.HTools.Simu
(
loadData
, parseData
) where
import Text.Printf (printf)
import Ganeti.HTools.Utils
import Ganeti.HTools.Types
import Ganeti.HTools.Loader
import qualified Ganeti.HTools.Container as Container
import qualified Ganeti.HTools.Group as Group
import qualified Ganeti.HTools.Node as Node
parseDesc :: String -> Result (AllocPolicy, Int, Int, Int, Int)
parseDesc desc =
case sepSplit ',' desc of
[a, n, d, m, c] -> do
apol <- apolFromString a
ncount <- tryRead "node count" n
disk <- annotateResult "disk size" (parseUnit d)
mem <- annotateResult "memory size" (parseUnit m)
cpu <- tryRead "cpu count" c
return (apol, ncount, disk, mem, cpu)
es -> fail $ printf
"Invalid cluster specification, expected 5 comma-separated\
\ sections (allocation policy, node count, disk size,\
\ memory size, number of CPUs) but got %d: '%s'" (length es) desc
createGroup :: Int
-> String
-> Result (Group.Group, [Node.Node])
createGroup grpIndex spec = do
(apol, ncount, disk, mem, cpu) <- parseDesc spec
let nodes = map (\idx ->
Node.create (printf "node-%02d-%03d" grpIndex idx)
(fromIntegral mem) 0 mem
(fromIntegral disk) disk
(fromIntegral cpu) False grpIndex
) [1..ncount]
grp = Group.create (printf "group-%02d" grpIndex)
(printf "fake-uuid-%02d" grpIndex) apol
return (Group.setIdx grp grpIndex, nodes)
parseData :: [String]
-> Result ClusterData
parseData ndata = do
grpNodeData <- mapM (uncurry createGroup) $ zip [1..] ndata
let (groups, nodes) = unzip grpNodeData
nodes' = concat nodes
let ktn = map (\(idx, n) -> (idx, Node.setIdx n idx))
$ zip [1..] nodes'
ktg = map (\g -> (Group.idx g, g)) groups
return (ClusterData (Container.fromList ktg)
(Container.fromList ktn) Container.empty [])
loadData :: [String]
-> IO (Result ClusterData)
loadData =
return . parseData