From 7530a6e35f31b76bccc99e31d8dded3b5a0281dd Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Thu, 19 Jun 2014 15:44:45 -0400 Subject: [PATCH] Allow limiting the stdout view given start_line and end_line parameters --- awx/api/views.py | 6 ++++-- awx/main/models/unified_jobs.py | 27 +++++++++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/awx/api/views.py b/awx/api/views.py index be0f93aec9..779a718a13 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -1653,6 +1653,8 @@ class UnifiedJobStdout(RetrieveAPIView): unified_job = self.get_object() if request.accepted_renderer.format in ('html', 'api'): scheme = request.QUERY_PARAMS.get('scheme', None) + start_line = request.QUERY_PARAMS.get('start_line', 0) + end_line = request.QUERY_PARAMS.get('end_line', None) if scheme not in SCHEME: scheme = 'ansi2html' dark_val = request.QUERY_PARAMS.get('dark', '') @@ -1663,11 +1665,11 @@ class UnifiedJobStdout(RetrieveAPIView): title=get_view_name(self.__class__)) if content_only: headers = conv.produce_headers() - body = conv.convert(unified_job.result_stdout_raw, full=False) + body = conv.convert(unified_job.result_stdout_raw_limited(start_line, end_line), full=False) data = '\n'.join([headers, body]) data = '
%s
' % data else: - data = conv.convert(unified_job.result_stdout_raw) + data = conv.convert(unified_job.result_stdout_raw_limited(start_line, end_line)) # Fix ugly grey background used by default. data = data.replace('.body_background { background-color: #AAAAAA; }', '.body_background { background-color: #f5f5f5; }') diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index 9e18ccf361..152d5910aa 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -8,6 +8,7 @@ import re import shlex import os import os.path +from cStringIO import StringIO # PyYAML import yaml @@ -501,21 +502,35 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique pass super(UnifiedJob, self).delete() - @property - def result_stdout_raw(self): + def result_stdout_raw_handle(self): if self.result_stdout_file != "": if not os.path.exists(self.result_stdout_file): - return "stdout capture is missing" - with open(self.result_stdout_file, "r") as stdout_fd: - return stdout_fd.read() + return StringIO("stdout capture is missing") + return open(self.result_stdout_file, "r") else: - return self.result_stdout_text + return StringIO(self.result_stdout_text) + + @property + def result_stdout_raw(self): + return self.result_stdout_raw_handle().read() @property def result_stdout(self): ansi_escape = re.compile(r'\x1b[^m]*m') return ansi_escape.sub('', self.result_stdout_raw) + def result_stdout_raw_limited(self, start_line=0, end_line=None): + return_buffer = "" + if end_line is not None: + end_line = int(end_line) + for line in self.result_stdout_raw_handle().readlines()[int(start_line):end_line]: + return_buffer += line + return return_buffer + + def result_stdout_limited(self, start_line=0, end_line=None): + ansi_escape = re.compile(r'\x1b[^m]*m') + return ansi_escape.sub('', self.result_stdout_raw_limited(start_line, end_line)) + @property def celery_task(self): try: