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