neil / rpms / python-blivet

Forked from rpms/python-blivet a year ago
Clone

Blame SOURCES/0028-Add-recognition-of-Dell-FW-RAID-to-udev-device_is_disk.patch

d52dce
From 4e23e410bb5fcab5db931ad42a9b46af6be4fb3d Mon Sep 17 00:00:00 2001
d52dce
From: David Lehman <dlehman@redhat.com>
d52dce
Date: Thu, 16 Jan 2020 13:14:29 -0500
d52dce
Subject: [PATCH 1/2] Add recognition of Dell FW RAID to udev.device_is_disk.
d52dce
d52dce
Resolves: rhbz#1758102
d52dce
---
d52dce
 blivet/udev.py     | 16 +++++++++++++++-
d52dce
 tests/udev_test.py | 42 ++++++++++++++++++++++++++++++++++++++++++
d52dce
 2 files changed, 57 insertions(+), 1 deletion(-)
d52dce
d52dce
diff --git a/blivet/udev.py b/blivet/udev.py
d52dce
index 53e7b7ca..df2b4e64 100644
d52dce
--- a/blivet/udev.py
d52dce
+++ b/blivet/udev.py
d52dce
@@ -353,7 +353,7 @@ def device_is_disk(info):
d52dce
                  device_is_dm_lvm(info) or
d52dce
                  device_is_dm_crypt(info) or
d52dce
                  (device_is_md(info) and
d52dce
-                  not device_get_md_container(info))))
d52dce
+                  (not device_get_md_container(info) and not all(device_is_disk(d) for d in device_get_slaves(info))))))
d52dce
 
d52dce
 
d52dce
 def device_is_partition(info):
d52dce
@@ -432,6 +432,20 @@ def device_get_devname(info):
d52dce
     return info.get('DEVNAME')
d52dce
 
d52dce
 
d52dce
+def device_get_slaves(info):
d52dce
+    """ Return a list of udev device objects representing this device's slaves. """
d52dce
+    slaves_dir = device_get_sysfs_path(info) + "/slaves/"
d52dce
+    names = list()
d52dce
+    if os.path.isdir(slaves_dir):
d52dce
+        names = os.listdir(slaves_dir)
d52dce
+
d52dce
+    slaves = list()
d52dce
+    for name in names:
d52dce
+        slaves.append(get_device(device_node="/dev/" + name))
d52dce
+
d52dce
+    return slaves
d52dce
+
d52dce
+
d52dce
 def device_get_md_level(info):
d52dce
     """ Returns the RAID level of the array of which this device is a member.
d52dce
 
d52dce
diff --git a/tests/udev_test.py b/tests/udev_test.py
d52dce
index 5cc81a05..beb8109c 100644
d52dce
--- a/tests/udev_test.py
d52dce
+++ b/tests/udev_test.py
d52dce
@@ -35,3 +35,45 @@ class UdevTest(unittest.TestCase):
d52dce
         import blivet.udev
d52dce
         blivet.udev.trigger()
d52dce
         self.assertTrue(blivet.udev.util.run_program.called)
d52dce
+
d52dce
+    @mock.patch('blivet.udev.device_is_cdrom', return_value=False)
d52dce
+    @mock.patch('blivet.udev.device_is_partition', return_value=False)
d52dce
+    @mock.patch('blivet.udev.device_is_dm_partition', return_value=False)
d52dce
+    @mock.patch('blivet.udev.device_is_dm_lvm', return_value=False)
d52dce
+    @mock.patch('blivet.udev.device_is_dm_crypt', return_value=False)
d52dce
+    @mock.patch('blivet.udev.device_is_md')
d52dce
+    @mock.patch('blivet.udev.device_get_md_container')
d52dce
+    @mock.patch('blivet.udev.device_get_slaves')
d52dce
+    def test_udev_device_is_disk_md(self, *args):
d52dce
+        import blivet.udev
d52dce
+        info = dict(DEVTYPE='disk', SYS_PATH=mock.sentinel.md_path)
d52dce
+        (device_get_slaves, device_get_md_container, device_is_md) = args[:3]  # pylint: disable=unbalanced-tuple-unpacking
d52dce
+
d52dce
+        disk_parents = [dict(DEVTYPE="disk", SYS_PATH='/fake/path/2'),
d52dce
+                        dict(DEVTYPE="disk", SYS_PATH='/fake/path/3')]
d52dce
+        partition_parents = [dict(DEVTYPE="partition", SYS_PATH='/fake/path/2'),
d52dce
+                             dict(DEVTYPE="partition", SYS_PATH='/fake/path/3')]
d52dce
+        mixed_parents = [dict(DEVTYPE="partition", SYS_PATH='/fake/path/2'),
d52dce
+                         dict(DEVTYPE="partition", SYS_PATH='/fake/path/3')]
d52dce
+
d52dce
+        blivet.udev.os.path.exists.return_value = False  # has_range checked in device_is_disk
d52dce
+        device_is_md.return_value = True
d52dce
+
d52dce
+        # Intel FW RAID (MD RAID w/ container layer)
d52dce
+        # device_get_container will return some mock value which will evaluate to True
d52dce
+        device_get_md_container.return_value = mock.sentinel.md_container
d52dce
+        device_get_slaves.side_effect = lambda info: list()
d52dce
+        self.assertTrue(blivet.udev.device_is_disk(info))
d52dce
+
d52dce
+        # Normal MD RAID
d52dce
+        device_get_slaves.side_effect = lambda info: partition_parents if info['SYS_PATH'] == mock.sentinel.md_path else list()
d52dce
+        device_get_md_container.return_value = None
d52dce
+        self.assertFalse(blivet.udev.device_is_disk(info))
d52dce
+
d52dce
+        # Dell FW RAID (MD RAID whose members are all whole disks)
d52dce
+        device_get_slaves.side_effect = lambda info: disk_parents if info['SYS_PATH'] == mock.sentinel.md_path else list()
d52dce
+        self.assertTrue(blivet.udev.device_is_disk(info))
d52dce
+
d52dce
+        # Normal MD RAID (w/ at least one non-disk member)
d52dce
+        device_get_slaves.side_effect = lambda info: mixed_parents if info['SYS_PATH'] == mock.sentinel.md_path else list()
d52dce
+        self.assertFalse(blivet.udev.device_is_disk(info))
d52dce
-- 
d52dce
2.24.1
d52dce
d52dce
d52dce
From 1d75298702f55830a3d69858c3b0b7defa7bf6f2 Mon Sep 17 00:00:00 2001
d52dce
From: David Lehman <dlehman@redhat.com>
d52dce
Date: Tue, 21 Jan 2020 15:28:27 -0500
d52dce
Subject: [PATCH 2/2] Fix udev test names so they actually get run.
d52dce
d52dce
---
d52dce
 tests/udev_test.py | 4 ++--
d52dce
 1 file changed, 2 insertions(+), 2 deletions(-)
d52dce
d52dce
diff --git a/tests/udev_test.py b/tests/udev_test.py
d52dce
index beb8109c..653eeb6d 100644
d52dce
--- a/tests/udev_test.py
d52dce
+++ b/tests/udev_test.py
d52dce
@@ -26,12 +26,12 @@ class UdevTest(unittest.TestCase):
d52dce
         for device in devices:
d52dce
             self.assertNotEqual(blivet.udev.get_device(device.sys_path), None)
d52dce
 
d52dce
-    def udev_settle_test(self):
d52dce
+    def test_udev_settle(self):
d52dce
         import blivet.udev
d52dce
         blivet.udev.settle()
d52dce
         self.assertTrue(blivet.udev.util.run_program.called)
d52dce
 
d52dce
-    def udev_trigger_test(self):
d52dce
+    def test_udev_trigger(self):
d52dce
         import blivet.udev
d52dce
         blivet.udev.trigger()
d52dce
         self.assertTrue(blivet.udev.util.run_program.called)
d52dce
-- 
d52dce
2.24.1
d52dce