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.run_special_task_actions(job, target, labels_list,
                                               provision.Cleanup)

            target.verify()
            provision.run_special_task_actions(job, target, labels_list,
                                               provision.Verify)
    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 :
