from ganeti import constants
from ganeti import errors
-import ganeti.http.client
+# pylint has a bug here, doesn't see this import
+import ganeti.http.client # pylint: disable-msg=W0611
# Module level variable
Must be called before using any RPC function.
"""
- global _http_manager
+ global _http_manager # pylint: disable-msg=W0603
assert not _http_manager, "RPC module initialized more than once"
Must be called before quitting the program.
"""
- global _http_manager
+ global _http_manager # pylint: disable-msg=W0603
if _http_manager:
_http_manager.Shutdown()
args = (msg, prereq)
else:
args = (msg, )
- raise ec(*args)
+ raise ec(*args) # pylint: disable-msg=W0142
class Client:
self.nc = {}
self._ssl_params = \
- http.HttpSslParams(ssl_key_path=constants.SSL_CERT_FILE,
- ssl_cert_path=constants.SSL_CERT_FILE)
+ http.HttpSslParams(ssl_key_path=constants.NODED_CERT_FILE,
+ ssl_cert_path=constants.NODED_CERT_FILE)
def ConnectList(self, node_list, address_list=None):
"""Add a list of nodes to the target nodes.
return results
+def _EncodeImportExportIO(ieio, ieioargs):
+ """Encodes import/export I/O information.
+
+ """
+ if ieio == constants.IEIO_RAW_DISK:
+ assert len(ieioargs) == 1
+ return (ieioargs[0].ToDict(), )
+
+ if ieio == constants.IEIO_SCRIPT:
+ assert len(ieioargs) == 2
+ return (ieioargs[0].ToDict(), ieioargs[1])
+
+ return ieioargs
+
+
class RpcRunner(object):
"""RPC runner class"""
[self._InstDict(inst), reboot_type,
shutdown_timeout])
- def call_instance_os_add(self, node, inst, reinstall):
+ def call_instance_os_add(self, node, inst, reinstall, debug):
"""Installs an OS on the given instance.
This is a single-node call.
"""
return self._SingleNodeCall(node, "instance_os_add",
- [self._InstDict(inst), reinstall])
+ [self._InstDict(inst), reinstall, debug])
- def call_instance_run_rename(self, node, inst, old_name):
+ def call_instance_run_rename(self, node, inst, old_name, debug):
"""Run the OS rename script for an instance.
This is a single-node call.
"""
return self._SingleNodeCall(node, "instance_run_rename",
- [self._InstDict(inst), old_name])
+ [self._InstDict(inst), old_name, debug])
def call_instance_info(self, node, instance, hname):
"""Returns information about a single instance.
"""
return self._SingleNodeCall(node, "blockdev_snapshot", [cf_bdev.ToDict()])
- def call_snapshot_export(self, node, snap_bdev, dest_node, instance,
- cluster_name, idx):
- """Request the export of a given snapshot.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "snapshot_export",
- [snap_bdev.ToDict(), dest_node,
- self._InstDict(instance), cluster_name, idx])
-
def call_finalize_export(self, node, instance, snap_disks):
"""Request the completion of an export operation.
"""
return self._SingleNodeCall(node, "export_info", [path])
- def call_instance_os_import(self, node, inst, src_node, src_images,
- cluster_name):
- """Request the import of a backup into an instance.
-
- This is a single-node call.
-
- """
- return self._SingleNodeCall(node, "instance_os_import",
- [self._InstDict(inst), src_node, src_images,
- cluster_name])
-
def call_export_list(self, node_list):
"""Gets the stored exports list.
"""
return self._SingleNodeCall(node, "node_demote_from_mc", [])
-
def call_node_powercycle(self, node, hypervisor):
"""Tries to powercycle a node.
"""
return self._SingleNodeCall(node, "node_powercycle", [hypervisor])
-
def call_test_delay(self, node_list, duration):
"""Sleep for a fixed time on given node(s).
hv_full = objects.FillDict(cluster.hvparams.get(hvname, {}), hvparams)
return self._MultiNodeCall(node_list, "hypervisor_validate_params",
[hvname, hv_full])
+
+ def call_x509_cert_create(self, node, validity):
+ """Creates a new X509 certificate for SSL/TLS.
+
+ This is a single-node call.
+
+ @type validity: int
+ @param validity: Validity in seconds
+
+ """
+ return self._SingleNodeCall(node, "x509_cert_create", [validity])
+
+ def call_x509_cert_remove(self, node, name):
+ """Removes a X509 certificate.
+
+ This is a single-node call.
+
+ @type name: string
+ @param name: Certificate name
+
+ """
+ return self._SingleNodeCall(node, "x509_cert_remove", [name])
+
+ def call_import_start(self, node, x509_key_name, source_x509_ca,
+ instance, dest, dest_args):
+ """Starts a listener for an import.
+
+ This is a single-node call.
+
+ @type node: string
+ @param node: Node name
+ @type instance: C{objects.Instance}
+ @param instance: Instance object
+
+ """
+ return self._SingleNodeCall(node, "import_start",
+ [x509_key_name, source_x509_ca,
+ self._InstDict(instance), dest,
+ _EncodeImportExportIO(dest, dest_args)])
+
+ def call_export_start(self, node, x509_key_name, dest_x509_ca, host, port,
+ instance, source, source_args):
+ """Starts an export daemon.
+
+ This is a single-node call.
+
+ @type node: string
+ @param node: Node name
+ @type instance: C{objects.Instance}
+ @param instance: Instance object
+
+ """
+ return self._SingleNodeCall(node, "export_start",
+ [x509_key_name, dest_x509_ca, host, port,
+ self._InstDict(instance), source,
+ _EncodeImportExportIO(source, source_args)])
+
+ def call_impexp_status(self, node, names):
+ """Gets the status of an import or export.
+
+ This is a single-node call.
+
+ @type node: string
+ @param node: Node name
+ @type names: List of strings
+ @param names: Import/export names
+ @rtype: List of L{objects.ImportExportStatus} instances
+ @return: Returns a list of the state of each named import/export or None if
+ a status couldn't be retrieved
+
+ """
+ result = self._SingleNodeCall(node, "impexp_status", [names])
+
+ if not result.fail_msg:
+ decoded = []
+
+ for i in result.payload:
+ if i is None:
+ decoded.append(None)
+ continue
+ decoded.append(objects.ImportExportStatus.FromDict(i))
+
+ result.payload = decoded
+
+ return result
+
+ def call_impexp_abort(self, node, name):
+ """Aborts an import or export.
+
+ This is a single-node call.
+
+ @type node: string
+ @param node: Node name
+ @type name: string
+ @param name: Import/export name
+
+ """
+ return self._SingleNodeCall(node, "impexp_abort", [name])
+
+ def call_impexp_cleanup(self, node, name):
+ """Cleans up after an import or export.
+
+ This is a single-node call.
+
+ @type node: string
+ @param node: Node name
+ @type name: string
+ @param name: Import/export name
+
+ """
+ return self._SingleNodeCall(node, "impexp_cleanup", [name])