ceph_volume: Rejecting Read-only devices
authorErwan Velu <erwan@redhat.com>
Tue, 9 Oct 2018 20:02:31 +0000 (22:02 +0200)
committerAlfredo Deza <adeza@redhat.com>
Fri, 26 Oct 2018 20:23:48 +0000 (16:23 -0400)
If a devices is said to be read-only, there is no chance we can actually
use it. So let's report it as unusable.

Signed-off-by: Erwan Velu <erwan@redhat.com>
(cherry picked from commit f1a94350064263f27f67d2c715c5ca5922481a01)

src/ceph-volume/ceph_volume/tests/util/test_device.py
src/ceph-volume/ceph_volume/util/device.py
src/ceph-volume/ceph_volume/util/disk.py

index 1e6766b45a3cc860b8f864cd427f16f391e1bac3..a44be7697dcb876bb356681039ee83a7624672d5 100644 (file)
@@ -162,6 +162,18 @@ class TestCephDiskDevice(object):
         disk = device.Device("/dev/sdb")
         assert disk.is_valid
 
+    def test_reject_readonly_device(self, device_info):
+        data = {"/dev/cdrom": {"ro": 1}}
+        device_info(devices=data)
+        disk = device.Device("/dev/cdrom")
+        assert not disk.is_valid
+
+    def test_accept_non_readonly_device(self, device_info):
+        data = {"/dev/sda": {"ro": 0}}
+        device_info(devices=data)
+        disk = device.Device("/dev/sda")
+        assert disk.is_valid
+
     @pytest.mark.parametrize("label", ceph_partlabels)
     def test_is_member_lsblk(self, device_info, label):
         lsblk = {"PARTLABEL": label}
index a705678157f372f9427cb53f030fabb19fa83b6f..7831c14ca816c68938d450e043dbb28aa4a0d514 100644 (file)
@@ -141,6 +141,7 @@ class Device(object):
             except KeyError:
                 pass
         reject_device('removable', 1, 'removable')
+        reject_device('ro', 1, 'read-only')
 
         self._valid = len(self._rejected_reasons) == 0
         return self._valid
index ae1da7095e68fcb81cf80959b9dea13fb0abe3f8..4fc813e7209fe66c77fabd566578495d7a3f5f82 100644 (file)
@@ -695,6 +695,9 @@ def get_devices(_sys_block_path='/sys/block', _dev_path='/dev', _mapper_path='/d
                 continue
 
         metadata['removable'] = get_file_contents(os.path.join(sysdir, 'removable'))
+        # Is the device read-only ?
+        metadata['ro'] = get_file_contents(os.path.join(sysdir, 'ro'))
+
 
         for key in ['vendor', 'model', 'sas_address', 'sas_device_handle']:
             metadata[key] = get_file_contents(sysdir + "/device/" + key)