1# Lint as: python2, python3 2# Copyright 2016 The Chromium 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"""Utility functions for AFE-based interactions. 7 8NOTE: This module should only be used in the context of a running test. Any 9 utilities that require accessing the AFE, should do so by creating 10 their own instance of the AFE client and interact with it directly. 11""" 12 13from __future__ import absolute_import 14from __future__ import division 15from __future__ import print_function 16 17import logging 18import traceback 19 20from autotest_lib.client.common_lib import error 21from autotest_lib.server.cros import provision 22from autotest_lib.server.cros import provisioner 23from autotest_lib.server import site_utils as server_utils 24 25 26def _log_image_name(image_name): 27 try: 28 logging.debug("_log_image_name: image (%s)", image_name) 29 server_utils.ParseBuildName(name=image_name) 30 except Exception: 31 logging.error(traceback.format_exc()) 32 33 34def _format_image_name(board, version): 35 return "%s-release/%s" % (board, version) 36 37 38def get_stable_cros_image_name_v2(host_info): 39 """Retrieve the ChromeOS stable image name for a given board. 40 41 @param host_info: a host_info_store object. 42 43 @returns Name of a ChromeOS image to be installed in order to 44 repair the given board. 45 """ 46 if not host_info.cros_stable_version: 47 raise error.AutoservError("No cros stable_version found" 48 " in host_info_store.") 49 50 logging.debug("Get cros stable_version for board: %s", 51 getattr(host_info, "board", None)) 52 out = _format_image_name(board=host_info.board, 53 version=host_info.cros_stable_version) 54 _log_image_name(out) 55 return out 56 57 58def get_stable_firmware_version_v2(host_info): 59 """Retrieve the stable firmware version for a given model. 60 61 @param host_info: a host_info_store object. 62 63 @returns A version of firmware to be installed via 64 `chromeos-firmwareupdate` from a repair build. 65 """ 66 logging.debug("Get firmware stable_version for model: %s", 67 getattr(host_info, "model", None)) 68 return host_info.firmware_stable_version 69 70 71def get_stable_faft_version_v2(host_info): 72 """Retrieve the stable firmware version for FAFT DUTs. 73 74 @param host_info: a host_info_store object. 75 76 @returns A version of firmware to be installed in order to 77 repair firmware on a DUT used for FAFT testing. 78 """ 79 logging.debug("Get faft stable_version for model: %s", 80 getattr(host_info, "model", None)) 81 return host_info.faft_stable_version 82 83 84def clean_provision_labels(host): 85 """Clean provision-related labels. 86 87 @param host: Host object. 88 """ 89 info = host.host_info_store.get() 90 info.clear_version_labels() 91 attributes = host.get_attributes_to_clear_before_provision() 92 for key in attributes: 93 info.attributes.pop(key, None) 94 95 host.host_info_store.commit(info) 96 97 98def add_provision_labels(host, version_prefix, image_name, 99 provision_attributes={}): 100 """Add provision labels for host. 101 102 @param host: Host object. 103 @param version_prefix: a string version prefix, e.g. "cros-version:" 104 @param image_name: a string image name, e.g. peppy-release/R70-11011.0.0. 105 @param provision_attributes: a map, including attributes for provisioning, 106 e.g. {"job_repo_url": "http://..."} 107 """ 108 info = host.host_info_store.get() 109 info.attributes.update(provision_attributes) 110 info.set_version_label(version_prefix, image_name) 111 host.host_info_store.commit(info) 112 113 114def machine_install_and_update_labels(host, update_url, with_cheets=False, 115 staging_server=None): 116 """Install a build and update the version labels on a host. 117 118 @param host: Host object where the build is to be installed. 119 @param update_url: URL of the build to install. 120 @param with_cheets: If true, installation is for a specific, custom 121 version of Android for a target running ARC. 122 @param staging_server: Server where images have been staged. Typically, 123 an instance of dev_server.ImageServer. 124 """ 125 clean_provision_labels(host) 126 127 logging.debug('Attempting to provision with quick-provision.') 128 cros_provisioner = provisioner.ChromiumOSProvisioner(update_url, host=host) 129 image_name, host_attributes = cros_provisioner.run_provision() 130 131 if with_cheets: 132 image_name += provision.CHEETS_SUFFIX 133 add_provision_labels(host, host.VERSION_PREFIX, image_name, host_attributes) 134