From 200e6bfd934b34aa8175330aef32c51505ec3392 Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Thu, 27 Sep 2018 16:14:28 -0400 Subject: [PATCH] ceph-volume util.device add a ceph-disk device object to detect types Signed-off-by: Alfredo Deza --- src/ceph-volume/ceph_volume/util/device.py | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 7dca60a49ae4f..56902858de404 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -13,6 +13,7 @@ class Device(object): self.lv_api = None self.pvs_api = [] self.disk_api = {} + self.blkid_api = {} self.sys_api = {} self._exists = None self._is_lvm_member = None @@ -26,6 +27,7 @@ class Device(object): self.abspath = lv.lv_path else: dev = disk.lsblk(self.path) + self.blkid_api = disk.blkid(self.path) self.disk_api = dev device_type = dev.get('TYPE', '') # always check is this is an lvm member @@ -36,6 +38,8 @@ class Device(object): sys_info.devices = disk.get_devices() self.sys_api = sys_info.devices.get(self.abspath, {}) + self.ceph_disk = CephDiskDevice(self) + def __repr__(self): prefix = 'Unknown' if self.is_lv: @@ -77,6 +81,10 @@ class Device(object): self._set_lvm_membership() return self._is_lvm_member + @property + def is_ceph_disk_member(self): + return self.ceph_disk.is_member + @property def is_mapper(self): return self.path.startswith('/dev/mapper') @@ -96,3 +104,48 @@ class Device(object): if self.disk_api: return self.disk_api['TYPE'] == 'device' return False + + +class CephDiskDevice(object): + """ + Detect devices that have been created by ceph-disk, report their type + (journal, data, etc..). Requires a ``Device`` object as input. + """ + + def __init__(self, device): + self.device = device + self._is_ceph_disk_member = None + + @property + def partlabel(self): + """ + In containers, the 'PARTLABEL' attribute might not be detected + correctly via ``lsblk``, so we poke at the value with ``lsblk`` first, + falling back to ``blkid`` (which works correclty in containers). + """ + lsblk_partlabel = self.device.disk_api.get('PARTLABEL') + if lsblk_partlabel: + return lsblk_partlabel + return self.device.blkid_api.get('PARTLABEL', '') + + @property + def is_member(self): + if self._is_ceph_disk_member is None: + if 'ceph' in self.partlabel: + self._is_ceph_disk_member = True + return True + return False + return self._is_ceph_disk_member + + @property + def type(self): + types = [ + 'data', 'wal', 'db', 'lockbox', 'journal', + # ceph-disk uses 'ceph block' when placing data in bluestore, but + # keeps the regular OSD files in 'ceph data' :( :( :( :( + 'block', + ] + for t in types: + if t in self.partlabel: + return t + return 'unknown' -- 2.39.5