|
4 | 4 |
|
5 | 5 | import logging |
6 | 6 | import os |
| 7 | +import re |
7 | 8 | import subprocess |
8 | 9 | import tempfile |
9 | 10 | import uuid |
|
12 | 13 | import lib.efi as efi |
13 | 14 | from lib.basevm import BaseVM |
14 | 15 | from lib.common import ( |
| 16 | + KiB, |
15 | 17 | PackageManagerEnum, |
16 | 18 | expand_scope_relative_nodeid, |
17 | 19 | parse_xe_dict, |
|
27 | 29 | from lib.vdi import VDI |
28 | 30 | from lib.vif import VIF |
29 | 31 |
|
30 | | -from typing import TYPE_CHECKING, Iterable, List, Literal, overload |
| 32 | +from typing import TYPE_CHECKING, Iterable, List, Literal, assert_never, overload |
31 | 33 |
|
32 | 34 | if TYPE_CHECKING: |
33 | 35 | from lib.host import Host |
@@ -523,6 +525,36 @@ def detect_package_manager(self) -> PackageManagerEnum: |
523 | 525 | return PackageManagerEnum.ZYPPER |
524 | 526 | return PackageManagerEnum.UNKNOWN |
525 | 527 |
|
| 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 | + |
526 | 558 | def insert_cd(self, vdi_name: str) -> None: |
527 | 559 | logging.info("Insert CD %r in VM %s", vdi_name, self.uuid) |
528 | 560 | self.host.xe('vm-cd-insert', {'uuid': self.uuid, 'cd-name': vdi_name}) |
|
0 commit comments