From 85670b4c6b75a506b4e9f11cfb0ba8ae1d2cbdb1 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) Conflicts: - file: src/ceph-volume/ceph_volume/util/device.py comment: pacific don't have --list-all, remove from init - src/ceph-volume/ceph_volume/util/disk.py comment: manually resolve conflict in block_types[] --- src/ceph-volume/ceph_volume/util/disk.py | 28 +++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/ceph-volume/ceph_volume/util/disk.py b/src/ceph-volume/ceph_volume/util/disk.py index ac08d1c2c5830..1644b15300e9f 100644 --- a/src/ceph-volume/ceph_volume/util/disk.py +++ b/src/ceph-volume/ceph_volume/util/disk.py @@ -793,6 +793,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=''): """ @@ -808,8 +821,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'] + block_types = ['disk', 'mpath', 'part'] if allow_loop_devices(): block_types.append('loop') @@ -819,6 +833,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 @@ -846,11 +862,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['actuators'] = "" if os.path.isdir(sysdir + "/queue/independent_access_ranges/"): -- 2.39.5