diff --git a/lib/backend.py b/lib/backend.py index 4c537b5b944edbcee11f1b8d42e6a0d61d7d9aab..032547d22f0a8a35a100b988bf81d23c1818e11d 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -2517,6 +2517,32 @@ def BlockdevSnapshot(disk): disk.unique_id, disk.dev_type) +def BlockdevSetInfo(disk, info): + """Sets 'metadata' information on block devices. + + This function sets 'info' metadata on block devices. Initial + information is set at device creation; this function should be used + for example after renames. + + @type disk: L{objects.Disk} + @param disk: the disk to be grown + @type info: string + @param info: new 'info' metadata + @rtype: (status, result) + @return: a tuple with the status of the operation (True/False), and + the errors message if status is False + + """ + r_dev = _RecursiveFindBD(disk) + if r_dev is None: + _Fail("Cannot find block device %s", disk) + + try: + r_dev.SetInfo(info) + except errors.BlockDeviceError, err: + _Fail("Failed to set information on block device: %s", err, exc=True) + + def FinalizeExport(instance, snap_disks): """Write out the export configuration information. diff --git a/lib/cmdlib.py b/lib/cmdlib.py index ba13cac86e1acba6f5ab3455a7198c53da6e3d3f..6d998e4ce799592ae974a58343d3fa4a4b6ef41a 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -7480,6 +7480,15 @@ class LUInstanceRename(LogicalUnit): new_file_storage_dir)) _StartInstanceDisks(self, inst, None) + # update info on disks + info = _GetInstanceInfoText(inst) + for (idx, disk) in enumerate(inst.disks): + for node in inst.all_nodes: + self.cfg.SetDiskID(disk, node) + result = self.rpc.call_blockdev_setinfo(node, disk, info) + if result.fail_msg: + self.LogWarning("Error setting info on node %s for disk %s: %s", + node, idx, result.fail_msg) try: result = self.rpc.call_instance_run_rename(inst.primary_node, inst, old_name, self.op.debug_level) diff --git a/lib/rpc_defs.py b/lib/rpc_defs.py index c6ae9671abfee484a5110ffd250d0daf13eab8ca..15344b5eb21125be6934f45cffd9b88f19c9fdfd 100644 --- a/lib/rpc_defs.py +++ b/lib/rpc_defs.py @@ -418,6 +418,10 @@ _BLOCKDEV_CALLS = [ ], _BlockdevGetMirrorStatusMultiPreProc, _BlockdevGetMirrorStatusMultiPostProc, "Request status of (mirroring) devices from multiple nodes"), + ("blockdev_setinfo", SINGLE, None, constants.RPC_TMO_NORMAL, [ + ("disk", ED_OBJECT_DICT, None), + ("info", None, None), + ], None, None, "Sets metadata information on a given block device"), ] _OS_CALLS = [ diff --git a/lib/server/noded.py b/lib/server/noded.py index 203dc3cc1d25f69ab3ea572a421856a79780a5d6..2ff474c22280f90a6f12ee20f880d923f86d0ef5 100644 --- a/lib/server/noded.py +++ b/lib/server/noded.py @@ -367,6 +367,15 @@ class NodeRequestHandler(http.server.HttpServerHandler): dest_node, dest_path, cluster_name = params[1:] return backend.BlockdevExport(disk, dest_node, dest_path, cluster_name) + @staticmethod + def perspective_blockdev_setinfo(params): + """Sets metadata information on the given block device. + + """ + (disk, info) = params + disk = objects.Disk.FromDict(disk) + return backend.BlockdevSetInfo(disk, info) + # blockdev/drbd specific methods ---------- @staticmethod