From: Jan Sobczak Date: Fri, 20 Nov 2020 13:33:13 +0000 (+0100) Subject: ceph-volume: support symlinks as devices X-Git-Tag: v16.2.11~391^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=261decfb3570b27136c7880b64dcea90d8dfca51;p=ceph.git ceph-volume: support symlinks as devices This makes ceph-volume support passing symlinks as devices. Fixes: https://tracker.ceph.com/issues/49103 Signed-off-by: Guillaume Abrioux (cherry picked from commit 9ddc5b77372cd2e0d5badd433c93d147cb25c6ee) --- diff --git a/src/ceph-volume/ceph_volume/devices/lvm/batch.py b/src/ceph-volume/ceph_volume/devices/lvm/batch.py index a8d9ae4eec66..c97d3a25bc2b 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/batch.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/batch.py @@ -73,7 +73,8 @@ def get_physical_osds(devices, args): abs_size, args.osds_per_device, osd_id, - 'dmcrypt' if args.dmcrypt else None)) + 'dmcrypt' if args.dmcrypt else None, + dev.symlink)) return ret @@ -562,7 +563,8 @@ class Batch(object): abs_size, slots, id_, - encryption): + encryption, + symlink=None): self.id_ = id_ self.data = self.VolSpec(path=data_path, rel_size=rel_size, @@ -572,6 +574,7 @@ class Batch(object): self.fast = None self.very_fast = None self.encryption = encryption + self.symlink = symlink def add_fast_device(self, path, rel_size, abs_size, slots, type_): self.fast = self.VolSpec(path=path, @@ -623,9 +626,12 @@ class Batch(object): if self.encryption: report += templates.osd_encryption.format( enc=self.encryption) + path = self.data.path + if self.symlink: + path = f'{self.symlink} -> {self.data.path}' report += templates.osd_component.format( _type=self.data.type_, - path=self.data.path, + path=path, size=self.data.abs_size, percent=self.data.rel_size) if self.fast: diff --git a/src/ceph-volume/ceph_volume/tests/conftest.py b/src/ceph-volume/ceph_volume/tests/conftest.py index 2bd7449783da..545a5f3453d2 100644 --- a/src/ceph-volume/ceph_volume/tests/conftest.py +++ b/src/ceph-volume/ceph_volume/tests/conftest.py @@ -63,6 +63,7 @@ def mock_device(): dev.path = '/dev/foo' dev.vg_name = 'vg_foo' dev.lv_name = 'lv_foo' + dev.symlink = None dev.vgs = [lvm.VolumeGroup(vg_name=dev.vg_name, lv_name=dev.lv_name)] dev.available_lvm = True dev.vg_size = [21474836480] 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 5c87294ddf51..91130d34df0d 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -249,6 +249,41 @@ class TestDevice(object): disk = device.Device("/dev/dm-0") assert not disk.available + @patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False) + @patch('ceph_volume.util.device.os.path.realpath') + @patch('ceph_volume.util.device.os.path.islink') + def test_accept_symlink_to_device(self, + m_os_path_islink, + m_os_path_realpath, + device_info, + fake_call): + m_os_path_islink.return_value = True + m_os_path_realpath.return_value = '/dev/sdb' + data = {"/dev/sdb": {"ro": 0, "size": 5368709120}} + lsblk = {"TYPE": "disk"} + device_info(devices=data,lsblk=lsblk) + disk = device.Device("/dev/test_symlink") + print(disk) + print(disk.sys_api) + assert disk.available + + @patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False) + @patch('ceph_volume.util.device.os.readlink') + @patch('ceph_volume.util.device.os.path.islink') + def test_reject_symlink_to_device_mapper(self, + m_os_path_islink, + m_os_readlink, + device_info, + fake_call): + m_os_path_islink.return_value = True + m_os_readlink.return_value = '/dev/dm-0' + data = {"/dev/mapper/mpatha": {"ro": 0, "size": 5368709120}} + lsblk = {"TYPE": "disk"} + device_info(devices=data,lsblk=lsblk) + disk = device.Device("/dev/mapper/mpatha") + assert disk.available + + @patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False) def test_reject_readonly_device(self, fake_call, device_info): data = {"/dev/cdrom": {"ro": 1}} lsblk = {"TYPE": "disk", "NAME": "cdrom"} diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 02e549c55b70..e5d819dc74c8 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -99,6 +99,15 @@ class Device(object): def __init__(self, path, with_lsm=False, lvs=None, lsblk_all=None, all_devices_vgs=None): self.path = path + # LVs can have a vg/lv path, while disks will have /dev/sda + self.symlink = None + # check if we are a symlink + if os.path.islink(self.path): + self.symlink = self.path + real_path = os.path.realpath(self.path) + # check if we are not a device mapper + if "dm-" not in real_path: + self.path = real_path if not sys_info.devices: sys_info.devices = disk.get_devices() self.sys_api = sys_info.devices.get(self.path, {})