From: Andrew Schoen Date: Tue, 22 Jan 2019 15:32:00 +0000 (-0600) Subject: ceph-volume: mark a device not available if it belongs to ceph-disk X-Git-Tag: v12.2.11~1^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F26117%2Fhead;p=ceph.git 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) --- 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