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 f6e439279d78c4..43b65e6e969579 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -230,7 +230,39 @@ def test_reject_not_acceptable_device(self, fake_call, device_info): disk = device.Device("/dev/dm-0") assert not disk.available - def test_reject_readonly_device(self, fake_call, device_info): + @patch('ceph_volume.util.device.os.readlink') + @patch('ceph_volume.util.device.os.path.islink') + def test_accept_symlink_to_device(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/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.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 + + def test_reject_readonly_device(self, device_info, fake_call): data = {"/dev/cdrom": {"ro": 1}} lsblk = {"TYPE": "disk"} device_info(devices=data,lsblk=lsblk) diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index edd6e804fb19ea..931c96428bb358 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -151,6 +151,13 @@ def __hash__(self): def _parse(self): if not sys_info.devices: sys_info.devices = disk.get_devices() + # check if we are a symlink + if os.path.islink(self.abspath): + temp_path = os.path.join(os.path.dirname(self.abspath), + os.readlink(self.abspath)) + # check if we are not a device mapper + if "dm-" not in temp_path: + self.abspath = temp_path self.sys_api = sys_info.devices.get(self.abspath, {}) if not self.sys_api: # if no device was found check if we are a partition @@ -160,7 +167,6 @@ def _parse(self): if part: self.sys_api = part break - # if the path is not absolute, we have 'vg/lv', let's use LV name # to get the LV. if self.path[0] == '/':