blob: 0ad16dfe2c65e0c0016f42f2f80847ceabb65c3f [file] [log] [blame]
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-| Unittests for ganeti-htools.
-}
{-
Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
-}
module Test.Ganeti.HTools.Backend.Simu (testHTools_Backend_Simu) where
import Test.QuickCheck hiding (Result)
import Control.Monad
import qualified Data.IntMap as IntMap
import Text.Printf (printf)
import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon
import Ganeti.BasicTypes
import qualified Ganeti.Constants as C
import qualified Ganeti.HTools.Backend.Simu as Simu
import qualified Ganeti.HTools.Container as Container
import qualified Ganeti.HTools.Group as Group
import qualified Ganeti.HTools.Loader as Loader
import qualified Ganeti.HTools.Node as Node
import qualified Ganeti.HTools.Types as Types
-- | Generates a tuple of specs for simulation.
genSimuSpec :: Gen (String, Int, Int, Int, Int)
genSimuSpec = do
pol <- elements [C.allocPolicyPreferred,
C.allocPolicyLastResort, C.allocPolicyUnallocable,
"p", "a", "u"]
-- should be reasonable (nodes/group), bigger values only complicate
-- the display of failed tests, and we don't care (in this particular
-- test) about big node groups
nodes <- choose (0, 20)
dsk <- choose (0, maxDsk)
mem <- choose (0, maxMem)
cpu <- choose (0, maxCpu)
return (pol, nodes, dsk, mem, cpu)
-- | Checks that given a set of corrects specs, we can load them
-- successfully, and that at high-level the values look right.
prop_Load :: Property
prop_Load =
forAll (choose (0, 10)) $ \ngroups ->
forAll (replicateM ngroups genSimuSpec) $ \specs ->
let strspecs = map (\(p, n, d, m, c) -> printf "%s,%d,%d,%d,%d"
p n d m c::String) specs
totnodes = sum $ map (\(_, n, _, _, _) -> n) specs
mdc_in = concatMap (\(_, n, d, m, c) ->
replicate n (fromIntegral m, fromIntegral d,
fromIntegral c,
fromIntegral m, fromIntegral d))
specs :: [(Double, Double, Double, Int, Int)]
in case Simu.parseData strspecs of
Bad msg -> failTest $ "Failed to load specs: " ++ msg
Ok (Loader.ClusterData gl nl il tags ipol) ->
let nodes = map snd $ IntMap.toAscList nl
nidx = map Node.idx nodes
mdc_out = map (\n -> (Node.tMem n, Node.tDsk n, Node.tCpu n,
Node.fMem n, Node.fDsk n)) nodes
in conjoin [ Container.size gl ==? ngroups
, Container.size nl ==? totnodes
, Container.size il ==? 0
, length tags ==? 0
, ipol ==? Types.defIPolicy
, nidx ==? [1..totnodes]
, mdc_in ==? mdc_out
, map Group.iPolicy (Container.elems gl) ==?
replicate ngroups Types.defIPolicy
]
testSuite "HTools/Backend/Simu"
[ 'prop_Load
]