commit e18785cdd56cf614fe43b603db3a2a51c8c9c2aa Merge: e763a23 7f2183e Author: Brian Foley <bpfo...@google.com> 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 <bpfo...@google.com> 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