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: v14.1.0~305^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F26084%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 --- 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 1d44facd875b..7eea92ecd0c5 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 667bb97f2569..cb62a744fbf2 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