1# Copyright 2015 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# Expects to be run in an environment with sudo and no interactive password 6# prompt, such as within the Chromium OS development chroot. 7 8 9"""This file provides core logic for pdtester verify/repair process.""" 10 11import logging 12 13from autotest_lib.server.hosts import servo_host 14 15 16# Names of the host attributes in the database that represent the values for 17# the pdtester_host and pdtester_port for a PD tester connected to the DUT. 18PDTESTER_HOST_ATTR = 'pdtester_host' 19PDTESTER_PORT_ATTR = 'pdtester_port' 20 21 22def make_pdtester_hostname(dut_hostname): 23 """Given a DUT's hostname, return the hostname of its PD tester. 24 25 @param dut_hostname: hostname of a DUT. 26 27 @return hostname of the DUT's PD tester. 28 29 """ 30 host_parts = dut_hostname.split('.') 31 host_parts[0] = host_parts[0] + '-pdtester' 32 return '.'.join(host_parts) 33 34 35class PDTesterHost(servo_host.ServoHost): 36 """Host class for a host that controls a PDTester object.""" 37 38 39 def _initialize(self, pdtester_host='localhost', pdtester_port=9999, 40 *args, **dargs): 41 """Initialize a PDTesterHost instance. 42 43 A PDTesterHost instance represents a host that controls a PD tester. 44 45 @param pdtester_host: Name of the host where the servod process 46 is running. 47 @param pdtester_port: Port the servod process is listening on. 48 49 """ 50 super(PDTesterHost, self)._initialize(pdtester_host, pdtester_port, 51 *args, **dargs) 52 self.connect_servo() 53 54 55def create_pdtester_host(pdtester_args, servo_host): 56 """Create a PDTesterHost object used to access pdtester servo 57 58 The `pdtester_args` parameter is a dictionary specifying optional 59 PDTester client parameter overrides (i.e. a specific host or port). 60 When specified, the caller requires that an exception be raised 61 unless both the PDTesterHost and the PDTester are successfully 62 created. 63 64 @param pdtester_args: A dictionary that contains args for creating 65 a PDTesterHost object, 66 e.g. {'pdtester_host': '172.11.11.111', 67 'pdtester_port': 9999}. 68 @param servo_host: If PDTester and Servo are the same, this 69 servo_host object will be returned. 70 @returns: A PDTesterHost object or None. 71 72 """ 73 # None means PDTester is not required to run a test. 74 if pdtester_args is None: 75 return None 76 77 # If an user doesn't pass the PDTester info, fall back to use the servo 78 # info. Usually we use Servo v4 as PDTester, so make it default. 79 if PDTESTER_HOST_ATTR not in pdtester_args: 80 logging.debug('%s not specified, reuse the same hostname as servo: %s', 81 PDTESTER_HOST_ATTR, servo_host.hostname) 82 pdtester_args[PDTESTER_HOST_ATTR] = servo_host.hostname 83 84 if PDTESTER_PORT_ATTR not in pdtester_args: 85 logging.debug('%s not specified, reuse the same port as servo: %s', 86 PDTESTER_PORT_ATTR, servo_host.servo_port) 87 pdtester_args[PDTESTER_PORT_ATTR] = servo_host.servo_port 88 89 # Just return the servo_host object, if the hostname and the port are the 90 # same as servo_host. 91 if (pdtester_args[PDTESTER_HOST_ATTR] == servo_host.hostname and 92 pdtester_args[PDTESTER_PORT_ATTR] == servo_host.servo_port): 93 logging.debug('Return the servo_host directly as PDTester and Servo ' 94 'are the same.') 95 return servo_host 96 97 return PDTesterHost(**pdtester_args) 98