diff --git a/scripts/raid-size-tests.py b/scripts/raid-size-tests.py index 7b39cf72..0a28d985 100644 --- a/scripts/raid-size-tests.py +++ b/scripts/raid-size-tests.py @@ -7,16 +7,13 @@ # raid devices (backed by sparse files in a tmpfs) and comparing their sizes # with the estimates. It must be run as root. -import atexit import os import random -import shutil import subprocess import sys import tempfile import uuid -import attr from subiquity.models.filesystem import ( align_down, @@ -25,6 +22,9 @@ from subiquity.models.filesystem import ( humanize_size, raidlevels, ) +from subiquity.models.tests.test_filesystem import ( + FakeDev, + ) tmpdir = tempfile.mkdtemp() @@ -96,11 +96,6 @@ def get_real_raid_size(raid): stdout=subprocess.PIPE, encoding='ascii').stdout.strip()) -@attr.s -class FakeDev: - size = attr.ib() - - def verify_size_ok(level, sizes): r = False try: diff --git a/subiquity/models/filesystem.py b/subiquity/models/filesystem.py index ab89878d..1f06c008 100644 --- a/subiquity/models/filesystem.py +++ b/subiquity/models/filesystem.py @@ -258,10 +258,15 @@ def calculate_data_offset(devsize): return data_offset +def raid_device_sort(devices): + return sorted(devices, key=lambda d: d.id) + + # This this is tested against reality in ./scripts/get-raid-sizes.py def get_raid_size(level, devices): if len(devices) == 0: return 0 + devices = raid_device_sort(devices) data_offset = calculate_data_offset(devices[0].size) sizes = [align_down(dev.size - data_offset) for dev in devices] min_size = min(sizes) @@ -893,6 +898,13 @@ class Raid(_Device): name = attr.ib() raidlevel = attr.ib(converter=lambda x: raidlevels_by_value[x].value) devices = attributes.reflist(backlink="_constructed_device") + + def serialize_devices(self): + # Surprisingly, the order of devices passed to mdadm --create + # matters (see get_raid_size) so we sort devices here the same + # way get_raid_size does. + return [d.id for d in raid_device_sort(self.devices)] + spare_devices = attributes.reflist(backlink="_constructed_device") preserve = attr.ib(default=False) diff --git a/subiquity/models/tests/test_filesystem.py b/subiquity/models/tests/test_filesystem.py index c37672c1..af854468 100644 --- a/subiquity/models/tests/test_filesystem.py +++ b/subiquity/models/tests/test_filesystem.py @@ -19,6 +19,7 @@ import unittest import attr from subiquity.models.filesystem import ( + attributes, Bootloader, dehumanize_size, DeviceAction, @@ -108,14 +109,17 @@ class TestDehumanizeSize(unittest.TestCase): self.assertEqual(expected_error, actual_error) +@attr.s +class FakeDev: + + size = attr.ib() + id = attributes.idfield("fakedev") + + class TestRoundRaidSize(unittest.TestCase): def test_lp1816777(self): - @attr.s - class FakeDev: - size = attr.ib() - self.assertLessEqual( get_raid_size("raid1", [FakeDev(500107862016)]*2), 499972571136)