From 7a3008d282ff468bd7c7562172e9468f15d223cf Mon Sep 17 00:00:00 2001 From: Guillaume Abrioux Date: Tue, 19 Jul 2022 12:06:10 +0000 Subject: [PATCH] ceph-volume: report slave devices in inventory `ceph-volume inventory` currently reports the following: ``` Device Path Size rotates available Model name /dev/mapper/mpatha 50.00 GB True True /dev/mapper/mpathaa 6.00 GB True True /dev/mapper/mpathab 6.00 GB True True /dev/mapper/mpathac 6.00 GB True True /dev/mapper/mpathad 6.00 GB True True /dev/mapper/mpathae 6.00 GB True True ``` whereas something like following would be useful: ``` Device Path Size Device nodes rotates available Model name /dev/mapper/mpatha 50.00 GB sdf,sde True True /dev/mapper/mpathaa 6.00 GB sdbe,sdat True True /dev/mapper/mpathab 6.00 GB sdav,sdbf True True /dev/mapper/mpathac 6.00 GB sdbb,sdbl True True /dev/mapper/mpathad 6.00 GB sdas,sdbc True True /dev/mapper/mpathae 6.00 GB sdax,sdbh True True ``` Fixes: https://tracker.ceph.com/issues/56624 Signed-off-by: Guillaume Abrioux (cherry picked from commit 1ac2a8270cf4aece58ae3f952cc4d1ef978384ed) --- src/ceph-volume/ceph_volume/tests/conftest.py | 6 +++++- src/ceph-volume/ceph_volume/tests/test_inventory.py | 8 ++++++-- src/ceph-volume/ceph_volume/util/device.py | 7 ++++++- src/ceph-volume/ceph_volume/util/disk.py | 6 ++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/ceph-volume/ceph_volume/tests/conftest.py b/src/ceph-volume/ceph_volume/tests/conftest.py index 80d291a2cdb54..8393b2e5d1b74 100644 --- a/src/ceph-volume/ceph_volume/tests/conftest.py +++ b/src/ceph-volume/ceph_volume/tests/conftest.py @@ -279,7 +279,11 @@ def patch_bluestore_label(): def device_info(monkeypatch, patch_bluestore_label): def apply(devices=None, lsblk=None, lv=None, blkid=None, udevadm=None, has_bluestore_label=False): - devices = devices if devices else {} + if devices: + for dev in devices.keys(): + devices[dev]['device_nodes'] = os.path.basename(dev) + else: + devices = {} lsblk = lsblk if lsblk else {} blkid = blkid if blkid else {} udevadm = udevadm if udevadm else {} diff --git a/src/ceph-volume/ceph_volume/tests/test_inventory.py b/src/ceph-volume/ceph_volume/tests/test_inventory.py index b00bd668d01aa..7b27504ecee76 100644 --- a/src/ceph-volume/ceph_volume/tests/test_inventory.py +++ b/src/ceph-volume/ceph_volume/tests/test_inventory.py @@ -28,7 +28,8 @@ def device_report_keys(device_info): 'size': 1999844147200.0, 'support_discard': '', 'vendor': 'DELL', - 'device_id': 'Vendor-Model-Serial'} + 'device_id': 'Vendor-Model-Serial', + 'device_nodes': 'sdb'} } ) report = Devices().json_report()[0] @@ -55,7 +56,8 @@ def device_sys_api_keys(device_info): 'sectorsize': '512', 'size': 1999844147200.0, 'support_discard': '', - 'vendor': 'DELL'} + 'vendor': 'DELL', + 'device_nodes': 'sdb'} } ) report = Devices().json_report()[0] @@ -85,6 +87,7 @@ def device_data(device_info): 'size': 1999844147200.0, 'support_discard': '', 'vendor': 'DELL', + 'device_nodes': 'sdb' } } ) @@ -140,6 +143,7 @@ class TestInventory(object): 'size', 'support_discard', 'vendor', + 'device_nodes' ] expected_lsm_keys = [ diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 8f9dea6234dcd..9dcc8256fb1bc 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -15,7 +15,7 @@ logger = logging.getLogger(__name__) report_template = """ -{dev:<25} {size:<12} {rot!s:<7} {available!s:<9} {model}""" +{dev:<25} {size:<12} {device_nodes:<15} {rot!s:<7} {available!s:<9} {model}""" def encryption_status(abspath): @@ -56,6 +56,8 @@ class Devices(object): rot='rotates', model='Model name', available='available', + device_nodes='Device nodes', + )] for device in sorted(self.devices): output.append(device.report()) @@ -110,6 +112,8 @@ class Device(object): self.path = real_path if not sys_info.devices: sys_info.devices = disk.get_devices() + if sys_info.devices.get(self.path, {}): + self.device_nodes = sys_info.devices[self.path]['device_nodes'] self.sys_api = sys_info.devices.get(self.path, {}) self.partitions = self._get_partitions() self.lv_api = None @@ -279,6 +283,7 @@ class Device(object): rot=self.rotational, available=self.available, model=self.model, + device_nodes=self.device_nodes ) def json_report(self): diff --git a/src/ceph-volume/ceph_volume/util/disk.py b/src/ceph-volume/ceph_volume/util/disk.py index f98b0d6f427d9..ec0ea7d3d57bf 100644 --- a/src/ceph-volume/ceph_volume/util/disk.py +++ b/src/ceph-volume/ceph_volume/util/disk.py @@ -864,6 +864,12 @@ 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 device_slaves: + metadata['device_nodes'] = ','.join(device_slaves) + else: + metadata['device_nodes'] = devname + metadata['scheduler_mode'] = "" scheduler = get_file_contents(sysdir + "/queue/scheduler") if scheduler is not None: -- 2.39.5