diff --git a/kiwi/builder/disk.py b/kiwi/builder/disk.py index 410d922b46f..9181562ec29 100644 --- a/kiwi/builder/disk.py +++ b/kiwi/builder/disk.py @@ -1189,9 +1189,19 @@ def _build_and_map_disk_partitions( (self.root_clone_count + 1) * squashed_rootfs_mbsize if \ self.root_clone_count else squashed_rootfs_mbsize + root_clone_count = self.root_clone_count + if self.root_filesystem_is_overlay: + # in overlay mode an eventual root clone is created from + # the root readonly partition and not from the root (rw) + # partition. Thus no further action needed here in this + # case + root_clone_count = 0 + if self.spare_part_mbsize and self.spare_part_is_last: rootfs_mbsize = disksize_mbytes - disksize_used_mbytes - \ self.spare_part_mbsize - Defaults.get_min_partition_mbytes() + if root_clone_count: + rootfs_mbsize = int(rootfs_mbsize / (root_clone_count + 1)) else: if self.oem_systemsize and not self.oem_resize: rootfs_mbsize = self.oem_systemsize @@ -1209,18 +1219,13 @@ def _build_and_map_disk_partitions( '--> overlayroot explicitly requested no write partition' ) else: - root_clone_count = self.root_clone_count - if self.root_filesystem_is_overlay: - # in overlay mode an eventual root clone is created from - # the root readonly partition and not from the root (rw) - # partition. Thus no further action needed here in this - # case - root_clone_count = 0 if root_clone_count: if rootfs_mbsize == 'all_free': + clone_rootfs_mbsize = disksize_mbytes - \ + disksize_used_mbytes - Defaults.get_min_partition_mbytes() clone_rootfs_mbsize = int( - (disksize_mbytes - disksize_used_mbytes) / (root_clone_count + 1) - ) + Defaults.get_min_partition_mbytes() + clone_rootfs_mbsize / (root_clone_count + 1) + ) rootfs_mbsize = \ f'clone:{clone_rootfs_mbsize}:{clone_rootfs_mbsize}' else: @@ -1247,7 +1252,7 @@ def _build_and_map_disk_partitions( ) disk.create_root_partition(rootfs_mbsize, root_clone_count) - if self.spare_part_mbsize and self.spare_part_is_last: + if self.spare_part_is_last: log.info('--> creating spare partition') disk.create_spare_partition( 'all_free' diff --git a/test/unit/builder/disk_test.py b/test/unit/builder/disk_test.py index 5cc2bb08049..0300a7751bb 100644 --- a/test/unit/builder/disk_test.py +++ b/test/unit/builder/disk_test.py @@ -570,7 +570,7 @@ def test_create_disk_standard_root_with_clone( format(self.disk_setup.boot_partition_size()), 1 ) disk.create_root_partition.assert_called_once_with( - 'clone:458:458', 1 + 'clone:443:443', 1 ) disk.create_custom_partitions.assert_called_once_with( self.disk_builder.custom_partitions @@ -581,10 +581,23 @@ def test_create_disk_standard_root_with_clone( call([self.device_map['rootclone1']]) ] + # Test in spare part mode + self.disk_builder.spare_part_mbsize = 42 + self.disk_builder.spare_part_is_last = True + disk.create_root_partition.reset_mock() + with patch('builtins.open', m_open, create=True): + self.disk_builder.create_disk() + + disk.create_root_partition.assert_called_once_with( + 'clone:422:422', 1 + ) + # Test in overlay mode a root clone is created from # the root readonly partition and not from the root (rw) # partition. self.disk_builder.root_filesystem_is_overlay = True + self.disk_builder.spare_part_mbsize = None + self.disk_builder.spare_part_is_last = False disk.create_root_partition.reset_mock() with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk()