blob: 9bb8cc1ce3c1eb96abd2b209b720d935b9cea896 [file] [log] [blame]
# Copyright 2016 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
from autotest_lib.client.common_lib.cros import autoupdater
from autotest_lib.client.common_lib.cros import dev_server
from autotest_lib.server import afe_utils
from autotest_lib.server import site_utils
from autotest_lib.server import test
from autotest_lib.server.cros.dynamic_suite import frontend_wrappers
class servohost_Reboot(test.test):
"""Enable a safe reboot for a servo host."""
version = 1
def run_once(self, host, force_reboot=False):
"""
Perfom a safe reboot for a servo host.
A servo host could be used by multiple duts so we need to lock them down
to ensure they're not running a test that requires the servo.
@param host: Dut that was designated to kick off the reboot for the
servo host.
"""
s_host = host._servo_host
reboot_needed = force_reboot
# If we don't have to force reboot, check if we need to reboot at all.
if not force_reboot:
servo_host_build = afe_utils.get_stable_cros_image_name(
s_host.get_board())
ds = dev_server.ImageServer.resolve(s_host.hostname)
url = ds.get_update_url(servo_host_build)
updater = autoupdater.ChromiumOSUpdater(update_url=url, host=s_host)
reboot_needed = (updater.check_update_status() ==
autoupdater.UPDATER_NEED_REBOOT)
if reboot_needed:
# Get the list of duts to lock but take out the current host so we
# don't wait forever.
afe = frontend_wrappers.RetryingAFE(timeout_min=5, delay_sec=10)
dut_list = s_host.get_attached_duts(afe)
dut_list.remove(host.hostname)
# Lock the duts and reboot the servo host.
lock_msg = 'reboot for servo host %s' % s_host.hostname
with site_utils.lock_duts_and_wait(
dut_list, afe, lock_msg=lock_msg) as lock_success:
logging.info(
'status waiting for duts to go idle for '
'servo host[%s]: %s', s_host.hostname, lock_success)
if lock_success:
s_host.reboot()