Mauricio Faria de Oliveira has proposed merging ~mfo/maas:3.0 into maas:3.0.
Requested reviews: Mauricio Faria de Oliveira (mfo) For more details, see: https://code.launchpad.net/~mfo/maas/+git/maas/+merge/443686 Please ignore this. It's just for unit tests. -- Your team MAAS Committers is subscribed to branch maas:3.0.
diff --git a/debian/changelog b/debian/changelog index 7c4cd20..00141ab 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +maas (1:3.0.1-0ubuntu1) focal; urgency=medium + + * New upstream release, MAAS 3.0.1. + - Revert "Add VMFS7 storage layout for VMware ESXi 7.0" + - Update maas-ui to 08f3762e1102 3.0 branch: select fixes only (for maas 3.0.1) (#4935) + + -- Mauricio Faria de Oliveira <[email protected]> Fri, 26 May 2023 13:07:34 -0300 + maas (1:3.0.0-0ubuntu1) focal; urgency=medium * New upstream release, MAAS 3.0.0. diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py index dbc5b79..5746a55 100644 --- a/src/maasserver/forms/__init__.py +++ b/src/maasserver/forms/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2012-2021 Canonical Ltd. This software is licensed under the +# Copyright 2012-2020 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Forms.""" @@ -154,7 +154,7 @@ from maasserver.models.blockdevice import MIN_BLOCK_DEVICE_SIZE from maasserver.models.partition import MIN_PARTITION_SIZE from maasserver.models.partitiontable import PARTITION_TABLE_TYPE_CHOICES from maasserver.permissions import NodePermission, ResourcePoolPermission -from maasserver.storage_layouts import VMFS6StorageLayout, VMFS7StorageLayout +from maasserver.storage_layouts import VMFS6StorageLayout from maasserver.utils.converters import machine_readable_bytes from maasserver.utils.forms import ( compose_invalid_choice_text, @@ -2777,7 +2777,7 @@ class FormatPartitionForm(Form): cleaned_data = super().clean() if self.partition.is_vmfs_partition(): set_form_error( - self, "VMFS", "Base VMFS partitions may not be formatted." + self, "VMFS6", "VMFS6 partitions may not be formatted." ) return cleaned_data @@ -4085,18 +4085,16 @@ class CreateVMFSForm(CreateVolumeGroupForm): """For validating and saving a new VMFS group.""" def clean(self): - """Validate that the VMFS storage layout is applied.""" + """Validate that the VMFS6 storage layout is applied.""" cleaned_data = super().clean() - vmfs6_layout = VMFS6StorageLayout(self.node) - vmfs6_bd = vmfs6_layout.is_layout() - vmfs7_layout = VMFS7StorageLayout(self.node) - vmfs7_bd = vmfs7_layout.is_layout() - if vmfs6_bd is None and vmfs7_bd is None: + vmfs_layout = VMFS6StorageLayout(self.node) + vmfs_bd = vmfs_layout.is_layout() + if vmfs_bd is None: set_form_error( self, - "VMFS", + "VMFS6", "VMFS Datastores may only be created after the " - "VMFS6 or VMFS7 storage layout has been applied.", + "VMFS6 storage layout has been applied.", ) return cleaned_data diff --git a/src/maasserver/forms/tests/test_vmfs.py b/src/maasserver/forms/tests/test_vmfs.py index d96c76b..21bd4ba 100644 --- a/src/maasserver/forms/tests/test_vmfs.py +++ b/src/maasserver/forms/tests/test_vmfs.py @@ -1,42 +1,40 @@ -# Copyright 2019-2021 Canonical Ltd. This software is licensed under the +# Copyright 2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Tests for all forms that are used with `VMFS`.""" -import random import uuid from maasserver.enum import FILESYSTEM_TYPE from maasserver.forms import CreateVMFSForm, UpdateVMFSForm from maasserver.models.blockdevice import MIN_BLOCK_DEVICE_SIZE from maasserver.models.partitiontable import PARTITION_TABLE_EXTRA_SPACE -from maasserver.storage_layouts import VMFS6StorageLayout, VMFS7StorageLayout +from maasserver.storage_layouts import VMFS6StorageLayout from maasserver.testing.factory import factory from maasserver.testing.testcase import MAASServerTestCase from maasserver.tests.test_storage_layouts import LARGE_BLOCK_DEVICE -def make_Node_with_VMFS_layout(*args, **kwargs): - """Create a node with the VMFS storage layout applied.""" +def make_Node_with_VMFS6_layout(*args, **kwargs): + """Create a node with the VMFS6 storage layout applied.""" kwargs["with_boot_disk"] = False node = factory.make_Node(*args, **kwargs) factory.make_PhysicalBlockDevice(node=node, size=LARGE_BLOCK_DEVICE) - layout_class = random.choice([VMFS6StorageLayout, VMFS7StorageLayout]) - layout = layout_class(node) + layout = VMFS6StorageLayout(node) layout.configure() return node class TestCreateVMFSForm(MAASServerTestCase): def test_requires_fields(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() form = CreateVMFSForm(node, data={}) self.assertFalse(form.is_valid(), form.errors) self.assertItemsEqual(["name"], form.errors.keys()) def test_is_not_valid_if_invalid_uuid(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_device = factory.make_PhysicalBlockDevice(node=node) data = { "name": factory.make_name("name"), @@ -50,7 +48,7 @@ class TestCreateVMFSForm(MAASServerTestCase): self.assertEqual({"uuid": ["Enter a valid value."]}, form._errors) def test_is_not_valid_missing_block_devices_and_partitions(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() data = {"name": factory.make_name("name"), "uuid": uuid.uuid4()} form = CreateVMFSForm(node, data=data) self.assertFalse( @@ -68,7 +66,7 @@ class TestCreateVMFSForm(MAASServerTestCase): ) def test_is_not_valid_if_block_device_does_not_belong_to_node(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_device = factory.make_PhysicalBlockDevice() data = { "name": factory.make_name("name"), @@ -91,7 +89,7 @@ class TestCreateVMFSForm(MAASServerTestCase): ) def test_is_not_valid_if_partition_does_not_belong_to_node(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() partition = factory.make_Partition() data = { "name": factory.make_name("name"), @@ -122,10 +120,10 @@ class TestCreateVMFSForm(MAASServerTestCase): } form = CreateVMFSForm(node, data=data) self.assertFalse(form.is_valid()) - self.assertIn("VMFS", form.errors) + self.assertIn("VMFS6", form.errors) def test_creates_volume_group_with_block_devices(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_devices = [ factory.make_PhysicalBlockDevice(node=node) for _ in range(3) ] @@ -146,7 +144,7 @@ class TestCreateVMFSForm(MAASServerTestCase): ) def test_creates_with_block_devices_by_name(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_devices = [ factory.make_PhysicalBlockDevice(node=node) for _ in range(3) ] @@ -169,7 +167,7 @@ class TestCreateVMFSForm(MAASServerTestCase): ) def test_creates_with_partitions(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_device = factory.make_PhysicalBlockDevice( node=node, size=(MIN_BLOCK_DEVICE_SIZE * 3) + PARTITION_TABLE_EXTRA_SPACE, @@ -192,7 +190,7 @@ class TestCreateVMFSForm(MAASServerTestCase): ) def test_creates_with_partitions_by_name(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() block_device = factory.make_PhysicalBlockDevice( node=node, size=(MIN_BLOCK_DEVICE_SIZE * 3) + PARTITION_TABLE_EXTRA_SPACE, @@ -250,7 +248,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): self.assertEqual(new_uuid, vmfs.uuid) def test_adds_block_device(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) data = {"add_block_devices": [block_device.id]} @@ -263,7 +261,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): ) def test_adds_block_device_by_name(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) data = {"add_block_devices": [block_device.name]} @@ -276,7 +274,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): ) def test_adds_partition(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) partition_table = factory.make_PartitionTable( @@ -292,7 +290,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): ) def test_adds_partition_by_name(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) partition_table = factory.make_PartitionTable( @@ -308,7 +306,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): ) def test_removes_partition(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) partition_table = factory.make_PartitionTable( @@ -327,7 +325,7 @@ class TestUpdateVMFSForm(MAASServerTestCase): self.assertIsNone(partition.get_effective_filesystem()) def test_removes_partition_by_name(self): - node = make_Node_with_VMFS_layout() + node = make_Node_with_VMFS6_layout() vmfs = factory.make_VMFS(node=node) block_device = factory.make_PhysicalBlockDevice(node=node) partition_table = factory.make_PartitionTable( diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py index 0bf7d83..b61ccbb 100644 --- a/src/maasserver/models/node.py +++ b/src/maasserver/models/node.py @@ -160,7 +160,6 @@ from maasserver.storage_layouts import ( StorageLayoutError, StorageLayoutMissingBootDiskError, VMFS6StorageLayout, - VMFS7StorageLayout, ) from maasserver.utils.dns import validate_hostname from maasserver.utils.mac import get_vendor_for_mac @@ -1516,10 +1515,8 @@ class Node(CleanSave, TimestampedModel): # layout is created with a datastore. If the user applied the VMFS # storage layout a datastore must be defined as one will always be # created. - if ( - VMFS6StorageLayout(self).is_layout() - or VMFS7StorageLayout(self).is_layout() - ): + vmfs_layout = VMFS6StorageLayout(self) + if vmfs_layout.is_layout() is not None: fs_groups = self.virtualblockdevice_set.filter( filesystem_group__group_type=FILESYSTEM_GROUP_TYPE.VMFS6 ) diff --git a/src/maasserver/models/partition.py b/src/maasserver/models/partition.py index 62895f8..09e3cb4 100644 --- a/src/maasserver/models/partition.py +++ b/src/maasserver/models/partition.py @@ -1,4 +1,4 @@ -# Copyright 2015-2021 Canonical Ltd. This software is licensed under the +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Model for a partition in a partition table.""" @@ -206,10 +206,7 @@ class Partition(CleanSave, TimestampedModel): def get_partition_number(self): """Return the partition number in the table.""" # Avoid circular imports. - from maasserver.storage_layouts import ( - VMFS6StorageLayout, - VMFS7StorageLayout, - ) + from maasserver.storage_layouts import VMFS6StorageLayout # Sort manually instead of with `order_by`, this will prevent django # from making a query if the partitions are already cached. @@ -226,26 +223,18 @@ class Partition(CleanSave, TimestampedModel): boot_disk = node.get_boot_disk() bios_boot_method = node.get_bios_boot_method() block_device = self.partition_table.block_device - vmfs6_layout = VMFS6StorageLayout(self.get_node()) - vmfs6_bd = vmfs6_layout.is_layout() - vmfs7_layout = VMFS7StorageLayout(self.get_node()) - vmfs7_bd = vmfs7_layout.is_layout() - # VMware ESXi is a DD image but MAAS allows partitions to - # be added to the end of the disk as well as resize the - # datastore partition. The EFI partition is already in the - # image so there is no reason to account for it. - if vmfs6_bd is not None: - if vmfs6_bd.id == block_device.id and idx >= 3: - # VMware ESXi 6.7 skips the 4th partition. + vmfs_layout = VMFS6StorageLayout(self.get_node()) + vmfs_bd = vmfs_layout.is_layout() + if vmfs_bd is not None: + # VMware ESXi is a DD image but MAAS allows partitions to + # be added to the end of the disk as well as resize the + # datastore partition. The EFI partition is already in the + # image so there is no reason to account for it. + if vmfs_bd.id == block_device.id and idx >= 3: + # VMware ESXi skips the 4th partition. return idx + 2 else: return idx + 1 - elif vmfs7_bd is not None: - if vmfs7_bd.id == block_device.id and idx >= 1: - # VMware ESXi 7.0 skips the partitions 2-4. - return idx + 4 - else: - return idx + 1 elif arch == "ppc64el" and block_device.id == boot_disk.id: return idx + 2 elif arch == "amd64" and bios_boot_method != "uefi": @@ -352,7 +341,7 @@ class Partition(CleanSave, TimestampedModel): } ) - def is_vmfs6_partition(self): + def is_vmfs_partition(self): # Avoid circular imports. from maasserver.storage_layouts import VMFS6StorageLayout @@ -370,27 +359,6 @@ class Partition(CleanSave, TimestampedModel): return False return True - def is_vmfs7_partition(self): - # Avoid circular imports. - from maasserver.storage_layouts import VMFS7StorageLayout - - vmfs_layout = VMFS7StorageLayout(self.get_node()) - vmfs_bd = vmfs_layout.is_layout() - if vmfs_bd is None: - return False - if vmfs_bd.id != self.partition_table.block_device_id: - return False - if self.get_partition_number() < len(vmfs_layout.base_partitions) + 3: - # A user may apply the VMFS7 layout and leave space at the end of - # the disk for additional VMFS datastores. Those partitions may be - # deleted, the base partitions may not as they are part of the DD. - # The + 3 is to account for partition 2-4 being skipped. - return True - return False - - def is_vmfs_partition(self): - return self.is_vmfs6_partition() or self.is_vmfs7_partition() - def delete(self): """Delete the partition. diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py index eff9617..669eeb4 100644 --- a/src/maasserver/models/tests/test_node.py +++ b/src/maasserver/models/tests/test_node.py @@ -140,7 +140,6 @@ from maasserver.storage_layouts import ( StorageLayoutError, StorageLayoutMissingBootDiskError, VMFS6StorageLayout, - VMFS7StorageLayout, ) from maasserver.testing.eventloop import ( RegionEventLoopFixture, @@ -9400,8 +9399,7 @@ class TestNode_Start(MAASTransactionServerTestCase): osystem="esxi", distro_series="6.7", with_boot_disk=False ) factory.make_PhysicalBlockDevice(node=node, size=(100 * 1024 ** 3)) - layout_class = random.choice([VMFS6StorageLayout, VMFS7StorageLayout]) - layout = layout_class(node) + layout = VMFS6StorageLayout(node) layout.configure() self.assertItemsEqual([], node.storage_layout_issues()) @@ -9410,8 +9408,7 @@ class TestNode_Start(MAASTransactionServerTestCase): osystem="esxi", distro_series="6.7", with_boot_disk=False ) factory.make_PhysicalBlockDevice(node=node, size=(100 * 1024 ** 3)) - layout_class = random.choice([VMFS6StorageLayout, VMFS7StorageLayout]) - layout = layout_class(node) + layout = VMFS6StorageLayout(node) layout.configure() node.virtualblockdevice_set.delete() self.assertEqual( @@ -9425,8 +9422,7 @@ class TestNode_Start(MAASTransactionServerTestCase): with_boot_disk=False, ) factory.make_PhysicalBlockDevice(node=node, size=(100 * 1024 ** 3)) - layout_class = random.choice([VMFS6StorageLayout, VMFS7StorageLayout]) - layout = layout_class(node) + layout = VMFS6StorageLayout(node) layout.configure() self.assertItemsEqual( [ diff --git a/src/maasserver/models/tests/test_partition.py b/src/maasserver/models/tests/test_partition.py index efb6b00..de94701 100644 --- a/src/maasserver/models/tests/test_partition.py +++ b/src/maasserver/models/tests/test_partition.py @@ -1,4 +1,4 @@ -# Copyright 2015-2021 Canonical Ltd. This software is licensed under the +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Tests for `Partition`.""" @@ -29,7 +29,7 @@ from maasserver.models.partitiontable import ( PARTITION_TABLE_EXTRA_SPACE, PREP_PARTITION_SIZE, ) -from maasserver.storage_layouts import VMFS6StorageLayout, VMFS7StorageLayout +from maasserver.storage_layouts import VMFS6StorageLayout from maasserver.testing.factory import factory from maasserver.testing.testcase import MAASServerTestCase from maasserver.tests.test_storage_layouts import LARGE_BLOCK_DEVICE @@ -470,7 +470,7 @@ class TestPartition(MAASServerTestCase): self.expectThat(idx, Equals(partition.get_partition_number())) idx += 1 - def test_get_partition_number_returns_vmfs6_order(self): + def test_get_partition_number_returns_vmfs_order(self): node = factory.make_Node(with_boot_disk=False) bd = factory.make_PhysicalBlockDevice( node=node, size=LARGE_BLOCK_DEVICE @@ -483,19 +483,6 @@ class TestPartition(MAASServerTestCase): [part.get_partition_number() for part in pt.partitions.all()], ) - def test_get_partition_number_returns_vmfs7_order(self): - node = factory.make_Node(with_boot_disk=False) - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - layout.configure() - pt = bd.get_partitiontable() - self.assertItemsEqual( - [1, 5, 6, 7, 8], - [part.get_partition_number() for part in pt.partitions.all()], - ) - def test_get_partition_number_returns_starting_at_2_for_amd64_gpt(self): node = factory.make_Node( architecture="amd64/generic", @@ -543,7 +530,7 @@ class TestPartition(MAASServerTestCase): # Skip the extended partition. idx += 1 - def test_is_vmfs6_partition(self): + def test_is_vmfs_partition(self): node = factory.make_Node(with_boot_disk=False) bd = factory.make_PhysicalBlockDevice( node=node, size=LARGE_BLOCK_DEVICE @@ -552,45 +539,13 @@ class TestPartition(MAASServerTestCase): layout.configure() pt = bd.get_partitiontable() for partition in pt.partitions.all(): - self.assertTrue(partition.is_vmfs6_partition()) - - def test_is_vmfs7_partition(self): - node = factory.make_Node(with_boot_disk=False) - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - layout.configure() - pt = bd.get_partitiontable() - for partition in pt.partitions.all(): - if partition.get_partition_number() >= 8: - self.assertFalse(partition.is_vmfs7_partition()) - else: - self.assertTrue(partition.is_vmfs7_partition()) - - def test_is_vmfs_partition(self): - node = factory.make_Node(with_boot_disk=False) - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - vmfs_layout = random.choice([VMFS6StorageLayout, VMFS7StorageLayout]) - layout = vmfs_layout(node) - layout_name = layout.configure() - pt = bd.get_partitiontable() - for partition in pt.partitions.all(): - if ( - layout_name == "VMFS7" - and partition.get_partition_number() >= 8 - ): - self.assertFalse(partition.is_vmfs_partition()) - else: - self.assertTrue(partition.is_vmfs_partition()) + self.assertTrue(partition.is_vmfs_partition()) def test_is_vmfs_partition_false_no_vmfs(self): partition = factory.make_Partition() self.assertFalse(partition.is_vmfs_partition()) - def test_is_vmfs6_partition_false_different_block_device(self): + def test_is_vmfs_partition_false_different_block_device(self): node = factory.make_Node(with_boot_disk=False) factory.make_PhysicalBlockDevice(node=node, size=LARGE_BLOCK_DEVICE) layout = VMFS6StorageLayout(node) @@ -598,15 +553,7 @@ class TestPartition(MAASServerTestCase): other_bd_part = factory.make_Partition(node=node) self.assertFalse(other_bd_part.is_vmfs_partition()) - def test_is_vmfs7_partition_false_different_block_device(self): - node = factory.make_Node(with_boot_disk=False) - factory.make_PhysicalBlockDevice(node=node, size=LARGE_BLOCK_DEVICE) - layout = VMFS7StorageLayout(node) - layout.configure() - other_bd_part = factory.make_Partition(node=node) - self.assertFalse(other_bd_part.is_vmfs_partition()) - - def test_is_vmfs6_partition_false_extra_partition(self): + def test_is_vmfs_partition_false_extra_partition(self): node = factory.make_Node(with_boot_disk=False) bd = factory.make_PhysicalBlockDevice( node=node, size=LARGE_BLOCK_DEVICE @@ -617,17 +564,6 @@ class TestPartition(MAASServerTestCase): extra_partition = pt.add_partition() self.assertFalse(extra_partition.is_vmfs_partition()) - def test_is_vmfs7_partition_false_extra_partition(self): - node = factory.make_Node(with_boot_disk=False) - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node, {"root_size": 10 * 1024 ** 3}) - layout.configure() - pt = bd.get_partitiontable() - extra_partition = pt.add_partition() - self.assertFalse(extra_partition.is_vmfs_partition()) - def test_delete_not_allowed_if_part_of_filesystem_group(self): partition = factory.make_Partition( size=1024 ** 3, block_device_size=2 * 1024 ** 3 @@ -641,7 +577,7 @@ class TestPartition(MAASServerTestCase): error.message, ) - def test_delete_not_allowed_if_part_of_vmfs6_layout(self): + def test_delete_not_allowed_if_part_of_vmfs_layout(self): node = factory.make_Node(with_boot_disk=False) bd = factory.make_PhysicalBlockDevice( node=node, size=LARGE_BLOCK_DEVICE @@ -652,17 +588,6 @@ class TestPartition(MAASServerTestCase): partition = random.choice(list(pt.partitions.all())) self.assertRaises(ValidationError, partition.delete) - def test_delete_not_allowed_if_part_of_vmfs7_layout(self): - node = factory.make_Node(with_boot_disk=False) - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - layout.configure() - pt = bd.get_partitiontable() - partition = random.choice(list(pt.partitions.all())) - self.assertRaises(ValidationError, partition.delete) - def test_delete(self): partition = factory.make_Partition() partition.delete() diff --git a/src/maasserver/storage_layouts.py b/src/maasserver/storage_layouts.py index 52dd20e..467ca87 100644 --- a/src/maasserver/storage_layouts.py +++ b/src/maasserver/storage_layouts.py @@ -1,4 +1,4 @@ -# Copyright 2015-2021 Canonical Ltd. This software is licensed under the +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Storage layouts.""" @@ -812,7 +812,7 @@ class VMFS6StorageLayout(StorageLayoutBase): def clean(self): cleaned_data = super().clean() if self.boot_disk.size < 1024 ** 3: - set_form_error(self, "size", "Boot disk must be at least 10G.") + set_form_error(self, "size", "Boot disk must be atleast 10G.") return cleaned_data def configure_storage(self, allow_fallback): @@ -870,8 +870,6 @@ class VMFS6StorageLayout(StorageLayoutBase): for i, (partition, base_partition) in enumerate( zip(ordered_partitions, self.base_partitions) ): - if (i + 1) == len(self.base_partitions): - return bd if partition.bootable != base_partition.get("bootable", False): break # Skip checking the size of the Datastore partition as that @@ -880,42 +878,11 @@ class VMFS6StorageLayout(StorageLayoutBase): continue if partition.size != base_partition["size"]: break + if (i + 1) == len(self.base_partitions): + return bd return None -class VMFS7StorageLayout(VMFS6StorageLayout): - """VMFS7 layout. - - The VMware ESXi 7+ image is a DD. The image has 5 partitions which are - in order but not linear. Users may only change the last partition which - is partition 8 and stored at the end of the disk. - - NAME PARTITION SIZE START BLOCK END BLOCK - EFI System 1 105MB 0 105 - Basic Data 5 1074MB 106 1180 - Basic Data 6 1074MB 1181 2255 - VMFSL 7 8.5GB 2256 10959 - VMFS 8 Remaining 10960 End of disk - """ - - base_partitions = [ - # EFI System - {"size": 105 * 1024 ** 2, "bootable": True}, - # Basic Data - {"size": 1074 * 1024 ** 2}, - # Basic Data - {"size": 1074 * 1024 ** 2}, - # VMFSL - {"size": 8704 * 1024 ** 2}, - # VMFS - {"size": 0}, - ] - - def configure_storage(self, allow_fallback): - super().configure_storage(allow_fallback) - return "VMFS7" - - class BlankStorageLayout(StorageLayoutBase): """Blank layout. @@ -947,7 +914,6 @@ STORAGE_LAYOUTS = { "lvm": ("LVM layout", LVMStorageLayout), "bcache": ("Bcache layout", BcacheStorageLayout), "vmfs6": ("VMFS6 layout", VMFS6StorageLayout), - "vmfs7": ("VMFS7 layout", VMFS7StorageLayout), "blank": ("No storage (blank) layout", BlankStorageLayout), } diff --git a/src/maasserver/tests/test_storage_layouts.py b/src/maasserver/tests/test_storage_layouts.py index c85425b..29dcffa 100644 --- a/src/maasserver/tests/test_storage_layouts.py +++ b/src/maasserver/tests/test_storage_layouts.py @@ -1,4 +1,4 @@ -# Copyright 2015-2021 Canonical Ltd. This software is licensed under the +# Copyright 2015-2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Test the storage layouts.""" @@ -42,7 +42,6 @@ from maasserver.storage_layouts import ( StorageLayoutForm, StorageLayoutMissingBootDiskError, VMFS6StorageLayout, - VMFS7StorageLayout, ) from maasserver.testing.factory import factory from maasserver.testing.testcase import MAASServerTestCase @@ -87,7 +86,6 @@ class TestFormHelpers(MAASServerTestCase): ("lvm", "LVM layout"), ("bcache", "Bcache layout"), ("vmfs6", "VMFS6 layout"), - ("vmfs7", "VMFS7 layout"), ("blank", "No storage (blank) layout"), ], get_storage_layout_choices(), @@ -1886,7 +1884,7 @@ class TestVMFS6StorageLayout(MAASServerTestCase): layout = VMFS6StorageLayout(node) error = self.assertRaises(StorageLayoutFieldsError, layout.configure) self.assertEqual( - {"size": ["Boot disk must be at least 10G."]}, error.message_dict + {"size": ["Boot disk must be atleast 10G."]}, error.message_dict ) def test_accepts_root_device_param(self): @@ -1984,139 +1982,6 @@ class TestVMFS6StorageLayout(MAASServerTestCase): self.assertIsNone(vmfs_layout.is_layout(), layout_name) -class TestVMFS7StorageLayout(MAASServerTestCase): - def test_init_sets_up_all_fields(self): - node = factory.make_Node(with_boot_disk=False) - factory.make_PhysicalBlockDevice(node=node, size=LARGE_BLOCK_DEVICE) - layout = VMFS7StorageLayout(node) - self.assertItemsEqual( - ["root_device", "root_size", "boot_size"], layout.fields.keys() - ) - - def test_creates_layout(self): - node = factory.make_Node(with_boot_disk=False) - node.boot_disk = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - self.assertEqual("VMFS7", layout.configure()) - pt = node.boot_disk.get_partitiontable() - self.assertDictEqual( - { - "%s-part1" % node.boot_disk.name: 105 * 1024 ** 2, - "%s-part5" % node.boot_disk.name: 1074 * 1024 ** 2, - "%s-part6" % node.boot_disk.name: 1074 * 1024 ** 2, - "%s-part7" % node.boot_disk.name: 8704 * 1024 ** 2, - "%s-part8" - % node.boot_disk.name: ( - node.boot_disk.size - - 105 * 1024 ** 2 - - 1074 * 1024 ** 2 - - 1074 * 1024 ** 2 - - 8704 * 1024 ** 2 - - 7 * 1024 ** 2 - ), - }, - {part.name: part.size for part in pt.partitions.all()}, - ) - - def test_clean_validates_min_size(self): - node = factory.make_Node(with_boot_disk=False) - node.boot_disk = factory.make_PhysicalBlockDevice( - node=node, size=1024 ** 3 - 1 - ) - layout = VMFS7StorageLayout(node) - error = self.assertRaises(StorageLayoutFieldsError, layout.configure) - self.assertEqual( - {"size": ["Boot disk must be at least 10G."]}, error.message_dict - ) - - def test_accepts_root_device_param(self): - # Regression test for LP:1825241 - node = factory.make_Node(with_boot_disk=False) - node.boot_disk = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - root_disk = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node, {"root_device": root_disk.id}) - self.assertEqual("VMFS7", layout.configure()) - pt = root_disk.get_partitiontable() - self.assertDictEqual( - { - "%s-part1" % root_disk.name: 105 * 1024 ** 2, - "%s-part5" % root_disk.name: 1074 * 1024 ** 2, - "%s-part6" % root_disk.name: 1074 * 1024 ** 2, - "%s-part7" % root_disk.name: 8704 * 1024 ** 2, - "%s-part8" - % root_disk.name: ( - root_disk.size - - 105 * 1024 ** 2 - - 1074 * 1024 ** 2 - - 1074 * 1024 ** 2 - - 8704 * 1024 ** 2 - - 7 * 1024 ** 2 - ), - }, - {part.name: part.size for part in pt.partitions.all()}, - ) - - def test_accepts_root_size_param(self): - node = factory.make_Node(with_boot_disk=False) - node.boot_disk = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node, {"root_size": 10 * 1024 ** 3}) - self.assertEqual("VMFS7", layout.configure()) - pt = node.boot_disk.get_partitiontable() - self.assertDictEqual( - { - "%s-part1" % node.boot_disk.name: 105 * 1024 ** 2, - "%s-part5" % node.boot_disk.name: 1074 * 1024 ** 2, - "%s-part6" % node.boot_disk.name: 1074 * 1024 ** 2, - "%s-part7" % node.boot_disk.name: 8704 * 1024 ** 2, - "%s-part8" % node.boot_disk.name: 10 * 1024 ** 3, - }, - {part.name: part.size for part in pt.partitions.all()}, - ) - - def test_is_layout(self): - node = make_Node_with_uefi_boot_method() - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - layout.configure() - self.assertEqual(bd, layout.is_layout()) - - def test_is_layout_without_datastore(self): - node = make_Node_with_uefi_boot_method() - bd = factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE - ) - layout = VMFS7StorageLayout(node) - layout.configure() - # A user can delete the VMFS Datastore but the layout should still - # be detected for the UI. - node.virtualblockdevice_set.delete() - self.assertEqual(bd, layout.is_layout()) - - def test_is_layout_returns_none_when_not_found(self): - node = make_Node_with_uefi_boot_method() - factory.make_PhysicalBlockDevice(node=node, size=LARGE_BLOCK_DEVICE) - factory.make_PhysicalBlockDevice( - node=node, size=LARGE_BLOCK_DEVICE, tags=["ssd"] - ) - for layout_name, layout_class in STORAGE_LAYOUTS.values(): - if layout_class == VMFS7StorageLayout: - continue - layout = layout_class(node) - layout.configure() - vmfs_layout = VMFS7StorageLayout(node) - self.assertIsNone(vmfs_layout.is_layout(), layout_name) - - class TestBlankStorageLayout(MAASServerTestCase): def __init__(self, *args, **kwargs): # Make sure any existing storage layout can be cleared. diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py index 8adacc4..8c7493b 100644 --- a/src/maasserver/websockets/handlers/tests/test_machine.py +++ b/src/maasserver/websockets/handlers/tests/test_machine.py @@ -14,7 +14,6 @@ from django.core.exceptions import ValidationError from django.http import HttpRequest from lxml import etree from testtools import ExpectedException -from testtools.content import text_content from testtools.matchers import ( ContainsDict, Equals, @@ -3503,16 +3502,14 @@ class TestMachineHandler(MAASServerTestCase): handler = MachineHandler(user, {}, None) node = factory.make_Node(with_boot_disk=False) node.boot_disk = factory.make_PhysicalBlockDevice( - node=node, size=40 * 1024 ** 3 + node=node, size=10 * 1024 ** 3 ) - factory.make_PhysicalBlockDevice(node=node, size=20 * 1024 ** 3) - storage_layout = factory.pick_choice( - get_storage_layout_choices(), but_not=("blank",) - ) - self.addDetail("storage_layout", text_content(storage_layout)) + factory.make_PhysicalBlockDevice(node=node, size=10 * 2024 ** 3) params = { "system_id": node.system_id, - "storage_layout": storage_layout, + "storage_layout": factory.pick_choice( + get_storage_layout_choices(), but_not="blank" + ), } handler.apply_storage_layout(params) self.assertTrue(node.boot_disk.partitiontable_set.exists()) diff --git a/src/maasui/src b/src/maasui/src index 545f413..08f3762 160000 --- a/src/maasui/src +++ b/src/maasui/src @@ -1 +1 @@ -Subproject commit 545f41330490b1bbfe3dca0bf30ba637d883dbc0 +Subproject commit 08f3762e110260bfd11deef2385c1134af864d01
-- Mailing list: https://launchpad.net/~sts-sponsors Post to : [email protected] Unsubscribe : https://launchpad.net/~sts-sponsors More help : https://help.launchpad.net/ListHelp

