Skip to content

Commit e5d048c

Browse files
committed
Move root partition resizing logic to VM.grow_root_partition()
And make it a bit more robust, by: - fetching the actual partition mounted on / - checking if the filesystem is ext* Signed-off-by: Gaëtan Lehmann <gaetan.lehmann@vates.tech>
1 parent eef0398 commit e5d048c

2 files changed

Lines changed: 29 additions & 11 deletions

File tree

lib/vm.py

Lines changed: 26 additions & 0 deletions
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,
@@ -506,6 +508,30 @@ def detect_package_manager(self) -> PackageManagerEnum:
506508
return PackageManagerEnum.APK
507509
return PackageManagerEnum.UNKNOWN
508510

511+
def grow_root_partition(self) -> int | None:
512+
if self.detect_package_manager() == PackageManagerEnum.APK:
513+
# growpart is not available in alpine 3.12
514+
# vm.ssh('apk add cloud-utils-growpart e2fsprogs-extra')
515+
self.ssh('apk add gawk util-linux e2fsprogs-extra')
516+
self.ssh(
517+
'wget https://raw.githubusercontent.com/canonical/cloud-utils/main/bin/growpart -O /usr/bin/growpart'
518+
)
519+
self.ssh('chmod +x /usr/bin/growpart')
520+
else:
521+
return None
522+
mount_output = self.ssh('mount').strip()
523+
root_match = re.search(r'/dev/(\w+?)(p?)(\d+) on / type (\w+)', mount_output)
524+
assert root_match is not None
525+
disk, p, partition, typ = root_match.groups()
526+
if not typ.startswith('ext'):
527+
logging.debug(f"Unsupported filesystem: {typ}")
528+
return None
529+
growpart_returncode = self.ssh_with_result(f'growpart /dev/{disk} {partition}').returncode
530+
assert growpart_returncode in [0, 1] # growpart returns 1 if the size is already the expected one
531+
self.ssh(f'resize2fs /dev/{disk}{p}{partition}')
532+
df_output = self.ssh('df /')
533+
return int(df_output.splitlines()[-1].split()[3]) * KiB
534+
509535
def insert_cd(self, vdi_name: str) -> None:
510536
logging.info("Insert CD %r in VM %s", vdi_name, self.uuid)
511537
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
@@ -241,17 +241,9 @@ def xva_export_import(source_vm: VM, compression: XVACompression, temp_large_dir
241241
vm.wait_for_vm_running_and_ssh_up()
242242
install_randstream(vm)
243243

244-
if vm.detect_package_manager() == PackageManagerEnum.APK:
245-
# growpart is not available in alpine 3.12
246-
# vm.ssh('apk add cloud-utils-growpart e2fsprogs-extra')
247-
vm.ssh('apk add gawk util-linux e2fsprogs-extra')
248-
vm.ssh('wget https://raw.githubusercontent.com/canonical/cloud-utils/main/bin/growpart -O /usr/bin/growpart')
249-
vm.ssh('chmod +x /usr/bin/growpart')
250-
# TODO: maybe use `findmnt -no SOURCE /` from util-linux to get the blockdevice mounted on /
251-
growpart_returncode = vm.ssh_with_result('growpart /dev/xvda 3').returncode
252-
assert growpart_returncode in [0, 1] # growpart returns 1 if the size is already the expected one
253-
vm.ssh('resize2fs /dev/xvda3')
254-
stream_size = min(volume_size // 2, config.write_volume_cap)
244+
root_partition_size = vm.grow_root_partition()
245+
if root_partition_size is not None:
246+
stream_size = min(root_partition_size // 2, config.write_volume_cap)
255247
else:
256248
stream_size = 500 * MiB
257249

0 commit comments

Comments
 (0)