Home | History | Annotate | Download | only in hosts
      1 # Copyright (c) 2017 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """Host object for Jetstream devices.
      6 
      7 Host customization provided for fine-tuning autotest reset, verification,
      8 and provisioning on Jetstream devices. A more customized host wrapper is
      9 typicaly used in Jetstream autotests.
     10 """
     11 
     12 import logging
     13 
     14 import common
     15 from autotest_lib.client.common_lib import error
     16 from autotest_lib.client.common_lib import lsbrelease_utils
     17 from autotest_lib.server.hosts import cros_host
     18 from autotest_lib.server.hosts import cros_repair
     19 
     20 
     21 # Presence of any of these processes indicates that the host is up:
     22 BOOT_DETECTION_PROCESSES = ('ap-controller',)
     23 
     24 # Maximum time for host to report is_up after rebooting
     25 BOOT_TIMEOUT_SECONDS = 180
     26 
     27 # Maximum time for host to recover after resetting
     28 RESET_TIMEOUT_SECONDS = 60
     29 
     30 
     31 class JetstreamHost(cros_host.CrosHost):
     32     """Jetstream-specific host class."""
     33 
     34     @staticmethod
     35     def check_host(host, timeout=10):
     36         """
     37         Check if the given host is jetstream host.
     38 
     39         @param host: An ssh host representing a device.
     40         @param timeout: The timeout for the run command.
     41 
     42         @return: True if the host is a Jetstream device, otherwise False.
     43         """
     44         try:
     45             lsb_release_content = host.run(
     46                 'grep CHROMEOS_RELEASE_BOARD /etc/lsb-release').stdout
     47             return lsbrelease_utils.is_jetstream(
     48                 lsb_release_content=lsb_release_content)
     49         except (error.AutoservRunError, error.AutoservSSHTimeout):
     50             return False
     51 
     52     def _initialize(self, *args, **dargs):
     53         logging.debug('Initializing Jetstream host')
     54         super(JetstreamHost, self)._initialize(*args, **dargs)
     55         # Overwrite base class initialization
     56         self._repair_strategy = cros_repair.create_jetstream_repair_strategy()
     57 
     58     def get_os_type(self):
     59         return 'jetstream'
     60 
     61     def get_wait_up_processes(self):
     62         return BOOT_DETECTION_PROCESSES
     63 
     64     def verify(self):
     65         # Whirlwind takes longer to start all system services, so check
     66         # that ap-controller is running before verifying, crbug/739583.
     67         self.wait_up(timeout=BOOT_TIMEOUT_SECONDS)
     68         logging.debug('Jetstream host is up, starting verification')
     69         super(JetstreamHost, self).verify()
     70 
     71     def cleanup_services(self):
     72         """Restores the host to default settings.
     73 
     74         @raises AutoservRunError: on failure.
     75         """
     76         logging.debug('Jetstream: Resetting AP services')
     77         # This is a 'fake' factory reset which restores the DUT to
     78         # its default state and restarts AP services.
     79         self.run('sudo ap-configure --factory_reset', ignore_status=False)
     80         self.wait_up(timeout=RESET_TIMEOUT_SECONDS)
     81 
     82         # Stop service ap-update-manager to prevent rebooting during autoupdate.
     83         self.run('sudo stop ap-update-manager', ignore_status=False)
     84 
     85     def prepare_for_update(self):
     86         """Prepare the host for an update."""
     87         logging.debug('Jetstream: Prepare for update')
     88         try:
     89             self.cleanup_services()
     90         except error.AutoservRunError:
     91             logging.exception('Failed to reset host')
     92