]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-volume: fixes fallback to stat in is_device and is_partition
authorTeoman ONAY <tonay@ibm.com>
Tue, 3 Oct 2023 19:47:16 +0000 (21:47 +0200)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Tue, 23 Jan 2024 18:28:39 +0000 (01:28 +0700)
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>
(cherry picked from commit 52ca4a61d5d69ccfadeef8408a4711c820b98959)

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 e991b935ab6e7370a8058b9386a30fc7f03db5bd..4e32529342ac20d55b95674758cf31e2d52a7ef6 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 f71aeb21a23f9b7237a93488fdc2cbc061d770d9..94325b475ef0dc3a8f596b685b24b45773f792da 100644 (file)
@@ -3,6 +3,11 @@ import pytest
 from ceph_volume.util import disk
 from mock.mock import patch
 
+    @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 0ca52d2231f916529a9a6d62ff032000b23752d8..ac08d1c2c5830ba19b9264d698f35bf8ba763815 100644 (file)
@@ -360,30 +360,18 @@ def is_device(dev):
             return False
 
     # 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):