import sys

from autotest_lib.client.common_lib.cros.graphite import autotest_stats
from autotest_lib.server.cros import provision


# 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
    timer = None
    try:
        job.record('START', None, 'reset')
        target = hosts.create_target_machine(machine, initialize=False,
                                             auto_monitor=False)
        timer = autotest_stats.Timer('reset_time')
        timer.start()

        # 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 as e:
        logging.exception(e)
        job.record('END FAIL', None, 'reset')
        # See the provision control segment for the explanation of why we're
        # doing this.
        raise Exception('')
    else:
        job.record('END GOOD', None, 'reset',
                   '%s reset successfully' % machine)
    finally:
        if timer:
            timer.stop()


job.parallel_simple(reset, machines)

# vim: set syntax=python :
