Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit 7bba905

Browse files
committed
Feature PS-9868:
Complete logic for retrieve logs for job. Update project requirements.
1 parent 5830c1a commit 7bba905

File tree

6 files changed

+84
-150
lines changed

6 files changed

+84
-150
lines changed

Pipfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ six = "*"
1313
gradient-statsd = "*"
1414
click = "*"
1515
terminaltables = "*"
16+
colorclass = "*"
1617

1718
[dev-packages]
1819
twine = "*"

Pipfile.lock

Lines changed: 24 additions & 126 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

paperspace/cli/cli.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from paperspace.cli.jobs import jobs_group
99
from paperspace.cli.logs import logs_group
1010
from paperspace.cli.projects import projects_group
11-
from paperspace.cli.types import ChoiceType, json_string
11+
from paperspace.cli.cli_types import ChoiceType, json_string
1212
from paperspace.cli.validators import validate_mutually_exclusive, validate_email
1313
from paperspace.commands import experiments as experiments_commands, deployments as deployments_commands, \
1414
machines as machines_commands, login as login_commands
@@ -1056,3 +1056,7 @@ def version():
10561056
cli.add_command(jobs_group)
10571057
cli.add_command(projects_group)
10581058
cli.add_command(logs_group)
1059+
1060+
1061+
if __name__ == '__main__':
1062+
cli()

paperspace/commands/logs.py

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,59 @@
1+
import pydoc
2+
3+
import terminaltables
4+
from colorclass import Color
5+
16
from paperspace.commands import CommandBase
7+
from paperspace.utils import get_terminal_lines
8+
9+
10+
class ListLogsCommand(CommandBase):
11+
last_line_number = 0
12+
base_url = "/jobs/logs?jobId={}&line={}"
213

14+
is_logs_complete = False
15+
16+
def execute(self, job_id):
17+
table_data = [("LINE", "MESSAGE")]
18+
table = terminaltables.AsciiTable(table_data, title=f"Job {job_id} logs")
19+
20+
while not self.is_logs_complete:
21+
response = self._get_logs(job_id)
322

4-
class LogsCommandBase(CommandBase):
5-
def _log_message(self, response, success_msg_template, error_msg):
6-
if response.ok:
723
try:
8-
handle = response.json()
9-
except (ValueError, KeyError):
10-
self.logger.log(success_msg_template)
24+
data = response.json()
25+
if not response.ok:
26+
self.logger.log_error_response(data)
27+
return
28+
except (ValueError, KeyError) as e:
29+
if response.status_code == 204:
30+
continue
31+
self.logger.log("Error while parsing response data: {}".format(e))
32+
return
1133
else:
12-
msg = success_msg_template.format(**handle)
13-
self.logger.log(msg)
34+
self._log_logs_list(data, table, table_data)
35+
36+
def _get_logs(self, job_id):
37+
url = self.base_url.format(job_id, self.last_line_number)
38+
return self.api.get(url)
39+
40+
def _log_logs_list(self, data, table, table_data):
41+
if not data:
42+
self.logger.log("No Logs found")
1443
else:
15-
try:
16-
data = response.json()
17-
self.logger.log_error_response(data)
18-
except ValueError:
19-
self.logger.log(error_msg)
44+
table_str = self._make_table(data, table, table_data)
45+
if len(table_str.splitlines()) > get_terminal_lines():
46+
pydoc.pager(table_str)
47+
else:
48+
self.logger.log(table_str)
49+
50+
def _make_table(self, logs, table, table_data):
51+
if logs[-1].get("message") == "PSEOF":
52+
self.is_logs_complete = True
53+
else:
54+
self.last_line_number = logs[-1].get("line")
2055

56+
for log in logs:
57+
table_data.append((Color.colorize("red", log.get("line")), log.get("message")))
2158

22-
class ListLogsCommand(LogsCommandBase):
23-
def execute(self, job_id):
24-
url = f"/jobs/logs?jobId={job_id}"
25-
response = self.api.get(url)
26-
self._log_message(
27-
response,
28-
"Job logs retrieved",
29-
"Unknown error while retrieving job logs"
30-
)
59+
return table.table

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
],
4141
keywords='paperspace api development library',
4242
packages=find_packages(exclude=['contrib', 'docs', 'tests', 'old_tests']),
43-
install_requires=['requests[security]', 'boto3', 'botocore', 'six', 'gradient-statsd', 'click', 'terminaltables'],
43+
install_requires=[
44+
'requests[security]', 'boto3', 'botocore', 'six', 'gradient-statsd', 'click', 'terminaltables', 'colorclass'
45+
],
4446
entry_points={'console_scripts': [
4547
'paperspace-python = paperspace.main:main',
4648
]},

0 commit comments

Comments
 (0)