Skip to content

Commit 689ed7b

Browse files
authored
test/cvm_boot: optionally add package repository before upgrading packages (#3851)
* tool: add createrepo tool Signed-off-by: Thien Trung Vuong <tvuong@microsoft.com> * test/cvm_boot: optionally add package repository before upgrading packages Signed-off-by: Thien Trung Vuong <tvuong@microsoft.com> --------- Signed-off-by: Thien Trung Vuong <tvuong@microsoft.com>
1 parent a0a1273 commit 689ed7b

File tree

4 files changed

+123
-6
lines changed

4 files changed

+123
-6
lines changed

lisa/operating_system.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
Type,
2020
Union,
2121
)
22+
from urllib.parse import urlparse
2223

2324
from assertpy import assert_that
2425
from retry import retry
@@ -378,6 +379,9 @@ def get_kernel_information(self, force_run: bool = False) -> KernelInformation:
378379

379380
return kernel_information
380381

382+
def add_repository(self, repo: str, **kwargs: Any) -> None:
383+
raise NotImplementedError()
384+
381385
def install_packages(
382386
self,
383387
packages: Union[
@@ -985,6 +989,7 @@ def add_repository(
985989
no_gpgcheck: bool = True,
986990
repo_name: Optional[str] = None,
987991
keys_location: Optional[List[str]] = None,
992+
**kwargs: Any,
988993
) -> None:
989994
self._initialize_package_installation()
990995
if keys_location:
@@ -1537,6 +1542,7 @@ def add_repository(
15371542
no_gpgcheck: bool = True,
15381543
repo_name: Optional[str] = None,
15391544
keys_location: Optional[List[str]] = None,
1545+
**kwargs: Any,
15401546
) -> None:
15411547
self._node.tools[YumConfigManager].add_repository(repo, no_gpgcheck)
15421548

@@ -1955,6 +1961,35 @@ def add_azure_core_repo(
19551961
sudo=True,
19561962
)
19571963

1964+
def add_repository(
1965+
self,
1966+
repo: str,
1967+
no_gpgcheck: bool = True,
1968+
repo_name: Optional[str] = None,
1969+
keys_location: Optional[List[str]] = None,
1970+
**kwargs: Any,
1971+
) -> None:
1972+
parsed_url = urlparse(repo)
1973+
if parsed_url.scheme and parsed_url.netloc:
1974+
self._node.tools[YumConfigManager].add_repository(repo, no_gpgcheck)
1975+
else:
1976+
self._create_local_repo(Path(repo))
1977+
1978+
def _create_local_repo(self, source_tarball: Path) -> None:
1979+
from lisa.tools import CreateRepo, RemoteCopy
1980+
1981+
working_path = Path(self._node.get_working_path())
1982+
tarball_file = source_tarball.name
1983+
tarball_path = working_path / tarball_file
1984+
1985+
# copy tarball to remote node
1986+
result = self._node.tools[RemoteCopy].copy_to_remote(
1987+
src=source_tarball, dest=working_path
1988+
)
1989+
self._log.debug(f"tarball copied to: {result}")
1990+
1991+
self._node.tools[CreateRepo].create_repo_from_tarball(tarball_path)
1992+
19581993
# Disable KillUserProcesses to avoid test processes being terminated when
19591994
# the SSH session is reset
19601995
def set_kill_user_processes(self) -> None:
@@ -2054,6 +2089,7 @@ def add_repository(
20542089
no_gpgcheck: bool = True,
20552090
repo_name: Optional[str] = None,
20562091
keys_location: Optional[List[str]] = None,
2092+
**kwargs: Any,
20572093
) -> None:
20582094
self._initialize_package_installation()
20592095
cmd = "zypper ar"
@@ -2187,6 +2223,7 @@ def add_repository(
21872223
no_gpgcheck: bool = True,
21882224
repo_name: Optional[str] = None,
21892225
keys_location: Optional[List[str]] = None,
2226+
**kwargs: Any,
21902227
) -> None:
21912228
raise SkippedException(
21922229
UnsupportedDistroException(

lisa/tools/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from .chown import Chown
2626
from .chrony import Chrony
2727
from .cp import Cp
28+
from .createrepo import CreateRepo
2829
from .curl import Curl
2930
from .date import Date
3031
from .df import Df
@@ -147,6 +148,7 @@
147148
"Chown",
148149
"Chrony",
149150
"Cp",
151+
"CreateRepo",
150152
"Curl",
151153
"Date",
152154
"Df",

lisa/tools/createrepo.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT license.
3+
4+
5+
from pathlib import Path
6+
7+
from lisa.executable import Tool
8+
from lisa.operating_system import CBLMariner
9+
from lisa.tools.tar import Tar
10+
from lisa.tools.tee import Tee
11+
from lisa.util import UnsupportedDistroException
12+
13+
14+
class CreateRepo(Tool):
15+
@property
16+
def command(self) -> str:
17+
return "createrepo"
18+
19+
@property
20+
def can_install(self) -> bool:
21+
return True
22+
23+
def _install(self) -> bool:
24+
if isinstance(self.node.os, CBLMariner):
25+
self.node.os.install_packages("createrepo")
26+
else:
27+
raise UnsupportedDistroException(
28+
self.node.os,
29+
f"tool {self.command} can't be installed in {self.node.os.name}",
30+
)
31+
return self._check_exists()
32+
33+
def create_repo_from_tarball(self, tarball_path: Path) -> None:
34+
workspace = Path(self.node.get_working_path())
35+
repo_path = workspace / "rpms"
36+
37+
# extract tarball
38+
self.node.tools[Tar].extract(
39+
file=tarball_path.as_posix(),
40+
dest_dir=repo_path.as_posix(),
41+
)
42+
43+
# run createrepo
44+
self._run_create_repo(path=repo_path.as_posix(), compatibility=True)
45+
46+
# add repo file
47+
repo_file = "[builtpackages]\n"
48+
repo_file += "name=Built Packages\n"
49+
repo_file += f"baseurl=file://{repo_path.as_posix()}\n" # noqa: E231
50+
repo_file += "enabled=1\n"
51+
repo_file += "gpgcheck=0\n"
52+
repo_file += "priority=1\n"
53+
repo_file += "skip_if_unavailable=True\n"
54+
55+
# write repo file to /etc/yum/repos.d/
56+
repo_file_path = Path("/etc/yum.repos.d/builtpackages.repo")
57+
self.node.tools[Tee].write_to_file(repo_file, repo_file_path, sudo=True)
58+
59+
def _run_create_repo(self, path: str, compatibility: bool = True) -> None:
60+
cmd = path
61+
if compatibility:
62+
cmd = f"--compatibility {cmd}"
63+
self.run(
64+
cmd,
65+
expected_exit_code=0,
66+
expected_exit_code_failure_message="Failed to create repository",
67+
shell=True,
68+
sudo=False,
69+
force_run=True,
70+
)

microsoft/testsuites/cvm/cvm_boot.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
SecurityProfile,
2222
SecurityProfileSettings,
2323
)
24-
from lisa.operating_system import CBLMariner, Posix
24+
from lisa.operating_system import CBLMariner
2525
from lisa.sut_orchestrator import AZURE
2626
from lisa.testsuite import simple_requirement
2727
from lisa.tools import BootCtl, Lsblk, Tpm2
@@ -96,9 +96,13 @@ def verify_encrypted_root_partition(self, node: RemoteNode) -> None:
9696
use_new_environment=True,
9797
)
9898
def verify_boot_success_after_component_upgrade(
99-
self, log: Logger, node: RemoteNode, log_path: Path
99+
self,
100+
log: Logger,
101+
node: RemoteNode,
102+
log_path: Path,
103+
variables: Dict[str, Any],
100104
) -> None:
101-
posix_os: Posix = cast(Posix, node.os)
105+
os: CBLMariner = cast(CBLMariner, node.os)
102106
# First boot - no package upgrade has been performed
103107
# Check PCR values (PCR4, PCR7)
104108
pcrs_before_reboot = node.tools[Tpm2].pcrread(pcrs=[4, 7])
@@ -107,16 +111,20 @@ def verify_boot_success_after_component_upgrade(
107111
boot_components = ["shim", "systemd-boot", "kernel-uki"]
108112
boot_components_versions: Dict[str, str] = dict()
109113
for pkg in boot_components:
110-
pkg_version = posix_os.get_package_information(pkg, use_cached=False)
114+
pkg_version = os.get_package_information(pkg, use_cached=False)
111115
boot_components_versions[pkg] = pkg_version.version_str
112116

117+
repo_url = variables.get("rpm_repository")
118+
if repo_url:
119+
os.add_repository(repo_url)
120+
113121
# Upgrade boot components
114-
posix_os.update_packages(boot_components)
122+
os.update_packages(boot_components)
115123

116124
# Get new boot components versions
117125
boot_components_new_versions: Dict[str, str] = dict()
118126
for pkg in boot_components:
119-
pkg_version = posix_os.get_package_information(pkg, use_cached=False)
127+
pkg_version = os.get_package_information(pkg, use_cached=False)
120128
boot_components_new_versions[pkg] = pkg_version.version_str
121129

122130
# Reboot

0 commit comments

Comments
 (0)