Skip to content

Commit b4276e0

Browse files
committed
squash:update
1 parent 1db6037 commit b4276e0

File tree

2 files changed

+38
-72
lines changed

2 files changed

+38
-72
lines changed

tmt/steps/provision/__init__.py

+29-62
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import re
99
import secrets
1010
import shlex
11-
import shutil
1211
import signal as _signal
1312
import string
1413
import subprocess
@@ -57,7 +56,6 @@
5756
ProvisionError,
5857
ShellScript,
5958
configure_constant,
60-
create_directory,
6159
effective_workdir_root,
6260
)
6361

@@ -981,14 +979,33 @@ def show(
981979
class GuestLog:
982980
name: str
983981

984-
def fetch(self) -> Optional[str]:
982+
def fetch(self) -> str:
985983
"""
986984
Fetch and return content of a log.
987985
988986
:returns: content of the log, or ``None`` if the log cannot be retrieved.
989987
"""
990988
raise NotImplementedError
991989

990+
def store(self, path: Path, logname: Optional[str] = None) -> None:
991+
"""
992+
Save log content to a file.
993+
994+
:param path: a path to save into, could be a directory
995+
or a file path.
996+
:param content: content of the log.
997+
:param logname: name of the log, if not set, logpath
998+
is supposed to be a file path.
999+
"""
1000+
# if path is file path
1001+
if not path.is_dir():
1002+
path.write_text(self.fetch())
1003+
# if path is a directory
1004+
elif logname:
1005+
(path / logname).write_text(self.fetch())
1006+
else:
1007+
raise tmt.utils.GeneralError('Log path is a directory but log name is not defined.')
1008+
9921009

9931010
class Guest(tmt.utils.Common):
9941011
"""
@@ -1031,8 +1048,6 @@ def get_data_class(cls) -> type[GuestData]:
10311048
#: Guest topology hostname or IP address for guest/guest communication.
10321049
topology_address: Optional[str] = None
10331050

1034-
guest_logs: list[GuestLog] = []
1035-
10361051
become: bool
10371052

10381053
hardware: Optional[tmt.hardware.Hardware]
@@ -1058,6 +1073,7 @@ def __init__(
10581073
"""
10591074
Initialize guest data
10601075
"""
1076+
self.guest_logs: list[GuestLog] = []
10611077

10621078
super().__init__(logger=logger, parent=parent, name=name)
10631079
self.load(data)
@@ -1719,33 +1735,12 @@ def essential_requires(cls) -> list['tmt.base.Dependency']:
17191735

17201736
return []
17211737

1722-
def acquire_log(self, logname: str) -> Optional[str]:
1723-
"""
1724-
Fetch and return content of a log.
1725-
1726-
:param logname: name of the log.
1727-
:returns: content of the log, or ``None`` if the log cannot be retrieved.
1728-
"""
1729-
raise NotImplementedError
1730-
1731-
def store_log(self, path: Path, content: str, logname: Optional[str] = None) -> None:
1738+
@property
1739+
def logdir(self) -> Optional[Path]:
17321740
"""
1733-
Save log content to a file.
1734-
1735-
:param path: a path to save into, could be a directory
1736-
or a file path.
1737-
:param content: content of the log.
1738-
:param logname: name of the log, if not set, logpath
1739-
is supposed to be a file path.
1741+
Path to store logs
17401742
"""
1741-
# if path is file path
1742-
if not path.is_dir():
1743-
path.write_text(content)
1744-
# if path is a directory
1745-
elif logname:
1746-
(path / logname).write_text(content)
1747-
else:
1748-
raise tmt.utils.GeneralError('Log path is a directory but log name is not defined.')
1743+
return self.workdir / 'logs' if self.workdir else None
17491744

17501745
def fetch_logs(
17511746
self, dirpath: Optional[Path] = None, guest_logs: Optional[list[GuestLog]] = None
@@ -1761,17 +1756,11 @@ def fetch_logs(
17611756

17621757
guest_logs = guest_logs or self.guest_logs or []
17631758

1764-
dirpath = dirpath or (self.workdir / 'logs' if self.workdir else None) or Path.cwd()
1765-
if self.workdir and dirpath == self.workdir / 'logs':
1766-
create_directory(
1767-
path=self.workdir / 'logs', name='logs workdir', quiet=True, logger=self._logger
1768-
)
1759+
dirpath = dirpath or self.logdir or Path.cwd()
1760+
if dirpath == self.logdir:
1761+
self.logdir.mkdir(parents=True, exist_ok=True)
17691762
for log in guest_logs:
1770-
content = log.fetch()
1771-
if content:
1772-
self.store_log(dirpath, content, log.name)
1773-
else:
1774-
self.store_log(dirpath, '', log.name)
1763+
log.store(dirpath, log.name)
17751764

17761765

17771766
@container
@@ -2809,28 +2798,6 @@ def show(self, keys: Optional[list[str]] = None) -> None:
28092798
if hardware:
28102799
echo(tmt.utils.format('hardware', tmt.utils.dict_to_yaml(hardware.to_spec())))
28112800

2812-
def prune(self, logger: tmt.log.Logger) -> None:
2813-
"""Do not prune logs"""
2814-
if self.workdir is None:
2815-
return
2816-
2817-
logs_dir = self.workdir / 'logs'
2818-
if logs_dir.exists():
2819-
for member in self.workdir.iterdir():
2820-
if member.name == "logs":
2821-
logger.debug(f"Preserve '{member.relative_to(self.workdir)}'.", level=3)
2822-
continue
2823-
logger.debug(f"Remove '{member}'.", level=3)
2824-
try:
2825-
if member.is_file() or member.is_symlink():
2826-
member.unlink()
2827-
else:
2828-
shutil.rmtree(member)
2829-
except OSError as error:
2830-
logger.warning(f"Unable to remove '{member}': {error}")
2831-
else:
2832-
super().prune(logger)
2833-
28342801

28352802
@container
28362803
class ProvisionTask(tmt.queue.GuestlessTask[None]):

tmt/steps/provision/mrack.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -1287,9 +1287,12 @@ def get_new_state() -> GuestInspectType:
12871287
if state == 'Reserved':
12881288
for key in response["logs"]:
12891289
self.guest_logs.append(
1290-
GuestLogBeaker(self, key.replace('.log', ''), response["logs"][key])
1290+
GuestLogBeaker(key.replace('.log', ''), self, response["logs"][key])
12911291
)
1292-
self.guest_logs.append(GuestLogBeaker(self, 'dmesg'))
1292+
# console.log contains dmesg, and accessible even when the system is dead.
1293+
self.guest_logs.append(
1294+
GuestLogBeaker('dmesg', self, response["logs"]["console.log"])
1295+
)
12931296
return current
12941297

12951298
raise tmt.utils.WaitingIncompleteError
@@ -1483,18 +1486,14 @@ def guest(self) -> Optional[GuestBeaker]:
14831486

14841487
@container
14851488
class GuestLogBeaker(tmt.steps.provision.GuestLog):
1486-
def __init__(self, guest: GuestBeaker, name: str, url: Optional[str] = None) -> None:
1487-
self.name = name
1488-
self.url = url
1489-
self.guest = guest
1489+
guest: GuestBeaker
1490+
url: str
14901491

1491-
def fetch(self) -> Optional[str]:
1492+
def fetch(self) -> str:
14921493
"""
14931494
Fetch and return content of a log.
14941495
14951496
:returns: content of the log, or ``None`` if the log cannot be retrieved.
14961497
"""
14971498

1498-
if self.name == 'dmesg':
1499-
return self.guest.execute(Command('dmesg')).stdout
1500-
return tmt.utils.get_url_content(self.url) if self.url else None
1499+
return tmt.utils.get_url_content(self.url) if self.url else ''

0 commit comments

Comments
 (0)