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