From f3694a94de254f67024bb15567204a4ae221f995 Mon Sep 17 00:00:00 2001 From: Michael Fritch Date: Tue, 18 Jan 2022 15:15:45 -0700 Subject: [PATCH] ceph-volume: filter RBD devices from the device inventory Avoid running `blkid` or deploying OSDs on RBD devices by ensuring they do not appear in the `ceph-volume inventory` Fixes: https://tracker.ceph.com/issues/53846 Signed-off-by: Michael Fritch (cherry picked from commit 47325ec3ec5ce1d53c5eae2952f631e95b7135fe) --- src/ceph-volume/ceph_volume/tests/util/test_disk.py | 9 +++++++++ src/ceph-volume/ceph_volume/util/disk.py | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/ceph-volume/ceph_volume/tests/util/test_disk.py b/src/ceph-volume/ceph_volume/tests/util/test_disk.py index 44f19e036fa47..6b178eabdbb73 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_disk.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_disk.py @@ -331,6 +331,15 @@ class TestGetDevices(object): result = disk.get_devices(_sys_block_path=block_path) assert result[sda_path]['rotational'] == '1' + def test_is_ceph_rbd(self, tmpfile, tmpdir, patched_get_block_devs_lsblk): + rbd_path = '/dev/rbd0' + patched_get_block_devs_lsblk.return_value = [[rbd_path, rbd_path, 'disk']] + block_path = self.setup_path(tmpdir) + block_rbd_path = os.path.join(block_path, 'rbd0') + os.makedirs(block_rbd_path) + result = disk.get_devices(_sys_block_path=block_path) + assert rbd_path not in result + class TestSizeCalculations(object): diff --git a/src/ceph-volume/ceph_volume/util/disk.py b/src/ceph-volume/ceph_volume/util/disk.py index 88db0513817a9..8a47061ef91bb 100644 --- a/src/ceph-volume/ceph_volume/util/disk.py +++ b/src/ceph-volume/ceph_volume/util/disk.py @@ -361,6 +361,13 @@ def is_partition(dev): return False +def is_ceph_rbd(dev): + """ + Boolean to determine if a given device is a ceph RBD device, like /dev/rbd0 + """ + return dev.startswith(('/dev/rbd')) + + class BaseFloatUnit(float): """ Base class to support float representations of size values. Suffix is @@ -764,6 +771,10 @@ def get_devices(_sys_block_path='/sys/block'): sysdir = os.path.join(_sys_block_path, devname) metadata = {} + # If the device is ceph rbd it gets excluded + if is_ceph_rbd(diskname): + continue + # If the mapper device is a logical volume it gets excluded if is_mapper_device(diskname): if lvm.get_device_lvs(diskname): -- 2.39.5