Derek Beckett | f73baca | 2020-08-19 15:08:47 -0700 | [diff] [blame] | 1 | # Lint as: python2, python3 |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 2 | # Copyright 2016 The Chromium OS Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | """This class defines the CrosHost Label class.""" |
| 7 | |
Derek Beckett | f73baca | 2020-08-19 15:08:47 -0700 | [diff] [blame] | 8 | from __future__ import absolute_import |
| 9 | from __future__ import division |
| 10 | from __future__ import print_function |
| 11 | |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 12 | import collections |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 13 | import logging |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 14 | import re |
| 15 | |
| 16 | import common |
| 17 | |
| 18 | from autotest_lib.client.bin import utils |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 19 | from autotest_lib.server.cros.dynamic_suite import constants as ds_constants |
| 20 | from autotest_lib.server.hosts import base_label |
| 21 | from autotest_lib.server.hosts import common_label |
Garry Wang | 11b5e87 | 2020-03-11 15:14:08 -0700 | [diff] [blame] | 22 | from autotest_lib.server.hosts import servo_constants |
Derek Beckett | f73baca | 2020-08-19 15:08:47 -0700 | [diff] [blame] | 23 | from six.moves import zip |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 24 | |
| 25 | # pylint: disable=missing-docstring |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 26 | LsbOutput = collections.namedtuple('LsbOutput', ['unibuild', 'board']) |
| 27 | |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 28 | # Repair and Deploy taskName |
| 29 | REPAIR_TASK_NAME = 'repair' |
| 30 | DEPLOY_TASK_NAME = 'deploy' |
| 31 | |
Gregory Nisbet | fb68a1f | 2019-08-22 10:27:33 -0700 | [diff] [blame] | 32 | |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 33 | def _parse_lsb_output(host): |
Allen Li | a0c7afc | 2019-02-26 15:50:06 -0800 | [diff] [blame] | 34 | """Parses the LSB output and returns key data points for labeling. |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 35 | |
Allen Li | a0c7afc | 2019-02-26 15:50:06 -0800 | [diff] [blame] | 36 | @param host: Host that the command will be executed against |
| 37 | @returns: LsbOutput with the result of parsing the /etc/lsb-release output |
| 38 | """ |
| 39 | release_info = utils.parse_cmd_output('cat /etc/lsb-release', |
| 40 | run_method=host.run) |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 41 | |
Allen Li | a0c7afc | 2019-02-26 15:50:06 -0800 | [diff] [blame] | 42 | unibuild = release_info.get('CHROMEOS_RELEASE_UNIBUILD') == '1' |
| 43 | return LsbOutput(unibuild, release_info['CHROMEOS_RELEASE_BOARD']) |
C Shapiro | 05dd322 | 2017-09-22 10:42:33 -0600 | [diff] [blame] | 44 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 45 | |
C Shapiro | be0ff8d | 2019-06-14 10:41:43 -0600 | [diff] [blame] | 46 | class DeviceSkuLabel(base_label.StringPrefixLabel): |
| 47 | """Determine the correct device_sku label for the device.""" |
| 48 | |
| 49 | _NAME = ds_constants.DEVICE_SKU_LABEL |
| 50 | |
| 51 | def generate_labels(self, host): |
| 52 | device_sku = host.host_info_store.get().device_sku |
| 53 | if device_sku: |
| 54 | return [device_sku] |
| 55 | |
| 56 | mosys_cmd = 'mosys platform sku' |
| 57 | result = host.run(command=mosys_cmd, ignore_status=True) |
| 58 | if result.exit_status == 0: |
| 59 | return [result.stdout.strip()] |
| 60 | |
| 61 | return [] |
| 62 | |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 63 | def update_for_task(self, task_name): |
Otabek Kasimov | b80faf7 | 2020-09-15 21:22:00 -0700 | [diff] [blame] | 64 | # This label is stored in the lab config. |
| 65 | return task_name in (DEPLOY_TASK_NAME, REPAIR_TASK_NAME, '') |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 66 | |
C Shapiro | be0ff8d | 2019-06-14 10:41:43 -0600 | [diff] [blame] | 67 | |
Ned Nguyen | e0a619d | 2019-07-01 15:50:23 -0600 | [diff] [blame] | 68 | class BrandCodeLabel(base_label.StringPrefixLabel): |
| 69 | """Determine the correct brand_code (aka RLZ-code) for the device.""" |
| 70 | |
| 71 | _NAME = ds_constants.BRAND_CODE_LABEL |
| 72 | |
| 73 | def generate_labels(self, host): |
| 74 | brand_code = host.host_info_store.get().brand_code |
| 75 | if brand_code: |
| 76 | return [brand_code] |
| 77 | |
Greg Edelston | 7cea0c4 | 2019-11-26 15:17:22 -0700 | [diff] [blame] | 78 | cros_config_cmd = 'cros_config / brand-code' |
| 79 | result = host.run(command=cros_config_cmd, ignore_status=True) |
Ned Nguyen | e0a619d | 2019-07-01 15:50:23 -0600 | [diff] [blame] | 80 | if result.exit_status == 0: |
| 81 | return [result.stdout.strip()] |
| 82 | |
| 83 | return [] |
| 84 | |
| 85 | |
Shijin Abraham | c09587d | 2020-02-14 20:46:55 -0800 | [diff] [blame] | 86 | class BluetoothPeerLabel(base_label.StringPrefixLabel): |
| 87 | """Return the Bluetooth peer labels. |
| 88 | |
| 89 | working_bluetooth_btpeer label is applied if a Raspberry Pi Bluetooth peer |
| 90 | is detected.There can be up to 4 Bluetooth peers. Labels |
| 91 | working_bluetooth_btpeer:[1-4] will be assigned depending on the number of |
| 92 | peers present. |
| 93 | |
| 94 | """ |
| 95 | |
| 96 | _NAME = 'working_bluetooth_btpeer' |
| 97 | |
| 98 | def exists(self, host): |
| 99 | return len(host._btpeer_host_list) > 0 |
| 100 | |
| 101 | def generate_labels(self, host): |
| 102 | labels_list = [] |
| 103 | count = 1 |
| 104 | |
| 105 | for (btpeer, btpeer_host) in \ |
| 106 | zip(host.btpeer_list, host._btpeer_host_list): |
| 107 | try: |
| 108 | # Initialize one device type to make sure the peer is working |
| 109 | bt_hid_device = btpeer.get_bluetooth_hid_mouse() |
| 110 | if bt_hid_device.CheckSerialConnection(): |
| 111 | labels_list.append(str(count)) |
| 112 | count += 1 |
| 113 | except Exception as e: |
| 114 | logging.error('Error with initializing bt_hid_mouse on ' |
| 115 | 'btpeer %s %s', btpeer_host.hostname, e) |
| 116 | |
| 117 | logging.info('Bluetooth Peer labels are %s', labels_list) |
| 118 | return labels_list |
| 119 | |
| 120 | def update_for_task(self, task_name): |
Shijin Abraham | 76bc1db | 2020-03-06 10:52:10 -0800 | [diff] [blame] | 121 | # This label is stored in the state config, so only repair tasks update |
| 122 | # it or when no task name is mentioned. |
| 123 | return task_name in (REPAIR_TASK_NAME, '') |
Shijin Abraham | c09587d | 2020-02-14 20:46:55 -0800 | [diff] [blame] | 124 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 125 | |
Mary Ruthven | 935ebad | 2018-06-13 16:13:20 -0700 | [diff] [blame] | 126 | class Cr50Label(base_label.StringPrefixLabel): |
Mary Ruthven | 6c46264 | 2019-09-17 19:13:36 -0700 | [diff] [blame] | 127 | """Label indicating the cr50 image type.""" |
Mary Ruthven | 935ebad | 2018-06-13 16:13:20 -0700 | [diff] [blame] | 128 | |
| 129 | _NAME = 'cr50' |
| 130 | |
| 131 | def __init__(self): |
| 132 | self.ver = None |
| 133 | |
Mary Ruthven | 935ebad | 2018-06-13 16:13:20 -0700 | [diff] [blame] | 134 | def exists(self, host): |
| 135 | # Make sure the gsctool version command runs ok |
| 136 | self.ver = host.run('gsctool -a -f', ignore_status=True) |
| 137 | return self.ver.exit_status == 0 |
| 138 | |
Mary Ruthven | 6c46264 | 2019-09-17 19:13:36 -0700 | [diff] [blame] | 139 | def _get_version(self, region): |
| 140 | """Get the version number of the given region""" |
| 141 | return re.search(region + ' (\d+\.\d+\.\d+)', self.ver.stdout).group(1) |
Mary Ruthven | 935ebad | 2018-06-13 16:13:20 -0700 | [diff] [blame] | 142 | |
| 143 | def generate_labels(self, host): |
| 144 | # Check the major version to determine prePVT vs PVT |
Mary Ruthven | 6c46264 | 2019-09-17 19:13:36 -0700 | [diff] [blame] | 145 | version = self._get_version('RW') |
| 146 | major_version = int(version.split('.')[1]) |
Mary Ruthven | 935ebad | 2018-06-13 16:13:20 -0700 | [diff] [blame] | 147 | # PVT images have a odd major version prePVT have even |
Mary Ruthven | 6c46264 | 2019-09-17 19:13:36 -0700 | [diff] [blame] | 148 | return ['pvt' if (major_version % 2) else 'prepvt'] |
| 149 | |
Xixuan Wu | 61b2b26 | 2020-03-06 10:09:55 -0800 | [diff] [blame] | 150 | def update_for_task(self, task_name): |
| 151 | # This label is stored in the state config, so only repair tasks update |
| 152 | # it or when no task name is mentioned. |
| 153 | return task_name in (REPAIR_TASK_NAME, '') |
| 154 | |
Mary Ruthven | 6c46264 | 2019-09-17 19:13:36 -0700 | [diff] [blame] | 155 | |
| 156 | class Cr50RWKeyidLabel(Cr50Label): |
| 157 | """Label indicating the cr50 RW version.""" |
| 158 | _REGION = 'RW' |
| 159 | _NAME = 'cr50-rw-keyid' |
| 160 | |
| 161 | def _get_keyid_info(self, region): |
| 162 | """Get the keyid of the given region.""" |
| 163 | match = re.search('keyids:.*%s (\S+)' % region, self.ver.stdout) |
| 164 | keyid = match.group(1).rstrip(',') |
| 165 | is_prod = int(keyid, 16) & (1 << 2) |
| 166 | return [keyid, 'prod' if is_prod else 'dev'] |
| 167 | |
| 168 | def generate_labels(self, host): |
| 169 | """Get the key type.""" |
| 170 | return self._get_keyid_info(self._REGION) |
| 171 | |
| 172 | |
| 173 | class Cr50ROKeyidLabel(Cr50RWKeyidLabel): |
| 174 | """Label indicating the RO key type.""" |
| 175 | _REGION = 'RO' |
| 176 | _NAME = 'cr50-ro-keyid' |
| 177 | |
| 178 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 179 | class ChameleonLabel(base_label.BaseLabel): |
| 180 | """Determine if a Chameleon is connected to this host.""" |
| 181 | |
| 182 | _NAME = 'chameleon' |
| 183 | |
| 184 | def exists(self, host): |
Xixuan Wu | 7afb54f | 2019-09-17 11:45:20 -0700 | [diff] [blame] | 185 | # See crbug.com/1004500#2 for details. |
Shijin Abraham | 783a7dd | 2020-02-14 15:36:11 -0800 | [diff] [blame] | 186 | has_chameleon = host._chameleon_host is not None |
Gregory Nisbet | b2f6d79 | 2019-09-11 14:30:47 -0700 | [diff] [blame] | 187 | # TODO(crbug.com/995900) -- debug why chameleon label is flipping |
| 188 | try: |
| 189 | logging.info("has_chameleon %s", has_chameleon) |
Shijin Abraham | 783a7dd | 2020-02-14 15:36:11 -0800 | [diff] [blame] | 190 | logging.info("_chameleon_host %s", |
| 191 | getattr(host, "_chameleon_host", "NO_ATTRIBUTE")) |
| 192 | logging.info("chameleon %s", |
| 193 | getattr(host, "chameleon", "NO_ATTRIBUTE")) |
Gregory Nisbet | b2f6d79 | 2019-09-11 14:30:47 -0700 | [diff] [blame] | 194 | except: |
| 195 | pass |
| 196 | return has_chameleon |
| 197 | |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 198 | def update_for_task(self, task_name): |
| 199 | # This label is stored in the state config, so only repair tasks update |
| 200 | # it or when no task name is mentioned. |
| 201 | return task_name in (REPAIR_TASK_NAME, '') |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 202 | |
| 203 | |
| 204 | class ChameleonConnectionLabel(base_label.StringPrefixLabel): |
| 205 | """Return the Chameleon connection label.""" |
| 206 | |
| 207 | _NAME = 'chameleon' |
| 208 | |
| 209 | def exists(self, host): |
Shijin Abraham | 783a7dd | 2020-02-14 15:36:11 -0800 | [diff] [blame] | 210 | return host._chameleon_host is not None |
Joseph Hwang | eac4431 | 2016-08-31 12:08:38 +0800 | [diff] [blame] | 211 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 212 | def generate_labels(self, host): |
Shijin Abraham | 783a7dd | 2020-02-14 15:36:11 -0800 | [diff] [blame] | 213 | return [host.chameleon.get_label()] |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 214 | |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 215 | def update_for_task(self, task_name): |
| 216 | # This label is stored in the lab config, so only deploy tasks update it |
| 217 | # or when no task name is mentioned. |
| 218 | return task_name in (DEPLOY_TASK_NAME, '') |
| 219 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 220 | |
| 221 | class AudioLoopbackDongleLabel(base_label.BaseLabel): |
| 222 | """Return the label if an audio loopback dongle is plugged in.""" |
| 223 | |
| 224 | _NAME = 'audio_loopback_dongle' |
| 225 | |
| 226 | def exists(self, host): |
Gregory Nisbet | e280ea2 | 2019-08-16 17:50:03 -0700 | [diff] [blame] | 227 | # Based on crbug.com/991285, AudioLoopbackDongle sometimes flips. |
| 228 | # Ensure that AudioLoopbackDongle.exists returns True |
| 229 | # forever, after it returns True *once*. |
| 230 | if self._cached_exists(host): |
| 231 | # If the current state is True, return it, don't run the command on |
| 232 | # the DUT and potentially flip the state. |
| 233 | return True |
| 234 | # If the current state is not True, run the command on |
| 235 | # the DUT. The new state will be set to whatever the command |
| 236 | # produces. |
| 237 | return self._host_run_exists(host) |
| 238 | |
Derek Beckett | 239fdae | 2021-07-21 14:23:11 -0700 | [diff] [blame] | 239 | def _node_type_is_plugged(self, node_type, nodes_info): |
| 240 | """Determine if there is any node of node_type plugged. |
| 241 | |
| 242 | This method is used in the AudioLoopbackDongleLabel class, where the |
| 243 | call is executed on autotest server. Use get_cras_nodes instead if |
| 244 | the call can be executed on Cros device. |
| 245 | |
| 246 | Since Cras only reports the plugged node in GetNodes, we can |
| 247 | parse the return value to see if there is any node with the given type. |
| 248 | For example, if INTERNAL_MIC is of intereset, the pattern we are |
| 249 | looking for is: |
| 250 | |
| 251 | dict entry( |
| 252 | string "Type" |
| 253 | variant string "INTERNAL_MIC" |
| 254 | ) |
| 255 | |
| 256 | @param node_type: A str representing node type defined in CRAS_NODE_TYPES. |
| 257 | @param nodes_info: A str containing output of command get_nodes_cmd. |
| 258 | |
| 259 | @returns: True if there is any node of node_type plugged. False otherwise. |
| 260 | |
| 261 | """ |
| 262 | match = re.search(r'string "Type"\s+variant\s+string "%s"' % node_type, |
| 263 | nodes_info) |
| 264 | return True if match else False |
| 265 | |
Gregory Nisbet | e280ea2 | 2019-08-16 17:50:03 -0700 | [diff] [blame] | 266 | def _cached_exists(self, host): |
| 267 | """Get the state of AudioLoopbackDongle in the data store""" |
| 268 | info = host.host_info_store.get() |
| 269 | for label in info.labels: |
| 270 | if label.startswith(self._NAME): |
| 271 | return True |
| 272 | return False |
| 273 | |
| 274 | def _host_run_exists(self, host): |
| 275 | """Detect presence of audio_loopback_dongle by physically |
| 276 | running a command on the DUT.""" |
Derek Beckett | 239fdae | 2021-07-21 14:23:11 -0700 | [diff] [blame] | 277 | cras_cmd = ('dbus-send --system --type=method_call --print-reply ' |
| 278 | '--dest=org.chromium.cras /org/chromium/cras ' |
| 279 | 'org.chromium.cras.Control.GetNodes') |
| 280 | nodes_info = host.run(command=cras_cmd, ignore_status=True).stdout |
| 281 | if (self._node_type_is_plugged('HEADPHONE', nodes_info) |
| 282 | and self._node_type_is_plugged('MIC', nodes_info)): |
Otabek Kasimov | cefc0d1 | 2020-02-07 17:13:52 -0800 | [diff] [blame] | 283 | return True |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 284 | return False |
| 285 | |
Eshwar Narayan | 871a2c0 | 2020-02-06 11:15:24 -0800 | [diff] [blame] | 286 | def update_for_task(self, task_name): |
| 287 | # This label is stored in the state config, so only repair tasks update |
| 288 | # it or when no task name is mentioned. |
| 289 | return task_name in (REPAIR_TASK_NAME, '') |
| 290 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 291 | |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 292 | class ServoTypeLabel(base_label.StringPrefixLabel): |
Otabek Kasimov | e756528 | 2020-04-14 13:26:12 -0700 | [diff] [blame] | 293 | _NAME = servo_constants.SERVO_TYPE_LABEL_PREFIX |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 294 | |
| 295 | def generate_labels(self, host): |
| 296 | info = host.host_info_store.get() |
| 297 | |
| 298 | servo_type = self._get_from_labels(info) |
| 299 | if servo_type != '': |
Otabek Kasimov | 1b67c00 | 2020-04-15 13:27:38 -0700 | [diff] [blame] | 300 | logging.info("Using servo_type: %s from cache!", servo_type) |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 301 | return [servo_type] |
| 302 | |
| 303 | if host.servo is not None: |
| 304 | try: |
| 305 | servo_type = host.servo.get_servo_version() |
| 306 | if servo_type != '': |
| 307 | return [servo_type] |
Otabek Kasimov | 1b67c00 | 2020-04-15 13:27:38 -0700 | [diff] [blame] | 308 | logging.warning('Cannot collect servo_type from servo' |
| 309 | ' by `dut-control servo_type`! Please file a bug' |
| 310 | ' and inform infra team as we are not expected ' |
| 311 | ' to reach this point.') |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 312 | except Exception as e: |
| 313 | # We don't want fail the label and break DUTs here just |
| 314 | # because of servo issue. |
| 315 | logging.error("Failed to update servo_type, %s", str(e)) |
| 316 | return [] |
| 317 | |
| 318 | def _get_from_labels(self, info): |
| 319 | prefix = self._NAME + ':' |
| 320 | for label in info.labels: |
| 321 | if label.startswith(prefix): |
| 322 | suffix_length = len(prefix) |
| 323 | return label[suffix_length:] |
| 324 | return '' |
| 325 | |
| 326 | def update_for_task(self, task_name): |
| 327 | # This label is stored in the lab config, |
| 328 | # only deploy and repair tasks update it |
| 329 | # or when no task name is mentioned. |
Otabek Kasimov | e7908f5 | 2020-05-05 18:13:33 -0700 | [diff] [blame] | 330 | return task_name in (DEPLOY_TASK_NAME, '') |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 331 | |
| 332 | |
Xixuan Wu | 78569d0 | 2019-09-15 16:08:25 -0700 | [diff] [blame] | 333 | def _parse_hwid_labels(hwid_info_list): |
| 334 | if len(hwid_info_list) == 0: |
| 335 | return hwid_info_list |
| 336 | |
| 337 | res = [] |
| 338 | # See crbug.com/997816#c7 for details of two potential formats of returns |
| 339 | # from HWID server. |
| 340 | if isinstance(hwid_info_list[0], dict): |
| 341 | # Format of hwid_info: |
| 342 | # [{u'name': u'sku', u'value': u'xxx'}, ..., ] |
| 343 | for hwid_info in hwid_info_list: |
| 344 | value = hwid_info.get('value', '') |
| 345 | name = hwid_info.get('name', '') |
| 346 | # There should always be a name but just in case there is not. |
| 347 | if name: |
| 348 | new_label = name if not value else '%s:%s' % (name, value) |
| 349 | res.append(new_label) |
| 350 | else: |
| 351 | # Format of hwid_info: |
| 352 | # [<DUTLabel name: 'sku' value: u'xxx'>, ..., ] |
| 353 | for hwid_info in hwid_info_list: |
| 354 | new_label = str(hwid_info) |
| 355 | logging.info('processing hwid label: %s', new_label) |
| 356 | res.append(new_label) |
| 357 | |
| 358 | return res |
| 359 | |
| 360 | |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 361 | CROS_LABELS = [ |
Eshwar Narayan | f46904c | 2020-02-11 17:57:31 -0800 | [diff] [blame] | 362 | AudioLoopbackDongleLabel(), #STATECONFIG |
Shijin Abraham | 76bc1db | 2020-03-06 10:52:10 -0800 | [diff] [blame] | 363 | BluetoothPeerLabel(), #STATECONFIG |
Eshwar Narayan | f46904c | 2020-02-11 17:57:31 -0800 | [diff] [blame] | 364 | ChameleonConnectionLabel(), #LABCONFIG |
| 365 | ChameleonLabel(), #STATECONFIG |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 366 | common_label.OSLabel(), |
Eshwar Narayan | f46904c | 2020-02-11 17:57:31 -0800 | [diff] [blame] | 367 | DeviceSkuLabel(), #LABCONFIG |
Otabek Kasimov | 4318591 | 2020-03-11 16:01:52 -0700 | [diff] [blame] | 368 | ServoTypeLabel(), #LABCONFIG |
Xixuan Wu | 457b4ac | 2020-03-02 14:39:08 -0800 | [diff] [blame] | 369 | # Temporarily add back as there's no way to reference cr50 configs. |
| 370 | # See crbug.com/1057145 for the root cause. |
| 371 | # See crbug.com/1057719 for future tracking. |
| 372 | Cr50Label(), |
| 373 | Cr50ROKeyidLabel(), |
Kevin Cheng | a2619dc | 2016-03-28 11:42:08 -0700 | [diff] [blame] | 374 | ] |
Garry Wang | e4b6d6e | 2019-06-17 17:08:46 -0700 | [diff] [blame] | 375 | |
| 376 | LABSTATION_LABELS = [ |
Garry Wang | e4b6d6e | 2019-06-17 17:08:46 -0700 | [diff] [blame] | 377 | common_label.OSLabel(), |
| 378 | ] |