def get_console_output(self, build_id, subjob_id, atom_id, result_root, max_lines=50, offset_line=None):
        """
        Return the console output if it exists, raises an ItemNotFound error if not.

        On success, the response contains keys: offset_line, num_lines, total_num_lines, and content.

        e.g.:
        {
            'offset_line': 0,
            'num_lines': 50,
            'total_num_lines': 167,
            'content': 'Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit,\n...',
        }

        :type build_id: int
        :type subjob_id: int
        :type atom_id: int
        :param result_root: the sys path to either the results or artifacts directory where results are stored.
        :type result_root: str
        :param max_lines: The maximum total number of lines to return. If this max_lines + offset_line lines do not
            exist in the output file, just return what there is.
        :type max_lines: int
        :param offset_line: The line number (0-indexed) to start reading content for. If none is specified, we will
            return the console output starting from the end of the file.
        :type offset_line: int | None
        """
        if offset_line is not None and offset_line < 0:
            raise BadRequestError('\'offset_line\' must be greater than or equal to zero.')
        if max_lines <= 0:
            raise BadRequestError('\'max_lines\' must be greater than zero.')

        artifact_dir = BuildArtifact.atom_artifact_directory(build_id, subjob_id, atom_id, result_root=result_root)
        output_file = os.path.join(artifact_dir, BuildArtifact.OUTPUT_FILE)

        if not os.path.isfile(output_file):
            raise ItemNotFoundError('Output file doesn\'t exist for build_id: {} subjob_id: {} atom_id: {}'.format(
                build_id, subjob_id, atom_id))

        try:
            console_output = ConsoleOutput(output_file)
            segment = console_output.segment(max_lines, offset_line)
        except ValueError as e:
            raise BadRequestError(e)

        return {
            'offset_line': segment.offset_line,
            'num_lines': segment.num_lines,
            'total_num_lines': segment.total_num_lines,
            'content': segment.content,
        }
Esempio n. 2
0
    def test_segment_for_incomplete_console_output(
            self,
            input_max_lines,
            input_offset_line,
            expected_num_lines,
            expected_offset_line,
            expected_total_num_lines,
            expected_content
    ):
        """
        :type input_max_lines: int
        :type input_offset_line: int | None
        :type expected_num_lines: int
        :type expected_offset_line: int
        :type expected_total_num_lines: int
        :type expected_content: str
        """
        console_output = ConsoleOutput(self._incomplete_console_output_file_path)
        segment = console_output.segment(max_lines=input_max_lines, offset_line=input_offset_line)

        self.assertEquals(segment.num_lines, expected_num_lines)
        self.assertEquals(segment.offset_line, expected_offset_line)
        self.assertEquals(segment.total_num_lines, expected_total_num_lines)
        self.assertEquals(segment.content, expected_content)
Esempio n. 3
0
 def test_segment_raises_value_error_if_offset_greater_than_total_length(self):
     with self.assertRaises(ValueError):
         console_output = ConsoleOutput(self._completed_console_output_file_path)
         console_output.segment(max_lines=5, offset_line=155)