commit e18785cdd56cf614fe43b603db3a2a51c8c9c2aa
Merge: e763a23 7f2183e
Author: Brian Foley <[email protected]>
Date: Mon Dec 19 11:31:06 2016 +0000
Merge branch 'stable-2.17'
* stable-2.17
1143: Add gnt-cluster modify --modify-ssh-setup option
* stable-2.15
Fix gnt-instance console instance unpausing for xl toolstack
Disable pylint too-many-nested-blocks in _RunCmdPipe
Reduce nesting in import-export ProcessChildIO
Reduce nesting in LUOobCommand.Exec
Reduce nesting in LUInstanceCreate.RunOsScripts
Reduce nesting in RemoveNodeSshKeyBulk key calculation
Reduce nesting in RemoveNodeSshKeyBulk ssh logic
Reduce nesting in gnt-cluster VerifyDisks missing disk loop
Reduce nesting in _CheckVLANArguments
Reduce nesting in StartDaemon
Disable pylint bad-continuation warning
Disable pylint superfluous-parens warning
Disable pylint redefined-variable-type warning
Disable pylint too-many-branches warnings
Disable pylint broad-except warnings
Disable incorrect pylint assigning-non-slot warning
Quell pylint unbalanced-tuple-unpacking warning
Cleanup: Use new-style classes everywhere
Quell pylint socket.timeout warning
Quell the pylint wrong-import-order warnings
Quell cell-var-from-loop warning
Use default value lambda param to avoid cell-var-from-loop
Quell too-many-boolean-expressions
Remove pylint tests removed in pylint 2.0
Quell trailing newline
Quell bad-whitespace warning
Quell consider-using-enumerate warning
Disable pylint unsubscriptable-object warning
Disable pylint bare-except warning
Disable unwanted pylint wrong-import-position warnings
Disable pylint unused-wildcard-import warning
Disable incorrect pylint not-callable warning
Disable pylint unpacking-non-sequence warning
Disable pylint misplaced-comparison-constant warning
Disable incorect pylint simplify-if-statement warning
Disable pylint eval-used warning
Disable pylint invalid-name warning
Disable pylint import-self warning
Disable some pylint unused-import warnings
Replace deprecated pylint >=0.27 pragma with new form
Delete old warning disables removed from pylint 1.6
Fix pylint >1.4 pycurl no-member warnings
Cleanup: Remove unused/duplicate module/fn import
Cleanup: Fix unidiomatic-typecheck
Cleanup: Remove some unneeded pylint disables
Cleanup: Iterate dict rather than key list
Cleanup: Remove unused format key
Cleanup: StartInstance and RebootInstance return None
Cleanup: Fix for/else with no break in AddAuthorizedKeys
Cleanup: Replace map/filters with list comprehensions
Cleanup: del is a statement not a function
Cleanup: Use FOO not in BAR instead of not FOO in BAR
Cleanup: Simplify boolean assignment
Cleanup: Remove some unnecessary if (...) parens
Fix invalid variable error for file-based disks
FIX: Refactor DiagnoseOS to use a loop, not an inner fn
FIX: Set INSTANCE_NICn_NETWORK_NAME only if net is defined
StartInstance restores instance state if running
Allow migrate --cleanup to adopt an instance
Make migrate --cleanup more robust
Make finalize_migration_{src,dst} a single op
Make FinalizeMigration{Src,Dst} more robust
Fix instance state detection in _Shutdowninstance
Code cleanup in hypervisor backend
Fix for incorrect parsing of DRBD versions
Fix for instance reinstall not updating config
Change a few errors to report names, not UUIDs
Give atomicWriteFile temp filenames a more distinct pattern
LV check failure should print instance name
Add ganeti-noded and ganeti-rapi --max-clients options
Disable logging CallRPCMethod timings in non-debug configs
568 Update hv_kvm to handle output from qemu >= 1.6.0
Improve cluster verify ssh key errors
Resolve merge conflicts:
lib/cmdlib/common.py
caused by 81a68a3 use names not uuids in warnings
lib/rapi/testutils.py
trivial module import tweaks
lib/server/rapi.py
caused by c1e18c4 --max-clients and pam options
lib/storage/drbd_info.py
test/py/ganeti.storage.drbd_unittest.py
caused by 49980c6 DRBD version parsing -- fixed differently (and
less flexibly) on master. Use 2.17's version
test/hs/Test/Ganeti/OpCodes.hs
caused by e763a23 improve test data generation touching code
code in 2.16, and modify_ssh_setup cluster param
Signed-off-by: Brian Foley <[email protected]>
diff --cc lib/cmdlib/common.py
index 95a1186,b6e673e..08c6e4a
--- a/lib/cmdlib/common.py
+++ b/lib/cmdlib/common.py
@@@ -1600,10 -1595,9 +1601,10 @@@ def EnsureKvmdOnNodes(lu, feedback_fn,
# Stop KVM where necessary
if stop_nodes:
results = lu.rpc.call_node_ensure_daemon(stop_nodes, constants.KVMD,
False)
- for node_uuid in stop_nodes:
- results[node_uuid].Warn("Failed to stop KVM daemon on node '%s'" %
- lu.cfg.GetNodeName(node_uuid), feedback_fn)
+ if not silent_stop:
+ for node_uuid in stop_nodes:
+ results[node_uuid].Warn("Failed to stop KVM daemon in node '%s'" %
- node_uuid, feedback_fn)
++ lu.cfg.GetNodeName(node_uuid), feedback_fn)
def WarnAboutFailedSshUpdates(result, master_uuid, feedback_fn):
diff --cc lib/http/auth.py
index ce2e663,e7d4dc0..17bb31c
--- a/lib/http/auth.py
+++ b/lib/http/auth.py
@@@ -36,11 -36,12 +36,11 @@@ import r
import base64
import binascii
+ from cStringIO import StringIO
+
from ganeti import compat
from ganeti import http
-from ganeti import utils
- from cStringIO import StringIO
-
# Digest types from RFC2617
HTTP_BASIC_AUTH = "Basic"
HTTP_DIGEST_AUTH = "Digest"
diff --cc lib/rapi/testutils.py
index a0986a8,ed9caad..042f38f
--- a/lib/rapi/testutils.py
+++ b/lib/rapi/testutils.py
@@@ -49,10 -51,10 +51,10 @@@ import ganeti.rpc.client as rpcc
from ganeti import rapi
import ganeti.http.server # pylint: disable=W0611
-import ganeti.server.rapi # pylint: disable=W0611
+import ganeti.server.rapi
+from ganeti.rapi.auth import users_file
- import ganeti.rapi.client
+ import ganeti.rapi.client # pylint: disable=W0611
-
_URI_RE = re.compile(r"https://(?P<host>.*):(?P<port>\d+)(?P<path>/.*)")
diff --cc lib/server/rapi.py
index f6db8c5,6bdb24f..c078f64
--- a/lib/server/rapi.py
+++ b/lib/server/rapi.py
@@@ -48,11 -57,10 +48,10 @@@ from ganeti import serialize
from ganeti import pathutils
from ganeti.rapi import connector
from ganeti.rapi import baserlib
+from ganeti.rapi.auth import basic_auth
+from ganeti.rapi.auth import pam
import ganeti.http.auth # pylint: disable=W0611
- import ganeti.http.server
class RemoteApiRequestContext(object):
@@@ -228,18 -338,19 +232,17 @@@ def PrepRapi(options, _)
"""
mainloop = daemon.Mainloop()
- users = RapiUsers()
+ if options.pamauth:
+ options.reqauth = True
+ authenticator = pam.PamAuthenticator()
+ else:
+ authenticator = basic_auth.BasicAuthenticator()
- handler = RemoteApiHandler(users.Get, options.reqauth)
-
- # Setup file watcher (it'll be driven by asyncore)
- SetupFileWatcher(pathutils.RAPI_USERS_FILE,
- compat.partial(users.Load, pathutils.RAPI_USERS_FILE))
-
- users.Load(pathutils.RAPI_USERS_FILE)
+ handler = RemoteApiHandler(authenticator, options.reqauth)
- server = \
- http.server.HttpServer(mainloop, options.bind_address, options.port,
- handler,
- ssl_params=options.ssl_params,
ssl_verify_peer=False)
+ server = http.server.HttpServer(
+ mainloop, options.bind_address, options.port, options.max_clients,
+ handler, ssl_params=options.ssl_params, ssl_verify_peer=False)
server.Start()
return (mainloop, server)
@@@ -271,10 -380,10 +274,14 @@@ def Main()
default=False, action="store_true",
help=("Disable anonymous HTTP requests and require"
" authentication"))
+ parser.add_option("--pam-authentication", dest="pamauth",
+ default=False, action="store_true",
+ help=("Enable RAPI authentication and authorization via"
+ " PAM"))
+ parser.add_option("--max-clients", dest="max_clients",
+ default=20, type="int",
+ help="Number of simultaneous connections accepted"
+ " by ganeti-rapi")
daemon.GenericMain(constants.RAPI, parser, CheckRapi, PrepRapi, ExecRapi,
default_ssl_cert=pathutils.RAPI_CERT_FILE,
diff --cc test/hs/Test/Ganeti/OpCodes.hs
index 41d4640,ed7934e..a87501c
--- a/test/hs/Test/Ganeti/OpCodes.hs
+++ b/test/hs/Test/Ganeti/OpCodes.hs
@@@ -143,412 -140,6 +143,413 @@@ arbitraryDataCollectorInterval = d
intervals <- vector $ length els
genMaybe . return . containerFromList $ zip els intervals
+genOpCodeFromId :: String -> Maybe ConfigData -> Gen OpCodes.OpCode
+genOpCodeFromId op_id cfg =
+ case op_id of
+ "OP_TEST_DELAY" ->
+ OpCodes.OpTestDelay <$> arbitrary <*> arbitrary <*>
+ genNodeNamesNE <*> return Nothing <*> arbitrary <*> arbitrary <*>
+ arbitrary
+ "OP_INSTANCE_REPLACE_DISKS" ->
+ OpCodes.OpInstanceReplaceDisks <$> getInstanceName <*> return Nothing
<*>
+ arbitrary <*> arbitrary <*> arbitrary <*> genDiskIndices <*>
+ genMaybe genNodeNameNE <*> return Nothing <*> genMaybe genNameNE
+ "OP_INSTANCE_FAILOVER" ->
+ OpCodes.OpInstanceFailover <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> genMaybe genNodeNameNE <*>
+ return Nothing <*> arbitrary <*> arbitrary <*> genMaybe genNameNE
+ "OP_INSTANCE_MIGRATE" ->
+ OpCodes.OpInstanceMigrate <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> genMaybe getNodeName <*> return Nothing
<*>
+ arbitrary <*> arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
+ arbitrary <*> arbitrary
+ "OP_TAGS_GET" ->
+ arbitraryOpTagsGet
+ "OP_TAGS_SEARCH" ->
+ OpCodes.OpTagsSearch <$> genNameNE
+ "OP_TAGS_SET" ->
+ arbitraryOpTagsSet
+ "OP_TAGS_DEL" ->
+ arbitraryOpTagsDel
+ "OP_CLUSTER_POST_INIT" -> pure OpCodes.OpClusterPostInit
+ "OP_CLUSTER_RENEW_CRYPTO" -> OpCodes.OpClusterRenewCrypto
+ <$> arbitrary -- Node SSL certificates
+ <*> arbitrary -- renew_ssh_keys
+ <*> arbitrary -- ssh_key_type
+ <*> arbitrary -- ssh_key_bits
+ <*> arbitrary -- verbose
+ <*> arbitrary -- debug
+ "OP_CLUSTER_DESTROY" -> pure OpCodes.OpClusterDestroy
+ "OP_CLUSTER_QUERY" -> pure OpCodes.OpClusterQuery
+ "OP_CLUSTER_VERIFY" ->
+ OpCodes.OpClusterVerify <$> arbitrary <*> arbitrary <*>
+ genListSet Nothing <*> genListSet Nothing <*> arbitrary <*>
+ genMaybe getGroupName <*> arbitrary
+ "OP_CLUSTER_VERIFY_CONFIG" ->
+ OpCodes.OpClusterVerifyConfig <$> arbitrary <*> arbitrary <*>
+ genListSet Nothing <*> arbitrary
+ "OP_CLUSTER_VERIFY_GROUP" ->
+ OpCodes.OpClusterVerifyGroup <$> getGroupName <*> arbitrary <*>
+ arbitrary <*> genListSet Nothing <*> genListSet Nothing <*>
+ arbitrary <*> arbitrary
+ "OP_CLUSTER_VERIFY_DISKS" ->
+ OpCodes.OpClusterVerifyDisks <$> genMaybe getGroupName <*> arbitrary
+ "OP_GROUP_VERIFY_DISKS" ->
+ OpCodes.OpGroupVerifyDisks <$> getGroupName <*> arbitrary
+ "OP_CLUSTER_REPAIR_DISK_SIZES" ->
+ OpCodes.OpClusterRepairDiskSizes <$> getInstanceNames
+ "OP_CLUSTER_CONFIG_QUERY" ->
+ OpCodes.OpClusterConfigQuery <$> genFieldsNE
+ "OP_CLUSTER_RENAME" ->
+ OpCodes.OpClusterRename <$> genNameNE
+ "OP_CLUSTER_SET_PARAMS" ->
+ OpCodes.OpClusterSetParams
+ <$> arbitrary -- force
+ <*> emptyMUD -- hv_state
+ <*> emptyMUD -- disk_state
+ <*> genMaybe genName -- vg_name
+ <*> genMaybe arbitrary -- enabled_hypervisors
+ <*> genMaybe genEmptyContainer -- hvparams
+ <*> emptyMUD -- beparams
+ <*> genMaybe genEmptyContainer -- os_hvp
+ <*> genMaybe genEmptyContainer -- osparams
+ <*> genMaybe genEmptyContainer -- osparams_private_cluster
+ <*> genMaybe genEmptyContainer -- diskparams
+ <*> genMaybe arbitrary -- candidate_pool_size
+ <*> genMaybe arbitrary -- max_running_jobs
+ <*> genMaybe arbitrary -- max_tracked_jobs
+ <*> arbitrary -- uid_pool
+ <*> arbitrary -- add_uids
+ <*> arbitrary -- remove_uids
+ <*> arbitrary -- maintain_node_health
+ <*> arbitrary -- prealloc_wipe_disks
+ <*> arbitrary -- nicparams
+ <*> emptyMUD -- ndparams
+ <*> emptyMUD -- ipolicy
+ <*> genMaybe genPrintableAsciiString
+ -- drbd_helper
+ <*> genMaybe genPrintableAsciiString
+ -- default_iallocator
+ <*> emptyMUD -- default_iallocator_params
+ <*> genMaybe genMacPrefix -- mac_prefix
+ <*> genMaybe genPrintableAsciiString
+ -- master_netdev
+ <*> arbitrary -- master_netmask
+ <*> genMaybe (listOf genPrintableAsciiStringNE)
+ -- reserved_lvs
+ <*> genMaybe (listOf ((,) <$> arbitrary
+ <*> genPrintableAsciiStringNE))
+ -- hidden_os
+ <*> genMaybe (listOf ((,) <$> arbitrary
+ <*> genPrintableAsciiStringNE))
+ -- blacklisted_os
+ <*> arbitrary -- use_external_mip_script
+ <*> arbitrary -- enabled_disk_templates
+ <*> arbitrary -- modify_etc_hosts
++ <*> arbitrary -- modify_ssh_setup
+ <*> genMaybe genName -- file_storage_dir
+ <*> genMaybe genName -- shared_file_storage_dir
+ <*> genMaybe genName -- gluster_file_storage_dir
+ <*> genMaybe genPrintableAsciiString
+ -- install_image
+ <*> genMaybe genPrintableAsciiString
+ -- instance_communication_network
+ <*> genMaybe genPrintableAsciiString
+ -- zeroing_image
+ <*> genMaybe (listOf genPrintableAsciiStringNE)
+ -- compression_tools
+ <*> arbitrary -- enabled_user_shutdown
+ <*> genMaybe arbitraryDataCollector -- enabled_data_collectors
+ <*> arbitraryDataCollectorInterval -- data_collector_interval
+ <*> genMaybe genName -- diagnose_data_collector_filename
+ <*> genMaybe (fromPositive <$> arbitrary) -- maintd round interval
+ <*> genMaybe arbitrary -- enable maintd balancing
+ <*> genMaybe arbitrary -- maintd balancing threshold
+ "OP_CLUSTER_REDIST_CONF" -> pure OpCodes.OpClusterRedistConf
+ "OP_CLUSTER_ACTIVATE_MASTER_IP" ->
+ pure OpCodes.OpClusterActivateMasterIp
+ "OP_CLUSTER_DEACTIVATE_MASTER_IP" ->
+ pure OpCodes.OpClusterDeactivateMasterIp
+ "OP_QUERY" ->
+ OpCodes.OpQuery <$> arbitrary <*> arbitrary <*> genNamesNE <*>
+ pure Nothing
+ "OP_QUERY_FIELDS" ->
+ OpCodes.OpQueryFields <$> arbitrary <*> genMaybe genNamesNE
+ "OP_OOB_COMMAND" ->
+ OpCodes.OpOobCommand <$> getNodeNames <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> arbitrary <*> (arbitrary `suchThat` (>0))
+ "OP_NODE_REMOVE" ->
+ OpCodes.OpNodeRemove <$> getNodeName <*> return Nothing <*>
+ arbitrary <*> arbitrary
+ "OP_NODE_ADD" ->
+ OpCodes.OpNodeAdd <$> getNodeName <*> emptyMUD <*> emptyMUD <*>
+ genMaybe genNameNE <*> genMaybe genNameNE <*> arbitrary <*>
+ genMaybe genNameNE <*> arbitrary <*> arbitrary <*> emptyMUD <*>
+ arbitrary <*> arbitrary <*> arbitrary
+ "OP_NODE_QUERYVOLS" ->
+ OpCodes.OpNodeQueryvols <$> genNamesNE <*> genNodeNamesNE
+ "OP_NODE_QUERY_STORAGE" ->
+ OpCodes.OpNodeQueryStorage <$> genNamesNE <*> arbitrary <*>
+ getNodeNames <*> genMaybe genNameNE
+ "OP_NODE_MODIFY_STORAGE" ->
+ OpCodes.OpNodeModifyStorage <$> getNodeName <*> return Nothing <*>
+ arbitrary <*> genMaybe genNameNE <*> pure emptyJSObject
+ "OP_REPAIR_NODE_STORAGE" ->
+ OpCodes.OpRepairNodeStorage <$> getNodeName <*> return Nothing <*>
+ arbitrary <*> genMaybe genNameNE <*> arbitrary
+ "OP_NODE_SET_PARAMS" ->
+ OpCodes.OpNodeSetParams <$> getNodeName <*> return Nothing <*>
+ arbitrary <*> emptyMUD <*> emptyMUD <*> arbitrary <*> arbitrary <*>
+ arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
+ genMaybe genNameNE <*> emptyMUD <*> arbitrary <*> arbitrary <*>
+ arbitrary
+ "OP_NODE_POWERCYCLE" ->
+ OpCodes.OpNodePowercycle <$> getNodeName <*> return Nothing <*>
arbitrary
+ "OP_NODE_MIGRATE" ->
+ OpCodes.OpNodeMigrate <$> getNodeName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> genMaybe getNodeName <*> return Nothing
<*>
+ arbitrary <*> arbitrary <*> genMaybe genNameNE
+ "OP_NODE_EVACUATE" ->
+ OpCodes.OpNodeEvacuate <$> arbitrary <*> getNodeName <*>
+ return Nothing <*> genMaybe getNodeName <*> return Nothing <*>
+ genMaybe genNameNE <*> arbitrary <*> arbitrary
+ "OP_INSTANCE_CREATE" ->
+ OpCodes.OpInstanceCreate
+ <$> genFQDN -- instance_name
+ <*> arbitrary -- force_variant
+ <*> arbitrary -- wait_for_sync
+ <*> arbitrary -- name_check
+ <*> arbitrary -- ignore_ipolicy
+ <*> arbitrary -- opportunistic_locking
+ <*> pure emptyJSObject -- beparams
+ <*> arbitrary -- disks
+ <*> arbitrary -- disk_template
+ <*> genMaybe getGroupName -- group_name
+ <*> arbitrary -- file_driver
+ <*> genMaybe genNameNE -- file_storage_dir
+ <*> pure emptyJSObject -- hvparams
+ <*> arbitrary -- hypervisor
+ <*> genMaybe genNameNE -- iallocator
+ <*> arbitrary -- identify_defaults
+ <*> arbitrary -- ip_check
+ <*> arbitrary -- conflicts_check
+ <*> arbitrary -- mode
+ <*> arbitrary -- nics
+ <*> arbitrary -- no_install
+ <*> pure emptyJSObject -- osparams
+ <*> genMaybe arbitraryPrivateJSObj -- osparams_private
+ <*> genMaybe arbitrarySecretJSObj -- osparams_secret
+ <*> genMaybe genNameNE -- os_type
+ <*> genMaybe getNodeName -- pnode
+ <*> return Nothing -- pnode_uuid
+ <*> genMaybe getNodeName -- snode
+ <*> return Nothing -- snode_uuid
+ <*> genMaybe (pure []) -- source_handshake
+ <*> genMaybe genNodeNameNE -- source_instance_name
+ <*> arbitrary -- source_shutdown_timeout
+ <*> genMaybe genNodeNameNE -- source_x509_ca
+ <*> return Nothing -- src_node
+ <*> genMaybe genNodeNameNE -- src_node_uuid
+ <*> genMaybe genNameNE -- src_path
+ <*> genPrintableAsciiString -- compress
+ <*> arbitrary -- start
+ <*> arbitrary -- forthcoming
+ <*> arbitrary -- commit
+ <*> (genTags >>= mapM mkNonEmpty) -- tags
+ <*> arbitrary -- instance_communication
+ <*> arbitrary -- helper_startup_timeout
+ <*> arbitrary -- helper_shutdown_timeout
+ "OP_INSTANCE_MULTI_ALLOC" ->
+ OpCodes.OpInstanceMultiAlloc <$> arbitrary <*> genMaybe genNameNE <*>
+ pure []
+ "OP_INSTANCE_REINSTALL" ->
+ OpCodes.OpInstanceReinstall <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> genMaybe genNameNE <*> genMaybe (pure emptyJSObject)
+ <*> genMaybe arbitraryPrivateJSObj <*> genMaybe arbitrarySecretJSObj
+ <*> arbitrary <*> arbitrary
+ <*> genMaybe (listOf genPrintableAsciiString)
+ <*> genMaybe (listOf genPrintableAsciiString)
+ "OP_INSTANCE_REMOVE" ->
+ OpCodes.OpInstanceRemove <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary
+ "OP_INSTANCE_RENAME" ->
+ OpCodes.OpInstanceRename <$> getInstanceName <*> return Nothing <*>
+ (genFQDN >>= mkNonEmpty) <*> arbitrary <*> arbitrary
+ "OP_INSTANCE_STARTUP" ->
+ OpCodes.OpInstanceStartup <$>
+ getInstanceName <*> -- instance_name
+ return Nothing <*> -- instance_uuid
+ arbitrary <*> -- force
+ arbitrary <*> -- ignore_offline_nodes
+ pure emptyJSObject <*> -- hvparams
+ pure emptyJSObject <*> -- beparams
+ arbitrary <*> -- no_remember
+ arbitrary <*> -- startup_paused
+ arbitrary -- shutdown_timeout
+ "OP_INSTANCE_SHUTDOWN" ->
+ OpCodes.OpInstanceShutdown <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+ "OP_INSTANCE_REBOOT" ->
+ OpCodes.OpInstanceReboot <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> arbitrary
+ "OP_INSTANCE_MOVE" ->
+ OpCodes.OpInstanceMove <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> getNodeName <*>
+ return Nothing <*> genPrintableAsciiString <*> arbitrary
+ "OP_INSTANCE_CONSOLE" -> OpCodes.OpInstanceConsole <$> getInstanceName <*>
+ return Nothing
+ "OP_INSTANCE_ACTIVATE_DISKS" ->
+ OpCodes.OpInstanceActivateDisks <$> getInstanceName <*> return Nothing
<*>
+ arbitrary <*> arbitrary
+ "OP_INSTANCE_DEACTIVATE_DISKS" ->
+ OpCodes.OpInstanceDeactivateDisks <$> genFQDN <*> return Nothing <*>
+ arbitrary
+ "OP_INSTANCE_RECREATE_DISKS" ->
+ OpCodes.OpInstanceRecreateDisks <$> getInstanceName <*> return Nothing
<*>
+ arbitrary <*> genNodeNamesNE <*> return Nothing <*> genMaybe
getNodeName
+ "OP_INSTANCE_QUERY_DATA" ->
+ OpCodes.OpInstanceQueryData <$> arbitrary <*>
+ getInstanceNames <*> arbitrary
+ "OP_INSTANCE_SET_PARAMS" ->
+ OpCodes.OpInstanceSetParams
+ <$> getInstanceName -- instance_name
+ <*> return Nothing -- instance_uuid
+ <*> arbitrary -- force
+ <*> arbitrary -- force_variant
+ <*> arbitrary -- ignore_ipolicy
+ <*> arbitrary -- nics
+ <*> arbitrary -- disks
+ <*> pure emptyJSObject -- beparams
+ <*> arbitrary -- runtime_mem
+ <*> pure emptyJSObject -- hvparams
+ <*> arbitrary -- disk_template
+ <*> pure emptyJSObject -- ext_params
+ <*> arbitrary -- file_driver
+ <*> genMaybe genNameNE -- file_storage_dir
+ <*> genMaybe getNodeName -- pnode
+ <*> return Nothing -- pnode_uuid
+ <*> genMaybe getNodeName -- remote_node
+ <*> return Nothing -- remote_node_uuid
+ <*> genMaybe genNameNE -- iallocator
+ <*> genMaybe genNameNE -- os_name
+ <*> pure emptyJSObject -- osparams
+ <*> genMaybe arbitraryPrivateJSObj -- osparams_private
+ <*> arbitrary -- clear_osparams
+ <*> arbitrary -- clear_osparams_private
+ <*> genMaybe (listOf genPrintableAsciiString) -- remove_osparams
+ <*> genMaybe (listOf genPrintableAsciiString) --
remove_osparams_private
+ <*> arbitrary -- wait_for_sync
+ <*> arbitrary -- offline
+ <*> arbitrary -- conflicts_check
+ <*> arbitrary -- hotplug
+ <*> arbitrary -- hotplug_if_possible
+ <*> arbitrary -- instance_communication
+ "OP_INSTANCE_GROW_DISK" ->
+ OpCodes.OpInstanceGrowDisk <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+ "OP_INSTANCE_CHANGE_GROUP" ->
+ OpCodes.OpInstanceChangeGroup <$> getInstanceName <*> return Nothing <*>
+ arbitrary <*> genMaybe genNameNE <*>
+ genMaybe (resize maxNodes (listOf genNameNE))
+ "OP_GROUP_ADD" ->
+ OpCodes.OpGroupAdd <$> genNameNE <*> arbitrary <*>
+ emptyMUD <*> genMaybe genEmptyContainer <*>
+ emptyMUD <*> emptyMUD <*> emptyMUD
+ "OP_GROUP_ASSIGN_NODES" ->
+ OpCodes.OpGroupAssignNodes <$> getGroupName <*>
+ arbitrary <*> getNodeNames <*> return Nothing
+ "OP_GROUP_SET_PARAMS" ->
+ OpCodes.OpGroupSetParams <$> getGroupName <*>
+ arbitrary <*> emptyMUD <*> genMaybe genEmptyContainer <*>
+ emptyMUD <*> emptyMUD <*> emptyMUD
+ "OP_GROUP_REMOVE" ->
+ OpCodes.OpGroupRemove <$> getGroupName
+ "OP_GROUP_RENAME" ->
+ OpCodes.OpGroupRename <$> getGroupName <*> genNameNE
+ "OP_GROUP_EVACUATE" ->
+ OpCodes.OpGroupEvacuate <$> getGroupName <*>
+ arbitrary <*> genMaybe genNameNE <*> genMaybe genNamesNE <*>
+ arbitrary <*> arbitrary
+ "OP_OS_DIAGNOSE" ->
+ OpCodes.OpOsDiagnose <$> genFieldsNE <*> genNamesNE
+ "OP_EXT_STORAGE_DIAGNOSE" ->
+ OpCodes.OpOsDiagnose <$> genFieldsNE <*> genNamesNE
+ "OP_BACKUP_PREPARE" ->
+ OpCodes.OpBackupPrepare <$> getInstanceName <*>
+ return Nothing <*> arbitrary
+ "OP_BACKUP_EXPORT" ->
+ OpCodes.OpBackupExport
+ <$> getInstanceName -- instance_name
+ <*> return Nothing -- instance_uuid
+ <*> genPrintableAsciiString -- compress
+ <*> arbitrary -- shutdown_timeout
+ <*> arbitrary -- target_node
+ <*> return Nothing -- target_node_uuid
+ <*> arbitrary -- shutdown
+ <*> arbitrary -- remove_instance
+ <*> arbitrary -- ignore_remove_failures
+ <*> arbitrary -- mode
+ <*> genMaybe (pure []) -- x509_key_name
+ <*> genMaybe genNameNE -- destination_x509_ca
+ <*> arbitrary -- zero_free_space
+ <*> arbitrary -- zeroing_timeout_fixed
+ <*> arbitrary -- zeroing_timeout_per_mib
+ <*> arbitrary -- long_sleep
+ "OP_BACKUP_REMOVE" ->
+ OpCodes.OpBackupRemove <$> getInstanceName <*> return Nothing
+ "OP_TEST_ALLOCATOR" ->
+ OpCodes.OpTestAllocator <$> arbitrary <*> arbitrary <*>
+ genNameNE <*> genMaybe (pure []) <*> genMaybe (pure []) <*>
+ arbitrary <*> genMaybe genNameNE <*>
+ (genTags >>= mapM mkNonEmpty) <*>
+ arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
+ arbitrary <*> genMaybe genNodeNamesNE <*> arbitrary <*>
+ genMaybe genNamesNE <*> arbitrary <*> arbitrary <*>
+ genMaybe getGroupName
+ "OP_TEST_JQUEUE" ->
+ OpCodes.OpTestJqueue <$> arbitrary <*> arbitrary <*>
+ resize 20 (listOf genFQDN) <*> arbitrary
+ "OP_TEST_OS_PARAMS" ->
+ OpCodes.OpTestOsParams <$> genMaybe arbitrarySecretJSObj
+ "OP_TEST_DUMMY" ->
+ OpCodes.OpTestDummy <$> pure J.JSNull <*> pure J.JSNull <*>
+ pure J.JSNull <*> pure J.JSNull
+ "OP_NETWORK_ADD" ->
+ 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 genIPv4Address <*> pure Nothing <*> pure Nothing <*>
+ genMaybe genMacPrefix <*> genMaybe (listOf genIPv4Address) <*>
+ genMaybe (listOf genIPv4Address)
+ "OP_NETWORK_CONNECT" ->
+ OpCodes.OpNetworkConnect <$> getGroupName <*>
+ genNameNE <*> arbitrary <*> genNameNE <*> genPrintableAsciiString <*>
+ arbitrary
+ "OP_NETWORK_DISCONNECT" ->
+ OpCodes.OpNetworkDisconnect <$> getGroupName <*>
+ genNameNE
+ "OP_RESTRICTED_COMMAND" ->
+ OpCodes.OpRestrictedCommand <$> arbitrary <*> getNodeNames <*>
+ return Nothing <*> genNameNE
+ "OP_REPAIR_COMMAND" ->
+ OpCodes.OpRepairCommand <$> getNodeName <*> genNameNE <*>
+ genMaybe genPrintableAsciiStringNE
+ _ -> fail $ "Undefined arbitrary for opcode " ++ op_id
+ where getInstanceName =
+ case cfg of
+ Just c -> fmap (fromMaybe "") . genValidInstanceName $ c
+ Nothing -> genFQDN
+ getNodeName = maybe genFQDN genValidNodeName cfg >>= mkNonEmpty
+ getGroupName = maybe genName genValidGroupName cfg >>= mkNonEmpty
+ getInstanceNames = resize maxNodes (listOf getInstanceName) >>=
+ mapM mkNonEmpty
+ getNodeNames = resize maxNodes (listOf getNodeName)
+
instance Arbitrary OpCodes.OpCode where
arbitrary = do
op_id <- elements OpCodes.allOpIDs