184 lines
5.1 KiB
Python
184 lines
5.1 KiB
Python
# 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 != '----'
|