Skip to content

Commit 2be0026

Browse files
authored
Merge pull request #542 from xcp-ng/gln/refactor-root-partition-resizing-vyxq
Move root partition resizing logic to VM.grow_root_partition()
2 parents 8b1b12b + 686b749 commit 2be0026

2 files changed

Lines changed: 36 additions & 12 deletions

File tree

lib/vm.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import logging
66
import os
7+
import re
78
import subprocess
89
import tempfile
910
import uuid
@@ -12,6 +13,7 @@
1213
import lib.efi as efi
1314
from lib.basevm import BaseVM
1415
from lib.common import (
16+
KiB,
1517
PackageManagerEnum,
1618
expand_scope_relative_nodeid,
1719
parse_xe_dict,
@@ -27,7 +29,7 @@
2729
from lib.vdi import VDI
2830
from lib.vif import VIF
2931

30-
from typing import TYPE_CHECKING, Iterable, List, Literal, overload
32+
from typing import TYPE_CHECKING, Iterable, List, Literal, assert_never, overload
3133

3234
if TYPE_CHECKING:
3335
from lib.host import Host
@@ -523,6 +525,36 @@ def detect_package_manager(self) -> PackageManagerEnum:
523525
return PackageManagerEnum.ZYPPER
524526
return PackageManagerEnum.UNKNOWN
525527

528+
def grow_root_partition(self) -> int | None:
529+
pkg_manager = self.detect_package_manager()
530+
match pkg_manager:
531+
case PackageManagerEnum.APK:
532+
self.ssh('apk add util-linux e2fsprogs-extra')
533+
case PackageManagerEnum.APT_GET:
534+
self.ssh('apt-get update && apt-get install -y -qq util-linux e2fsprogs')
535+
case PackageManagerEnum.DNF:
536+
self.ssh('dnf install -y util-linux e2fsprogs')
537+
case PackageManagerEnum.YUM:
538+
self.ssh('yum install -y util-linux e2fsprogs')
539+
case PackageManagerEnum.ZYPPER:
540+
self.ssh('zypper --non-interactive install util-linux e2fsprogs')
541+
case PackageManagerEnum.UNKNOWN:
542+
return None
543+
case _:
544+
assert_never(pkg_manager)
545+
mount_output = self.ssh('mount').strip()
546+
root_match = re.search(r'/dev/(\w+?)(p?)(\d+) on / type (\w+)', mount_output)
547+
assert root_match is not None
548+
disk, p, partition, fs_type = root_match.groups()
549+
if not fs_type.startswith('ext'):
550+
logging.debug(f"Unsupported filesystem: {fs_type}")
551+
return None
552+
self.ssh(f'echo ", +" | sfdisk --no-reread --force -N {partition} /dev/{disk}')
553+
self.ssh(f'partx -u -n {partition}:{partition} /dev/{disk}')
554+
self.ssh(f'resize2fs /dev/{disk}{p}{partition}')
555+
df_output = self.ssh('df /')
556+
return int(df_output.splitlines()[-1].split()[3]) * KiB
557+
526558
def insert_cd(self, vdi_name: str) -> None:
527559
logging.info("Insert CD %r in VM %s", vdi_name, self.uuid)
528560
self.host.xe('vm-cd-insert', {'uuid': self.uuid, 'cd-name': vdi_name})

tests/storage/storage.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -250,17 +250,9 @@ def xva_export_import(source_vm: VM, compression: XVACompression, temp_large_dir
250250
vm.wait_for_vm_running_and_ssh_up()
251251
install_randstream(vm)
252252

253-
if vm.detect_package_manager() == PackageManagerEnum.APK:
254-
# growpart is not available in alpine 3.12
255-
# vm.ssh('apk add cloud-utils-growpart e2fsprogs-extra')
256-
vm.ssh('apk add gawk util-linux e2fsprogs-extra')
257-
vm.ssh('wget https://raw.githubusercontent.com/canonical/cloud-utils/main/bin/growpart -O /usr/bin/growpart')
258-
vm.ssh('chmod +x /usr/bin/growpart')
259-
# TODO: maybe use `findmnt -no SOURCE /` from util-linux to get the blockdevice mounted on /
260-
growpart_returncode = vm.ssh_with_result('growpart /dev/xvda 3').returncode
261-
assert growpart_returncode in [0, 1] # growpart returns 1 if the size is already the expected one
262-
vm.ssh('resize2fs /dev/xvda3')
263-
stream_size = min(volume_size // 2, config.write_volume_cap)
253+
root_partition_size = vm.grow_root_partition()
254+
if root_partition_size is not None:
255+
stream_size = min(root_partition_size // 2, config.write_volume_cap)
264256
else:
265257
stream_size = 500 * MiB
266258

0 commit comments

Comments
 (0)