普通文本  |  92行  |  3.2 KB

# Copyright (c) 2017 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.

"""Host object for Jetstream devices.

Host customization provided for fine-tuning autotest reset, verification,
and provisioning on Jetstream devices. A more customized host wrapper is
typicaly used in Jetstream autotests.
"""

import logging

import common
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import lsbrelease_utils
from autotest_lib.server.hosts import cros_host
from autotest_lib.server.hosts import cros_repair


# Presence of any of these processes indicates that the host is up:
BOOT_DETECTION_PROCESSES = ('ap-controller',)

# Maximum time for host to report is_up after rebooting
BOOT_TIMEOUT_SECONDS = 180

# Maximum time for host to recover after resetting
RESET_TIMEOUT_SECONDS = 60


class JetstreamHost(cros_host.CrosHost):
    """Jetstream-specific host class."""

    @staticmethod
    def check_host(host, timeout=10):
        """
        Check if the given host is jetstream host.

        @param host: An ssh host representing a device.
        @param timeout: The timeout for the run command.

        @return: True if the host is a Jetstream device, otherwise False.
        """
        try:
            lsb_release_content = host.run(
                'grep CHROMEOS_RELEASE_BOARD /etc/lsb-release').stdout
            return lsbrelease_utils.is_jetstream(
                lsb_release_content=lsb_release_content)
        except (error.AutoservRunError, error.AutoservSSHTimeout):
            return False

    def _initialize(self, *args, **dargs):
        logging.debug('Initializing Jetstream host')
        super(JetstreamHost, self)._initialize(*args, **dargs)
        # Overwrite base class initialization
        self._repair_strategy = cros_repair.create_jetstream_repair_strategy()

    def get_os_type(self):
        return 'jetstream'

    def get_wait_up_processes(self):
        return BOOT_DETECTION_PROCESSES

    def verify(self):
        # Whirlwind takes longer to start all system services, so check
        # that ap-controller is running before verifying, crbug/739583.
        self.wait_up(timeout=BOOT_TIMEOUT_SECONDS)
        logging.debug('Jetstream host is up, starting verification')
        super(JetstreamHost, self).verify()

    def cleanup_services(self):
        """Restores the host to default settings.

        @raises AutoservRunError: on failure.
        """
        logging.debug('Jetstream: Resetting AP services')
        # This is a 'fake' factory reset which restores the DUT to
        # its default state and restarts AP services.
        self.run('sudo ap-configure --factory_reset', ignore_status=False)
        self.wait_up(timeout=RESET_TIMEOUT_SECONDS)

        # Stop service ap-update-manager to prevent rebooting during autoupdate.
        self.run('sudo stop ap-update-manager', ignore_status=False)

    def prepare_for_update(self):
        """Prepare the host for an update."""
        logging.debug('Jetstream: Prepare for update')
        try:
            self.cleanup_services()
        except error.AutoservRunError:
            logging.exception('Failed to reset host')