curtin-dev team mailing list archive
-
curtin-dev team
-
Mailing list archive
-
Message #02065
Re: [Merge] ~mwhudson/curtin:v2-partition-ops into curtin:master
Diff comments:
> diff --git a/tests/integration/test_block_meta.py b/tests/integration/test_block_meta.py
> index 72cb19a..f729e81 100644
> --- a/tests/integration/test_block_meta.py
> +++ b/tests/integration/test_block_meta.py
> @@ -187,6 +223,148 @@ class TestBlockMeta(IntegrationTestCase):
> p1kname = block.partition_kname(block.path_to_kname(dev), 1)
> self.assertTrue(block.is_extended_partition('/dev/' + p1kname))
>
> + def test_logical_v1(self):
> + self._test_logical(1)
> +
> + def test_logical_v2(self):
> + self._test_logical(2)
> +
> + def _test_replace_partition(self, ptable):
> + psize = 20 << 20
> + img = self.tmp_path('image.img')
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='100M', ptable=ptable)
> + config.add_part(size=psize, number=1)
> + config.add_part(size=psize, number=2)
> + self.run_bm(config.render())
> +
> + with loop_dev(img) as dev:
> + self.assertEqual(
> + summarize_partitions(dev), [
> + PartData(number=1, offset=1 << 20, size=psize),
> + PartData(number=2, offset=(1 << 20) + psize, size=psize),
> + ])
> +
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='100M', ptable=ptable, preserve=True)
> + config.add_part(size=psize, number=1, offset=1 << 20, preserve=True)
> + config.add_part(size=psize*2, number=2)
> + self.run_bm(config.render())
> +
> + with loop_dev(img) as dev:
> + self.assertEqual(
> + summarize_partitions(dev), [
> + PartData(number=1, offset=1 << 20, size=psize),
> + PartData(number=2, offset=(1 << 20) + psize, size=2*psize),
> + ])
> +
> + def test_replace_partition_gpt_v2(self):
> + self._test_replace_partition('gpt')
> +
> + def test_replace_partition_msdos_v2(self):
> + self._test_replace_partition('msdos')
> +
> + def test_delete_logical_partition(self):
> + # The test case that resulted in a lot of hair-pulling:
> + # deleting a logical partition renumbers any later partitions
> + # (so you cannot stably refer to partitions by number!)
> + psize = 20 << 20
> + img = self.tmp_path('image.img')
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='100M', ptable='msdos')
> + config.add_part(size='90M', number=1, flag='extended')
> + config.add_part(size=psize, number=5, flag='logical')
> + config.add_part(size=psize, number=6, flag='logical')
> + self.run_bm(config.render())
> +
> + 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=6, offset=(3 << 20) + psize, size=psize),
> + ])
> +
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='100M', ptable='msdos', preserve=True)
> + config.add_part(size='90M', number=1, flag='extended', preserve=True)
> + config.add_part(
> + size=psize, number=5, flag='logical', offset=(3 << 20) + psize,
> + preserve=True)
> + self.run_bm(config.render())
> +
> + with loop_dev(img) as dev:
> + self.assertEqual(
> + summarize_partitions(dev), [
> + PartData(number=1, offset=1 << 20, size=1 << 10),
> + PartData(number=5, offset=(3 << 20) + psize, size=psize),
> + ])
> +
> + def _test_wiping(self, ptable):
> + # Test wiping behaviour.
> + #
> + # Paritions that should be (superblock, i.e. first and last
> + # megabyte) wiped:
> + #
> + # 1) New partitions
> + # 2) Partitions that are being removed, i.e. no longer present
> + # 3) Preserved partitions with an explicit wipe
> + #
> + # Partitions that should not be wiped:
> + #
> + # 4) Preserved partitions with no wipe field.
> + #
> + # We test this by creating some partitions with block-meta,
> + # writing content to them, then running block-meta again, with
> + # each partition matching one of the conditions above.
> + ONE_MEG_BYTES = 1 << 20
Reuse the constant from earlier?
> +
> + img = self.tmp_path('image.img')
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='30M', ptable=ptable)
> + config.add_part(size='5M', number=1, offset='5M')
> + config.add_part(size='5M', number=2, offset='10M')
> + config.add_part(size='5M', number=3, offset='15M')
> + config.add_part(size='5M', number=4, offset='20M')
> + self.run_bm(config.render())
> +
> + part_offset_sizes = {}
> + with loop_dev(img) as dev:
> + for kname, number, offset, size in block.sysfs_partition_data(dev):
> + content = bytes([number])
> + with open(block.kname_to_path(kname), 'wb') as fp:
> + fp.write(content*size)
> + part_offset_sizes[number] = (offset, size)
> +
> + config = StorageConfigBuilder(version=2)
> + config.add_image(path=img, size='30M', ptable=ptable, preserve=True)
> + config.add_part(size='5M', number=1, offset='5M')
> + # Partition 2 is being deleted.
> + config.add_part(
> + size='5M', number=3, offset='15M', preserve=True,
> + wipe='superblock')
> + config.add_part(size='5M', number=4, offset='20M', preserve=True)
> + self.run_bm(config.render())
> +
> + expected_content = {1: {0}, 2: {0}, 3: {0}, 4: {4}}
> +
> + with loop_dev(img) as dev:
> + with open(dev, 'rb') as fp:
> + for nr, (offset, size) in part_offset_sizes.items():
> + expected = expected_content[nr]
> + fp.seek(offset)
> + first = set(fp.read(ONE_MEG_BYTES))
> + fp.seek(offset + size - ONE_MEG_BYTES)
> + last = set(fp.read(ONE_MEG_BYTES))
> + self.assertEqual(first, expected)
> + self.assertEqual(last, expected)
> +
> + def test_wiping_gpt(self):
> + self._test_wiping('gpt')
> +
> + def test_wiping_msdos(self):
> + self._test_wiping('msdos')
> +
> def test_raw_image(self):
> img = self.tmp_path('image.img')
> config = StorageConfigBuilder(version=1)
--
https://code.launchpad.net/~mwhudson/curtin/+git/curtin/+merge/414079
Your team curtin developers is requested to review the proposed merge of ~mwhudson/curtin:v2-partition-ops into curtin:master.
References