import sys

from autotest_lib.server import utils
from autotest_lib.server.cros import provision

try:
    from chromite.lib import metrics
except ImportError:
    metrics = utils.metrics_mock


DURATION_METRIC = 'chromeos/autotest/autoserv/reset_duration'


# A string of the form 'label1,label2:value,label3'.
job_labels = locals().get('job_labels') or ','.join(args)
labels_list = [l.strip() for l in job_labels.split(',') if l]


def reset(machine):
    print('Starting to reset host %s' % machine)
    try:
        job.record('START', None, 'reset')
        target = hosts.create_target_machine(machine)
        hostname = utils.get_hostname_from_machine(machine)
        with metrics.SecondsTimer(DURATION_METRIC,
                                  fields={'dut_host_name': hostname}):
            # Assume cleanup always runs first.
            target.cleanup()
            provision.Cleanup.run_task_actions(job, target, labels_list)

            target.verify()
            provision.Verify.run_task_actions(job, target, labels_list)
    except Exception:
        logging.exception('Reset failed due to Exception.')
        job.record('END FAIL', None, 'reset')
        # See the provision control segment for the explanation of why we're
        # doing this.
        raise Exception('')
    else:
        hostname = utils.get_hostname_from_machine(machine)
        job.record('END GOOD', None, 'reset',
                   '%s reset successfully' % hostname)


job.parallel_simple(reset, machines)

# vim: set syntax=python :
