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 import utils
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:
        hostname = utils.get_hostname_from_machine(machine)
        job.record('START', None, 'cleanup')
        host = hosts.create_host(machine, 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, hostname)
        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' % hostname)
    finally:
        if timer:
            timer.stop()



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

# vim: set syntax=python :
