blob: 5946571c3405cd781c4e2cb2fb7f3b47c20d06ad [file] [log] [blame] [edit]
# 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 server import crashcollect
from server import utils
from 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 :