| # 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 : |