# Copyright (c) 2008 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os

from autotest_lib.server import crashcollect
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 repair(machine):
    try:
        hostname = utils.get_hostname_from_machine(machine)
        job.record('START', None, 'repair')
        target = hosts.create_target_machine(machine,
                                             try_lab_servo=True,
                                             try_servo_repair=True)
        try:
            # We don't need to collect logs or crash info if we're a
            # testbed since they're not applicable (yet).
            if isinstance(target, hosts.CrosHost):
                # Collect logs before the repair, as it might destroy all
                # useful logs.
                local_log_dir = os.path.join(job.resultdir, hostname,
                                             'before_repair')
                target.collect_logs('/var/log',
                                    local_log_dir,
                                    ignore_errors=True)
                # Collect crash info.
                crashcollect.get_crashinfo(target, None)
        except Exception:
            logging.exception('Crash collection failed; crashes may be '
                              'lost.  Sorry about that.')

        target.repair()
        logging.debug('Repair with labels list %s', labels_list)

        try:
            target.labels.update_labels(target,
                                        task_name='repair',
                                        keep_pool=True)
        except Exception:
            logging.exception('Exception while updating labels.')
    except Exception:
        logging.exception('Repair failed due to Exception.')
        job.record('END FAIL', None, 'repair')
        # See the provision control segment for the explanation of why we're
        # doing this.
        raise Exception('')
    else:
        job.record('END GOOD', None, 'repair',
                   '%s repaired successfully' % hostname)


job.parallel_simple(repair, machines)

# vim: set syntax=python :
