← Back to team overview

curtin-dev team mailing list archive

[Merge] ~dbungert/curtin:integration-sysfs into curtin:master

 

Dan Bungert has proposed merging ~dbungert/curtin:integration-sysfs into curtin:master.

Commit message:
integration: use sfdisk as the source of info

sysfs size of extended partitions is known to provide a strange
number, and we're using a mix of sysfs and sfdisk, so primarily get
info from sfdisk and compare what we can to sysfs.


Requested reviews:
  curtin developers (curtin-dev)

For more details, see:
https://code.launchpad.net/~dbungert/curtin/+git/curtin/+merge/436927
-- 
Your team curtin developers is requested to review the proposed merge of ~dbungert/curtin:integration-sysfs into curtin:master.
diff --git a/tests/integration/test_block_meta.py b/tests/integration/test_block_meta.py
index 38b188a..271e556 100644
--- a/tests/integration/test_block_meta.py
+++ b/tests/integration/test_block_meta.py
@@ -106,18 +106,6 @@ def _get_filesystem_size(dev, part_action, fstype='ext4'):
     return _get_fs_sizers[fstype](dev, part_action)
 
 
-def _get_extended_partition_size(dev, num):
-    # sysfs reports extended partitions as having 1K size
-    # sfdisk seems to have a better idea
-    ptable_json = util.subp(['sfdisk', '-J', dev], capture=True)[0]
-    ptable = json.loads(ptable_json)
-
-    nodename = f'{dev}p{num}'
-    partitions = ptable['partitiontable']['partitions']
-    partition = [part for part in partitions if part['node'] == nodename][0]
-    return partition['size'] * 512
-
-
 def _get_disk_label_id(dev):
     ptable_json = util.subp(['sfdisk', '-J', dev], capture=True)[0]
     ptable = json.loads(ptable_json)
@@ -128,16 +116,29 @@ def _get_disk_label_id(dev):
 def summarize_partitions(dev):
     parts = []
     ptable_json = util.subp(['sfdisk', '-J', dev], capture=True)[0]
-    ptable = json.loads(ptable_json)
-    partitions = ptable['partitiontable']['partitions']
-    for d in block.sysfs_partition_data(dev):
-        nodename = f'/dev/{d[0]}'
-        partition = [part for part in partitions
-                     if part['node'] == nodename][0]
-        ptype = partition['type']
-        boot = partition.get('bootable', False)
-        # We don't care about the kname
-        pd = PartData(*d[1:], partition_type=ptype, boot=boot)
+    ptable = json.loads(ptable_json)['partitiontable']
+    partitions = ptable['partitions']
+    sectorsize = ptable['sectorsize']
+    assert dev == ptable['device']
+    sysfs_data = block.sysfs_partition_data(dev)
+    for part in partitions:
+        node = part['node']
+        (unused, s_number, s_offset, s_size) = [
+                entry for entry in sysfs_data
+                if '/dev/' + entry[0] == node][0]
+        assert node.startswith(f'{dev}p')
+        number = int(node[len(dev) + 1:])
+        ptype = part['type']
+        offset = part['start'] * sectorsize
+        size = part['size'] * sectorsize
+        boot = part.get('bootable', False)
+        assert s_number == number
+        assert s_offset == offset
+        if ptype not in ('5', 'f'):  # extended sizes known to be bad in sysfs
+            assert s_size == size
+        pd = PartData(
+                number=number, offset=offset, size=size,
+                boot=boot, partition_type=ptype)
         pd.assertFieldsAreNotNone()
         parts.append(pd)
     return sorted(parts)
@@ -418,14 +419,11 @@ class TestBlockMeta(IntegrationTestCase):
         with loop_dev(img) as dev:
             self.assertEqual(
                 summarize_partitions(dev), [
-                    # extended partitions get a strange size in sysfs
-                    PartData(number=1, offset=1 << 20,  size=1 << 10),
+                    PartData(number=1, offset=1 << 20,  size=99 << 20),
                     PartData(number=5, offset=2 << 20,  size=10 << 20),
-                    # part 5 takes us to 12 MiB offset, curtin leaves a 1 MiB
-                    # gap.
+                    # part 5 goes to 12 MiB offset, curtin leaves a 1 MiB gap.
                     PartData(number=6, offset=13 << 20, size=10 << 20),
                 ])
-            self.assertEqual(99 << 20, _get_extended_partition_size(dev, 1))
 
             p1kname = block.partition_kname(block.path_to_kname(dev), 1)
             self.assertTrue(block.is_extended_partition('/dev/' + p1kname))
@@ -487,11 +485,10 @@ class TestBlockMeta(IntegrationTestCase):
         with loop_dev(img) as dev:
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20,           size=1 << 10),
-                    PartData(number=5, offset=(2 << 20),         size=psize),
+                    PartData(number=1, offset=1 << 20, size=90 << 20),
+                    PartData(number=5, offset=(2 << 20), size=psize),
                     PartData(number=6, offset=(3 << 20) + psize, size=psize),
                 ])
-            self.assertEqual(90 << 20, _get_extended_partition_size(dev, 1))
 
         config = StorageConfigBuilder(version=2)
         config.add_image(path=img, size='100M', ptable='msdos', preserve=True)
@@ -504,10 +501,9 @@ class TestBlockMeta(IntegrationTestCase):
         with loop_dev(img) as dev:
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20,           size=1 << 10),
+                    PartData(number=1, offset=1 << 20, size=90 << 20),
                     PartData(number=5, offset=(3 << 20) + psize, size=psize),
                 ])
-            self.assertEqual(90 << 20, _get_extended_partition_size(dev, 1))
 
     def _test_wiping(self, ptable):
         # Test wiping behaviour.
@@ -674,14 +670,11 @@ class TestBlockMeta(IntegrationTestCase):
             self.create_data(dev, p6)
             self.assertEqual(
                 summarize_partitions(dev), [
-                    # extended partitions get a strange size in sysfs
-                    PartData(number=1, offset=1 << 20,  size=1 << 10),
+                    PartData(number=1, offset=1 << 20,  size=50 << 20),
                     PartData(number=5, offset=2 << 20,  size=10 << 20),
-                    # part 5 takes us to 12 MiB offset, curtin leaves a 1 MiB
-                    # gap.
+                    # part 5 goes to 12 MiB offset, curtin leaves a 1 MiB gap.
                     PartData(number=6, offset=13 << 20, size=10 << 20),
                 ])
-            self.assertEqual(50 << 20, _get_extended_partition_size(dev, 1))
 
         config.set_preserve()
         p6['resize'] = True
@@ -692,11 +685,10 @@ class TestBlockMeta(IntegrationTestCase):
             self.check_data(dev, p6)
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20,  size=1 << 10),
+                    PartData(number=1, offset=1 << 20,  size=50 << 20),
                     PartData(number=5, offset=2 << 20,  size=10 << 20),
                     PartData(number=6, offset=13 << 20, size=20 << 20),
                 ])
-            self.assertEqual(50 << 20, _get_extended_partition_size(dev, 1))
 
     def test_resize_extended(self):
         img = self.tmp_path('image.img')
@@ -711,11 +703,9 @@ class TestBlockMeta(IntegrationTestCase):
         with loop_dev(img) as dev:
             self.assertEqual(
                 summarize_partitions(dev), [
-                    # extended partitions get a strange size in sysfs
-                    PartData(number=1, offset=1 << 20,  size=1 << 10),
-                    PartData(number=5, offset=2 << 20,  size=49 << 20),
+                    PartData(number=1, offset=1 << 20, size=50 << 20),
+                    PartData(number=5, offset=2 << 20, size=49 << 20),
                 ])
-            self.assertEqual(50 << 20, _get_extended_partition_size(dev, 1))
 
         config.set_preserve()
         p1['resize'] = True
@@ -727,10 +717,9 @@ class TestBlockMeta(IntegrationTestCase):
         with loop_dev(img) as dev:
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20,  size=1 << 10),
+                    PartData(number=1, offset=1 << 20,  size=99 << 20),
                     PartData(number=5, offset=2 << 20,  size=98 << 20),
                 ])
-            self.assertEqual(99 << 20, _get_extended_partition_size(dev, 1))
 
     def test_split(self):
         img = self.tmp_path('image.img')
@@ -876,12 +865,11 @@ class TestBlockMeta(IntegrationTestCase):
             self.create_data(dev, p5)
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20, size=9 << 20),
-                    PartData(number=2, offset=10 << 20, size=1 << 10),
+                    PartData(number=1, offset=1 << 20,  size=9 << 20),
+                    PartData(number=2, offset=10 << 20, size=89 << 20),
                     PartData(number=5, offset=11 << 20, size=36 << 20),
                     PartData(number=6, offset=49 << 20, size=50 << 20),
                 ])
-            self.assertEqual(89 << 20, _get_extended_partition_size(dev, 2))
             self.assertEqual(9 << 20, _get_filesystem_size(dev, p1))
             self.assertEqual(36 << 20, _get_filesystem_size(dev, p5))
             self.assertEqual(50 << 20, _get_filesystem_size(dev, p6))
@@ -904,12 +892,11 @@ class TestBlockMeta(IntegrationTestCase):
             self.check_data(dev, p5)
             self.assertEqual(
                 summarize_partitions(dev), [
-                    PartData(number=1, offset=1 << 20, size=9 << 20),
-                    PartData(number=2, offset=10 << 20, size=1 << 10),
-                    PartData(number=5, offset=11 << 20, size=136 << 20),
+                    PartData(number=1, offset=1 << 20,   size=9 << 20),
+                    PartData(number=2, offset=10 << 20,  size=189 << 20),
+                    PartData(number=5, offset=11 << 20,  size=136 << 20),
                     PartData(number=6, offset=149 << 20, size=50 << 20),
                 ])
-            self.assertEqual(189 << 20, _get_extended_partition_size(dev, 2))
             self.assertEqual(9 << 20, _get_filesystem_size(dev, p1))
             self.assertEqual(136 << 20, _get_filesystem_size(dev, p5))
             self.assertEqual(50 << 20, _get_filesystem_size(dev, p6))

Follow ups