438 |
438 |
|
439 |
439 |
|
440 |
440 |
class RpcRunner(_generated_rpc.RpcClientDefault,
|
441 |
|
_generated_rpc.RpcClientBootstrap):
|
|
441 |
_generated_rpc.RpcClientBootstrap,
|
|
442 |
_generated_rpc.RpcClientConfig):
|
442 |
443 |
"""RPC runner class.
|
443 |
444 |
|
444 |
445 |
"""
|
... | ... | |
453 |
454 |
# <http://www.logilab.org/ticket/36586> and
|
454 |
455 |
# <http://www.logilab.org/ticket/35642>
|
455 |
456 |
# pylint: disable=W0233
|
|
457 |
_generated_rpc.RpcClientConfig.__init__(self)
|
456 |
458 |
_generated_rpc.RpcClientBootstrap.__init__(self)
|
457 |
459 |
_generated_rpc.RpcClientDefault.__init__(self)
|
458 |
460 |
|
... | ... | |
639 |
641 |
|
640 |
642 |
return ieioargs
|
641 |
643 |
|
642 |
|
#
|
643 |
|
# Begin RPC calls
|
644 |
|
#
|
645 |
|
|
646 |
|
@classmethod
|
647 |
|
@_RpcTimeout(_TMO_NORMAL)
|
648 |
|
def call_upload_file(cls, node_list, file_name, address_list=None):
|
649 |
|
"""Upload a file.
|
650 |
|
|
651 |
|
The node will refuse the operation in case the file is not on the
|
652 |
|
approved file list.
|
653 |
|
|
654 |
|
This is a multi-node call.
|
655 |
|
|
656 |
|
@type node_list: list
|
657 |
|
@param node_list: the list of node names to upload to
|
658 |
|
@type file_name: str
|
659 |
|
@param file_name: the filename to upload
|
660 |
|
@type address_list: list or None
|
661 |
|
@keyword address_list: an optional list of node addresses, in order
|
662 |
|
to optimize the RPC speed
|
|
644 |
@staticmethod
|
|
645 |
def _PrepareFileUpload(filename):
|
|
646 |
"""Loads a file and prepares it for an upload to nodes.
|
663 |
647 |
|
664 |
648 |
"""
|
665 |
|
file_contents = utils.ReadFile(file_name)
|
666 |
|
data = _Compress(file_contents)
|
667 |
|
st = os.stat(file_name)
|
|
649 |
data = _Compress(utils.ReadFile(filename))
|
|
650 |
st = os.stat(filename)
|
668 |
651 |
getents = runtime.GetEnts()
|
669 |
|
params = [file_name, data, st.st_mode, getents.LookupUid(st.st_uid),
|
670 |
|
getents.LookupGid(st.st_gid), st.st_atime, st.st_mtime]
|
671 |
|
return cls._StaticMultiNodeCall(node_list, "upload_file", params,
|
672 |
|
address_list=address_list)
|
673 |
|
|
674 |
|
@classmethod
|
675 |
|
@_RpcTimeout(_TMO_NORMAL)
|
676 |
|
def call_write_ssconf_files(cls, node_list, values):
|
677 |
|
"""Write ssconf files.
|
678 |
|
|
679 |
|
This is a multi-node call.
|
|
652 |
return [filename, data, st.st_mode, getents.LookupUid(st.st_uid),
|
|
653 |
getents.LookupGid(st.st_gid), st.st_atime, st.st_mtime]
|
680 |
654 |
|
681 |
|
"""
|
682 |
|
return cls._StaticMultiNodeCall(node_list, "write_ssconf_files", [values])
|
|
655 |
#
|
|
656 |
# Begin RPC calls
|
|
657 |
#
|
683 |
658 |
|
684 |
659 |
def call_test_delay(self, node_list, duration, read_timeout=None):
|
685 |
660 |
"""Sleep for a fixed time on given node(s).
|
... | ... | |
743 |
718 |
body = serializer.DumpJson(args, indent=False)
|
744 |
719 |
|
745 |
720 |
return self._proc(node_list, procedure, body, read_timeout=timeout)
|
|
721 |
|
|
722 |
|
|
723 |
class ConfigRunner(_generated_rpc.RpcClientConfig):
|
|
724 |
"""RPC wrappers for L{config}.
|
|
725 |
|
|
726 |
"""
|
|
727 |
_PrepareFileUpload = \
|
|
728 |
staticmethod(RpcRunner._PrepareFileUpload) # pylint: disable=W0212
|
|
729 |
|
|
730 |
def __init__(self, address_list):
|
|
731 |
"""Initializes this class.
|
|
732 |
|
|
733 |
"""
|
|
734 |
_generated_rpc.RpcClientConfig.__init__(self)
|
|
735 |
|
|
736 |
if address_list is None:
|
|
737 |
resolver = _SsconfResolver
|
|
738 |
else:
|
|
739 |
# Caller provided an address list
|
|
740 |
resolver = _StaticResolver(address_list)
|
|
741 |
|
|
742 |
self._proc = _RpcProcessor(resolver,
|
|
743 |
netutils.GetDaemonPort(constants.NODED))
|
|
744 |
|
|
745 |
def _Call(self, node_list, procedure, timeout, args):
|
|
746 |
"""Entry point for automatically generated RPC wrappers.
|
|
747 |
|
|
748 |
"""
|
|
749 |
body = serializer.DumpJson(args, indent=False)
|
|
750 |
|
|
751 |
return self._proc(node_list, procedure, body, read_timeout=timeout)
|