Revision e1dde6ad htools/Ganeti/HTools/QC.hs
b/htools/Ganeti/HTools/QC.hs | ||
---|---|---|
32 | 32 |
, testInstance |
33 | 33 |
, testNode |
34 | 34 |
, testText |
35 |
, testSimu |
|
35 | 36 |
, testOpCodes |
36 | 37 |
, testJobs |
37 | 38 |
, testCluster |
... | ... | |
40 | 41 |
) where |
41 | 42 |
|
42 | 43 |
import Test.QuickCheck |
44 |
import Text.Printf (printf) |
|
43 | 45 |
import Data.List (findIndex, intercalate, nub, isPrefixOf) |
46 |
import qualified Data.Set as Set |
|
44 | 47 |
import Data.Maybe |
45 | 48 |
import Control.Monad |
46 | 49 |
import qualified Text.JSON as J |
... | ... | |
62 | 65 |
import qualified Ganeti.HTools.Group as Group |
63 | 66 |
import qualified Ganeti.HTools.PeerMap as PeerMap |
64 | 67 |
import qualified Ganeti.HTools.Rapi |
65 |
import qualified Ganeti.HTools.Simu |
|
68 |
import qualified Ganeti.HTools.Simu as Simu
|
|
66 | 69 |
import qualified Ganeti.HTools.Text as Text |
67 | 70 |
import qualified Ganeti.HTools.Types as Types |
68 | 71 |
import qualified Ganeti.HTools.Utils as Utils |
... | ... | |
705 | 708 |
, 'prop_Instance_setMovable |
706 | 709 |
] |
707 | 710 |
|
708 |
-- ** Text backend tests |
|
711 |
-- ** Backends |
|
712 |
|
|
713 |
-- *** Text backend tests |
|
709 | 714 |
|
710 | 715 |
-- Instance text loader tests |
711 | 716 |
|
... | ... | |
856 | 861 |
, 'prop_Text_CreateSerialise |
857 | 862 |
] |
858 | 863 |
|
864 |
-- *** Simu backend |
|
865 |
|
|
866 |
-- | Generates a tuple of specs for simulation. |
|
867 |
genSimuSpec :: Gen (String, Int, Int, Int, Int) |
|
868 |
genSimuSpec = do |
|
869 |
pol <- elements [C.allocPolicyPreferred, |
|
870 |
C.allocPolicyLastResort, C.allocPolicyUnallocable, |
|
871 |
"p", "a", "u"] |
|
872 |
-- should be reasonable (nodes/group), bigger values only complicate |
|
873 |
-- the display of failed tests, and we don't care (in this particular |
|
874 |
-- test) about big node groups |
|
875 |
nodes <- choose (0, 20) |
|
876 |
dsk <- choose (0, maxDsk) |
|
877 |
mem <- choose (0, maxMem) |
|
878 |
cpu <- choose (0, maxCpu) |
|
879 |
return (pol, nodes, dsk, mem, cpu) |
|
880 |
|
|
881 |
-- | Checks that given a set of corrects specs, we can load them |
|
882 |
-- successfully, and that at high-level the values look right. |
|
883 |
prop_SimuLoad = |
|
884 |
forAll (choose (0, 10)) $ \ngroups -> |
|
885 |
forAll (replicateM ngroups genSimuSpec) $ \specs -> |
|
886 |
let strspecs = map (\(p, n, d, m, c) -> printf "%s,%d,%d,%d,%d" |
|
887 |
p n d m c::String) specs |
|
888 |
totnodes = sum $ map (\(_, n, _, _, _) -> n) specs |
|
889 |
mdc_in = concatMap (\(_, n, d, m, c) -> |
|
890 |
replicate n (fromIntegral m, fromIntegral d, |
|
891 |
fromIntegral c, |
|
892 |
fromIntegral m, fromIntegral d)) specs |
|
893 |
in case Simu.parseData strspecs of |
|
894 |
Types.Bad msg -> failTest $ "Failed to load specs: " ++ msg |
|
895 |
Types.Ok (Loader.ClusterData gl nl il tags ipol) -> |
|
896 |
let nodes = map snd $ IntMap.toAscList nl |
|
897 |
nidx = map Node.idx nodes |
|
898 |
mdc_out = map (\n -> (Node.tMem n, Node.tDsk n, Node.tCpu n, |
|
899 |
Node.fMem n, Node.fDsk n)) nodes |
|
900 |
in |
|
901 |
Container.size gl ==? ngroups .&&. |
|
902 |
Container.size nl ==? totnodes .&&. |
|
903 |
Container.size il ==? 0 .&&. |
|
904 |
length tags ==? 0 .&&. |
|
905 |
ipol ==? Types.defIPolicy .&&. |
|
906 |
nidx ==? [1..totnodes] .&&. |
|
907 |
mdc_in ==? mdc_out .&&. |
|
908 |
map Group.iPolicy (Container.elems gl) ==? |
|
909 |
replicate ngroups Types.defIPolicy |
|
910 |
|
|
911 |
testSuite "Simu" |
|
912 |
[ 'prop_SimuLoad |
|
913 |
] |
|
914 |
|
|
859 | 915 |
-- ** Node tests |
860 | 916 |
|
861 | 917 |
prop_Node_setAlias node name = |
Also available in: Unified diff