From 78d335b19d12d1390e70d35d5e0f59389f6b2d75 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 7b88f74f8f4..d61222afe0a 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 469096b7765..a96b0f0a7f8 100644 --- a/src/ceph-volume/ceph_volume/util/disk.py +++ b/src/ceph-volume/ceph_volume/util/disk.py @@ -807,6 +807,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=''): """ @@ -822,8 +835,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') @@ -835,6 +849,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 @@ -862,11 +878,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'] = None if os.path.isdir(sysdir + "/queue/independent_access_ranges/"): -- 2.39.5