]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume: fixes fallback to stat in is_device and is_partition 53798/head
authorTeoman ONAY <tonay@ibm.com>
Tue, 3 Oct 2023 19:47:16 +0000 (21:47 +0200)
committerTeoman ONAY <tonay@ibm.com>
Mon, 20 Nov 2023 08:50:05 +0000 (09:50 +0100)
os.stat (or lstat) cannot distinguish a block device from
a partition.

Fixes: https://tracker.ceph.com/issues/58812
Signed-off-by: Teoman ONAY <tonay@ibm.com>
src/ceph-volume/ceph_volume/tests/util/test_device.py
src/ceph-volume/ceph_volume/tests/util/test_disk.py
src/ceph-volume/ceph_volume/util/disk.py

index e2ea026286f91252eca66ed15916ebb33f77475c..69b57c21110ee53208128eeb98412f23773fa6ab 100644 (file)
@@ -152,14 +152,6 @@ class TestDevice(object):
         disk = device.Device("/dev/sda")
         assert disk.is_device is True
 
-    @patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
-    def test_is_partition(self, fake_call, device_info):
-        data = {"/dev/sda1": {"foo": "bar"}}
-        lsblk = {"TYPE": "part", "NAME": "sda1", "PKNAME": "sda"}
-        device_info(devices=data, lsblk=lsblk)
-        disk = device.Device("/dev/sda1")
-        assert disk.is_partition
-
     @patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
     def test_mpath_device_is_device(self, fake_call, device_info):
         data = {"/dev/foo": {"foo": "bar"}}
index ce1f9466fd56782360314938b7b055bf914e50a2..b287530dc17fcf8a91bb26fe14229bd8d2d38974 100644 (file)
@@ -33,6 +33,11 @@ class TestFunctions:
     def test_is_device_type_part(self):
         assert not disk.is_device('/dev/foo1')
 
+    @patch('ceph_volume.util.disk.os.path.exists', MagicMock(return_value=True))
+    @patch('ceph_volume.util.disk.get_partitions', MagicMock(return_value={"sda1": "sda"}))
+    def test_is_partition(self):
+        assert disk.is_partition('sda1')
+
 
 class TestLsblkParser(object):
 
index 8f1bf706934c3e8f045cb7e41ae5a6e9accc88c1..04104936985a487306185d0f3532c8471ab13a9f 100644 (file)
@@ -364,30 +364,18 @@ def is_device(dev):
         return TYPE in ['disk', 'mpath']
 
     # fallback to stat
-    return _stat_is_device(os.lstat(dev).st_mode)
+    return _stat_is_device(os.lstat(dev).st_mode) and not is_partition(dev)
 
 
-def is_partition(dev):
+def is_partition(dev: str) -> bool:
     """
     Boolean to determine if a given device is a partition, like /dev/sda1
     """
     if not os.path.exists(dev):
         return False
-    # use lsblk first, fall back to using stat
-    TYPE = lsblk(dev).get('TYPE')
-    if TYPE:
-        return TYPE == 'part'
-
-    # fallback to stat
-    stat_obj = os.stat(dev)
-    if _stat_is_device(stat_obj.st_mode):
-        return False
 
-    major = os.major(stat_obj.st_rdev)
-    minor = os.minor(stat_obj.st_rdev)
-    if os.path.exists('/sys/dev/block/%d:%d/partition' % (major, minor)):
-        return True
-    return False
+    partitions = get_partitions()
+    return dev.split("/")[-1] in partitions
 
 
 def is_ceph_rbd(dev):