| #!/usr/bin/env python2 |
| # Copyright 2016 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Generate a report on a given suite run.""" |
| |
| from __future__ import print_function |
| |
| import common |
| import sys |
| |
| from autotest_lib.server.cros.dynamic_suite import frontend_wrappers |
| from autotest_lib.server.lib import suite_report |
| from chromite.lib import commandline |
| from chromite.lib import cros_logging as logging |
| from chromite.lib import ts_mon_config |
| |
| def GetParser(): |
| """Creates the argparse parser.""" |
| parser = commandline.ArgumentParser(description=__doc__) |
| parser.add_argument('job_ids', type=int, nargs='+', |
| help='Suite job ids to dump') |
| # As a provision suite may exit before its all provision jobs finish, the |
| # provision suite report may not contain all the provision jobs. This hack |
| # helps to dump report for all provision jobs under the given provision |
| # suite (provision-job-id). See more details in crbug.com/794346 |
| parser.add_argument('--provision-job-id', type=int, |
| help='Provision suite job id to dump report.') |
| parser.add_argument('--output', '-o', type=str, action='store', |
| help='Path to write JSON file to') |
| parser.add_argument('--afe', type=str, action='store', |
| help='AFE server to connect to') |
| return parser |
| |
| |
| def main(argv): |
| """Standard main() for command line processing. |
| |
| @param argv Command line arguments (normally sys.argv). |
| """ |
| |
| parser = GetParser() |
| options = parser.parse_args(argv[1:]) |
| |
| with ts_mon_config.SetupTsMonGlobalState('dump_suite_report'): |
| |
| afe = frontend_wrappers.RetryingAFE(timeout_min=5, delay_sec=10, |
| server=options.afe) |
| tko = frontend_wrappers.RetryingTKO(timeout_min=5, delay_sec=10) |
| |
| job_ids = set(options.job_ids) |
| if options.provision_job_id: |
| job_ids.add(options.provision_job_id) |
| |
| # Look up and generate entries for all jobs. |
| entries = [] |
| for suite_job_id in job_ids: |
| reset_finish_time = (suite_job_id == options.provision_job_id) |
| |
| logging.debug('Suite job %s:' % suite_job_id) |
| suite_entries = suite_report.generate_suite_report( |
| suite_job_id, afe=afe, tko=tko, |
| reset_finish_time=reset_finish_time) |
| logging.debug('... generated %d entries' % len(suite_entries)) |
| entries.extend(suite_entries) |
| |
| # Write all entries as JSON. |
| if options.output: |
| with open(options.output, 'w') as f: |
| suite_report.dump_entries_as_json(entries, f) |
| else: |
| suite_report.dump_entries_as_json(entries, sys.stdout) |
| |
| |
| if __name__ == '__main__': |
| main(sys.argv) |