projects
/
ganeti-local
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'devel-2.1' into stable-2.1
[ganeti-local]
/
lib
/
rpc.py
diff --git
a/lib/rpc.py
b/lib/rpc.py
index
227e355
..
69e692c
100644
(file)
--- a/
lib/rpc.py
+++ b/
lib/rpc.py
@@
-42,7
+42,8
@@
from ganeti import serializer
from ganeti import constants
from ganeti import errors
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
# Module level variable
@@
-55,10
+56,12
@@
def Init():
Must be called before using any RPC function.
"""
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"
assert not _http_manager, "RPC module initialized more than once"
+ http.InitSsl()
+
_http_manager = http.client.HttpClientManager()
_http_manager = http.client.HttpClientManager()
@@
-68,7
+71,7
@@
def Shutdown():
Must be called before quitting the program.
"""
Must be called before quitting the program.
"""
- global _http_manager
+ global _http_manager # pylint: disable-msg=W0603
if _http_manager:
_http_manager.Shutdown()
if _http_manager:
_http_manager.Shutdown()
@@
-97,6
+100,7
@@
class RpcResult(object):
self.offline = offline
self.call = call
self.node = node
self.offline = offline
self.call = call
self.node = node
+
if offline:
self.fail_msg = "Node is marked offline"
self.data = self.payload = None
if offline:
self.fail_msg = "Node is marked offline"
self.data = self.payload = None
@@
-108,16
+112,26
@@
class RpcResult(object):
if not isinstance(self.data, (tuple, list)):
self.fail_msg = ("RPC layer error: invalid result type (%s)" %
type(self.data))
if not isinstance(self.data, (tuple, list)):
self.fail_msg = ("RPC layer error: invalid result type (%s)" %
type(self.data))
+ self.payload = None
elif len(data) != 2:
self.fail_msg = ("RPC layer error: invalid result length (%d), "
"expected 2" % len(self.data))
elif len(data) != 2:
self.fail_msg = ("RPC layer error: invalid result length (%d), "
"expected 2" % len(self.data))
+ self.payload = None
elif not self.data[0]:
self.fail_msg = self._EnsureErr(self.data[1])
elif not self.data[0]:
self.fail_msg = self._EnsureErr(self.data[1])
+ self.payload = None
else:
# finally success
self.fail_msg = None
self.payload = data[1]
else:
# finally success
self.fail_msg = None
self.payload = data[1]
+ assert hasattr(self, "call")
+ assert hasattr(self, "data")
+ assert hasattr(self, "fail_msg")
+ assert hasattr(self, "node")
+ assert hasattr(self, "offline")
+ assert hasattr(self, "payload")
+
@staticmethod
def _EnsureErr(val):
"""Helper to ensure we return a 'True' value for error."""
@staticmethod
def _EnsureErr(val):
"""Helper to ensure we return a 'True' value for error."""
@@
-126,7
+140,7
@@
class RpcResult(object):
else:
return "No error information"
else:
return "No error information"
- def Raise(self, msg, prereq=False):
+ def Raise(self, msg, prereq=False, ecode=None):
"""If the result has failed, raise an OpExecError.
This is used so that LU code doesn't have to check for each
"""If the result has failed, raise an OpExecError.
This is used so that LU code doesn't have to check for each
@@
-145,7
+159,11
@@
class RpcResult(object):
ec = errors.OpPrereqError
else:
ec = errors.OpExecError
ec = errors.OpPrereqError
else:
ec = errors.OpExecError
- raise ec(msg)
+ if ecode is not None:
+ args = (msg, prereq)
+ else:
+ args = (msg, )
+ raise ec(*args) # pylint: disable-msg=W0142
class Client:
class Client:
@@
-548,14
+566,15
@@
class RpcRunner(object):
return self._SingleNodeCall(node, "instance_migrate",
[self._InstDict(instance), target, live])
return self._SingleNodeCall(node, "instance_migrate",
[self._InstDict(instance), target, live])
- def call_instance_reboot(self, node, instance, reboot_type):
+ def call_instance_reboot(self, node, inst, reboot_type, shutdown_timeout):
"""Reboots an instance.
This is a single-node call.
"""
return self._SingleNodeCall(node, "instance_reboot",
"""Reboots an instance.
This is a single-node call.
"""
return self._SingleNodeCall(node, "instance_reboot",
- [self._InstDict(instance), reboot_type])
+ [self._InstDict(inst), reboot_type,
+ shutdown_timeout])
def call_instance_os_add(self, node, inst, reinstall):
"""Installs an OS on the given instance.
def call_instance_os_add(self, node, inst, reinstall):
"""Installs an OS on the given instance.
@@
-718,13
+737,14
@@
class RpcRunner(object):
# TODO: should this method query down nodes?
return cls._StaticMultiNodeCall(node_list, "master_info", [])
# TODO: should this method query down nodes?
return cls._StaticMultiNodeCall(node_list, "master_info", [])
- def call_version(self, node_list):
+ @classmethod
+ def call_version(cls, node_list):
"""Query node version.
This is a multi-node call.
"""
"""Query node version.
This is a multi-node call.
"""
- return self._MultiNodeCall(node_list, "version", [])
+ return cls._StaticMultiNodeCall(node_list, "version", [])
def call_blockdev_create(self, node, bdev, size, owner, on_primary, info):
"""Request creation of a given block device.
def call_blockdev_create(self, node, bdev, size, owner, on_primary, info):
"""Request creation of a given block device.
@@
-1032,7
+1052,7
@@
class RpcRunner(object):
return self._SingleNodeCall(node, "export_remove", [export])
@classmethod
return self._SingleNodeCall(node, "export_remove", [export])
@classmethod
- def call_node_leave_cluster(cls, node):
+ def call_node_leave_cluster(cls, node, modify_ssh_setup):
"""Requests a node to clean the cluster information it has.
This will remove the configuration information from the ganeti data
"""Requests a node to clean the cluster information it has.
This will remove the configuration information from the ganeti data
@@
-1041,7
+1061,8
@@
class RpcRunner(object):
This is a single-node call.
"""
This is a single-node call.
"""
- return cls._StaticSingleNodeCall(node, "node_leave_cluster", [])
+ return cls._StaticSingleNodeCall(node, "node_leave_cluster",
+ [modify_ssh_setup])
def call_node_volumes(self, node_list):
"""Gets all volumes on node(s).
def call_node_volumes(self, node_list):
"""Gets all volumes on node(s).