Signed-off-by: Helga Velroyen <[email protected]>
---
htest/Test/Ganeti/HTools/Node.hs | 35 +++++++++++++++++++++++++------
htools/Ganeti/HTools/Node.hs | 2 +-
htools/Ganeti/HTools/Program/Hspace.hs | 2 +-
3 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/htest/Test/Ganeti/HTools/Node.hs b/htest/Test/Ganeti/HTools/Node.hs
index 7d32abf..3e4ea8b 100644
--- a/htest/Test/Ganeti/HTools/Node.hs
+++ b/htest/Test/Ganeti/HTools/Node.hs
@@ -53,7 +53,7 @@ import qualified Ganeti.HTools.Types as Types
-- * Arbitrary instances
--- | Generas an arbitrary node based on sizing information.
+-- | Generates an arbitrary node based on sizing information.
genNode :: Maybe Int -- ^ Minimum node size in terms of units
-> Maybe Int -- ^ Maximum node size (when Nothing, bounded
-- just by the max... constants)
@@ -120,15 +120,35 @@ prop_setMcpu node mc =
Types.iPolicyVcpuRatio (Node.iPolicy newnode) ==? mc
where newnode = Node.setMcpu node mc
+prop_setFmemGreater :: Node.Node -> Int -> Property
+prop_setFmemGreater node new_mem =
+ not (Node.failN1 node) && (Node.rMem node >= 0) &&
+ (new_mem > Node.rMem node) ==>
+ not (Node.failN1 (Node.setFmem node new_mem))
+
+prop_setFmemExact :: Node.Node -> Property
+prop_setFmemExact node =
+ not (Node.failN1 node) && (Node.rMem node >= 0) ==>
+ not (Node.failN1 (Node.setFmem node (Node.rMem node)))
+
+-- Check if adding an instance that consumes exactly all reserved
+-- memory does not raise an N+1 error
+prop_addPri_NoN1Fail :: Property
+prop_addPri_NoN1Fail =
+ forAll genOnlineNode $ \node ->
+ forAll (genInstanceSmallerThanNode node) $ \inst ->
+ let inst' = inst { Instance.mem = Node.fMem node - Node.rMem node }
+ in case Node.addPri node inst' of
+ Bad Types.FailN1 -> False
+ _ -> True
+
-- | Check that an instance add with too high memory or disk will be
-- rejected.
prop_addPriFM :: Node.Node -> Instance.Instance -> Property
prop_addPriFM node inst =
Instance.mem inst >= Node.fMem node && not (Node.failN1 node) &&
not (Instance.isOffline inst) ==>
- case Node.addPri node inst'' of
- Bad Types.FailMem -> True
- _ -> False
+ (Node.addPri node inst'' ==? Bad Types.FailMem)
where inst' = setInstanceSmallerThanNode node inst
inst'' = inst' { Instance.mem = Instance.mem inst }
@@ -141,9 +161,7 @@ prop_addPriFD node inst =
let inst' = setInstanceSmallerThanNode node inst
inst'' = inst' { Instance.dsk = Instance.dsk inst
, Instance.diskTemplate = dt }
- in case Node.addPri node inst'' of
- Bad Types.FailDisk -> True
- _ -> False
+ in (Node.addPri node inst'' ==? Bad Types.FailDisk)
-- | Check that adding a primary instance with too many VCPUs fails
-- with type FailCPU.
@@ -294,10 +312,13 @@ testSuite "HTools/Node"
[ 'prop_setAlias
, 'prop_setOffline
, 'prop_setMcpu
+ , 'prop_setFmemGreater
+ , 'prop_setFmemExact
, 'prop_setXmem
, 'prop_addPriFM
, 'prop_addPriFD
, 'prop_addPriFC
+ , 'prop_addPri_NoN1Fail
, 'prop_addSec
, 'prop_addOfflinePri
, 'prop_addOfflineSec
diff --git a/htools/Ganeti/HTools/Node.hs b/htools/Ganeti/HTools/Node.hs
index d6b98cb..72e533e 100644
--- a/htools/Ganeti/HTools/Node.hs
+++ b/htools/Ganeti/HTools/Node.hs
@@ -354,7 +354,7 @@ computePDsk used total = fromIntegral used / total
-- | Sets the free memory.
setFmem :: Node -> Int -> Node
setFmem t new_mem =
- let new_n1 = new_mem <= rMem t
+ let new_n1 = new_mem < rMem t
new_mp = fromIntegral new_mem / tMem t
in t { fMem = new_mem, failN1 = new_n1, pMem = new_mp }
diff --git a/htools/Ganeti/HTools/Program/Hspace.hs
b/htools/Ganeti/HTools/Program/Hspace.hs
index 9ad61b8..6dd4905 100644
--- a/htools/Ganeti/HTools/Program/Hspace.hs
+++ b/htools/Ganeti/HTools/Program/Hspace.hs
@@ -122,7 +122,7 @@ cpuEff :: Cluster.CStats -> Double
cpuEff = effFn Cluster.csIcpu (fromIntegral . Cluster.csVcpu)
-- | Holds data for converting a 'Cluster.CStats' structure into
--- detailed statictics.
+-- detailed statistics.
statsData :: [(String, Cluster.CStats -> String)]
statsData = [ ("SCORE", printf "%.8f" . Cluster.csScore)
, ("INST_CNT", printf "%d" . Cluster.csNinst)
--
1.7.7.3