blob: 10c1630de363f4ca464ac7259fed7fc6cb056ac1 [file] [log] [blame]
# Copyright (c) 2014 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.
#
"""This file provides core logic for connecting a Chameleon Daemon."""
import xmlrpclib
from autotest_lib.client.bin import utils
from autotest_lib.server.cros.chameleon import chameleon
from autotest_lib.server.hosts import ssh_host
def make_chameleon_hostname(dut_hostname):
"""Given a DUT's hostname, return the hostname of its Chameleon.
@param dut_hostname: hostname of a DUT.
@return hostname of the DUT's Chameleon.
"""
host_parts = dut_hostname.split('.')
host_parts[0] = host_parts[0] + '-chameleon'
return '.'.join(host_parts)
class ChameleonHost(ssh_host.SSHHost):
"""Host class for a host that controls a Chameleon."""
# Chameleond process name.
CHAMELEOND_PROCESS = 'chameleond'
# TODO(waihong): Add verify and repair logic which are required while
# deploying to Cros Lab.
def _initialize(self, chameleon_host='localhost', chameleon_port=9992,
*args, **dargs):
"""Initialize a ChameleonHost instance.
A ChameleonHost instance represents a host that controls a Chameleon.
@param chameleon_host: Name of the host where the chameleond process
is running.
@param chameleon_port: Port the chameleond process is listening on.
"""
super(ChameleonHost, self)._initialize(hostname=chameleon_host,
*args, **dargs)
self._is_in_lab = utils.host_is_in_lab_zone(self.hostname)
remote = 'http://%s:%s' % (self.hostname, chameleon_port)
self._chameleond_proxy = xmlrpclib.ServerProxy(remote, allow_none=True)
def is_in_lab(self):
"""Check whether the chameleon host is a lab device.
@returns: True if the chameleon host is in Cros Lab, otherwise False.
"""
return self._is_in_lab
def get_wait_up_processes(self):
"""Get the list of local processes to wait for in wait_up.
Override get_wait_up_processes in
autotest_lib.client.common_lib.hosts.base_classes.Host.
Wait for chameleond process to go up. Called by base class when
rebooting the device.
"""
processes = [self.CHAMELEOND_PROCESS]
return processes
def create_chameleon_board(self):
"""Create a ChameleonBoard object."""
# TODO(waihong): Add verify and repair logic which are required while
# deploying to Cros Lab.
return chameleon.ChameleonBoard(self._chameleond_proxy)
def create_chameleon_host(dut, chameleon_args):
"""Create a ChameleonHost object.
There three possible cases:
1) If the DUT is in Cros Lab and has a chameleon board, then create
a ChameleonHost object pointing to the board. chameleon_args
is ignored.
2) If not case 1) and chameleon_args is neither None nor empty, then
create a ChameleonHost object using chameleon_args.
3) If neither case 1) or 2) applies, return None.
@param dut: host name of the host that chameleon connects. It can be used
to lookup the chameleon in test lab using naming convention.
@param chameleon_args: A dictionary that contains args for creating
a ChameleonHost object,
e.g. {'chameleon_host': '172.11.11.112',
'chameleon_port': 9992}.
@returns: A ChameleonHost object or None.
"""
hostname = make_chameleon_hostname(dut)
if utils.host_is_in_lab_zone(hostname):
return ChameleonHost(chameleon_host=hostname)
elif chameleon_args:
return ChameleonHost(**chameleon_args)
else:
return None