From fb4e9d7aed785f1c6771b9fe2a75950767421f4b 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 (cherry picked from commit d14a6b284c44a3f61c0dd8c60ccc474203003653) --- .../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 ca90453892fe..8be5f8e4be3d 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -92,6 +92,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 fb7a411985da..06f90cd37441 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -209,9 +209,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 @@ -282,7 +279,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): @@ -356,6 +360,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.47.3