diff --git a/htest/Test/Ganeti/HTools/Node.hs b/htest/Test/Ganeti/HTools/Node.hs
index 13934532e0c1a55a143ad0ac7491512ac37d69a0..2e1acf51687d007113b80046fd7238032419021c 100644
--- a/htest/Test/Ganeti/HTools/Node.hs
+++ b/htest/Test/Ganeti/HTools/Node.hs
@@ -32,6 +32,7 @@ module Test.Ganeti.HTools.Node
   , setInstanceSmallerThanNode
   , genNode
   , genOnlineNode
+  , genNodeList
   ) where
 
 import Test.QuickCheck
@@ -46,6 +47,7 @@ import Test.Ganeti.TestHTools
 import Test.Ganeti.HTools.Instance (genInstanceSmallerThanNode)
 
 import Ganeti.BasicTypes
+import qualified Ganeti.HTools.Loader as Loader
 import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Instance as Instance
 import qualified Ganeti.HTools.Node as Node
@@ -97,6 +99,14 @@ genOnlineNode =
 instance Arbitrary Node.Node where
   arbitrary = genNode Nothing Nothing
 
+-- | Node list generator.
+-- Given a node generator, create a random length node list.  Note that "real"
+-- clusters always have at least one node, so we don't generate empty node
+-- lists here.
+genNodeList :: Gen Node.Node -> Gen Node.List
+genNodeList ngen = fmap (snd . Loader.assignIndices) names_nodes
+    where names_nodes = (fmap . map) (\n -> (Node.name n, n)) $ listOf1 ngen
+
 -- * Test cases
 
 prop_setAlias :: Node.Node -> String -> Bool