LGTM, thanks for doing this, Brian

On Monday, December 19, 2016 at 11:33:46 AM UTC, Brian Foley wrote:
>
> 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 
>

Reply via email to