| # Copyright 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import os |
| import socket |
| import time |
| |
| from autotest_lib.client.common_lib import base_utils |
| from autotest_lib.client.common_lib import global_config |
| from autotest_lib.client.common_lib import time_utils |
| from autotest_lib.site_utils import job_directories |
| |
| CONFIG=global_config.global_config |
| |
| RETRIEVE_LOGS_CGI = CONFIG.get_config_value( |
| 'BUG_REPORTING', 'retrieve_logs_cgi', default='') |
| USE_PROD_SERVER = CONFIG.get_config_value( |
| 'SERVER', 'use_prod_sponge_server', default=False, type=bool) |
| |
| |
| class AutotestJobInfo(object): |
| """Autotest job info.""" |
| |
| # Tell the uploader what type of info this object holds. |
| tags=['autotest'] |
| |
| # Version of the data stored. |
| version = 2 |
| |
| def __init__(self, job): |
| self._job = job |
| self._tasks = list( |
| self.create_task_info(test) for test in self._job.tests) |
| |
| self.build = job.build |
| self.build_version = job.build_version |
| self.board = job.board |
| |
| @property |
| def id(self): |
| """The id of the autotest job.""" |
| return job_directories.get_job_id_or_task_id(self._job.dir) |
| |
| @property |
| def label(self): |
| """The label of the autotest job.""" |
| return self._job.label |
| |
| @property |
| def user(self): |
| """The user who launched the autotest job.""" |
| return self._job.user |
| |
| @property |
| def start_time(self): |
| """The utc start time of the autotest job.""" |
| return self._job.keyval_dict.get('job_started', time.time()) |
| |
| @property |
| def end_time(self): |
| """The utc end time of the autotest job.""" |
| return self._job.keyval_dict.get('job_finished', time.time()) |
| |
| @property |
| def dut(self): |
| """The dut for the job.""" |
| return self._job.machine |
| |
| @property |
| def drone(self): |
| """The drone used to run the job.""" |
| return self._job.keyval_dict.get('drone', socket.gethostname()) |
| |
| @property |
| def keyvals(self): |
| """Keyval dict for this job.""" |
| return self._job.keyval_dict |
| |
| @property |
| def tasks(self): |
| """All tests that this job ran.""" |
| return self._tasks |
| |
| @property |
| def results_dir(self): |
| """The directory where job results are stored.""" |
| return os.path.abspath(self._job.dir) |
| |
| @property |
| def results_url(self): |
| """The url where results are stored.""" |
| return '%sresults/%s-%s/%s' % ( |
| RETRIEVE_LOGS_CGI, self.id, self.user, self.dut) |
| |
| @property |
| def is_official(self): |
| """If this is a production result.""" |
| return USE_PROD_SERVER |
| |
| def create_task_info(self, test): |
| """Thunk for creating task info. |
| |
| @param test: The autotest test. |
| |
| @returns The task info. |
| """ |
| logging.info('Using default autotest task info for %s.', test.testname) |
| return AutotestTaskInfo(test, self) |
| |
| |
| class AutotestTaskInfo(object): |
| """Info about an autotest test.""" |
| |
| # Tell the uploader what type of info is kept in this task. |
| tags = ['autotest'] |
| |
| # A list of logs to upload for this task. |
| logs = ['debug', 'status.log', 'crash', 'keyval', 'control', 'control.srv', |
| 'results/results-chart.json'] |
| |
| # Version of the data stored. |
| version = 2 |
| |
| def __init__(self, test, job): |
| """ |
| @param test: The autotest test to create this task from. |
| @param job: The job info that owns this task. |
| """ |
| self._test = test |
| self._job = job |
| |
| keyvals_file = os.path.join(self.results_dir, 'keyval') |
| self.keyvals = base_utils.read_keyval(keyvals_file) |
| |
| @property |
| def taskname(self): |
| """The name of the test.""" |
| return self._test.testname |
| |
| @property |
| def status(self): |
| """The autotest status of this test.""" |
| return self._test.status |
| |
| @property |
| def start_time(self): |
| """The utc recorded time of when this test started.""" |
| return time_utils.to_utc_timestamp(self._test.started_time) |
| |
| @property |
| def end_time(self): |
| """The utc recorded time of when this test ended.""" |
| return time_utils.to_utc_timestamp(self._test.finished_time) |
| |
| @property |
| def subdir(self): |
| """The sub directory used for this test.""" |
| return self._test.subdir |
| |
| @property |
| def attributes(self): |
| """Attributes of this task.""" |
| return getattr(self._test, 'attributes', {}) |
| |
| @property |
| def reason(self): |
| """The reason for this tasks status.""" |
| return getattr(self._test, 'reason', None) |
| |
| @property |
| def results_dir(self): |
| """The full directory where results are stored for this test.""" |
| if self.subdir == '----' or not self.subdir: |
| return self._job.results_dir |
| else: |
| return os.path.join(self._job.results_dir, self.subdir) |
| |
| @property |
| def is_test(self): |
| """True if this task is an actual test that ran.""" |
| return self.subdir != '----' |