← Back to team overview

curtin-dev team mailing list archive

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