From 3fafe47f8811c15291a6e582e30a6c4fe9421d6b Mon Sep 17 00:00:00 2001 From: Guillaume Abrioux Date: Thu, 10 Aug 2023 09:01:22 +0000 Subject: [PATCH] ceph-volume: support partitions in inventory This makes ceph-volume report partitions in inventory. A partition is a valid device for `ceph-volume lvm prepare` so we should report them in inventory (when using `--list-all` parameter). Signed-off-by: Guillaume Abrioux (cherry picked from commit 00ba00fdfab8cb4969d46838e44cff3a03fc16ca) --- src/ceph-volume/ceph_volume/util/device.py | 2 ++ src/ceph-volume/ceph_volume/util/disk.py | 28 +++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 04f56097a621e..a3c10ec2d1bcd 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -54,6 +54,8 @@ class Devices(object): continue if device.is_lv and not list_all: continue + if device.is_partition and not list_all: + continue self.devices.append(device) def pretty_report(self): diff --git a/src/ceph-volume/ceph_volume/util/disk.py b/src/ceph-volume/ceph_volume/util/disk.py index caeea047ce051..dc72f1cafcfa1 100644 --- a/src/ceph-volume/ceph_volume/util/disk.py +++ b/src/ceph-volume/ceph_volume/util/disk.py @@ -804,6 +804,19 @@ def get_block_devs_sysfs(_sys_block_path='/sys/block', _sys_dev_block_path='/sys result.append([name, kname, "part"]) return sorted(result, key=lambda x: x[0]) +def get_partitions(_sys_dev_block_path ='/sys/dev/block'): + devices = os.listdir(_sys_dev_block_path) + result = dict() + for device in devices: + device_path = os.path.join(_sys_dev_block_path, device) + is_partition = get_file_contents(os.path.join(device_path, 'partition')) == "1" + if not is_partition: + continue + + partition_sys_name = os.path.basename(os.readlink(device_path)) + parent_device_sys_name = os.readlink(device_path).split('/')[-2:-1][0] + result[partition_sys_name] = parent_device_sys_name + return result def get_devices(_sys_block_path='/sys/block', device=''): """ @@ -819,8 +832,9 @@ def get_devices(_sys_block_path='/sys/block', device=''): device_facts = {} block_devs = get_block_devs_sysfs(_sys_block_path) + partitions = get_partitions() - block_types = ['disk', 'mpath', 'lvm'] + block_types = ['disk', 'mpath', 'lvm', 'part'] if allow_loop_devices(): block_types.append('loop') @@ -832,6 +846,8 @@ def get_devices(_sys_block_path='/sys/block', device=''): if block[2] not in block_types: continue sysdir = os.path.join(_sys_block_path, devname) + if block[2] == 'part': + sysdir = os.path.join(_sys_block_path, partitions[devname], devname) metadata = {} # If the device is ceph rbd it gets excluded @@ -859,11 +875,17 @@ def get_devices(_sys_block_path='/sys/block', device=''): for key, file_ in facts: metadata[key] = get_file_contents(os.path.join(sysdir, file_)) - device_slaves = os.listdir(os.path.join(sysdir, 'slaves')) + if block[2] != 'part': + device_slaves = os.listdir(os.path.join(sysdir, 'slaves')) + metadata['partitions'] = get_partitions_facts(sysdir) + if device_slaves: metadata['device_nodes'] = ','.join(device_slaves) else: - metadata['device_nodes'] = devname + if block[2] == 'part': + metadata['device_nodes'] = partitions[devname] + else: + metadata['device_nodes'] = devname metadata['scheduler_mode'] = "" scheduler = get_file_contents(sysdir + "/queue/scheduler") -- 2.39.5