Skip to content

Commit ff4b607

Browse files
committed
Fix log fetching on valkyrie
1 parent d9a2a27 commit ff4b607

File tree

4 files changed

+39
-51
lines changed

4 files changed

+39
-51
lines changed

swattool/logs.py

-37
This file was deleted.

swattool/logsview.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import requests
1111
from simple_term_menu import TerminalMenu # type: ignore
1212

13-
from . import logs
1413
from . import swatbuild
1514
from . import utils
1615
from .webrequests import Session
@@ -32,9 +31,10 @@ def show_logs_menu(build: swatbuild.Build):
3231
"""Show a menu allowing to select log file to analyze."""
3332
def get_failure_line(failure, logname):
3433
return (failure.id, failure.stepnumber, failure.stepname, logname)
35-
entries = [get_failure_line(failure, url)
36-
for failure in build.failures.values()
37-
for url in failure.urls]
34+
logs = [(failure, logname)
35+
for failure in build.failures.values()
36+
for logname in failure.urls]
37+
entries = [get_failure_line(failure, logname) for failure, logname in logs]
3838
default_line = get_failure_line(build.get_first_failure(), 'stdio')
3939
entry = entries.index(default_line)
4040
logs_menu = utils.tabulated_menu(entries, title="Log files",
@@ -45,7 +45,7 @@ def get_failure_line(failure, logname):
4545
if newentry is None:
4646
break
4747

48-
show_log_menu(build.id, entries[newentry][1], entries[newentry][3])
48+
show_log_menu(*logs[newentry])
4949

5050

5151
def _format_log_line(linenum: int, text: str, colorized_line: Optional[int],
@@ -124,9 +124,9 @@ def _show_log(loglines: list[str], selected_line: Optional[int],
124124
utils.show_in_less("\n".join(colorlines), startline)
125125

126126

127-
def _load_log(buildid: int, stepnumber: int, logname: str
127+
def _load_log(failure: swatbuild.Failure, logname: str
128128
) -> Optional[str]:
129-
logurl = logs.get_log_raw_url(buildid, stepnumber, logname)
129+
logurl = failure.get_log_raw_url(logname)
130130
if not logurl:
131131
logging.error("Failed to find log")
132132
return None
@@ -140,9 +140,9 @@ def _load_log(buildid: int, stepnumber: int, logname: str
140140
return logdata
141141

142142

143-
def show_log_menu(buildid: int, stepnumber: int, logname: str):
143+
def show_log_menu(failure: swatbuild.Failure, logname: str):
144144
"""Analyze a failure log file."""
145-
logdata = _load_log(buildid, stepnumber, logname)
145+
logdata = _load_log(failure, logname)
146146
if not logdata:
147147
return
148148

@@ -163,7 +163,8 @@ def preview(line):
163163
return _format_log_preview(int(line), loglines, highlight_lines,
164164
preview_height)
165165

166-
title = f"Log file: {logname} of build {buildid}, step {stepnumber}"
166+
title = f"Log file: {logname} of build {failure.build.id}, " \
167+
f"step {failure.stepnumber}"
167168
entry = 2
168169
while True:
169170
menu = TerminalMenu(entries, title=title, cursor_index=entry,

swattool/review.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def _handle_view_command(build: swatbuild.Build, command: str) -> bool:
151151
return True
152152
if command == "l": # View stdio log
153153
failure = build.get_first_failure()
154-
logsview.show_log_menu(build.id, failure.stepnumber, 'stdio')
154+
logsview.show_log_menu(failure, 'stdio')
155155
return True
156156
if command == "x": # Explore logs
157157
logsview.show_logs_menu(build)

swattool/swatbuild.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
"""Interraction with the swatbot Django server."""
44

55
import enum
6+
import json
67
import logging
78
import shutil
89
from datetime import datetime
910
from typing import Any, Iterable, Optional
1011

1112
import click
13+
import requests
1214
import tabulate
1315

14-
from . import logs
1516
from . import swatbotrest
1617
from . import userdata
1718
from . import utils
19+
from .webrequests import Session
1820

1921
logger = logging.getLogger(__name__)
2022

@@ -60,9 +62,26 @@ def open_log_url(self, logname: str = "stdio"):
6062
else:
6163
logger.error("Failed to find %s log", logname)
6264

63-
def get_log_raw_url(self, logname: str = "stdio") -> Optional[str]:
65+
def get_log_raw_url(self, logname: str = "stdio"
66+
) -> Optional[str]:
6467
"""Get the URL of a raw log file."""
65-
return logs.get_log_raw_url(self.build.id, self.stepnumber, logname)
68+
rest_url = self.build.rest_api_url()
69+
info_url = f"{rest_url}/builds/{self.build.id}/steps/" \
70+
f"{self.stepnumber}/logs/{logname}"
71+
logging.debug("Log info URL: %s", info_url)
72+
73+
try:
74+
info_data = Session().get(info_url)
75+
except requests.exceptions.HTTPError:
76+
return None
77+
78+
try:
79+
info_json_data = json.loads(info_data)
80+
except json.decoder.JSONDecodeError:
81+
return None
82+
83+
logid = info_json_data['logs'][0]['logid']
84+
return f"{rest_url}/logs/{logid}/raw"
6685

6786

6887
class Build:
@@ -231,3 +250,8 @@ def format_field(field):
231250
desc += f"\n\n{Field.USER_NOTES}:\n{wrapped}"
232251

233252
return desc
253+
254+
def rest_api_url(self) -> str:
255+
"""Get the REST API URL prefix for this build."""
256+
url, _, _ = self.autobuilder_url.partition('/#/builders')
257+
return f"{url}/api/v2"

0 commit comments

Comments
 (0)