+ """
+ return self._SingleNodeCall(node, "blockdev_addchildren",
+ [bdev.ToDict(),
+ [disk.ToDict() for disk in ndevs]])
+
+ def call_blockdev_removechildren(self, node, bdev, ndevs):
+ """Request removing a list of children from a (mirroring) device.
+
+ This is a single-node call.
+
+ """
+ return self._SingleNodeCall(node, "blockdev_removechildren",
+ [bdev.ToDict(),
+ [disk.ToDict() for disk in ndevs]])
+
+ def call_blockdev_getmirrorstatus(self, node, disks):
+ """Request status of a (mirroring) device.
+
+ This is a single-node call.
+
+ """
+ return self._SingleNodeCall(node, "blockdev_getmirrorstatus",
+ [dsk.ToDict() for dsk in disks])
+
+ def call_blockdev_find(self, node, disk):
+ """Request identification of a given block device.
+
+ This is a single-node call.
+
+ """
+ return self._SingleNodeCall(node, "blockdev_find", [disk.ToDict()])
+
+ def call_blockdev_close(self, node, instance_name, disks):
+ """Closes the given block devices.
+
+ This is a single-node call.
+
+ """
+ params = [instance_name, [cf.ToDict() for cf in disks]]
+ return self._SingleNodeCall(node, "blockdev_close", params)
+
+ def call_drbd_disconnect_net(self, node_list, nodes_ip, disks):
+ """Disconnects the network of the given drbd devices.
+
+ This is a multi-node call.
+
+ """
+ return self._MultiNodeCall(node_list, "drbd_disconnect_net",
+ [nodes_ip, [cf.ToDict() for cf in disks]])
+
+ def call_drbd_attach_net(self, node_list, nodes_ip,
+ disks, instance_name, multimaster):
+ """Disconnects the given drbd devices.
+
+ This is a multi-node call.
+
+ """
+ return self._MultiNodeCall(node_list, "drbd_attach_net",
+ [nodes_ip, [cf.ToDict() for cf in disks],
+ instance_name, multimaster])
+
+ def call_drbd_wait_sync(self, node_list, nodes_ip, disks):
+ """Waits for the synchronization of drbd devices is complete.
+
+ This is a multi-node call.
+
+ """
+ return self._MultiNodeCall(node_list, "drbd_wait_sync",
+ [nodes_ip, [cf.ToDict() for cf in disks]])
+
+ @classmethod
+ def call_upload_file(cls, node_list, file_name, address_list=None):
+ """Upload a file.
+
+ The node will refuse the operation in case the file is not on the
+ approved file list.
+
+ This is a multi-node call.
+
+ @type node_list: list
+ @param node_list: the list of node names to upload to
+ @type file_name: str
+ @param file_name: the filename to upload
+ @type address_list: list or None
+ @keyword address_list: an optional list of node addresses, in order
+ to optimize the RPC speed
+
+ """
+ file_contents = utils.ReadFile(file_name)
+ data = cls._Compress(file_contents)
+ st = os.stat(file_name)
+ params = [file_name, data, st.st_mode, st.st_uid, st.st_gid,
+ st.st_atime, st.st_mtime]
+ return cls._StaticMultiNodeCall(node_list, "upload_file", params,
+ address_list=address_list)
+
+ @classmethod
+ def call_write_ssconf_files(cls, node_list, values):
+ """Write ssconf files.
+
+ This is a multi-node call.
+
+ """
+ return cls._StaticMultiNodeCall(node_list, "write_ssconf_files", [values])
+
+ def call_os_diagnose(self, node_list):
+ """Request a diagnose of OS definitions.
+
+ This is a multi-node call.
+
+ """
+ result = self._MultiNodeCall(node_list, "os_diagnose", [])
+
+ for node_result in result.values():
+ if not node_result.failed and node_result.data:
+ node_result.data = [objects.OS.FromDict(oss)
+ for oss in node_result.data]