Revision d6f9f5bd
b/htools/Ganeti/HTools/QC.hs  

167  167 
setInstanceSmallerThanNode node inst) 
168  168  
169  169 
  Checks if a node is "big" enough. 
170 
isNodeBig :: Node.Node > Int > Bool


171 
isNodeBig node size = Node.availDisk node > size * Types.unitDsk


170 
isNodeBig :: Int > Node.Node > Bool


171 
isNodeBig size node = Node.availDisk node > size * Types.unitDsk


172  172 
&& Node.availMem node > size * Types.unitMem 
173  173 
&& Node.availCpu node > size * Types.unitCpu 
174  174  
...  ...  
265  265 
n' = Node.setPolicy nullIPolicy n 
266  266 
return $ Node.buildPeers n' Container.empty 
267  267  
268 
  Helper function to generate a sane node. 

269 
genOnlineNode :: Gen Node.Node 

270 
genOnlineNode = do 

271 
arbitrary `suchThat` (\n > not (Node.offline n) && 

272 
not (Node.failN1 n) && 

273 
Node.availDisk n > 0 && 

274 
Node.availMem n > 0 && 

275 
Node.availCpu n > 0) 

276  
268  277 
 and a random node 
269  278 
instance Arbitrary Node.Node where 
270  279 
arbitrary = genNode Nothing Nothing 
...  ...  
908  917 
in score <= 1e12 
909  918  
910  919 
  Check that cluster stats are sane. 
911 
prop_CStats_sane node =


920 
prop_CStats_sane = 

912  921 
forAll (choose (1, 1024)) $ \count > 
913 
(not (Node.offline node) && not (Node.failN1 node) && 

914 
(Node.availDisk node > 0) && (Node.availMem node > 0)) ==> 

922 
forAll genOnlineNode $ \node > 

915  923 
let fn = Node.buildPeers node Container.empty 
916  924 
nlst = zip [1..] $ replicate count fn::[(Types.Ndx, Node.Node)] 
917  925 
nl = Container.fromList nlst 
...  ...  
921  929  
922  930 
  Check that one instance is allocated correctly, without 
923  931 
 rebalances needed. 
924 
prop_ClusterAlloc_sane node inst =


932 
prop_ClusterAlloc_sane inst = 

925  933 
forAll (choose (5, 20)) $ \count > 
926 
not (Node.offline node) 

927 
&& not (Node.failN1 node) 

928 
&& Node.availDisk node > 0 

929 
&& Node.availMem node > 0 

930 
==> 

934 
forAll genOnlineNode $ \node > 

931  935 
let (nl, il, inst') = makeSmallEmptyCluster node count inst 
932  936 
in case Cluster.genAllocNodes defGroupList nl 2 True >>= 
933  937 
Cluster.tryAlloc nl il inst' of 
...  ...  
943  947 
  Checks that on a 25 node cluster, we can allocate a random 
944  948 
 instance spec via tiered allocation (whatever the original instance 
945  949 
 spec), on either one or two nodes. 
946 
prop_ClusterCanTieredAlloc node inst =


950 
prop_ClusterCanTieredAlloc inst = 

947  951 
forAll (choose (2, 5)) $ \count > 
948  952 
forAll (choose (1, 2)) $ \rqnodes > 
949 
not (Node.offline node) 

950 
&& not (Node.failN1 node) 

951 
&& isNodeBig node 4 

952 
==> 

953 
forAll (genOnlineNode `suchThat` (isNodeBig 4)) $ \node > 

953  954 
let nl = makeSmallCluster node count 
954  955 
il = Container.empty 
955  956 
allocnodes = Cluster.genAllocNodes defGroupList nl rqnodes True 
...  ...  
962  963  
963  964 
  Checks that on a 48 node cluster, once we allocate an instance, 
964  965 
 we can also evacuate it. 
965 
prop_ClusterAllocEvac node inst =


966 
prop_ClusterAllocEvac inst = 

966  967 
forAll (choose (4, 8)) $ \count > 
967 
not (Node.offline node) 

968 
&& not (Node.failN1 node) 

969 
&& isNodeBig node 4 

970 
==> 

968 
forAll (genOnlineNode `suchThat` (isNodeBig 4)) $ \node > 

971  969 
let (nl, il, inst') = makeSmallEmptyCluster node count inst 
972  970 
in case Cluster.genAllocNodes defGroupList nl 2 True >>= 
973  971 
Cluster.tryAlloc nl il inst' of 
Also available in: Unified diff