#!/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)
