diff --git a/htest/Test/Ganeti/HTools/Instance.hs b/htest/Test/Ganeti/HTools/Instance.hs index 2b046720b426d02e527b92c50958fb172df1bd98..0f71c2672f58d1bf2e98948815a17ba44855316e 100644 --- a/htest/Test/Ganeti/HTools/Instance.hs +++ b/htest/Test/Ganeti/HTools/Instance.hs @@ -31,6 +31,7 @@ module Test.Ganeti.HTools.Instance , genInstanceSmallerThanNode , genInstanceMaybeBiggerThanNode , genInstanceSmallerThan + , genInstanceOnNodeList , genInstanceList , Instance.Instance(..) ) where @@ -44,6 +45,7 @@ import Test.Ganeti.HTools.Types () import Ganeti.BasicTypes import qualified Ganeti.HTools.Instance as Instance import qualified Ganeti.HTools.Node as Node +import qualified Ganeti.HTools.Container as Container import qualified Ganeti.HTools.Loader as Loader import qualified Ganeti.HTools.Types as Types @@ -76,6 +78,23 @@ genInstanceMaybeBiggerThanNode node = (Node.availDisk node + Types.unitDsk * 3) (Node.availCpu node + Types.unitCpu * 4) +-- | Generates an instance with nodes on a node list. +-- The following rules are respected: +-- 1. The instance is never bigger than its primary node +-- 2. If possible the instance has different pnode and snode +-- 3. Else disk templates which require secondary nodes are disabled +genInstanceOnNodeList :: Node.List -> Gen Instance.Instance +genInstanceOnNodeList nl = do + let nsize = Container.size nl + pnode <- choose (0, nsize-1) + let (snodefilter, dtfilter) = + if nsize >= 2 + then ((/= pnode), const True) + else (const True, not . Instance.hasSecondary) + snode <- choose (0, nsize-1) `suchThat` snodefilter + i <- genInstanceSmallerThanNode (Container.find pnode nl) `suchThat` dtfilter + return $ i { Instance.pNode = pnode, Instance.sNode = snode } + -- | Generates an instance list given an instance generator. genInstanceList :: Gen Instance.Instance -> Gen Instance.List genInstanceList igen = fmap (snd . Loader.assignIndices) names_instances