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