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

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


DURATION_METRIC = 'chromeos/autotest/autoserv/verify_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 verify(machine):
    print('Initializing host %s' % machine)
    job.record('START', None, 'verify')
    target = hosts.create_target_machine(machine,
                                         try_lab_servo=True,
                                         try_servo_recovery=True)
    hostname = utils.get_hostname_from_machine(machine)
    try:
        with metrics.SecondsTimer(DURATION_METRIC,
                                  fields={'dut_host_name': hostname}):
            target.verify()
            provision.Verify.run_task_actions(job, target, labels_list)
    except Exception:
        logging.exception('Verify failed due to Exception.')
        job.record('END FAIL', None, 'verify')
        # 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, 'verify',
                   '%s verified successfully' % hostname)


job.parallel_simple(verify, machines)

# vim: set syntax=python :
