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/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)
    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 :
