69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
| # 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 :
 |