import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon
import Test.Ganeti.Types ()
-import Test.Ganeti.Query.Language
+import Test.Ganeti.Query.Language ()
import Ganeti.BasicTypes
import qualified Ganeti.Constants as C
, pure OpCodes.TagCluster
]
+arbitraryOpTagsGet :: Gen OpCodes.OpCode
+arbitraryOpTagsGet = do
+ kind <- arbitrary
+ OpCodes.OpTagsSet kind <$> arbitrary <*> genOpCodesTagName kind
+
+arbitraryOpTagsSet :: Gen OpCodes.OpCode
+arbitraryOpTagsSet = do
+ kind <- arbitrary
+ OpCodes.OpTagsSet kind <$> genTags <*> genOpCodesTagName kind
+
+arbitraryOpTagsDel :: Gen OpCodes.OpCode
+arbitraryOpTagsDel = do
+ kind <- arbitrary
+ OpCodes.OpTagsDel kind <$> genTags <*> genOpCodesTagName kind
+
$(genArbitrary ''OpCodes.ReplaceDisksMode)
$(genArbitrary ''DiskAccess)
instance Arbitrary INicParams where
arbitrary = INicParams <$> genMaybe genNameNE <*> genMaybe genName <*>
- genMaybe genNameNE <*> genMaybe genNameNE <*> genMaybe genNameNE
- <*> genMaybe genNameNE
+ genMaybe genNameNE <*> genMaybe genNameNE <*>
+ genMaybe genNameNE <*> genMaybe genNameNE <*>
+ genMaybe genNameNE
instance Arbitrary IDiskParams where
arbitrary = IDiskParams <$> arbitrary <*> arbitrary <*>
return Nothing <*> arbitrary <*> arbitrary <*> arbitrary <*>
genMaybe genNameNE <*> arbitrary
"OP_TAGS_GET" ->
- OpCodes.OpTagsGet <$> arbitrary <*> arbitrary
+ arbitraryOpTagsGet
"OP_TAGS_SEARCH" ->
OpCodes.OpTagsSearch <$> genNameNE
"OP_TAGS_SET" ->
- OpCodes.OpTagsSet <$> arbitrary <*> genTags
+ arbitraryOpTagsSet
"OP_TAGS_DEL" ->
- OpCodes.OpTagsSet <$> arbitrary <*> genTags
+ arbitraryOpTagsDel
"OP_CLUSTER_POST_INIT" -> pure OpCodes.OpClusterPostInit
"OP_CLUSTER_DESTROY" -> pure OpCodes.OpClusterDestroy
"OP_CLUSTER_QUERY" -> pure OpCodes.OpClusterQuery
OpCodes.OpClusterRename <$> genNameNE
"OP_CLUSTER_SET_PARAMS" ->
OpCodes.OpClusterSetParams <$> arbitrary <*> emptyMUD <*> emptyMUD <*>
- arbitrary <*> genMaybe (listOf1 arbitrary >>= mkNonEmpty) <*>
+ arbitrary <*> genMaybe arbitrary <*>
genMaybe genEmptyContainer <*> emptyMUD <*>
genMaybe genEmptyContainer <*> genMaybe genEmptyContainer <*>
genMaybe genEmptyContainer <*> genMaybe arbitrary <*>
"OP_CLUSTER_DEACTIVATE_MASTER_IP" ->
pure OpCodes.OpClusterDeactivateMasterIp
"OP_QUERY" ->
- OpCodes.OpQuery <$> arbitrary <*> arbitrary <*> arbitrary <*> genFilter
+ OpCodes.OpQuery <$> arbitrary <*> arbitrary <*> arbitrary <*>
+ pure Nothing
"OP_QUERY_FIELDS" ->
OpCodes.OpQueryFields <$> arbitrary <*> arbitrary
"OP_OOB_COMMAND" ->
OpCodes.OpNodeRemove <$> genNodeNameNE <*> return Nothing
"OP_NODE_ADD" ->
OpCodes.OpNodeAdd <$> genNodeNameNE <*> emptyMUD <*> emptyMUD <*>
- genMaybe genName <*> genMaybe genNameNE <*> arbitrary <*>
+ genNameNE <*> genMaybe genNameNE <*> arbitrary <*>
genMaybe genNameNE <*> arbitrary <*> arbitrary <*> emptyMUD
"OP_NODE_QUERY" ->
OpCodes.OpNodeQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
OpCodes.OpNodeQueryvols <$> arbitrary <*> genNodeNamesNE
"OP_NODE_QUERY_STORAGE" ->
OpCodes.OpNodeQueryStorage <$> arbitrary <*> arbitrary <*>
- genNodeNamesNE <*> genNameNE
+ genNodeNamesNE <*> genMaybe genNameNE
"OP_NODE_MODIFY_STORAGE" ->
OpCodes.OpNodeModifyStorage <$> genNodeNameNE <*> return Nothing <*>
- arbitrary <*> genNameNE <*> pure emptyJSObject
+ arbitrary <*> genMaybe genNameNE <*> pure emptyJSObject
"OP_REPAIR_NODE_STORAGE" ->
OpCodes.OpRepairNodeStorage <$> genNodeNameNE <*> return Nothing <*>
- arbitrary <*> genNameNE <*> arbitrary
+ arbitrary <*> genMaybe genNameNE <*> arbitrary
"OP_NODE_SET_PARAMS" ->
OpCodes.OpNodeSetParams <$> genNodeNameNE <*> return Nothing <*>
arbitrary <*> emptyMUD <*> emptyMUD <*> arbitrary <*> arbitrary <*>
genMaybe genNameNE <*> arbitrary
"OP_INSTANCE_CREATE" ->
OpCodes.OpInstanceCreate <$> genFQDN <*> arbitrary <*>
- arbitrary <*> arbitrary <*> arbitrary <*> pure emptyJSObject <*>
- arbitrary <*> arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
- pure emptyJSObject <*> arbitrary <*> genMaybe genNameNE <*>
arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
- arbitrary <*> arbitrary <*> pure emptyJSObject <*>
- genMaybe genNameNE <*>
- genMaybe genNodeNameNE <*> return Nothing <*>
- genMaybe genNodeNameNE <*> return Nothing <*>
- genMaybe (pure []) <*> genMaybe genNodeNameNE <*>
- arbitrary <*> genMaybe genNodeNameNE <*> return Nothing <*>
- genMaybe genNodeNameNE <*> genMaybe genNameNE <*>
- arbitrary <*> arbitrary <*> (genTags >>= mapM mkNonEmpty)
+ pure emptyJSObject <*> arbitrary <*> arbitrary <*> arbitrary <*>
+ genMaybe genNameNE <*> pure emptyJSObject <*> arbitrary <*>
+ genMaybe genNameNE <*> arbitrary <*> arbitrary <*> arbitrary <*>
+ arbitrary <*> arbitrary <*> arbitrary <*> pure emptyJSObject <*>
+ genMaybe genNameNE <*> genMaybe genNodeNameNE <*> return Nothing <*>
+ genMaybe genNodeNameNE <*> return Nothing <*> genMaybe (pure []) <*>
+ genMaybe genNodeNameNE <*> arbitrary <*> genMaybe genNodeNameNE <*>
+ return Nothing <*> genMaybe genNodeNameNE <*> genMaybe genNameNE <*>
+ arbitrary <*> (genTags >>= mapM mkNonEmpty)
"OP_INSTANCE_MULTI_ALLOC" ->
- OpCodes.OpInstanceMultiAlloc <$> genMaybe genNameNE <*> pure [] <*>
- arbitrary
+ OpCodes.OpInstanceMultiAlloc <$> arbitrary <*> genMaybe genNameNE <*>
+ pure []
"OP_INSTANCE_REINSTALL" ->
OpCodes.OpInstanceReinstall <$> genFQDN <*> return Nothing <*>
arbitrary <*> genMaybe genNameNE <*> genMaybe (pure emptyJSObject)
arbitrary <*> genNodeNamesNE <*> return Nothing <*>
genMaybe genNameNE
"OP_INSTANCE_QUERY" ->
- OpCodes.OpInstanceQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
+ OpCodes.OpInstanceQuery <$> genFieldsNE <*> arbitrary <*> genNamesNE
"OP_INSTANCE_QUERY_DATA" ->
OpCodes.OpInstanceQueryData <$> arbitrary <*>
genNodeNamesNE <*> arbitrary
OpCodes.OpBackupRemove <$> genFQDN <*> return Nothing
"OP_TEST_ALLOCATOR" ->
OpCodes.OpTestAllocator <$> arbitrary <*> arbitrary <*>
- genNameNE <*> pure [] <*> pure [] <*>
+ genNameNE <*> genMaybe (pure []) <*> genMaybe (pure []) <*>
arbitrary <*> genMaybe genNameNE <*>
(genTags >>= mapM mkNonEmpty) <*>
arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
OpCodes.OpTestDummy <$> pure J.JSNull <*> pure J.JSNull <*>
pure J.JSNull <*> pure J.JSNull
"OP_NETWORK_ADD" ->
- OpCodes.OpNetworkAdd <$> genNameNE <*> genIp4Net <*>
- genMaybe genIp4Addr <*> pure Nothing <*> pure Nothing <*>
- genMaybe genMacPrefix <*> genMaybe (listOf genIp4Addr) <*>
+ OpCodes.OpNetworkAdd <$> genNameNE <*> genIPv4Network <*>
+ genMaybe genIPv4Address <*> pure Nothing <*> pure Nothing <*>
+ genMaybe genMacPrefix <*> genMaybe (listOf genIPv4Address) <*>
arbitrary <*> (genTags >>= mapM mkNonEmpty)
"OP_NETWORK_REMOVE" ->
OpCodes.OpNetworkRemove <$> genNameNE <*> arbitrary
"OP_NETWORK_SET_PARAMS" ->
OpCodes.OpNetworkSetParams <$> genNameNE <*>
- genMaybe genIp4Addr <*> pure Nothing <*> pure Nothing <*>
- genMaybe genMacPrefix <*> genMaybe (listOf genIp4Addr) <*>
- genMaybe (listOf genIp4Addr)
+ genMaybe genIPv4Address <*> pure Nothing <*> pure Nothing <*>
+ genMaybe genMacPrefix <*> genMaybe (listOf genIPv4Address) <*>
+ genMaybe (listOf genIPv4Address)
"OP_NETWORK_CONNECT" ->
OpCodes.OpNetworkConnect <$> genNameNE <*> genNameNE <*>
arbitrary <*> genNameNE <*> arbitrary
"OP_NETWORK_DISCONNECT" ->
OpCodes.OpNetworkDisconnect <$> genNameNE <*> genNameNE
"OP_NETWORK_QUERY" ->
- OpCodes.OpNetworkQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
+ OpCodes.OpNetworkQuery <$> genFieldsNE <*> arbitrary <*> genNamesNE
"OP_RESTRICTED_COMMAND" ->
OpCodes.OpRestrictedCommand <$> arbitrary <*> genNodeNamesNE <*>
return Nothing <*> genNameNE
runPython "from ganeti import opcodes\n\
\from ganeti import serializer\n\
\import sys\n\
- \print serializer.Dump([opid for opid in opcodes.OP_MAPPING])\n" ""
+ \print serializer.Dump([opid for opid in opcodes.OP_MAPPING])\n"
+ ""
>>= checkPythonResult
py_ops <- case J.decode py_stdout::J.Result [String] of
J.Ok ops -> return ops
) opcodes
py_stdout <-
runPython "from ganeti import opcodes\n\
- \import sys\n\
\from ganeti import serializer\n\
+ \import sys\n\
\op_data = serializer.Load(sys.stdin.read())\n\
\decoded = [opcodes.OpCode.LoadOpCode(o) for o in op_data]\n\
\for op in decoded:\n\
, SmallRatio(..)
, genSetHelper
, genSet
- , genIp4AddrStr
- , genIp4Addr
- , genIp4NetWithNetmask
- , genIp4Net
+ , genIPv4Address
+ , genIPv4Network
, genIp6Addr
, genIp6Net
+ , genOpCodesTagName
+ , genLuxiTagName
, netmask2NumHosts
, testSerialisation
, resultProp
genSet :: (Ord a, Bounded a, Enum a) => Maybe Int -> Gen (Set.Set a)
genSet = genSetHelper [minBound..maxBound]
--- | Generate an arbitrary IPv4 address in textual form (non empty).
-genIp4Addr :: Gen NonEmptyString
-genIp4Addr = genIp4AddrStr >>= mkNonEmpty
-
-- | Generate an arbitrary IPv4 address in textual form.
-genIp4AddrStr :: Gen String
-genIp4AddrStr = do
+genIPv4 :: Gen String
+genIPv4 = do
a <- choose (1::Int, 255)
b <- choose (0::Int, 255)
c <- choose (0::Int, 255)
d <- choose (0::Int, 255)
- return $ intercalate "." (map show [a, b, c, d])
+ return . intercalate "." $ map show [a, b, c, d]
--- | Generates an arbitrary IPv4 address with a given netmask in textual form.
-genIp4NetWithNetmask :: Int -> Gen NonEmptyString
-genIp4NetWithNetmask netmask = do
- ip <- genIp4AddrStr
- mkNonEmpty $ ip ++ "/" ++ show netmask
+genIPv4Address :: Gen IPv4Address
+genIPv4Address = mkIPv4Address =<< genIPv4
-- | Generate an arbitrary IPv4 network in textual form.
-genIp4Net :: Gen NonEmptyString
-genIp4Net = do
+genIPv4AddrRange :: Gen String
+genIPv4AddrRange = do
+ ip <- genIPv4
netmask <- choose (8::Int, 30)
- genIp4NetWithNetmask netmask
+ return $ ip ++ "/" ++ show netmask
+
+genIPv4Network :: Gen IPv4Network
+genIPv4Network = mkIPv4Network =<< genIPv4AddrRange
-- | Helper function to compute the number of hosts in a network
-- given the netmask. (For IPv4 only.)
ip <- genIp6Addr
return $ ip ++ "/" ++ show netmask
+-- | Generates a valid, arbitrary tag name with respect to the given
+-- 'TagKind' for opcodes.
+genOpCodesTagName :: TagKind -> Gen (Maybe NonEmptyString)
+genOpCodesTagName TagKindCluster = return Nothing
+genOpCodesTagName _ = Just <$> (mkNonEmpty =<< genFQDN)
+
+-- | Generates a valid, arbitrary tag name with respect to the given
+-- 'TagKind' for Luxi.
+genLuxiTagName :: TagKind -> Gen String
+genLuxiTagName TagKindCluster = return ""
+genLuxiTagName _ = genFQDN
+
-- * Helper functions
-- | Checks for serialisation idempotence.