import sys

from autotest_lib.client.common_lib.cros.graphite import 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 ' + machine
    timer = None
    try:
        job.record('START', None, 'reset')
        host = hosts.create_host(machine, initialize=False, auto_monitor=False)
        timer = stats.Timer('reset_time')
        timer.start()

        # Assume cleanup always runs first.
        host.cleanup()
        provision.run_special_task_actions(job, host, labels_list,
                                           provision.Cleanup)

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