import sys

from autotest_lib.site_utils.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.%s' %
                            host._get_board_from_afe())
        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:
        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 :
