diff --git a/autotools/build-rpc b/autotools/build-rpc index 576dd0d282035a2a96800a33b20d56750b730ce8..e8394272bd6f0c9e5bab12ede49849f26722f997 100755 --- a/autotools/build-rpc +++ b/autotools/build-rpc @@ -40,6 +40,9 @@ from ganeti import build _SINGLE = "single-node" _MULTI = "multi-node" +#: Expected length of a rpc definition +_RPC_DEF_LEN = 7 + def _WritePreamble(sw): """Writes a preamble for the RPC wrapper output. @@ -117,7 +120,12 @@ def _WriteBaseClass(sw, clsname, calls): sw.Write("_CALLS = rpc_defs.CALLS[%r]", clsname) sw.Write("") - for (name, kind, timeout, args, _, desc) in calls: + for v in calls: + if len(v) != _RPC_DEF_LEN: + raise ValueError("Procedure %s has only %d elements, expected %d" % + (v[0], len(v), _RPC_DEF_LEN)) + + for (name, kind, timeout, args, _, _, desc) in calls: funcargs = ["self"] if kind == _SINGLE: diff --git a/lib/rpc.py b/lib/rpc.py index 898224c11edb535847b183ccb1fd1526962f6914..2f65ad53f1944506a7afae6fe0e2aa5fe32280b3 100644 --- a/lib/rpc.py +++ b/lib/rpc.py @@ -434,7 +434,7 @@ class _RpcClientBase: """Entry point for automatically generated RPC wrappers. """ - (procedure, _, timeout, argdefs, postproc_fn, _) = cdef + (procedure, _, timeout, argdefs, _, postproc_fn, _) = cdef if callable(timeout): read_timeout = timeout(args) diff --git a/lib/rpc_defs.py b/lib/rpc_defs.py index 0fabc47c9ef05146ebf98302a660bd686aee0c26..13cb0948d63acc6a630e70f4e41617f9765ab55a 100644 --- a/lib/rpc_defs.py +++ b/lib/rpc_defs.py @@ -32,6 +32,7 @@ RPC definition fields: - Argument kind used for encoding/decoding - Description for docstring (can be C{None}) + - Custom body encoder (e.g. for preparing per-node bodies) - Return value wrapper (e.g. for deserializing into L{objects}-based objects) - Short call description for docstring @@ -157,14 +158,14 @@ def _TestDelayTimeout((duration, )): _FILE_STORAGE_CALLS = [ ("file_storage_dir_create", SINGLE, TMO_FAST, [ ("file_storage_dir", None, "File storage directory"), - ], None, "Create the given file storage directory"), + ], None, None, "Create the given file storage directory"), ("file_storage_dir_remove", SINGLE, TMO_FAST, [ ("file_storage_dir", None, "File storage directory"), - ], None, "Remove the given file storage directory"), + ], None, None, "Remove the given file storage directory"), ("file_storage_dir_rename", SINGLE, TMO_FAST, [ ("old_file_storage_dir", None, "Old name"), ("new_file_storage_dir", None, "New name"), - ], None, "Rename file storage directory"), + ], None, None, "Rename file storage directory"), ] _STORAGE_CALLS = [ @@ -173,85 +174,86 @@ _STORAGE_CALLS = [ ("su_args", None, None), ("name", None, None), ("fields", None, None), - ], None, "Get list of storage units"), + ], None, None, "Get list of storage units"), ("storage_modify", SINGLE, TMO_NORMAL, [ ("su_name", None, None), ("su_args", None, None), ("name", None, None), ("changes", None, None), - ], None, "Modify a storage unit"), + ], None, None, "Modify a storage unit"), ("storage_execute", SINGLE, TMO_NORMAL, [ ("su_name", None, None), ("su_args", None, None), ("name", None, None), ("op", None, None), - ], None, "Executes an operation on a storage unit"), + ], None, None, "Executes an operation on a storage unit"), ] _INSTANCE_CALLS = [ ("instance_info", SINGLE, TMO_URGENT, [ ("instance", None, "Instance name"), ("hname", None, "Hypervisor type"), - ], None, "Returns information about a single instance"), + ], None, None, "Returns information about a single instance"), ("all_instances_info", MULTI, TMO_URGENT, [ ("hypervisor_list", None, "Hypervisors to query for instances"), - ], None, "Returns information about all instances on the given nodes"), + ], None, None, + "Returns information about all instances on the given nodes"), ("instance_list", MULTI, TMO_URGENT, [ ("hypervisor_list", None, "Hypervisors to query for instances"), - ], None, "Returns the list of running instances on the given nodes"), + ], None, None, "Returns the list of running instances on the given nodes"), ("instance_reboot", SINGLE, TMO_NORMAL, [ ("inst", ED_INST_DICT, "Instance object"), ("reboot_type", None, None), ("shutdown_timeout", None, None), - ], None, "Returns the list of running instances on the given nodes"), + ], None, None, "Returns the list of running instances on the given nodes"), ("instance_shutdown", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, "Instance object"), ("timeout", None, None), - ], None, "Stops an instance"), + ], None, None, "Stops an instance"), ("instance_run_rename", SINGLE, TMO_SLOW, [ ("instance", ED_INST_DICT, "Instance object"), ("old_name", None, None), ("debug", None, None), - ], None, "Run the OS rename script for an instance"), + ], None, None, "Run the OS rename script for an instance"), ("instance_migratable", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, "Instance object"), - ], None, "Checks whether the given instance can be migrated"), + ], None, None, "Checks whether the given instance can be migrated"), ("migration_info", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, "Instance object"), - ], None, + ], None, None, "Gather the information necessary to prepare an instance migration"), ("accept_instance", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, "Instance object"), ("info", None, "Result for the call_migration_info call"), ("target", None, "Target hostname (usually an IP address)"), - ], None, "Prepare a node to accept an instance"), + ], None, None, "Prepare a node to accept an instance"), ("instance_finalize_migration_dst", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, "Instance object"), ("info", None, "Result for the call_migration_info call"), ("success", None, "Whether the migration was a success or failure"), - ], None, "Finalize any target-node migration specific operation"), + ], None, None, "Finalize any target-node migration specific operation"), ("instance_migrate", SINGLE, TMO_SLOW, [ ("instance", ED_INST_DICT, "Instance object"), ("target", None, "Target node name"), ("live", None, "Whether the migration should be done live or not"), - ], None, "Migrate an instance"), + ], None, None, "Migrate an instance"), ("instance_finalize_migration_src", SINGLE, TMO_SLOW, [ ("instance", ED_INST_DICT, "Instance object"), ("success", None, "Whether the migration succeeded or not"), ("live", None, "Whether the user requested a live migration or not"), - ], None, "Finalize the instance migration on the source node"), + ], None, None, "Finalize the instance migration on the source node"), ("instance_get_migration_status", SINGLE, TMO_SLOW, [ ("instance", ED_INST_DICT, "Instance object"), - ], _MigrationStatusPostProc, "Report migration status"), + ], None, _MigrationStatusPostProc, "Report migration status"), ("instance_start", SINGLE, TMO_NORMAL, [ ("instance_hvp_bep", ED_INST_DICT_HVP_BEP, None), ("startup_paused", None, None), - ], None, "Starts an instance"), + ], None, None, "Starts an instance"), ("instance_os_add", SINGLE, TMO_1DAY, [ ("instance_osp", ED_INST_DICT_OSP, None), ("reinstall", None, None), ("debug", None, None), - ], None, "Starts an instance"), + ], None, None, "Starts an instance"), ] _IMPEXP_CALLS = [ @@ -260,7 +262,7 @@ _IMPEXP_CALLS = [ ("instance", ED_INST_DICT, None), ("component", None, None), ("dest", ED_IMPEXP_IO, "Import destination"), - ], None, "Starts an import daemon"), + ], None, None, "Starts an import daemon"), ("export_start", SINGLE, TMO_NORMAL, [ ("opts", ED_OBJECT_DICT, None), ("host", None, None), @@ -268,205 +270,211 @@ _IMPEXP_CALLS = [ ("instance", ED_INST_DICT, None), ("component", None, None), ("source", ED_IMPEXP_IO, "Export source"), - ], None, "Starts an export daemon"), + ], None, None, "Starts an export daemon"), ("impexp_status", SINGLE, TMO_FAST, [ ("names", None, "Import/export names"), - ], _ImpExpStatusPostProc, "Gets the status of an import or export"), + ], None, _ImpExpStatusPostProc, "Gets the status of an import or export"), ("impexp_abort", SINGLE, TMO_NORMAL, [ ("name", None, "Import/export name"), - ], None, "Aborts an import or export"), + ], None, None, "Aborts an import or export"), ("impexp_cleanup", SINGLE, TMO_NORMAL, [ ("name", None, "Import/export name"), - ], None, "Cleans up after an import or export"), + ], None, None, "Cleans up after an import or export"), ("export_info", SINGLE, TMO_FAST, [ ("path", None, None), - ], None, "Queries the export information in a given path"), + ], None, None, "Queries the export information in a given path"), ("finalize_export", SINGLE, TMO_NORMAL, [ ("instance", ED_INST_DICT, None), ("snap_disks", ED_FINALIZE_EXPORT_DISKS, None), - ], None, "Request the completion of an export operation"), - ("export_list", MULTI, TMO_FAST, [], None, "Gets the stored exports list"), + ], None, None, "Request the completion of an export operation"), + ("export_list", MULTI, TMO_FAST, [], None, None, + "Gets the stored exports list"), ("export_remove", SINGLE, TMO_FAST, [ ("export", None, None), - ], None, "Requests removal of a given export"), + ], None, None, "Requests removal of a given export"), ] _X509_CALLS = [ ("x509_cert_create", SINGLE, TMO_NORMAL, [ ("validity", None, "Validity in seconds"), - ], None, "Creates a new X509 certificate for SSL/TLS"), + ], None, None, "Creates a new X509 certificate for SSL/TLS"), ("x509_cert_remove", SINGLE, TMO_NORMAL, [ ("name", None, "Certificate name"), - ], None, "Removes a X509 certificate"), + ], None, None, "Removes a X509 certificate"), ] _BLOCKDEV_CALLS = [ ("bdev_sizes", MULTI, TMO_URGENT, [ ("devices", None, None), - ], None, "Gets the sizes of requested block devices present on a node"), + ], None, None, + "Gets the sizes of requested block devices present on a node"), ("blockdev_create", SINGLE, TMO_NORMAL, [ ("bdev", ED_OBJECT_DICT, None), ("size", None, None), ("owner", None, None), ("on_primary", None, None), ("info", None, None), - ], None, "Request creation of a given block device"), + ], None, None, "Request creation of a given block device"), ("blockdev_wipe", SINGLE, TMO_SLOW, [ ("bdev", ED_OBJECT_DICT, None), ("offset", None, None), ("size", None, None), - ], None, + ], None, None, "Request wipe at given offset with given size of a block device"), ("blockdev_remove", SINGLE, TMO_NORMAL, [ ("bdev", ED_OBJECT_DICT, None), - ], None, "Request removal of a given block device"), + ], None, None, "Request removal of a given block device"), ("blockdev_pause_resume_sync", SINGLE, TMO_NORMAL, [ ("disks", ED_OBJECT_DICT_LIST, None), ("pause", None, None), - ], None, "Request a pause/resume of given block device"), + ], None, None, "Request a pause/resume of given block device"), ("blockdev_assemble", SINGLE, TMO_NORMAL, [ ("disk", ED_OBJECT_DICT, None), ("owner", None, None), ("on_primary", None, None), ("idx", None, None), - ], None, "Request assembling of a given block device"), + ], None, None, "Request assembling of a given block device"), ("blockdev_shutdown", SINGLE, TMO_NORMAL, [ ("disk", ED_OBJECT_DICT, None), - ], None, "Request shutdown of a given block device"), + ], None, None, "Request shutdown of a given block device"), ("blockdev_addchildren", SINGLE, TMO_NORMAL, [ ("bdev", ED_OBJECT_DICT, None), ("ndevs", ED_OBJECT_DICT_LIST, None), - ], None, "Request adding a list of children to a (mirroring) device"), + ], None, None, + "Request adding a list of children to a (mirroring) device"), ("blockdev_removechildren", SINGLE, TMO_NORMAL, [ ("bdev", ED_OBJECT_DICT, None), ("ndevs", ED_OBJECT_DICT_LIST, None), - ], None, "Request removing a list of children from a (mirroring) device"), + ], None, None, + "Request removing a list of children from a (mirroring) device"), ("blockdev_close", SINGLE, TMO_NORMAL, [ ("instance_name", None, None), ("disks", ED_OBJECT_DICT_LIST, None), - ], None, "Closes the given block devices"), + ], None, None, "Closes the given block devices"), ("blockdev_getsize", SINGLE, TMO_NORMAL, [ ("disks", ED_OBJECT_DICT_LIST, None), - ], None, "Returns the size of the given disks"), + ], None, None, "Returns the size of the given disks"), ("drbd_disconnect_net", MULTI, TMO_NORMAL, [ ("nodes_ip", None, None), ("disks", ED_OBJECT_DICT_LIST, None), - ], None, "Disconnects the network of the given drbd devices"), + ], None, None, "Disconnects the network of the given drbd devices"), ("drbd_attach_net", MULTI, TMO_NORMAL, [ ("nodes_ip", None, None), ("disks", ED_OBJECT_DICT_LIST, None), ("instance_name", None, None), ("multimaster", None, None), - ], None, "Connects the given DRBD devices"), + ], None, None, "Connects the given DRBD devices"), ("drbd_wait_sync", MULTI, TMO_SLOW, [ ("nodes_ip", None, None), ("disks", ED_OBJECT_DICT_LIST, None), - ], None, "Waits for the synchronization of drbd devices is complete"), + ], None, None, + "Waits for the synchronization of drbd devices is complete"), ("blockdev_grow", SINGLE, TMO_NORMAL, [ ("cf_bdev", ED_OBJECT_DICT, None), ("amount", None, None), ("dryrun", None, None), - ], None, "Request a snapshot of the given block device"), + ], None, None, "Request a snapshot of the given block device"), ("blockdev_export", SINGLE, TMO_1DAY, [ ("cf_bdev", ED_OBJECT_DICT, None), ("dest_node", None, None), ("dest_path", None, None), ("cluster_name", None, None), - ], None, "Export a given disk to another node"), + ], None, None, "Export a given disk to another node"), ("blockdev_snapshot", SINGLE, TMO_NORMAL, [ ("cf_bdev", ED_OBJECT_DICT, None), - ], None, "Export a given disk to another node"), + ], None, None, "Export a given disk to another node"), ("blockdev_rename", SINGLE, TMO_NORMAL, [ ("devlist", ED_BLOCKDEV_RENAME, None), - ], None, "Request rename of the given block devices"), + ], None, None, "Request rename of the given block devices"), ("blockdev_find", SINGLE, TMO_NORMAL, [ ("disk", ED_OBJECT_DICT, None), - ], _BlockdevFindPostProc, + ], None, _BlockdevFindPostProc, "Request identification of a given block device"), ("blockdev_getmirrorstatus", SINGLE, TMO_NORMAL, [ ("disks", ED_OBJECT_DICT_LIST, None), - ], _BlockdevGetMirrorStatusPostProc, + ], None, _BlockdevGetMirrorStatusPostProc, "Request status of a (mirroring) device"), ("blockdev_getmirrorstatus_multi", MULTI, TMO_NORMAL, [ ("node_disks", ED_NODE_TO_DISK_DICT, None), - ], _BlockdevGetMirrorStatusMultiPostProc, + ], None, _BlockdevGetMirrorStatusMultiPostProc, "Request status of (mirroring) devices from multiple nodes"), ] _OS_CALLS = [ - ("os_diagnose", MULTI, TMO_FAST, [], None, + ("os_diagnose", MULTI, TMO_FAST, [], None, None, "Request a diagnose of OS definitions"), ("os_validate", MULTI, TMO_FAST, [ ("required", None, None), ("name", None, None), ("checks", None, None), ("params", None, None), - ], None, "Run a validation routine for a given OS"), + ], None, None, "Run a validation routine for a given OS"), ("os_get", SINGLE, TMO_FAST, [ ("name", None, None), - ], _OsGetPostProc, "Returns an OS definition"), + ], None, _OsGetPostProc, "Returns an OS definition"), ] _NODE_CALLS = [ ("node_has_ip_address", SINGLE, TMO_FAST, [ ("address", None, "IP address"), - ], None, "Checks if a node has the given IP address"), + ], None, None, "Checks if a node has the given IP address"), ("node_info", MULTI, TMO_URGENT, [ ("vg_names", None, "Names of the volume groups to ask for disk space information"), ("hv_names", None, "Names of the hypervisors to ask for node information"), - ], None, "Return node information"), + ], None, None, "Return node information"), ("node_verify", MULTI, TMO_NORMAL, [ ("checkdict", None, None), ("cluster_name", None, None), - ], None, "Request verification of given parameters"), - ("node_volumes", MULTI, TMO_FAST, [], None, "Gets all volumes on node(s)"), - ("node_demote_from_mc", SINGLE, TMO_FAST, [], None, + ], None, None, "Request verification of given parameters"), + ("node_volumes", MULTI, TMO_FAST, [], None, None, + "Gets all volumes on node(s)"), + ("node_demote_from_mc", SINGLE, TMO_FAST, [], None, None, "Demote a node from the master candidate role"), ("node_powercycle", SINGLE, TMO_NORMAL, [ ("hypervisor", None, "Hypervisor type"), - ], None, "Tries to powercycle a node"), + ], None, None, "Tries to powercycle a node"), ] _MISC_CALLS = [ ("lv_list", MULTI, TMO_URGENT, [ ("vg_name", None, None), - ], None, "Gets the logical volumes present in a given volume group"), - ("vg_list", MULTI, TMO_URGENT, [], None, "Gets the volume group list"), + ], None, None, "Gets the logical volumes present in a given volume group"), + ("vg_list", MULTI, TMO_URGENT, [], None, None, "Gets the volume group list"), ("bridges_exist", SINGLE, TMO_URGENT, [ ("bridges_list", None, "Bridges which must be present on remote node"), - ], None, "Checks if a node has all the bridges given"), + ], None, None, "Checks if a node has all the bridges given"), ("etc_hosts_modify", SINGLE, TMO_NORMAL, [ ("mode", None, "Mode to operate; currently L{constants.ETC_HOSTS_ADD} or" " L{constants.ETC_HOSTS_REMOVE}"), ("name", None, "Hostname to be modified"), ("ip", None, "IP address (L{constants.ETC_HOSTS_ADD} only)"), - ], None, "Modify hosts file with name"), - ("drbd_helper", MULTI, TMO_URGENT, [], None, "Gets DRBD helper"), + ], None, None, "Modify hosts file with name"), + ("drbd_helper", MULTI, TMO_URGENT, [], None, None, "Gets DRBD helper"), ("run_oob", SINGLE, TMO_NORMAL, [ ("oob_program", None, None), ("command", None, None), ("remote_node", None, None), ("timeout", None, None), - ], None, "Runs out-of-band command"), + ], None, None, "Runs out-of-band command"), ("hooks_runner", MULTI, TMO_NORMAL, [ ("hpath", None, None), ("phase", None, None), ("env", None, None), - ], None, "Call the hooks runner"), + ], None, None, "Call the hooks runner"), ("iallocator_runner", SINGLE, TMO_NORMAL, [ ("name", None, "Iallocator name"), ("idata", None, "JSON-encoded input string"), - ], None, "Call an iallocator on a remote node"), + ], None, None, "Call an iallocator on a remote node"), ("test_delay", MULTI, _TestDelayTimeout, [ ("duration", None, None), - ], None, "Sleep for a fixed time on given node(s)"), + ], None, None, "Sleep for a fixed time on given node(s)"), ("hypervisor_validate_params", MULTI, TMO_NORMAL, [ ("hvname", None, "Hypervisor name"), ("hvfull", None, "Parameters to be validated"), - ], None, "Validate hypervisor params"), + ], None, None, "Validate hypervisor params"), ] CALLS = { @@ -478,48 +486,49 @@ CALLS = { ("jobqueue_update", MULTI, TMO_URGENT, [ ("file_name", None, None), ("content", ED_COMPRESS, None), - ], None, "Update job queue file"), - ("jobqueue_purge", SINGLE, TMO_NORMAL, [], None, "Purge job queue"), + ], None, None, "Update job queue file"), + ("jobqueue_purge", SINGLE, TMO_NORMAL, [], None, None, "Purge job queue"), ("jobqueue_rename", MULTI, TMO_URGENT, [ ("rename", None, None), - ], None, "Rename job queue file"), + ], None, None, "Rename job queue file"), ]), "RpcClientBootstrap": _Prepare([ ("node_start_master_daemons", SINGLE, TMO_FAST, [ ("no_voting", None, None), - ], None, "Starts master daemons on a node"), + ], None, None, "Starts master daemons on a node"), ("node_activate_master_ip", SINGLE, TMO_FAST, [ ("master_params", ED_OBJECT_DICT, "Network parameters of the master"), ("use_external_mip_script", None, "Whether to use the user-provided master IP address setup script"), - ], None, + ], None, None, "Activates master IP on a node"), - ("node_stop_master", SINGLE, TMO_FAST, [], None, + ("node_stop_master", SINGLE, TMO_FAST, [], None, None, "Deactivates master IP and stops master daemons on a node"), ("node_deactivate_master_ip", SINGLE, TMO_FAST, [ ("master_params", ED_OBJECT_DICT, "Network parameters of the master"), ("use_external_mip_script", None, "Whether to use the user-provided master IP address setup script"), - ], None, + ], None, None, "Deactivates master IP on a node"), ("node_change_master_netmask", SINGLE, TMO_FAST, [ ("old_netmask", None, "The old value of the netmask"), ("netmask", None, "The new value of the netmask"), ("master_ip", None, "The master IP"), ("master_netdev", None, "The master network device"), - ], None, "Change master IP netmask"), + ], None, None, "Change master IP netmask"), ("node_leave_cluster", SINGLE, TMO_NORMAL, [ ("modify_ssh_setup", None, None), - ], None, "Requests a node to clean the cluster information it has"), - ("master_info", MULTI, TMO_URGENT, [], None, "Query master info"), - ("version", MULTI, TMO_URGENT, [], None, "Query node version"), + ], None, None, + "Requests a node to clean the cluster information it has"), + ("master_info", MULTI, TMO_URGENT, [], None, None, "Query master info"), + ("version", MULTI, TMO_URGENT, [], None, None, "Query node version"), ]), "RpcClientConfig": _Prepare([ ("upload_file", MULTI, TMO_NORMAL, [ ("file_name", ED_FILE_DETAILS, None), - ], None, "Upload a file"), + ], None, None, "Upload a file"), ("write_ssconf_files", MULTI, TMO_NORMAL, [ ("values", None, None), - ], None, "Write ssconf files"), + ], None, None, "Write ssconf files"), ]), }