# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Expects to be run in an environment with sudo and no interactive password
# prompt, such as within the Chromium OS development chroot.


"""This file provides core logic for pdtester verify/repair process."""

import logging

from autotest_lib.server.hosts import servo_host


# Names of the host attributes in the database that represent the values for
# the pdtester_host and pdtester_port for a PD tester connected to the DUT.
PDTESTER_HOST_ATTR = 'pdtester_host'
PDTESTER_PORT_ATTR = 'pdtester_port'


def make_pdtester_hostname(dut_hostname):
    """Given a DUT's hostname, return the hostname of its PD tester.

    @param dut_hostname: hostname of a DUT.

    @return hostname of the DUT's PD tester.

    """
    host_parts = dut_hostname.split('.')
    host_parts[0] = host_parts[0] + '-pdtester'
    return '.'.join(host_parts)


class PDTesterHost(servo_host.ServoHost):
    """Host class for a host that controls a PDTester object."""


    def _initialize(self, pdtester_host='localhost', pdtester_port=9999,
                    *args, **dargs):
        """Initialize a PDTesterHost instance.

        A PDTesterHost instance represents a host that controls a PD tester.

        @param pdtester_host: Name of the host where the servod process
                              is running.
        @param pdtester_port: Port the servod process is listening on.

        """
        super(PDTesterHost, self)._initialize(pdtester_host, pdtester_port,
                                              *args, **dargs)
        self.connect_servo()


def create_pdtester_host(pdtester_args, servo_host):
    """Create a PDTesterHost object used to access pdtester servo

    The `pdtester_args` parameter is a dictionary specifying optional
    PDTester client parameter overrides (i.e. a specific host or port).
    When specified, the caller requires that an exception be raised
    unless both the PDTesterHost and the PDTester are successfully
    created.

    @param pdtester_args: A dictionary that contains args for creating
                          a PDTesterHost object,
                          e.g. {'pdtester_host': '172.11.11.111',
                                'pdtester_port': 9999}.
    @param servo_host: If PDTester and Servo are the same, this
                       servo_host object will be returned.
    @returns: A PDTesterHost object or None.

    """
    # None means PDTester is not required to run a test.
    if pdtester_args is None:
        return None

    # If an user doesn't pass the PDTester info, fall back to use the servo
    # info. Usually we use Servo v4 as PDTester, so make it default.
    if PDTESTER_HOST_ATTR not in pdtester_args:
        logging.debug('%s not specified, reuse the same hostname as servo: %s',
                      PDTESTER_HOST_ATTR, servo_host.hostname)
        pdtester_args[PDTESTER_HOST_ATTR] = servo_host.hostname

    if PDTESTER_PORT_ATTR not in pdtester_args:
        logging.debug('%s not specified, reuse the same port as servo: %s',
                      PDTESTER_PORT_ATTR, servo_host.servo_port)
        pdtester_args[PDTESTER_PORT_ATTR] = servo_host.servo_port

    # Just return the servo_host object, if the hostname and the port are the
    # same as servo_host.
    if (pdtester_args[PDTESTER_HOST_ATTR] == servo_host.hostname and
        pdtester_args[PDTESTER_PORT_ATTR] == servo_host.servo_port):
        logging.debug('Return the servo_host directly as PDTester and Servo '
                      'are the same.')
        return servo_host

    return PDTesterHost(**pdtester_args)
