普通文本  |  76行  |  2.38 KB

# 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.

import common
import itertools

from autotest_lib.server import frontend
from autotest_lib.server import site_utils


CLIENT_BOX_STR = 'client_box_'
RF_SWITCH_STR = 'rf_switch_'
RF_SWITCH_DUT = 'rf_switch_dut'
RF_SWITCH_CLIENT = 'rf_switch_client'


class ClientBoxException(Exception):
    pass


class ClientBox(object):
    """Class to manage devices in the Client Box."""


    def __init__(self, client_box_host):
        """Constructor for the ClientBox.

        @param client_box_host: Client Box AFE Host.
        """
        self.client_box_host = client_box_host
        self.client_box_label = ''
        self.rf_switch_label = ''
        for label in client_box_host.labels:
            if label.startswith(CLIENT_BOX_STR):
                self.client_box_label = label
            elif label.startswith(RF_SWITCH_STR) and (
                    label is not RF_SWITCH_CLIENT):
                self.rf_switch_label = label
        if not self.client_box_label or not self.rf_switch_label:
            msg = 'CleintBoxLabels: %s \t RfSwitchLabels: %s' % (
                     self.client_box_label, self.rf_switch_label)
            raise ClientBoxException(
                    'Labels not found:: %s' % msg)
        self.devices = None


    def get_devices(self):
        """Return all devices in the Client Box.

        @returns a list of autotest_lib.server.frontend.Host objects.
        """
        if self.devices is None:
            self.devices = self.get_devices_using_labels([RF_SWITCH_DUT])
        return self.devices

    def get_devices_using_labels(self, labels):
        """Returns all devices with the passed labels in the Client Box.

        @params labels: List of host labels.

        @returns a list of string containing the hostnames.
        """
        afe = frontend.AFE(
                debug=True, server=site_utils.get_global_afe_hostname())
        hosts = afe.get_hosts(label=self.client_box_label)
        labels.append(self.rf_switch_label)
        devices = []
        for host in hosts:
            labels_list = list(itertools.ifilter(
                lambda x: x in host.labels, labels))
            if len(labels) == len(labels_list):
                devices.append(host.hostname)
        return devices