普通文本  |  57行  |  2.31 KB

# 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()