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