import logging
import os

from autotest_lib.client.common_lib import error
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 cleanup(machine):
    timer = None
    try:
        job.record('START', None, 'cleanup')
        host = hosts.create_host(machine, initialize=False, auto_monitor=False,
                                 try_lab_servo=True)
        timer = autotest_stats.Timer('cleanup_time')
        timer.start()

        # Try to save /var/log files. If the dut is not sshable, try to restart
        # with servo. This is a temp fix to collect log for test failed with dut
        # not returning from reboot.
        # TODO(dshi): This temp fix should be removed after crash collect work
        # is completed, crbug.com/336985
        try:
            host.ssh_ping()
        except error.AutoservSshPingHostError:
            # Try to restart dut with servo.
            host._servo_repair_power()
        local_log_dir = os.path.join(job.resultdir, machine)
        host.collect_logs('/var/log', local_log_dir, ignore_errors=True)

        host.cleanup()
        provision.run_special_task_actions(job, host, labels_list,
                                           provision.Cleanup)
    except Exception as e:
        logging.exception(e)
        job.record('END FAIL', None, 'cleanup')
        # See the provision control segment for the explanation of why we're
        # doing this.
        raise Exception('')
    else:
        job.record('END GOOD', None, 'cleanup',
                   '%s cleaned successfully' % machine)
    finally:
        if timer:
            timer.stop()



job.parallel_simple(cleanup, machines, log=False)

# vim: set syntax=python :
