← Back to team overview

curtin-dev team mailing list archive

[Merge] ~dbungert/curtin:lp-2004609-swap-size-dropped into curtin:master

 

Dan Bungert has proposed merging ~dbungert/curtin:lp-2004609-swap-size-dropped into curtin:master.

Commit message:
block/v1: handle msdos+swap



Requested reviews:
  curtin developers (curtin-dev)

For more details, see:
https://code.launchpad.net/~dbungert/curtin/+git/curtin/+merge/436862
-- 
Your team curtin developers is requested to review the proposed merge of ~dbungert/curtin:lp-2004609-swap-size-dropped into curtin:master.
diff --git a/curtin/commands/block_meta.py b/curtin/commands/block_meta.py
index 74c491c..9ea543a 100644
--- a/curtin/commands/block_meta.py
+++ b/curtin/commands/block_meta.py
@@ -1097,9 +1097,13 @@ def partition_handler(info, storage_config, context):
                 partition_type = flag
             else:
                 partition_type = "primary"
-            cmd = ["parted", disk, "--script", "mkpart", partition_type,
-                   "%ss" % offset_sectors, "%ss" % str(offset_sectors +
-                                                       length_sectors)]
+            cmd = ["parted", disk, "--script", "mkpart", partition_type]
+            if flag == 'swap':
+                cmd.append("linux-swap")
+            cmd.extend((
+               "%ss" % offset_sectors,
+               "%ss" % str(offset_sectors + length_sectors),
+            ))
             if flag == 'boot':
                 cmd.extend(['set', str(partnumber), 'boot', 'on'])
 
diff --git a/tests/integration/test_block_meta.py b/tests/integration/test_block_meta.py
index 38b188a..ead1698 100644
--- a/tests/integration/test_block_meta.py
+++ b/tests/integration/test_block_meta.py
@@ -1230,3 +1230,16 @@ table-length: 256'''.encode()
             self.run_bm(config.render())
         self.assertPartitions(
             PartData(number=1, offset=1 << 20, size=1 << 20))
+
+    @parameterized.expand(((1,), (2,)))
+    def test_swap(self, sv):
+        self.img = self.tmp_path('image.img')
+        config = StorageConfigBuilder(version=sv)
+        config.add_image(path=self.img, create=True, size='20M',
+                         ptable='msdos')
+        config.add_part(number=1, offset=1 << 20, size=1 << 20, flag='swap')
+        self.run_bm(config.render())
+
+        self.assertPartitions(
+            PartData(number=1, offset=1 << 20, size=1 << 20, boot=False,
+                     partition_type='82'))
diff --git a/tests/unittests/test_commands_block_meta.py b/tests/unittests/test_commands_block_meta.py
index 7067bc0..0c198e6 100644
--- a/tests/unittests/test_commands_block_meta.py
+++ b/tests/unittests/test_commands_block_meta.py
@@ -654,6 +654,62 @@ class TestBlockMeta(CiTestCase):
                    'mkpart', 'primary', '2048s', '1001471s',
                    'set', '1', 'boot', 'on'], capture=True)])
 
+    def test_partition_handler_creates_swap(self):
+        """ Create a swap partition if the flag has requested as much """
+        self.config = {
+            'storage': {
+                'version': 1,
+                'config': [
+                    {'grub_device': True,
+                     'id': 'sda',
+                     'name': 'sda',
+                     'path': '/wark/xxx',
+                     'ptable': 'msdos',
+                     'type': 'disk',
+                     'wipe': 'superblock'},
+                    {'device': 'sda',
+                     'flag': 'swap',
+                     'id': 'sda-part1',
+                     'name': 'sda-part1',
+                     'number': 1,
+                     'offset': '4194304B',
+                     'size': '511705088B',
+                     'type': 'partition',
+                     'wipe': 'superblock'},
+                    {'id': 'sda1-root',
+                     'type': 'format',
+                     'fstype': 'swap',
+                     'volume': 'sda-part1'},
+                ],
+            }
+        }
+        self.storage_config = (
+            block_meta.extract_storage_ordered_dict(self.config))
+
+        disk_info = self.storage_config.get('sda')
+        part_info = self.storage_config.get('sda-part1')
+        disk_kname = disk_info.get('path')
+        part_kname = disk_kname + '1'
+        self.mock_getpath.side_effect = iter([
+            disk_kname,
+            part_kname,
+        ])
+        self.mock_block_get_part_table_type.return_value = 'dos'
+        kname = 'xxx'
+        self.mock_block_path_to_kname.return_value = kname
+        self.mock_block_sys_block_path.return_value = '/sys/class/block/xxx'
+        self.mock_block_sector_size.return_value = (512, 512)
+
+        block_meta.partition_handler(
+            part_info, self.storage_config, empty_context)
+        part_offset = 2048 * 512
+        self.mock_block_zero_file.assert_called_with(disk_kname, [part_offset],
+                                                     exclusive=False)
+        self.mock_subp.assert_has_calls(
+            [call(['parted', disk_kname, '--script',
+                   'mkpart', 'primary', 'linux-swap', '2048s', '1001471s',
+                   ], capture=True)])
+
     @patch('curtin.util.write_file')
     def test_mount_handler_defaults(self, mock_write_file):
         """Test mount_handler has defaults to 'defaults' for mount options"""

Follow ups