xref: /aosp_15_r20/external/autotest/server/afe_utils.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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