Revision 415a7304

b/lib/build/rpc_definitions.py
403 403
    ("master_info", MULTI, TMO_URGENT, [], None, "Query master info"),
404 404
    ("version", MULTI, TMO_URGENT, [], None, "Query node version"),
405 405
    ],
406
  "RpcClientConfig": [
407
    ("upload_file", MULTI, TMO_NORMAL, [
408
      ("file_name", "self._PrepareFileUpload(%s)", None),
409
      ], None, "Upload a file"),
410
    ("write_ssconf_files", MULTI, TMO_NORMAL, [
411
      ("values", None, None),
412
      ], None, "Write ssconf files"),
413
    ],
406 414
  }
b/lib/config.py
1723 1723
      node_list.append(node_info.name)
1724 1724
      addr_list.append(node_info.primary_ip)
1725 1725

  
1726
    result = rpc.RpcRunner.call_upload_file(node_list, self._cfg_file,
1727
                                            address_list=addr_list)
1726
    # TODO: Use dedicated resolver talking to config writer for name resolution
1727
    result = \
1728
      rpc.ConfigRunner(addr_list).call_upload_file(node_list, self._cfg_file)
1728 1729
    for to_node, to_result in result.items():
1729 1730
      msg = to_result.fail_msg
1730 1731
      if msg:
......
1783 1784
    # Write ssconf files on all nodes (including locally)
1784 1785
    if self._last_cluster_serial < self._config_data.cluster.serial_no:
1785 1786
      if not self._offline:
1786
        result = rpc.RpcRunner.call_write_ssconf_files(
1787
        result = rpc.ConfigRunner(None).call_write_ssconf_files(
1787 1788
          self._UnlockedGetOnlineNodeList(),
1788 1789
          self._UnlockedGetSsconfValues())
1789 1790

  
b/lib/rpc.py
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)
b/lib/server/noded.py
770 770
    files are accepted.
771 771

  
772 772
    """
773
    return backend.UploadFile(*params)
773
    return backend.UploadFile(*(params[0]))
774 774

  
775 775
  @staticmethod
776 776
  def perspective_master_info(params):

Also available in: Unified diff