# 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)
        # Initialize device health profile for repair.
        if hasattr(target, 'setup_device_health_profile'):
            target.setup_device_health_profile()

        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)
                and target.is_up()
                and target.is_file_system_writable()):
                # 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 :
