From d14a6b284c44a3f61c0dd8c60ccc474203003653 Mon Sep 17 00:00:00 2001 From: Andrew Schoen Date: Tue, 22 Jan 2019 09:32:00 -0600 Subject: [PATCH] ceph-volume: mark a device not available if it belongs to ceph-disk The `ceph-volume inventory` command will now show if a device is being used by ceph-disk and mark it not available if so. Fixes: https://tracker.ceph.com/issues/24871 Signed-off-by: Andrew Schoen --- .../ceph_volume/tests/util/test_device.py | 8 ++++++++ src/ceph-volume/ceph_volume/util/device.py | 15 +++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/ceph-volume/ceph_volume/tests/util/test_device.py b/src/ceph-volume/ceph_volume/tests/util/test_device.py index 1d44facd875ba..7eea92ecd0c52 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -106,6 +106,14 @@ class TestDevice(object): disk = device.Device("/dev/sda") assert disk.is_ceph_disk_member + def test_is_ceph_disk_member_not_available(self, device_info): + lsblk = {"PARTLABEL": "ceph data"} + device_info(lsblk=lsblk) + disk = device.Device("/dev/sda") + assert disk.is_ceph_disk_member + assert not disk.available + assert "Used by ceph-disk" in disk.rejected_reasons + def test_is_not_ceph_disk_member_lsblk(self, device_info): lsblk = {"PARTLABEL": "gluster partition"} device_info(lsblk=lsblk) diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 667bb97f2569c..cb62a744fbf2a 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -217,9 +217,6 @@ class Device(object): dev_id.replace(' ', '_') return dev_id - - - def _set_lvm_membership(self): if self._is_lvm_member is None: # this is contentious, if a PV is recognized by LVM but has no @@ -300,7 +297,14 @@ class Device(object): @property def is_ceph_disk_member(self): - return self.ceph_disk.is_member + is_member = self.ceph_disk.is_member + if self.sys_api.get("partitions"): + for part in self.sys_api.get("partitions").keys(): + part = Device("/dev/%s" % part) + if part.is_ceph_disk_member: + is_member = True + break + return is_member @property def is_mapper(self): @@ -374,6 +378,9 @@ class Device(object): ] rejected = [reason for (k, v, reason) in reasons if self.sys_api.get(k, '') == v] + if self.is_ceph_disk_member: + rejected.append("Used by ceph-disk") + return len(rejected) == 0, rejected -- 2.39.5