# 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 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 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 AutoservRunError:
            logging.exception('Failed to reset host')
