xref: /aosp_15_r20/tools/acloud/create/avd_spec.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
1*800a58d9SAndroid Build Coastguard Worker#!/usr/bin/env python
2*800a58d9SAndroid Build Coastguard Worker#
3*800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - The Android Open Source Project
4*800a58d9SAndroid Build Coastguard Worker#
5*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*800a58d9SAndroid Build Coastguard Worker#
9*800a58d9SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*800a58d9SAndroid Build Coastguard Worker#
11*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*800a58d9SAndroid Build Coastguard Worker# limitations under the License.
16*800a58d9SAndroid Build Coastguard Workerr"""AVDSpec class.
17*800a58d9SAndroid Build Coastguard Worker
18*800a58d9SAndroid Build Coastguard WorkerAVDSpec will take in args from the user and be the main data type that will
19*800a58d9SAndroid Build Coastguard Workerget passed into the create classes. The inferring magic will happen within
20*800a58d9SAndroid Build Coastguard Workerinitialization of AVDSpec (like LKGB build id, image branch, etc).
21*800a58d9SAndroid Build Coastguard Worker"""
22*800a58d9SAndroid Build Coastguard Worker
23*800a58d9SAndroid Build Coastguard Workerimport glob
24*800a58d9SAndroid Build Coastguard Workerimport logging
25*800a58d9SAndroid Build Coastguard Workerimport os
26*800a58d9SAndroid Build Coastguard Workerimport re
27*800a58d9SAndroid Build Coastguard Workerimport subprocess
28*800a58d9SAndroid Build Coastguard Workerimport tempfile
29*800a58d9SAndroid Build Coastguard Workerimport threading
30*800a58d9SAndroid Build Coastguard Worker
31*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors
32*800a58d9SAndroid Build Coastguard Workerfrom acloud.create import create_common
33*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal import constants
34*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_build_client
35*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth
36*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils
37*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import list as list_instance
38*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import config
39*800a58d9SAndroid Build Coastguard Worker
40*800a58d9SAndroid Build Coastguard Worker
41*800a58d9SAndroid Build Coastguard Workerlogger = logging.getLogger(__name__)
42*800a58d9SAndroid Build Coastguard Worker
43*800a58d9SAndroid Build Coastguard Worker# Default values for build target.
44*800a58d9SAndroid Build Coastguard Worker_BRANCH_RE = re.compile(r"^Manifest branch: (?P<branch>.+)")
45*800a58d9SAndroid Build Coastguard Worker_COMMAND_REPO_INFO = "repo info platform/tools/acloud"
46*800a58d9SAndroid Build Coastguard Worker_REPO_TIMEOUT = 3
47*800a58d9SAndroid Build Coastguard Worker_CF_ZIP_PATTERN = "*img*.zip"
48*800a58d9SAndroid Build Coastguard Worker_DEFAULT_BUILD_BITNESS = "x86_64"
49*800a58d9SAndroid Build Coastguard Worker_DEFAULT_BUILD_TYPE = "userdebug"
50*800a58d9SAndroid Build Coastguard Worker_ENV_ANDROID_PRODUCT_OUT = "ANDROID_PRODUCT_OUT"
51*800a58d9SAndroid Build Coastguard Worker_ENV_ANDROID_BUILD_TOP = "ANDROID_BUILD_TOP"
52*800a58d9SAndroid Build Coastguard Worker_GCE_LOCAL_IMAGE_CANDIDATES = ["avd-system.tar.gz",
53*800a58d9SAndroid Build Coastguard Worker                               "android_system_disk_syslinux.img"]
54*800a58d9SAndroid Build Coastguard Worker_LOCAL_ZIP_WARNING_MSG = "'adb sync' will take a long time if using images " \
55*800a58d9SAndroid Build Coastguard Worker                         "built with `m dist`. Building with just `m` will " \
56*800a58d9SAndroid Build Coastguard Worker                         "enable a faster 'adb sync' process."
57*800a58d9SAndroid Build Coastguard Worker_RE_ANSI_ESCAPE = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]")
58*800a58d9SAndroid Build Coastguard Worker_RE_FLAVOR = re.compile(r"^.+_(?P<flavor>.+)-img.+")
59*800a58d9SAndroid Build Coastguard Worker_RE_MEMORY = re.compile(r"(?P<gb_size>\d+)g$|(?P<mb_size>\d+)m$",
60*800a58d9SAndroid Build Coastguard Worker                        re.IGNORECASE)
61*800a58d9SAndroid Build Coastguard Worker_RE_INT = re.compile(r"^\d+$")
62*800a58d9SAndroid Build Coastguard Worker_RE_RES = re.compile(r"^(?P<x_res>\d+)x(?P<y_res>\d+)$")
63*800a58d9SAndroid Build Coastguard Worker_X_RES = "x_res"
64*800a58d9SAndroid Build Coastguard Worker_Y_RES = "y_res"
65*800a58d9SAndroid Build Coastguard Worker_COMMAND_GIT_REMOTE = ["git", "remote"]
66*800a58d9SAndroid Build Coastguard Worker
67*800a58d9SAndroid Build Coastguard Worker# The branch prefix is necessary for the Android Build system to know what we're
68*800a58d9SAndroid Build Coastguard Worker# talking about. For instance, on an aosp remote repo in the main branch,
69*800a58d9SAndroid Build Coastguard Worker# Android Build will recognize it as aosp-main.
70*800a58d9SAndroid Build Coastguard Worker_BRANCH_PREFIX = {"aosp": "aosp-"}
71*800a58d9SAndroid Build Coastguard Worker_DEFAULT_BRANCH_PREFIX = "git_"
72*800a58d9SAndroid Build Coastguard Worker_DEFAULT_BRANCH = "aosp-main"
73*800a58d9SAndroid Build Coastguard Worker
74*800a58d9SAndroid Build Coastguard Worker# The target prefix is needed to help concoct the lunch target name given a
75*800a58d9SAndroid Build Coastguard Worker# the branch, avd type and device flavor:
76*800a58d9SAndroid Build Coastguard Worker# aosp, cf and phone -> aosp_cf_x86_phone.
77*800a58d9SAndroid Build Coastguard Worker_BRANCH_TARGET_PREFIX = {"aosp": "aosp_"}
78*800a58d9SAndroid Build Coastguard Worker_BRANCH_TARGET_TRUNK_STAGEING = {"aosp-main": "-trunk_staging",
79*800a58d9SAndroid Build Coastguard Worker                                 "git_main": "-trunk_staging"}
80*800a58d9SAndroid Build Coastguard Worker
81*800a58d9SAndroid Build Coastguard Worker
82*800a58d9SAndroid Build Coastguard Workerdef EscapeAnsi(line):
83*800a58d9SAndroid Build Coastguard Worker    """Remove ANSI control sequences (e.g. temrinal color codes...)
84*800a58d9SAndroid Build Coastguard Worker
85*800a58d9SAndroid Build Coastguard Worker    Args:
86*800a58d9SAndroid Build Coastguard Worker        line: String, one line of command output.
87*800a58d9SAndroid Build Coastguard Worker
88*800a58d9SAndroid Build Coastguard Worker    Returns:
89*800a58d9SAndroid Build Coastguard Worker        String without ANSI code.
90*800a58d9SAndroid Build Coastguard Worker    """
91*800a58d9SAndroid Build Coastguard Worker    return _RE_ANSI_ESCAPE.sub('', line)
92*800a58d9SAndroid Build Coastguard Worker
93*800a58d9SAndroid Build Coastguard Worker
94*800a58d9SAndroid Build Coastguard Worker# pylint: disable=too-many-public-methods,too-many-lines,too-many-statements
95*800a58d9SAndroid Build Coastguard Workerclass AVDSpec():
96*800a58d9SAndroid Build Coastguard Worker    """Class to store data on the type of AVD to create."""
97*800a58d9SAndroid Build Coastguard Worker
98*800a58d9SAndroid Build Coastguard Worker    def __init__(self, args):
99*800a58d9SAndroid Build Coastguard Worker        """Process the args into class vars.
100*800a58d9SAndroid Build Coastguard Worker
101*800a58d9SAndroid Build Coastguard Worker        Args:
102*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
103*800a58d9SAndroid Build Coastguard Worker        """
104*800a58d9SAndroid Build Coastguard Worker        # Let's define the private class vars here and then process the user
105*800a58d9SAndroid Build Coastguard Worker        # args afterwards.
106*800a58d9SAndroid Build Coastguard Worker        self._client_adb_port = args.adb_port
107*800a58d9SAndroid Build Coastguard Worker        self._autoconnect = None
108*800a58d9SAndroid Build Coastguard Worker        self._cvd_host_package = None
109*800a58d9SAndroid Build Coastguard Worker        self._instance_name_to_reuse = None
110*800a58d9SAndroid Build Coastguard Worker        self._unlock_screen = None
111*800a58d9SAndroid Build Coastguard Worker        self._report_internal_ip = None
112*800a58d9SAndroid Build Coastguard Worker        self._disable_external_ip = None
113*800a58d9SAndroid Build Coastguard Worker        self._extra_files = None
114*800a58d9SAndroid Build Coastguard Worker        self._avd_type = None
115*800a58d9SAndroid Build Coastguard Worker        self._flavor = None
116*800a58d9SAndroid Build Coastguard Worker        self._force_sync = None
117*800a58d9SAndroid Build Coastguard Worker        self._image_source = None
118*800a58d9SAndroid Build Coastguard Worker        self._instance_type = None
119*800a58d9SAndroid Build Coastguard Worker        self._launch_args = None
120*800a58d9SAndroid Build Coastguard Worker        self._local_image_dir = None
121*800a58d9SAndroid Build Coastguard Worker        self._local_image_artifact = None
122*800a58d9SAndroid Build Coastguard Worker        self._local_instance_dir = None
123*800a58d9SAndroid Build Coastguard Worker        self._local_kernel_image = None
124*800a58d9SAndroid Build Coastguard Worker        self._local_system_image = None
125*800a58d9SAndroid Build Coastguard Worker        self._local_system_dlkm_image = None
126*800a58d9SAndroid Build Coastguard Worker        self._local_vendor_image = None
127*800a58d9SAndroid Build Coastguard Worker        self._local_vendor_boot_image = None
128*800a58d9SAndroid Build Coastguard Worker        self._local_tool_dirs = None
129*800a58d9SAndroid Build Coastguard Worker        self._image_download_dir = None
130*800a58d9SAndroid Build Coastguard Worker        self._num_of_instances = None
131*800a58d9SAndroid Build Coastguard Worker        self._num_avds_per_instance = None
132*800a58d9SAndroid Build Coastguard Worker        self._no_pull_log = None
133*800a58d9SAndroid Build Coastguard Worker        self._mkcert = None
134*800a58d9SAndroid Build Coastguard Worker        self._oxygen = None
135*800a58d9SAndroid Build Coastguard Worker        self._openwrt = None
136*800a58d9SAndroid Build Coastguard Worker        self._remote_image = {}
137*800a58d9SAndroid Build Coastguard Worker        self._system_build_info = {}
138*800a58d9SAndroid Build Coastguard Worker        self._kernel_build_info = {}
139*800a58d9SAndroid Build Coastguard Worker        self._boot_build_info = {}
140*800a58d9SAndroid Build Coastguard Worker        self._ota_build_info = {}
141*800a58d9SAndroid Build Coastguard Worker        self._host_package_build_info = {}
142*800a58d9SAndroid Build Coastguard Worker        self._bootloader_build_info = {}
143*800a58d9SAndroid Build Coastguard Worker        self._android_efi_loader_build_info = {}
144*800a58d9SAndroid Build Coastguard Worker        self._hw_property = None
145*800a58d9SAndroid Build Coastguard Worker        self._hw_customize = False
146*800a58d9SAndroid Build Coastguard Worker        self._remote_host = None
147*800a58d9SAndroid Build Coastguard Worker        self._remote_image_dir = None
148*800a58d9SAndroid Build Coastguard Worker        self._gce_metadata = None
149*800a58d9SAndroid Build Coastguard Worker        self._gce_only = None
150*800a58d9SAndroid Build Coastguard Worker        self._host_user = None
151*800a58d9SAndroid Build Coastguard Worker        self._host_ssh_private_key_path = None
152*800a58d9SAndroid Build Coastguard Worker        self._gpu = None
153*800a58d9SAndroid Build Coastguard Worker        self._disk_type = None
154*800a58d9SAndroid Build Coastguard Worker        self._base_instance_num = None
155*800a58d9SAndroid Build Coastguard Worker        self._stable_host_image_name = None
156*800a58d9SAndroid Build Coastguard Worker        self._use_launch_cvd = None
157*800a58d9SAndroid Build Coastguard Worker        self._remote_fetch = None
158*800a58d9SAndroid Build Coastguard Worker        self._webrtc_device_id = None
159*800a58d9SAndroid Build Coastguard Worker        self._connect_hostname = None
160*800a58d9SAndroid Build Coastguard Worker        self._fetch_cvd_wrapper = None
161*800a58d9SAndroid Build Coastguard Worker        self._fetch_cvd_version = None
162*800a58d9SAndroid Build Coastguard Worker
163*800a58d9SAndroid Build Coastguard Worker        # Create config instance for android_build_client to query build api.
164*800a58d9SAndroid Build Coastguard Worker        self._cfg = config.GetAcloudConfig(args)
165*800a58d9SAndroid Build Coastguard Worker        # Reporting args.
166*800a58d9SAndroid Build Coastguard Worker        self._serial_log_file = None
167*800a58d9SAndroid Build Coastguard Worker        # emulator_* are only used for goldfish avd_type.
168*800a58d9SAndroid Build Coastguard Worker        self._emulator_build_id = None
169*800a58d9SAndroid Build Coastguard Worker        self._emulator_build_target = None
170*800a58d9SAndroid Build Coastguard Worker        self._emulator_zip = None
171*800a58d9SAndroid Build Coastguard Worker
172*800a58d9SAndroid Build Coastguard Worker        # Fields only used for cheeps type.
173*800a58d9SAndroid Build Coastguard Worker        self._stable_cheeps_host_image_name = None
174*800a58d9SAndroid Build Coastguard Worker        self._stable_cheeps_host_image_project = None
175*800a58d9SAndroid Build Coastguard Worker        self._username = None
176*800a58d9SAndroid Build Coastguard Worker        self._password = None
177*800a58d9SAndroid Build Coastguard Worker        self._cheeps_betty_image = None
178*800a58d9SAndroid Build Coastguard Worker        self._cheeps_features = None
179*800a58d9SAndroid Build Coastguard Worker
180*800a58d9SAndroid Build Coastguard Worker        # Fields only used for trusty type.
181*800a58d9SAndroid Build Coastguard Worker        self._local_trusty_image = None
182*800a58d9SAndroid Build Coastguard Worker        self._trusty_host_package = None
183*800a58d9SAndroid Build Coastguard Worker        self._trusty_build_info = {}
184*800a58d9SAndroid Build Coastguard Worker
185*800a58d9SAndroid Build Coastguard Worker        # The maximum time in seconds used to wait for the AVD to boot.
186*800a58d9SAndroid Build Coastguard Worker        self._boot_timeout_secs = None
187*800a58d9SAndroid Build Coastguard Worker        # The maximum time in seconds used to wait for the instance ready.
188*800a58d9SAndroid Build Coastguard Worker        self._ins_timeout_secs = None
189*800a58d9SAndroid Build Coastguard Worker
190*800a58d9SAndroid Build Coastguard Worker        # The local instance id
191*800a58d9SAndroid Build Coastguard Worker        self._local_instance_id = None
192*800a58d9SAndroid Build Coastguard Worker
193*800a58d9SAndroid Build Coastguard Worker        self._ProcessArgs(args)
194*800a58d9SAndroid Build Coastguard Worker
195*800a58d9SAndroid Build Coastguard Worker    def __repr__(self):
196*800a58d9SAndroid Build Coastguard Worker        """Let's make it easy to see what this class is holding."""
197*800a58d9SAndroid Build Coastguard Worker        # TODO: I'm pretty sure there's a better way to do this, but I'm not
198*800a58d9SAndroid Build Coastguard Worker        # quite sure what that would be.
199*800a58d9SAndroid Build Coastguard Worker        representation = []
200*800a58d9SAndroid Build Coastguard Worker        representation.append("")
201*800a58d9SAndroid Build Coastguard Worker        representation.append(" - instance_type: %s" % self._instance_type)
202*800a58d9SAndroid Build Coastguard Worker        representation.append(" - avd type: %s" % self._avd_type)
203*800a58d9SAndroid Build Coastguard Worker        representation.append(" - flavor: %s" % self._flavor)
204*800a58d9SAndroid Build Coastguard Worker        representation.append(" - autoconnect: %s" % self._autoconnect)
205*800a58d9SAndroid Build Coastguard Worker        representation.append(" - num of instances requested: %s" %
206*800a58d9SAndroid Build Coastguard Worker                              self._num_of_instances)
207*800a58d9SAndroid Build Coastguard Worker        representation.append(" - image source type: %s" %
208*800a58d9SAndroid Build Coastguard Worker                              self._image_source)
209*800a58d9SAndroid Build Coastguard Worker        image_summary = None
210*800a58d9SAndroid Build Coastguard Worker        image_details = None
211*800a58d9SAndroid Build Coastguard Worker        if self._image_source == constants.IMAGE_SRC_LOCAL:
212*800a58d9SAndroid Build Coastguard Worker            image_summary = "local image dir"
213*800a58d9SAndroid Build Coastguard Worker            image_details = self._local_image_dir
214*800a58d9SAndroid Build Coastguard Worker            representation.append(" - instance id: %s" % self._local_instance_id)
215*800a58d9SAndroid Build Coastguard Worker        elif self._image_source == constants.IMAGE_SRC_REMOTE:
216*800a58d9SAndroid Build Coastguard Worker            image_summary = "remote image details"
217*800a58d9SAndroid Build Coastguard Worker            image_details = self._remote_image
218*800a58d9SAndroid Build Coastguard Worker        representation.append(" - %s: %s" % (image_summary, image_details))
219*800a58d9SAndroid Build Coastguard Worker        representation.append(" - hw properties: %s" %
220*800a58d9SAndroid Build Coastguard Worker                              self._hw_property)
221*800a58d9SAndroid Build Coastguard Worker        return "\n".join(representation)
222*800a58d9SAndroid Build Coastguard Worker
223*800a58d9SAndroid Build Coastguard Worker    def _ProcessArgs(self, args):
224*800a58d9SAndroid Build Coastguard Worker        """Main entry point to process args for the different type of args.
225*800a58d9SAndroid Build Coastguard Worker
226*800a58d9SAndroid Build Coastguard Worker        Split up the arg processing into related areas (image, instance type,
227*800a58d9SAndroid Build Coastguard Worker        etc) so that we don't have one huge monolilthic method that does
228*800a58d9SAndroid Build Coastguard Worker        everything. It makes it easier to review, write tests, and maintain.
229*800a58d9SAndroid Build Coastguard Worker
230*800a58d9SAndroid Build Coastguard Worker        Args:
231*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
232*800a58d9SAndroid Build Coastguard Worker        """
233*800a58d9SAndroid Build Coastguard Worker        self._ProcessMiscArgs(args)
234*800a58d9SAndroid Build Coastguard Worker        self._ProcessImageArgs(args)
235*800a58d9SAndroid Build Coastguard Worker        self._ProcessHWPropertyArgs(args)
236*800a58d9SAndroid Build Coastguard Worker        self._ProcessAutoconnect()
237*800a58d9SAndroid Build Coastguard Worker
238*800a58d9SAndroid Build Coastguard Worker    def _ProcessAutoconnect(self):
239*800a58d9SAndroid Build Coastguard Worker        """Process autoconnect.
240*800a58d9SAndroid Build Coastguard Worker
241*800a58d9SAndroid Build Coastguard Worker        Only Cuttlefish AVD support 'webrtc' and need to default use 'webrtc'.
242*800a58d9SAndroid Build Coastguard Worker        Other AVD types(goldfish, cheeps..etc.) still keep using ‘vnc’.
243*800a58d9SAndroid Build Coastguard Worker        """
244*800a58d9SAndroid Build Coastguard Worker        if self._autoconnect == constants.INS_KEY_WEBRTC:
245*800a58d9SAndroid Build Coastguard Worker            if self.avd_type != constants.TYPE_CF:
246*800a58d9SAndroid Build Coastguard Worker                self._autoconnect = constants.INS_KEY_VNC
247*800a58d9SAndroid Build Coastguard Worker
248*800a58d9SAndroid Build Coastguard Worker    def _ProcessImageArgs(self, args):
249*800a58d9SAndroid Build Coastguard Worker        """ Process Image Args.
250*800a58d9SAndroid Build Coastguard Worker
251*800a58d9SAndroid Build Coastguard Worker        Args:
252*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
253*800a58d9SAndroid Build Coastguard Worker        """
254*800a58d9SAndroid Build Coastguard Worker        # If user didn't specify --local-image, infer remote image args
255*800a58d9SAndroid Build Coastguard Worker        if args.local_image is None:
256*800a58d9SAndroid Build Coastguard Worker            self._image_source = constants.IMAGE_SRC_REMOTE
257*800a58d9SAndroid Build Coastguard Worker            self._ProcessRemoteBuildArgs(args)
258*800a58d9SAndroid Build Coastguard Worker        else:
259*800a58d9SAndroid Build Coastguard Worker            self._image_source = constants.IMAGE_SRC_LOCAL
260*800a58d9SAndroid Build Coastguard Worker            self._ProcessLocalImageArgs(args)
261*800a58d9SAndroid Build Coastguard Worker
262*800a58d9SAndroid Build Coastguard Worker        if args.local_kernel_image is not None:
263*800a58d9SAndroid Build Coastguard Worker            self._local_kernel_image = self._GetLocalImagePath(
264*800a58d9SAndroid Build Coastguard Worker                args.local_kernel_image)
265*800a58d9SAndroid Build Coastguard Worker
266*800a58d9SAndroid Build Coastguard Worker        if args.local_system_image is not None:
267*800a58d9SAndroid Build Coastguard Worker            self._local_system_image = self._GetLocalImagePath(
268*800a58d9SAndroid Build Coastguard Worker                args.local_system_image)
269*800a58d9SAndroid Build Coastguard Worker
270*800a58d9SAndroid Build Coastguard Worker        if args.local_system_dlkm_image is not None:
271*800a58d9SAndroid Build Coastguard Worker            self._local_system_dlkm_image = self._GetLocalImagePath(
272*800a58d9SAndroid Build Coastguard Worker                args.local_system_dlkm_image)
273*800a58d9SAndroid Build Coastguard Worker
274*800a58d9SAndroid Build Coastguard Worker        if args.local_vendor_image is not None:
275*800a58d9SAndroid Build Coastguard Worker            self._local_vendor_image = self._GetLocalImagePath(
276*800a58d9SAndroid Build Coastguard Worker                args.local_vendor_image)
277*800a58d9SAndroid Build Coastguard Worker
278*800a58d9SAndroid Build Coastguard Worker        if args.local_vendor_boot_image is not None:
279*800a58d9SAndroid Build Coastguard Worker            self._local_vendor_boot_image = self._GetLocalImagePath(
280*800a58d9SAndroid Build Coastguard Worker                args.local_vendor_boot_image)
281*800a58d9SAndroid Build Coastguard Worker
282*800a58d9SAndroid Build Coastguard Worker        self.image_download_dir = (
283*800a58d9SAndroid Build Coastguard Worker            args.image_download_dir if args.image_download_dir
284*800a58d9SAndroid Build Coastguard Worker            else tempfile.gettempdir())
285*800a58d9SAndroid Build Coastguard Worker
286*800a58d9SAndroid Build Coastguard Worker    @staticmethod
287*800a58d9SAndroid Build Coastguard Worker    def _ParseHWPropertyStr(hw_property_str):
288*800a58d9SAndroid Build Coastguard Worker        """Parse string to dict.
289*800a58d9SAndroid Build Coastguard Worker
290*800a58d9SAndroid Build Coastguard Worker        Args:
291*800a58d9SAndroid Build Coastguard Worker            hw_property_str: A hw properties string.
292*800a58d9SAndroid Build Coastguard Worker
293*800a58d9SAndroid Build Coastguard Worker        Returns:
294*800a58d9SAndroid Build Coastguard Worker            Dict converted from a string.
295*800a58d9SAndroid Build Coastguard Worker
296*800a58d9SAndroid Build Coastguard Worker        Raises:
297*800a58d9SAndroid Build Coastguard Worker            error.MalformedHWPropertyError: If hw_property_str is malformed.
298*800a58d9SAndroid Build Coastguard Worker        """
299*800a58d9SAndroid Build Coastguard Worker        hw_dict = create_common.ParseKeyValuePairArgs(hw_property_str)
300*800a58d9SAndroid Build Coastguard Worker        arg_hw_properties = {}
301*800a58d9SAndroid Build Coastguard Worker        for key, value in hw_dict.items():
302*800a58d9SAndroid Build Coastguard Worker            # Parsing HW properties int to avdspec.
303*800a58d9SAndroid Build Coastguard Worker            if key == constants.HW_ALIAS_RESOLUTION:
304*800a58d9SAndroid Build Coastguard Worker                match = _RE_RES.match(value)
305*800a58d9SAndroid Build Coastguard Worker                if match:
306*800a58d9SAndroid Build Coastguard Worker                    arg_hw_properties[_X_RES] = match.group("x_res")
307*800a58d9SAndroid Build Coastguard Worker                    arg_hw_properties[_Y_RES] = match.group("y_res")
308*800a58d9SAndroid Build Coastguard Worker                else:
309*800a58d9SAndroid Build Coastguard Worker                    raise errors.InvalidHWPropertyError(
310*800a58d9SAndroid Build Coastguard Worker                        "[%s] is an invalid resolution. Example:1280x800" % value)
311*800a58d9SAndroid Build Coastguard Worker            elif key in [constants.HW_ALIAS_MEMORY, constants.HW_ALIAS_DISK]:
312*800a58d9SAndroid Build Coastguard Worker                match = _RE_MEMORY.match(value)
313*800a58d9SAndroid Build Coastguard Worker                if match and match.group("gb_size"):
314*800a58d9SAndroid Build Coastguard Worker                    arg_hw_properties[key] = str(
315*800a58d9SAndroid Build Coastguard Worker                        int(match.group("gb_size")) * 1024)
316*800a58d9SAndroid Build Coastguard Worker                elif match and match.group("mb_size"):
317*800a58d9SAndroid Build Coastguard Worker                    arg_hw_properties[key] = match.group("mb_size")
318*800a58d9SAndroid Build Coastguard Worker                else:
319*800a58d9SAndroid Build Coastguard Worker                    raise errors.InvalidHWPropertyError(
320*800a58d9SAndroid Build Coastguard Worker                        "Expected gb size.[%s] is not allowed. Example:4g" % value)
321*800a58d9SAndroid Build Coastguard Worker            elif key in [constants.HW_ALIAS_CPUS, constants.HW_ALIAS_DPI]:
322*800a58d9SAndroid Build Coastguard Worker                if not _RE_INT.match(value):
323*800a58d9SAndroid Build Coastguard Worker                    raise errors.InvalidHWPropertyError(
324*800a58d9SAndroid Build Coastguard Worker                        "%s value [%s] is not an integer." % (key, value))
325*800a58d9SAndroid Build Coastguard Worker                arg_hw_properties[key] = value
326*800a58d9SAndroid Build Coastguard Worker
327*800a58d9SAndroid Build Coastguard Worker        return arg_hw_properties
328*800a58d9SAndroid Build Coastguard Worker
329*800a58d9SAndroid Build Coastguard Worker    def _ProcessHWPropertyArgs(self, args):
330*800a58d9SAndroid Build Coastguard Worker        """Get the HW properties from argparse.parse_args.
331*800a58d9SAndroid Build Coastguard Worker
332*800a58d9SAndroid Build Coastguard Worker        This method will initialize _hw_property in the following
333*800a58d9SAndroid Build Coastguard Worker        manner:
334*800a58d9SAndroid Build Coastguard Worker        1. Get default hw properties from flavor.
335*800a58d9SAndroid Build Coastguard Worker        2. Override hw properties from config.
336*800a58d9SAndroid Build Coastguard Worker        3. Override by hw_property args.
337*800a58d9SAndroid Build Coastguard Worker
338*800a58d9SAndroid Build Coastguard Worker        Args:
339*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
340*800a58d9SAndroid Build Coastguard Worker        """
341*800a58d9SAndroid Build Coastguard Worker        self._hw_property = {}
342*800a58d9SAndroid Build Coastguard Worker        default_property = self._cfg.GetDefaultHwProperty(self._flavor,
343*800a58d9SAndroid Build Coastguard Worker                                                          self._instance_type)
344*800a58d9SAndroid Build Coastguard Worker        self._hw_property = self._ParseHWPropertyStr(default_property)
345*800a58d9SAndroid Build Coastguard Worker        logger.debug("Default hw property for [%s] flavor: %s", self._flavor,
346*800a58d9SAndroid Build Coastguard Worker                     self._hw_property)
347*800a58d9SAndroid Build Coastguard Worker        if self._cfg.hw_property:
348*800a58d9SAndroid Build Coastguard Worker            self._hw_customize = True
349*800a58d9SAndroid Build Coastguard Worker            cfg_hw_property = self._ParseHWPropertyStr(self._cfg.hw_property)
350*800a58d9SAndroid Build Coastguard Worker            logger.debug("Hw property from config: %s", cfg_hw_property)
351*800a58d9SAndroid Build Coastguard Worker            self._hw_property.update(cfg_hw_property)
352*800a58d9SAndroid Build Coastguard Worker
353*800a58d9SAndroid Build Coastguard Worker        if args.hw_property:
354*800a58d9SAndroid Build Coastguard Worker            self._hw_customize = True
355*800a58d9SAndroid Build Coastguard Worker            arg_hw_property = self._ParseHWPropertyStr(args.hw_property)
356*800a58d9SAndroid Build Coastguard Worker            logger.debug("Use custom hw property: %s", arg_hw_property)
357*800a58d9SAndroid Build Coastguard Worker            self._hw_property.update(arg_hw_property)
358*800a58d9SAndroid Build Coastguard Worker
359*800a58d9SAndroid Build Coastguard Worker    def _ProcessMiscArgs(self, args):
360*800a58d9SAndroid Build Coastguard Worker        """These args we can take as and don't belong to a group of args.
361*800a58d9SAndroid Build Coastguard Worker
362*800a58d9SAndroid Build Coastguard Worker        Args:
363*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
364*800a58d9SAndroid Build Coastguard Worker        """
365*800a58d9SAndroid Build Coastguard Worker        self._autoconnect = args.autoconnect
366*800a58d9SAndroid Build Coastguard Worker        self._unlock_screen = args.unlock_screen
367*800a58d9SAndroid Build Coastguard Worker        self._report_internal_ip = args.report_internal_ip
368*800a58d9SAndroid Build Coastguard Worker        self._disable_external_ip = args.disable_external_ip
369*800a58d9SAndroid Build Coastguard Worker        self._avd_type = args.avd_type
370*800a58d9SAndroid Build Coastguard Worker        self._extra_files = create_common.ParseExtraFilesArgs(args.extra_files)
371*800a58d9SAndroid Build Coastguard Worker        self._flavor = args.flavor or constants.FLAVOR_PHONE
372*800a58d9SAndroid Build Coastguard Worker        self._force_sync = args.force_sync
373*800a58d9SAndroid Build Coastguard Worker        if args.remote_host:
374*800a58d9SAndroid Build Coastguard Worker            self._instance_type = constants.INSTANCE_TYPE_HOST
375*800a58d9SAndroid Build Coastguard Worker        else:
376*800a58d9SAndroid Build Coastguard Worker            self._instance_type = (constants.INSTANCE_TYPE_REMOTE
377*800a58d9SAndroid Build Coastguard Worker                                   if args.local_instance is None else
378*800a58d9SAndroid Build Coastguard Worker                                   constants.INSTANCE_TYPE_LOCAL)
379*800a58d9SAndroid Build Coastguard Worker        self._remote_host = args.remote_host
380*800a58d9SAndroid Build Coastguard Worker        self._remote_image_dir = args.remote_image_dir
381*800a58d9SAndroid Build Coastguard Worker        self._host_user = args.host_user
382*800a58d9SAndroid Build Coastguard Worker        self._host_ssh_private_key_path = args.host_ssh_private_key_path
383*800a58d9SAndroid Build Coastguard Worker        self._local_instance_id = args.local_instance
384*800a58d9SAndroid Build Coastguard Worker        self._local_instance_dir = args.local_instance_dir
385*800a58d9SAndroid Build Coastguard Worker        self._local_tool_dirs = args.local_tool
386*800a58d9SAndroid Build Coastguard Worker        self._cvd_host_package = args.cvd_host_package
387*800a58d9SAndroid Build Coastguard Worker        self._trusty_host_package = args.trusty_host_package
388*800a58d9SAndroid Build Coastguard Worker        self._num_of_instances = args.num
389*800a58d9SAndroid Build Coastguard Worker        self._num_avds_per_instance = args.num_avds_per_instance
390*800a58d9SAndroid Build Coastguard Worker        self._no_pull_log = args.no_pull_log
391*800a58d9SAndroid Build Coastguard Worker        self._mkcert = args.mkcert
392*800a58d9SAndroid Build Coastguard Worker        self._oxygen = args.oxygen
393*800a58d9SAndroid Build Coastguard Worker        self._openwrt = args.openwrt
394*800a58d9SAndroid Build Coastguard Worker        self._use_launch_cvd = args.use_launch_cvd
395*800a58d9SAndroid Build Coastguard Worker        self._serial_log_file = args.serial_log_file
396*800a58d9SAndroid Build Coastguard Worker        self._emulator_build_id = args.emulator_build_id
397*800a58d9SAndroid Build Coastguard Worker        self._emulator_build_target = (args.emulator_build_target
398*800a58d9SAndroid Build Coastguard Worker                                       or self._cfg.emulator_build_target)
399*800a58d9SAndroid Build Coastguard Worker        self._emulator_zip = args.emulator_zip
400*800a58d9SAndroid Build Coastguard Worker        self._gpu = args.gpu
401*800a58d9SAndroid Build Coastguard Worker        self._disk_type = (args.disk_type or self._cfg.disk_type)
402*800a58d9SAndroid Build Coastguard Worker        self._base_instance_num = args.base_instance_num
403*800a58d9SAndroid Build Coastguard Worker        self._gce_only = args.gce_only
404*800a58d9SAndroid Build Coastguard Worker        self._gce_metadata = create_common.ParseKeyValuePairArgs(args.gce_metadata)
405*800a58d9SAndroid Build Coastguard Worker        self._stable_host_image_name = (
406*800a58d9SAndroid Build Coastguard Worker            args.stable_host_image_name or self._cfg.stable_host_image_name)
407*800a58d9SAndroid Build Coastguard Worker
408*800a58d9SAndroid Build Coastguard Worker        self._stable_cheeps_host_image_name = args.stable_cheeps_host_image_name
409*800a58d9SAndroid Build Coastguard Worker        self._stable_cheeps_host_image_project = args.stable_cheeps_host_image_project
410*800a58d9SAndroid Build Coastguard Worker        self._username = args.username
411*800a58d9SAndroid Build Coastguard Worker        self._password = args.password
412*800a58d9SAndroid Build Coastguard Worker        self._cheeps_betty_image = (
413*800a58d9SAndroid Build Coastguard Worker            args.cheeps_betty_image or self._cfg.betty_image)
414*800a58d9SAndroid Build Coastguard Worker        self._cheeps_features = args.cheeps_features
415*800a58d9SAndroid Build Coastguard Worker
416*800a58d9SAndroid Build Coastguard Worker        self._boot_timeout_secs = args.boot_timeout_secs
417*800a58d9SAndroid Build Coastguard Worker        self._ins_timeout_secs = args.ins_timeout_secs
418*800a58d9SAndroid Build Coastguard Worker        self._launch_args = " ".join(
419*800a58d9SAndroid Build Coastguard Worker            list(filter(None, [self._cfg.launch_args, args.launch_args])))
420*800a58d9SAndroid Build Coastguard Worker        self._remote_fetch = args.remote_fetch
421*800a58d9SAndroid Build Coastguard Worker        self._webrtc_device_id = args.webrtc_device_id
422*800a58d9SAndroid Build Coastguard Worker        self._connect_hostname = args.connect_hostname or self._cfg.connect_hostname
423*800a58d9SAndroid Build Coastguard Worker        self._fetch_cvd_wrapper = args.fetch_cvd_wrapper
424*800a58d9SAndroid Build Coastguard Worker        self._fetch_cvd_version = self._GetFetchCVDVersion(args)
425*800a58d9SAndroid Build Coastguard Worker
426*800a58d9SAndroid Build Coastguard Worker        if args.reuse_gce:
427*800a58d9SAndroid Build Coastguard Worker            if args.reuse_gce != constants.SELECT_ONE_GCE_INSTANCE:
428*800a58d9SAndroid Build Coastguard Worker                if list_instance.GetInstancesFromInstanceNames(
429*800a58d9SAndroid Build Coastguard Worker                        self._cfg, [args.reuse_gce]):
430*800a58d9SAndroid Build Coastguard Worker                    self._instance_name_to_reuse = args.reuse_gce
431*800a58d9SAndroid Build Coastguard Worker            if self._instance_name_to_reuse is None:
432*800a58d9SAndroid Build Coastguard Worker                instance = list_instance.ChooseOneRemoteInstance(self._cfg)
433*800a58d9SAndroid Build Coastguard Worker                self._instance_name_to_reuse = instance.name
434*800a58d9SAndroid Build Coastguard Worker
435*800a58d9SAndroid Build Coastguard Worker        self._local_trusty_image = args.local_trusty_image
436*800a58d9SAndroid Build Coastguard Worker        self._trusty_build_info = {
437*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_ID: args.trusty_build_id,
438*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_BRANCH: args.trusty_branch,
439*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_TARGET: args.trusty_build_target}
440*800a58d9SAndroid Build Coastguard Worker
441*800a58d9SAndroid Build Coastguard Worker    def _GetFetchCVDVersion(self, args):
442*800a58d9SAndroid Build Coastguard Worker        """Get the fetch_cvd version.
443*800a58d9SAndroid Build Coastguard Worker
444*800a58d9SAndroid Build Coastguard Worker        Acloud will get the LKGB of fetch_cvd if no version specified.
445*800a58d9SAndroid Build Coastguard Worker
446*800a58d9SAndroid Build Coastguard Worker        Args:
447*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
448*800a58d9SAndroid Build Coastguard Worker
449*800a58d9SAndroid Build Coastguard Worker        Returns:
450*800a58d9SAndroid Build Coastguard Worker            The build id of fetch_cvd.
451*800a58d9SAndroid Build Coastguard Worker        """
452*800a58d9SAndroid Build Coastguard Worker        if args.fetch_cvd_build_id:
453*800a58d9SAndroid Build Coastguard Worker            return args.fetch_cvd_build_id
454*800a58d9SAndroid Build Coastguard Worker        return constants.LKGB
455*800a58d9SAndroid Build Coastguard Worker
456*800a58d9SAndroid Build Coastguard Worker    @staticmethod
457*800a58d9SAndroid Build Coastguard Worker    def _GetFlavorFromString(flavor_string):
458*800a58d9SAndroid Build Coastguard Worker        """Get flavor name from flavor string.
459*800a58d9SAndroid Build Coastguard Worker
460*800a58d9SAndroid Build Coastguard Worker        Flavor string can come from the zipped image name or the lunch target.
461*800a58d9SAndroid Build Coastguard Worker        e.g.
462*800a58d9SAndroid Build Coastguard Worker        If flavor_string come from zipped name:aosp_cf_x86_phone-img-5455843.zip
463*800a58d9SAndroid Build Coastguard Worker        , then "phone" is the flavor.
464*800a58d9SAndroid Build Coastguard Worker        If flavor_string come from a lunch'd target:aosp_cf_x86_auto-userdebug,
465*800a58d9SAndroid Build Coastguard Worker        then "auto" is the flavor.
466*800a58d9SAndroid Build Coastguard Worker
467*800a58d9SAndroid Build Coastguard Worker        Args:
468*800a58d9SAndroid Build Coastguard Worker            flavor_string: String which contains flavor.It can be a
469*800a58d9SAndroid Build Coastguard Worker                           build target or filename.
470*800a58d9SAndroid Build Coastguard Worker
471*800a58d9SAndroid Build Coastguard Worker        Returns:
472*800a58d9SAndroid Build Coastguard Worker            String of flavor name. None if flavor can't be determined.
473*800a58d9SAndroid Build Coastguard Worker        """
474*800a58d9SAndroid Build Coastguard Worker        for flavor in constants.ALL_FLAVORS:
475*800a58d9SAndroid Build Coastguard Worker            if re.match(r"(.*_)?%s" % flavor, flavor_string):
476*800a58d9SAndroid Build Coastguard Worker                return flavor
477*800a58d9SAndroid Build Coastguard Worker
478*800a58d9SAndroid Build Coastguard Worker        logger.debug("Unable to determine flavor from build target: %s",
479*800a58d9SAndroid Build Coastguard Worker                     flavor_string)
480*800a58d9SAndroid Build Coastguard Worker        return None
481*800a58d9SAndroid Build Coastguard Worker
482*800a58d9SAndroid Build Coastguard Worker    def _ProcessLocalImageArgs(self, args):
483*800a58d9SAndroid Build Coastguard Worker        """Get local image path.
484*800a58d9SAndroid Build Coastguard Worker
485*800a58d9SAndroid Build Coastguard Worker        Args:
486*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
487*800a58d9SAndroid Build Coastguard Worker        """
488*800a58d9SAndroid Build Coastguard Worker        if self._avd_type == constants.TYPE_CF:
489*800a58d9SAndroid Build Coastguard Worker            self._ProcessCFLocalImageArgs(args.local_image, args.flavor)
490*800a58d9SAndroid Build Coastguard Worker        elif self._avd_type == constants.TYPE_FVP:
491*800a58d9SAndroid Build Coastguard Worker            self._ProcessFVPLocalImageArgs()
492*800a58d9SAndroid Build Coastguard Worker        elif self._avd_type == constants.TYPE_TRUSTY:
493*800a58d9SAndroid Build Coastguard Worker            self._ProcessTrustyLocalImageArgs(args.local_image)
494*800a58d9SAndroid Build Coastguard Worker        elif self._avd_type == constants.TYPE_GF:
495*800a58d9SAndroid Build Coastguard Worker            local_image_path = self._GetLocalImagePath(args.local_image)
496*800a58d9SAndroid Build Coastguard Worker            if os.path.isdir(local_image_path):
497*800a58d9SAndroid Build Coastguard Worker                self._local_image_dir = local_image_path
498*800a58d9SAndroid Build Coastguard Worker            else:
499*800a58d9SAndroid Build Coastguard Worker                self._local_image_artifact = local_image_path
500*800a58d9SAndroid Build Coastguard Worker        elif self._avd_type == constants.TYPE_GCE:
501*800a58d9SAndroid Build Coastguard Worker            self._local_image_artifact = self._GetGceLocalImagePath(
502*800a58d9SAndroid Build Coastguard Worker                args.local_image)
503*800a58d9SAndroid Build Coastguard Worker        else:
504*800a58d9SAndroid Build Coastguard Worker            raise errors.CreateError(
505*800a58d9SAndroid Build Coastguard Worker                "Local image doesn't support the AVD type: %s" % self._avd_type
506*800a58d9SAndroid Build Coastguard Worker            )
507*800a58d9SAndroid Build Coastguard Worker
508*800a58d9SAndroid Build Coastguard Worker    @staticmethod
509*800a58d9SAndroid Build Coastguard Worker    def _GetGceLocalImagePath(local_image_dir):
510*800a58d9SAndroid Build Coastguard Worker        """Get gce local image path.
511*800a58d9SAndroid Build Coastguard Worker
512*800a58d9SAndroid Build Coastguard Worker        Choose image file in local_image_dir over $ANDROID_PRODUCT_OUT.
513*800a58d9SAndroid Build Coastguard Worker        There are various img files so we prioritize returning the one we find
514*800a58d9SAndroid Build Coastguard Worker        first based in the specified order in _GCE_LOCAL_IMAGE_CANDIDATES.
515*800a58d9SAndroid Build Coastguard Worker
516*800a58d9SAndroid Build Coastguard Worker        Args:
517*800a58d9SAndroid Build Coastguard Worker            local_image_dir: A string to specify local image dir.
518*800a58d9SAndroid Build Coastguard Worker
519*800a58d9SAndroid Build Coastguard Worker        Returns:
520*800a58d9SAndroid Build Coastguard Worker            String, image file path if exists.
521*800a58d9SAndroid Build Coastguard Worker
522*800a58d9SAndroid Build Coastguard Worker        Raises:
523*800a58d9SAndroid Build Coastguard Worker            errors.ImgDoesNotExist if image doesn't exist.
524*800a58d9SAndroid Build Coastguard Worker        """
525*800a58d9SAndroid Build Coastguard Worker        # IF the user specified a file, return it
526*800a58d9SAndroid Build Coastguard Worker        if local_image_dir and os.path.isfile(local_image_dir):
527*800a58d9SAndroid Build Coastguard Worker            return local_image_dir
528*800a58d9SAndroid Build Coastguard Worker
529*800a58d9SAndroid Build Coastguard Worker        # If the user didn't specify a dir, assume $ANDROID_PRODUCT_OUT
530*800a58d9SAndroid Build Coastguard Worker        if not local_image_dir:
531*800a58d9SAndroid Build Coastguard Worker            local_image_dir = utils.GetBuildEnvironmentVariable(
532*800a58d9SAndroid Build Coastguard Worker                _ENV_ANDROID_PRODUCT_OUT)
533*800a58d9SAndroid Build Coastguard Worker
534*800a58d9SAndroid Build Coastguard Worker        for img_name in _GCE_LOCAL_IMAGE_CANDIDATES:
535*800a58d9SAndroid Build Coastguard Worker            full_file_path = os.path.join(local_image_dir, img_name)
536*800a58d9SAndroid Build Coastguard Worker            if os.path.exists(full_file_path):
537*800a58d9SAndroid Build Coastguard Worker                return full_file_path
538*800a58d9SAndroid Build Coastguard Worker
539*800a58d9SAndroid Build Coastguard Worker        raise errors.ImgDoesNotExist("Could not find any GCE images (%s), you "
540*800a58d9SAndroid Build Coastguard Worker                                     "can build them via \"m dist\"" %
541*800a58d9SAndroid Build Coastguard Worker                                     ", ".join(_GCE_LOCAL_IMAGE_CANDIDATES))
542*800a58d9SAndroid Build Coastguard Worker
543*800a58d9SAndroid Build Coastguard Worker    @staticmethod
544*800a58d9SAndroid Build Coastguard Worker    def _GetLocalImagePath(local_image_arg):
545*800a58d9SAndroid Build Coastguard Worker        """Get local image path from argument or environment variable.
546*800a58d9SAndroid Build Coastguard Worker
547*800a58d9SAndroid Build Coastguard Worker        Args:
548*800a58d9SAndroid Build Coastguard Worker            local_image_arg: The path to the unzipped image package. If the
549*800a58d9SAndroid Build Coastguard Worker                             value is empty, this method returns
550*800a58d9SAndroid Build Coastguard Worker                             ANDROID_PRODUCT_OUT in build environment.
551*800a58d9SAndroid Build Coastguard Worker
552*800a58d9SAndroid Build Coastguard Worker        Returns:
553*800a58d9SAndroid Build Coastguard Worker            String, the path to the image file or directory.
554*800a58d9SAndroid Build Coastguard Worker
555*800a58d9SAndroid Build Coastguard Worker        Raises:
556*800a58d9SAndroid Build Coastguard Worker            errors.GetLocalImageError if the path does not exist.
557*800a58d9SAndroid Build Coastguard Worker        """
558*800a58d9SAndroid Build Coastguard Worker        if local_image_arg == constants.FIND_IN_BUILD_ENV:
559*800a58d9SAndroid Build Coastguard Worker            image_path = utils.GetBuildEnvironmentVariable(
560*800a58d9SAndroid Build Coastguard Worker                constants.ENV_ANDROID_PRODUCT_OUT)
561*800a58d9SAndroid Build Coastguard Worker        else:
562*800a58d9SAndroid Build Coastguard Worker            image_path = local_image_arg
563*800a58d9SAndroid Build Coastguard Worker
564*800a58d9SAndroid Build Coastguard Worker        if not os.path.exists(image_path):
565*800a58d9SAndroid Build Coastguard Worker            raise errors.GetLocalImageError("%s does not exist." %
566*800a58d9SAndroid Build Coastguard Worker                                            local_image_arg)
567*800a58d9SAndroid Build Coastguard Worker        return image_path
568*800a58d9SAndroid Build Coastguard Worker
569*800a58d9SAndroid Build Coastguard Worker    def _ProcessCFLocalImageArgs(self, local_image_arg, flavor_arg):
570*800a58d9SAndroid Build Coastguard Worker        """Get local built image path for cuttlefish-type AVD.
571*800a58d9SAndroid Build Coastguard Worker
572*800a58d9SAndroid Build Coastguard Worker        Two scenarios of using --local-image:
573*800a58d9SAndroid Build Coastguard Worker        - Without a following argument
574*800a58d9SAndroid Build Coastguard Worker          Set flavor string if the required images are in $ANDROID_PRODUCT_OUT,
575*800a58d9SAndroid Build Coastguard Worker        - With a following filename/dirname
576*800a58d9SAndroid Build Coastguard Worker          Set flavor string from the specified image/dir name.
577*800a58d9SAndroid Build Coastguard Worker
578*800a58d9SAndroid Build Coastguard Worker        Args:
579*800a58d9SAndroid Build Coastguard Worker            local_image_arg: String of local image args.
580*800a58d9SAndroid Build Coastguard Worker            flavor_arg: String of flavor arg
581*800a58d9SAndroid Build Coastguard Worker
582*800a58d9SAndroid Build Coastguard Worker        """
583*800a58d9SAndroid Build Coastguard Worker        flavor_from_build_string = None
584*800a58d9SAndroid Build Coastguard Worker        if local_image_arg == constants.FIND_IN_BUILD_ENV:
585*800a58d9SAndroid Build Coastguard Worker            self._CheckCFBuildTarget(self._instance_type)
586*800a58d9SAndroid Build Coastguard Worker            local_image_path = utils.GetBuildEnvironmentVariable(
587*800a58d9SAndroid Build Coastguard Worker                _ENV_ANDROID_PRODUCT_OUT)
588*800a58d9SAndroid Build Coastguard Worker            # Since dir is provided, check that any images exist to ensure user
589*800a58d9SAndroid Build Coastguard Worker            # didn't forget to 'make' before launch AVD.
590*800a58d9SAndroid Build Coastguard Worker            image_list = glob.glob(os.path.join(local_image_path, "*.img"))
591*800a58d9SAndroid Build Coastguard Worker            if not image_list:
592*800a58d9SAndroid Build Coastguard Worker                raise errors.GetLocalImageError(
593*800a58d9SAndroid Build Coastguard Worker                    "No image found(Did you choose a lunch target and run `m`?)"
594*800a58d9SAndroid Build Coastguard Worker                    ": %s.\n " % local_image_path)
595*800a58d9SAndroid Build Coastguard Worker        else:
596*800a58d9SAndroid Build Coastguard Worker            local_image_path = local_image_arg
597*800a58d9SAndroid Build Coastguard Worker
598*800a58d9SAndroid Build Coastguard Worker        if os.path.isfile(local_image_path):
599*800a58d9SAndroid Build Coastguard Worker            self._local_image_artifact = local_image_arg
600*800a58d9SAndroid Build Coastguard Worker            flavor_from_build_string = self._GetFlavorFromString(
601*800a58d9SAndroid Build Coastguard Worker                self._local_image_artifact)
602*800a58d9SAndroid Build Coastguard Worker            # Since file is provided and I assume it's a zip, so print the
603*800a58d9SAndroid Build Coastguard Worker            # warning message.
604*800a58d9SAndroid Build Coastguard Worker            utils.PrintColorString(_LOCAL_ZIP_WARNING_MSG,
605*800a58d9SAndroid Build Coastguard Worker                                   utils.TextColors.WARNING)
606*800a58d9SAndroid Build Coastguard Worker        else:
607*800a58d9SAndroid Build Coastguard Worker            self._local_image_dir = local_image_path
608*800a58d9SAndroid Build Coastguard Worker            try:
609*800a58d9SAndroid Build Coastguard Worker                flavor_from_build_string = self._GetFlavorFromString(
610*800a58d9SAndroid Build Coastguard Worker                    utils.GetBuildEnvironmentVariable(constants.ENV_BUILD_TARGET))
611*800a58d9SAndroid Build Coastguard Worker            except errors.GetAndroidBuildEnvVarError:
612*800a58d9SAndroid Build Coastguard Worker                logger.debug("Unable to determine flavor from env variable: %s",
613*800a58d9SAndroid Build Coastguard Worker                             constants.ENV_BUILD_TARGET)
614*800a58d9SAndroid Build Coastguard Worker
615*800a58d9SAndroid Build Coastguard Worker        if flavor_from_build_string and not flavor_arg:
616*800a58d9SAndroid Build Coastguard Worker            self._flavor = flavor_from_build_string
617*800a58d9SAndroid Build Coastguard Worker
618*800a58d9SAndroid Build Coastguard Worker    def _ProcessFVPLocalImageArgs(self):
619*800a58d9SAndroid Build Coastguard Worker        """Get local built image path for FVP-type AVD."""
620*800a58d9SAndroid Build Coastguard Worker        build_target = utils.GetBuildEnvironmentVariable(
621*800a58d9SAndroid Build Coastguard Worker            constants.ENV_BUILD_TARGET)
622*800a58d9SAndroid Build Coastguard Worker        if build_target != "fvp":
623*800a58d9SAndroid Build Coastguard Worker            utils.PrintColorString(
624*800a58d9SAndroid Build Coastguard Worker                "%s is not an fvp target (Try lunching fvp-eng "
625*800a58d9SAndroid Build Coastguard Worker                "and running 'm')" % build_target,
626*800a58d9SAndroid Build Coastguard Worker                utils.TextColors.WARNING)
627*800a58d9SAndroid Build Coastguard Worker        self._local_image_dir = utils.GetBuildEnvironmentVariable(
628*800a58d9SAndroid Build Coastguard Worker            _ENV_ANDROID_PRODUCT_OUT)
629*800a58d9SAndroid Build Coastguard Worker
630*800a58d9SAndroid Build Coastguard Worker        # Since dir is provided, so checking that any images exist to ensure
631*800a58d9SAndroid Build Coastguard Worker        # user didn't forget to 'make' before launch AVD.
632*800a58d9SAndroid Build Coastguard Worker        image_list = glob.glob(os.path.join(self.local_image_dir, "*.img"))
633*800a58d9SAndroid Build Coastguard Worker        if not image_list:
634*800a58d9SAndroid Build Coastguard Worker            raise errors.GetLocalImageError(
635*800a58d9SAndroid Build Coastguard Worker                "No image found(Did you choose a lunch target and run `m`?)"
636*800a58d9SAndroid Build Coastguard Worker                ": %s.\n " % self._local_image_dir)
637*800a58d9SAndroid Build Coastguard Worker
638*800a58d9SAndroid Build Coastguard Worker    def _ProcessTrustyLocalImageArgs(self, local_image_arg):
639*800a58d9SAndroid Build Coastguard Worker        """Get local built image path for Trusty-type AVD."""
640*800a58d9SAndroid Build Coastguard Worker        if local_image_arg == constants.FIND_IN_BUILD_ENV:
641*800a58d9SAndroid Build Coastguard Worker            build_target = utils.GetBuildEnvironmentVariable(
642*800a58d9SAndroid Build Coastguard Worker                constants.ENV_BUILD_TARGET)
643*800a58d9SAndroid Build Coastguard Worker            if build_target != "qemu_trusty_arm64":
644*800a58d9SAndroid Build Coastguard Worker                utils.PrintColorString(
645*800a58d9SAndroid Build Coastguard Worker                    f"{build_target} is not a trusty target (Try lunching "
646*800a58d9SAndroid Build Coastguard Worker                    "qemu_trusty_arm64-trunk_staging-userdebug "
647*800a58d9SAndroid Build Coastguard Worker                    "and running 'm')",
648*800a58d9SAndroid Build Coastguard Worker                    utils.TextColors.WARNING)
649*800a58d9SAndroid Build Coastguard Worker            local_image_path = utils.GetBuildEnvironmentVariable(
650*800a58d9SAndroid Build Coastguard Worker                _ENV_ANDROID_PRODUCT_OUT)
651*800a58d9SAndroid Build Coastguard Worker            # Since dir is provided, check that any images exist to ensure user
652*800a58d9SAndroid Build Coastguard Worker            # didn't forget to 'make' before launch AVD.
653*800a58d9SAndroid Build Coastguard Worker            image_list = glob.glob(os.path.join(local_image_path, "*.img"))
654*800a58d9SAndroid Build Coastguard Worker            if not image_list:
655*800a58d9SAndroid Build Coastguard Worker                raise errors.GetLocalImageError(
656*800a58d9SAndroid Build Coastguard Worker                    "No image found(Did you choose a lunch target and run `m`?)" +
657*800a58d9SAndroid Build Coastguard Worker                    f": {local_image_path}.\n ")
658*800a58d9SAndroid Build Coastguard Worker        else:
659*800a58d9SAndroid Build Coastguard Worker            local_image_path = local_image_arg
660*800a58d9SAndroid Build Coastguard Worker
661*800a58d9SAndroid Build Coastguard Worker        if os.path.isfile(local_image_path):
662*800a58d9SAndroid Build Coastguard Worker            self._local_image_artifact = local_image_arg
663*800a58d9SAndroid Build Coastguard Worker            # Since file is provided and I assume it's a zip, so print the
664*800a58d9SAndroid Build Coastguard Worker            # warning message.
665*800a58d9SAndroid Build Coastguard Worker            utils.PrintColorString(_LOCAL_ZIP_WARNING_MSG,
666*800a58d9SAndroid Build Coastguard Worker                                   utils.TextColors.WARNING)
667*800a58d9SAndroid Build Coastguard Worker        else:
668*800a58d9SAndroid Build Coastguard Worker            self._local_image_dir = local_image_path
669*800a58d9SAndroid Build Coastguard Worker
670*800a58d9SAndroid Build Coastguard Worker    def _ProcessRemoteBuildArgs(self, args):
671*800a58d9SAndroid Build Coastguard Worker        """Get the remote build args.
672*800a58d9SAndroid Build Coastguard Worker
673*800a58d9SAndroid Build Coastguard Worker        Some of the acloud magic happens here, we will infer some of these
674*800a58d9SAndroid Build Coastguard Worker        values if the user hasn't specified them.
675*800a58d9SAndroid Build Coastguard Worker
676*800a58d9SAndroid Build Coastguard Worker        Args:
677*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
678*800a58d9SAndroid Build Coastguard Worker        """
679*800a58d9SAndroid Build Coastguard Worker        self._remote_image[constants.BUILD_BRANCH] = args.branch
680*800a58d9SAndroid Build Coastguard Worker        if not self._remote_image[constants.BUILD_BRANCH]:
681*800a58d9SAndroid Build Coastguard Worker            self._remote_image[constants.BUILD_BRANCH] = self._GetBuildBranch(
682*800a58d9SAndroid Build Coastguard Worker                args.build_id, args.build_target)
683*800a58d9SAndroid Build Coastguard Worker
684*800a58d9SAndroid Build Coastguard Worker        self._remote_image[constants.BUILD_TARGET] = args.build_target
685*800a58d9SAndroid Build Coastguard Worker        if not self._remote_image[constants.BUILD_TARGET]:
686*800a58d9SAndroid Build Coastguard Worker            self._remote_image[constants.BUILD_TARGET] = self._GetBuildTarget(
687*800a58d9SAndroid Build Coastguard Worker                args, self._remote_image[constants.BUILD_BRANCH])
688*800a58d9SAndroid Build Coastguard Worker        else:
689*800a58d9SAndroid Build Coastguard Worker            # If flavor isn't specified, try to infer it from build target,
690*800a58d9SAndroid Build Coastguard Worker            # if we can't, just default to phone flavor.
691*800a58d9SAndroid Build Coastguard Worker            self._flavor = args.flavor or self._GetFlavorFromString(
692*800a58d9SAndroid Build Coastguard Worker                self._remote_image[constants.BUILD_TARGET]) or constants.FLAVOR_PHONE
693*800a58d9SAndroid Build Coastguard Worker            # infer avd_type from build_target.
694*800a58d9SAndroid Build Coastguard Worker            for avd_type, avd_type_abbr in constants.AVD_TYPES_MAPPING.items():
695*800a58d9SAndroid Build Coastguard Worker                if re.match(r"(.*_)?%s_" % avd_type_abbr,
696*800a58d9SAndroid Build Coastguard Worker                            self._remote_image[constants.BUILD_TARGET]):
697*800a58d9SAndroid Build Coastguard Worker                    self._avd_type = avd_type
698*800a58d9SAndroid Build Coastguard Worker                    break
699*800a58d9SAndroid Build Coastguard Worker
700*800a58d9SAndroid Build Coastguard Worker        self._remote_image[constants.BUILD_ID] = args.build_id
701*800a58d9SAndroid Build Coastguard Worker        if not self._remote_image[constants.BUILD_ID]:
702*800a58d9SAndroid Build Coastguard Worker            build_client = android_build_client.AndroidBuildClient(
703*800a58d9SAndroid Build Coastguard Worker                auth.CreateCredentials(self._cfg))
704*800a58d9SAndroid Build Coastguard Worker
705*800a58d9SAndroid Build Coastguard Worker            self._remote_image[constants.BUILD_ID] = build_client.GetLKGB(
706*800a58d9SAndroid Build Coastguard Worker                self._remote_image[constants.BUILD_TARGET],
707*800a58d9SAndroid Build Coastguard Worker                self._remote_image[constants.BUILD_BRANCH])
708*800a58d9SAndroid Build Coastguard Worker
709*800a58d9SAndroid Build Coastguard Worker        # Process system image, kernel image, bootloader, and otatools.
710*800a58d9SAndroid Build Coastguard Worker        self._system_build_info = {constants.BUILD_ID: args.system_build_id,
711*800a58d9SAndroid Build Coastguard Worker                                   constants.BUILD_BRANCH: args.system_branch,
712*800a58d9SAndroid Build Coastguard Worker                                   constants.BUILD_TARGET: args.system_build_target}
713*800a58d9SAndroid Build Coastguard Worker        self._ota_build_info = {constants.BUILD_ID: args.ota_build_id,
714*800a58d9SAndroid Build Coastguard Worker                                constants.BUILD_BRANCH: args.ota_branch,
715*800a58d9SAndroid Build Coastguard Worker                                constants.BUILD_TARGET: args.ota_build_target}
716*800a58d9SAndroid Build Coastguard Worker        self._kernel_build_info = {constants.BUILD_ID: args.kernel_build_id,
717*800a58d9SAndroid Build Coastguard Worker                                   constants.BUILD_BRANCH: args.kernel_branch,
718*800a58d9SAndroid Build Coastguard Worker                                   constants.BUILD_TARGET: args.kernel_build_target}
719*800a58d9SAndroid Build Coastguard Worker        self._boot_build_info = {constants.BUILD_ID: args.boot_build_id,
720*800a58d9SAndroid Build Coastguard Worker                                 constants.BUILD_BRANCH: args.boot_branch,
721*800a58d9SAndroid Build Coastguard Worker                                 constants.BUILD_TARGET: args.boot_build_target,
722*800a58d9SAndroid Build Coastguard Worker                                 constants.BUILD_ARTIFACT: args.boot_artifact}
723*800a58d9SAndroid Build Coastguard Worker        self._bootloader_build_info = {
724*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_ID: args.bootloader_build_id,
725*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_BRANCH: args.bootloader_branch,
726*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_TARGET: args.bootloader_build_target}
727*800a58d9SAndroid Build Coastguard Worker        self._android_efi_loader_build_info = {
728*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_ID: args.android_efi_loader_build_id,
729*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_ARTIFACT: args.android_efi_loader_artifact}
730*800a58d9SAndroid Build Coastguard Worker        self._host_package_build_info = {
731*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_ID: args.host_package_build_id,
732*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_BRANCH: args.host_package_branch,
733*800a58d9SAndroid Build Coastguard Worker            constants.BUILD_TARGET: args.host_package_build_target}
734*800a58d9SAndroid Build Coastguard Worker
735*800a58d9SAndroid Build Coastguard Worker    @staticmethod
736*800a58d9SAndroid Build Coastguard Worker    def _CheckCFBuildTarget(instance_type):
737*800a58d9SAndroid Build Coastguard Worker        """Check build target for the given instance type
738*800a58d9SAndroid Build Coastguard Worker
739*800a58d9SAndroid Build Coastguard Worker        Args:
740*800a58d9SAndroid Build Coastguard Worker            instance_type: String of instance type
741*800a58d9SAndroid Build Coastguard Worker
742*800a58d9SAndroid Build Coastguard Worker        Raises:
743*800a58d9SAndroid Build Coastguard Worker            errors.GetLocalImageError if the pattern is not match with
744*800a58d9SAndroid Build Coastguard Worker                current build target.
745*800a58d9SAndroid Build Coastguard Worker        """
746*800a58d9SAndroid Build Coastguard Worker        build_target = utils.GetBuildEnvironmentVariable(
747*800a58d9SAndroid Build Coastguard Worker            constants.ENV_BUILD_TARGET)
748*800a58d9SAndroid Build Coastguard Worker        pattern = constants.CF_AVD_BUILD_TARGET_PATTERN_MAPPING[instance_type]
749*800a58d9SAndroid Build Coastguard Worker        if pattern not in build_target:
750*800a58d9SAndroid Build Coastguard Worker            utils.PrintColorString(
751*800a58d9SAndroid Build Coastguard Worker                "%s is not a %s target (Try lunching a proper cuttlefish "
752*800a58d9SAndroid Build Coastguard Worker                "target and running 'm')" % (build_target, pattern),
753*800a58d9SAndroid Build Coastguard Worker                utils.TextColors.WARNING)
754*800a58d9SAndroid Build Coastguard Worker
755*800a58d9SAndroid Build Coastguard Worker    @staticmethod
756*800a58d9SAndroid Build Coastguard Worker    def _GetGitRemote():
757*800a58d9SAndroid Build Coastguard Worker        """Get the remote repo.
758*800a58d9SAndroid Build Coastguard Worker
759*800a58d9SAndroid Build Coastguard Worker        We'll go to a project we know exists (tools/acloud) and grab the git
760*800a58d9SAndroid Build Coastguard Worker        remote output from there.
761*800a58d9SAndroid Build Coastguard Worker
762*800a58d9SAndroid Build Coastguard Worker        Returns:
763*800a58d9SAndroid Build Coastguard Worker            remote: String, git remote (e.g. "aosp").
764*800a58d9SAndroid Build Coastguard Worker        """
765*800a58d9SAndroid Build Coastguard Worker        try:
766*800a58d9SAndroid Build Coastguard Worker            android_build_top = os.environ[constants.ENV_ANDROID_BUILD_TOP]
767*800a58d9SAndroid Build Coastguard Worker        except KeyError as e:
768*800a58d9SAndroid Build Coastguard Worker            raise errors.GetAndroidBuildEnvVarError(
769*800a58d9SAndroid Build Coastguard Worker                "Could not get environment var: %s\n"
770*800a58d9SAndroid Build Coastguard Worker                "Try to run '#source build/envsetup.sh && lunch <target>'"
771*800a58d9SAndroid Build Coastguard Worker                % _ENV_ANDROID_BUILD_TOP) from e
772*800a58d9SAndroid Build Coastguard Worker
773*800a58d9SAndroid Build Coastguard Worker        acloud_project = os.path.join(android_build_top, "tools", "acloud")
774*800a58d9SAndroid Build Coastguard Worker        return EscapeAnsi(utils.CheckOutput(_COMMAND_GIT_REMOTE,
775*800a58d9SAndroid Build Coastguard Worker                                            cwd=acloud_project).strip())
776*800a58d9SAndroid Build Coastguard Worker
777*800a58d9SAndroid Build Coastguard Worker    def _GetBuildBranch(self, build_id, build_target):
778*800a58d9SAndroid Build Coastguard Worker        """Infer build branch if user didn't specify branch name.
779*800a58d9SAndroid Build Coastguard Worker
780*800a58d9SAndroid Build Coastguard Worker        Args:
781*800a58d9SAndroid Build Coastguard Worker            build_id: String, Build id, e.g. "2263051", "P2804227"
782*800a58d9SAndroid Build Coastguard Worker            build_target: String, the build target, e.g. cf_x86_phone-userdebug
783*800a58d9SAndroid Build Coastguard Worker
784*800a58d9SAndroid Build Coastguard Worker        Returns:
785*800a58d9SAndroid Build Coastguard Worker            String, name of build branch.
786*800a58d9SAndroid Build Coastguard Worker        """
787*800a58d9SAndroid Build Coastguard Worker        # Infer branch from build_target and build_id
788*800a58d9SAndroid Build Coastguard Worker        if build_id and build_target:
789*800a58d9SAndroid Build Coastguard Worker            build_client = android_build_client.AndroidBuildClient(
790*800a58d9SAndroid Build Coastguard Worker                auth.CreateCredentials(self._cfg))
791*800a58d9SAndroid Build Coastguard Worker            return build_client.GetBranch(build_target, build_id)
792*800a58d9SAndroid Build Coastguard Worker
793*800a58d9SAndroid Build Coastguard Worker        return self._GetBranchFromRepo()
794*800a58d9SAndroid Build Coastguard Worker
795*800a58d9SAndroid Build Coastguard Worker    def _GetBranchFromRepo(self):
796*800a58d9SAndroid Build Coastguard Worker        """Get branch information from command "repo info".
797*800a58d9SAndroid Build Coastguard Worker
798*800a58d9SAndroid Build Coastguard Worker        If branch can't get from "repo info", it will be set as default branch
799*800a58d9SAndroid Build Coastguard Worker        "aosp-main".
800*800a58d9SAndroid Build Coastguard Worker
801*800a58d9SAndroid Build Coastguard Worker        Returns:
802*800a58d9SAndroid Build Coastguard Worker            branch: String, git branch name. e.g. "aosp-main"
803*800a58d9SAndroid Build Coastguard Worker        """
804*800a58d9SAndroid Build Coastguard Worker        branch = None
805*800a58d9SAndroid Build Coastguard Worker        # TODO(149460014): Migrate acloud to py3, then remove this
806*800a58d9SAndroid Build Coastguard Worker        # workaround.
807*800a58d9SAndroid Build Coastguard Worker        env = os.environ.copy()
808*800a58d9SAndroid Build Coastguard Worker        env.pop("PYTHONPATH", None)
809*800a58d9SAndroid Build Coastguard Worker        logger.info("Running command \"%s\"", _COMMAND_REPO_INFO)
810*800a58d9SAndroid Build Coastguard Worker        # TODO(154173071): Migrate acloud to py3, then apply Popen to append with encoding
811*800a58d9SAndroid Build Coastguard Worker        process = subprocess.Popen(_COMMAND_REPO_INFO, shell=True, stdin=None,
812*800a58d9SAndroid Build Coastguard Worker                                   stdout=subprocess.PIPE,
813*800a58d9SAndroid Build Coastguard Worker                                   stderr=subprocess.STDOUT, env=env,
814*800a58d9SAndroid Build Coastguard Worker                                   universal_newlines=True)
815*800a58d9SAndroid Build Coastguard Worker        timer = threading.Timer(_REPO_TIMEOUT, process.kill)
816*800a58d9SAndroid Build Coastguard Worker        timer.start()
817*800a58d9SAndroid Build Coastguard Worker        stdout, _ = process.communicate()
818*800a58d9SAndroid Build Coastguard Worker        if stdout:
819*800a58d9SAndroid Build Coastguard Worker            for line in stdout.splitlines():
820*800a58d9SAndroid Build Coastguard Worker                match = _BRANCH_RE.match(EscapeAnsi(line))
821*800a58d9SAndroid Build Coastguard Worker                if match:
822*800a58d9SAndroid Build Coastguard Worker                    branch_prefix = _BRANCH_PREFIX.get(self._GetGitRemote(),
823*800a58d9SAndroid Build Coastguard Worker                                                       _DEFAULT_BRANCH_PREFIX)
824*800a58d9SAndroid Build Coastguard Worker                    branch = branch_prefix + match.group("branch")
825*800a58d9SAndroid Build Coastguard Worker        timer.cancel()
826*800a58d9SAndroid Build Coastguard Worker        if branch:
827*800a58d9SAndroid Build Coastguard Worker            return branch
828*800a58d9SAndroid Build Coastguard Worker        utils.PrintColorString(
829*800a58d9SAndroid Build Coastguard Worker            "Unable to determine your repo branch, defaulting to %s"
830*800a58d9SAndroid Build Coastguard Worker            % _DEFAULT_BRANCH, utils.TextColors.WARNING)
831*800a58d9SAndroid Build Coastguard Worker        return _DEFAULT_BRANCH
832*800a58d9SAndroid Build Coastguard Worker
833*800a58d9SAndroid Build Coastguard Worker    def _GetBuildTarget(self, args, branch):
834*800a58d9SAndroid Build Coastguard Worker        """Infer build target if user doesn't specified target name.
835*800a58d9SAndroid Build Coastguard Worker
836*800a58d9SAndroid Build Coastguard Worker        Target = {REPO_PREFIX}{avd_type}_{bitness}_{flavor}-
837*800a58d9SAndroid Build Coastguard Worker            {DEFAULT_BUILD_TARGET_TYPE}.
838*800a58d9SAndroid Build Coastguard Worker        Example target: aosp_cf_x86_64_phone-userdebug
839*800a58d9SAndroid Build Coastguard Worker
840*800a58d9SAndroid Build Coastguard Worker        Args:
841*800a58d9SAndroid Build Coastguard Worker            args: Namespace object from argparse.parse_args.
842*800a58d9SAndroid Build Coastguard Worker            branch: String, name of build branch.
843*800a58d9SAndroid Build Coastguard Worker
844*800a58d9SAndroid Build Coastguard Worker        Returns:
845*800a58d9SAndroid Build Coastguard Worker            build_target: String, name of build target.
846*800a58d9SAndroid Build Coastguard Worker        """
847*800a58d9SAndroid Build Coastguard Worker        branch_prefix = re.split("-|_", branch)[0]
848*800a58d9SAndroid Build Coastguard Worker        return "%s%s_%s_%s%s-%s" % (
849*800a58d9SAndroid Build Coastguard Worker            _BRANCH_TARGET_PREFIX.get(branch_prefix, ""),
850*800a58d9SAndroid Build Coastguard Worker            constants.AVD_TYPES_MAPPING[args.avd_type],
851*800a58d9SAndroid Build Coastguard Worker            _DEFAULT_BUILD_BITNESS, self._flavor,
852*800a58d9SAndroid Build Coastguard Worker            _BRANCH_TARGET_TRUNK_STAGEING.get(branch, ""),
853*800a58d9SAndroid Build Coastguard Worker            _DEFAULT_BUILD_TYPE)
854*800a58d9SAndroid Build Coastguard Worker
855*800a58d9SAndroid Build Coastguard Worker    @property
856*800a58d9SAndroid Build Coastguard Worker    def instance_type(self):
857*800a58d9SAndroid Build Coastguard Worker        """Return the instance type."""
858*800a58d9SAndroid Build Coastguard Worker        return self._instance_type
859*800a58d9SAndroid Build Coastguard Worker
860*800a58d9SAndroid Build Coastguard Worker    @property
861*800a58d9SAndroid Build Coastguard Worker    def image_source(self):
862*800a58d9SAndroid Build Coastguard Worker        """Return the image type."""
863*800a58d9SAndroid Build Coastguard Worker        return self._image_source
864*800a58d9SAndroid Build Coastguard Worker
865*800a58d9SAndroid Build Coastguard Worker    @property
866*800a58d9SAndroid Build Coastguard Worker    def hw_property(self):
867*800a58d9SAndroid Build Coastguard Worker        """Return the hw_property."""
868*800a58d9SAndroid Build Coastguard Worker        return self._hw_property
869*800a58d9SAndroid Build Coastguard Worker
870*800a58d9SAndroid Build Coastguard Worker    @property
871*800a58d9SAndroid Build Coastguard Worker    def hw_customize(self):
872*800a58d9SAndroid Build Coastguard Worker        """Return the hw_customize."""
873*800a58d9SAndroid Build Coastguard Worker        return self._hw_customize
874*800a58d9SAndroid Build Coastguard Worker
875*800a58d9SAndroid Build Coastguard Worker    @property
876*800a58d9SAndroid Build Coastguard Worker    def local_image_dir(self):
877*800a58d9SAndroid Build Coastguard Worker        """Return local image dir."""
878*800a58d9SAndroid Build Coastguard Worker        return self._local_image_dir
879*800a58d9SAndroid Build Coastguard Worker
880*800a58d9SAndroid Build Coastguard Worker    @property
881*800a58d9SAndroid Build Coastguard Worker    def local_image_artifact(self):
882*800a58d9SAndroid Build Coastguard Worker        """Return local image artifact."""
883*800a58d9SAndroid Build Coastguard Worker        return self._local_image_artifact
884*800a58d9SAndroid Build Coastguard Worker
885*800a58d9SAndroid Build Coastguard Worker    @property
886*800a58d9SAndroid Build Coastguard Worker    def local_instance_dir(self):
887*800a58d9SAndroid Build Coastguard Worker        """Return local instance directory."""
888*800a58d9SAndroid Build Coastguard Worker        return self._local_instance_dir
889*800a58d9SAndroid Build Coastguard Worker
890*800a58d9SAndroid Build Coastguard Worker    @property
891*800a58d9SAndroid Build Coastguard Worker    def local_kernel_image(self):
892*800a58d9SAndroid Build Coastguard Worker        """Return local kernel image path."""
893*800a58d9SAndroid Build Coastguard Worker        return self._local_kernel_image
894*800a58d9SAndroid Build Coastguard Worker
895*800a58d9SAndroid Build Coastguard Worker    @property
896*800a58d9SAndroid Build Coastguard Worker    def local_system_image(self):
897*800a58d9SAndroid Build Coastguard Worker        """Return local system image path."""
898*800a58d9SAndroid Build Coastguard Worker        return self._local_system_image
899*800a58d9SAndroid Build Coastguard Worker
900*800a58d9SAndroid Build Coastguard Worker    @property
901*800a58d9SAndroid Build Coastguard Worker    def local_system_dlkm_image(self):
902*800a58d9SAndroid Build Coastguard Worker        """Return local system_dlkm image path."""
903*800a58d9SAndroid Build Coastguard Worker        return self._local_system_dlkm_image
904*800a58d9SAndroid Build Coastguard Worker
905*800a58d9SAndroid Build Coastguard Worker    @property
906*800a58d9SAndroid Build Coastguard Worker    def local_vendor_image(self):
907*800a58d9SAndroid Build Coastguard Worker        """Return local vendor image path."""
908*800a58d9SAndroid Build Coastguard Worker        return self._local_vendor_image
909*800a58d9SAndroid Build Coastguard Worker
910*800a58d9SAndroid Build Coastguard Worker    @property
911*800a58d9SAndroid Build Coastguard Worker    def local_vendor_boot_image(self):
912*800a58d9SAndroid Build Coastguard Worker        """Return local vendor boot image path."""
913*800a58d9SAndroid Build Coastguard Worker        return self._local_vendor_boot_image
914*800a58d9SAndroid Build Coastguard Worker
915*800a58d9SAndroid Build Coastguard Worker    @property
916*800a58d9SAndroid Build Coastguard Worker    def local_trusty_image(self):
917*800a58d9SAndroid Build Coastguard Worker        """Return local trusty qemu package path."""
918*800a58d9SAndroid Build Coastguard Worker        return self._local_trusty_image
919*800a58d9SAndroid Build Coastguard Worker
920*800a58d9SAndroid Build Coastguard Worker    @property
921*800a58d9SAndroid Build Coastguard Worker    def local_tool_dirs(self):
922*800a58d9SAndroid Build Coastguard Worker        """Return a list of local tool directories."""
923*800a58d9SAndroid Build Coastguard Worker        return self._local_tool_dirs
924*800a58d9SAndroid Build Coastguard Worker
925*800a58d9SAndroid Build Coastguard Worker    @property
926*800a58d9SAndroid Build Coastguard Worker    def avd_type(self):
927*800a58d9SAndroid Build Coastguard Worker        """Return the avd type."""
928*800a58d9SAndroid Build Coastguard Worker        return self._avd_type
929*800a58d9SAndroid Build Coastguard Worker
930*800a58d9SAndroid Build Coastguard Worker    @property
931*800a58d9SAndroid Build Coastguard Worker    def autoconnect(self):
932*800a58d9SAndroid Build Coastguard Worker        """autoconnect.
933*800a58d9SAndroid Build Coastguard Worker
934*800a58d9SAndroid Build Coastguard Worker        args.autoconnect could pass as Boolean or String.
935*800a58d9SAndroid Build Coastguard Worker
936*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, True only if self._autoconnect is not False.
937*800a58d9SAndroid Build Coastguard Worker        """
938*800a58d9SAndroid Build Coastguard Worker        return self._autoconnect is not False
939*800a58d9SAndroid Build Coastguard Worker
940*800a58d9SAndroid Build Coastguard Worker    @property
941*800a58d9SAndroid Build Coastguard Worker    def connect_adb(self):
942*800a58d9SAndroid Build Coastguard Worker        """Auto-connect to adb.
943*800a58d9SAndroid Build Coastguard Worker
944*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, whether autoconnect is enabled.
945*800a58d9SAndroid Build Coastguard Worker        """
946*800a58d9SAndroid Build Coastguard Worker        return self._autoconnect is not False
947*800a58d9SAndroid Build Coastguard Worker
948*800a58d9SAndroid Build Coastguard Worker    @property
949*800a58d9SAndroid Build Coastguard Worker    def connect_vnc(self):
950*800a58d9SAndroid Build Coastguard Worker        """Launch vnc.
951*800a58d9SAndroid Build Coastguard Worker
952*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, True if self._autoconnect is 'vnc'.
953*800a58d9SAndroid Build Coastguard Worker        """
954*800a58d9SAndroid Build Coastguard Worker        return self._autoconnect == constants.INS_KEY_VNC
955*800a58d9SAndroid Build Coastguard Worker
956*800a58d9SAndroid Build Coastguard Worker    @property
957*800a58d9SAndroid Build Coastguard Worker    def connect_webrtc(self):
958*800a58d9SAndroid Build Coastguard Worker        """Auto-launch webRTC AVD on the browser.
959*800a58d9SAndroid Build Coastguard Worker
960*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, True if args.autoconnect is "webrtc".
961*800a58d9SAndroid Build Coastguard Worker        """
962*800a58d9SAndroid Build Coastguard Worker        return self._autoconnect == constants.INS_KEY_WEBRTC
963*800a58d9SAndroid Build Coastguard Worker
964*800a58d9SAndroid Build Coastguard Worker    @property
965*800a58d9SAndroid Build Coastguard Worker    def unlock_screen(self):
966*800a58d9SAndroid Build Coastguard Worker        """Return unlock_screen."""
967*800a58d9SAndroid Build Coastguard Worker        return self._unlock_screen
968*800a58d9SAndroid Build Coastguard Worker
969*800a58d9SAndroid Build Coastguard Worker    @property
970*800a58d9SAndroid Build Coastguard Worker    def remote_image(self):
971*800a58d9SAndroid Build Coastguard Worker        """Return the remote image."""
972*800a58d9SAndroid Build Coastguard Worker        return self._remote_image
973*800a58d9SAndroid Build Coastguard Worker
974*800a58d9SAndroid Build Coastguard Worker    @property
975*800a58d9SAndroid Build Coastguard Worker    def remote_fetch(self):
976*800a58d9SAndroid Build Coastguard Worker        """Fetch cvd in remote host.
977*800a58d9SAndroid Build Coastguard Worker
978*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, whether fetch cvd in remote host.
979*800a58d9SAndroid Build Coastguard Worker        """
980*800a58d9SAndroid Build Coastguard Worker        return self._remote_fetch is True
981*800a58d9SAndroid Build Coastguard Worker
982*800a58d9SAndroid Build Coastguard Worker    @property
983*800a58d9SAndroid Build Coastguard Worker    def fetch_cvd_wrapper(self):
984*800a58d9SAndroid Build Coastguard Worker        """use fetch_cvd wrapper
985*800a58d9SAndroid Build Coastguard Worker
986*800a58d9SAndroid Build Coastguard Worker        Return: Boolean, whether fetch cvd in remote host.
987*800a58d9SAndroid Build Coastguard Worker        """
988*800a58d9SAndroid Build Coastguard Worker        return self._fetch_cvd_wrapper
989*800a58d9SAndroid Build Coastguard Worker
990*800a58d9SAndroid Build Coastguard Worker    @property
991*800a58d9SAndroid Build Coastguard Worker    def fetch_cvd_version(self):
992*800a58d9SAndroid Build Coastguard Worker        """Return fetch_cvd_version."""
993*800a58d9SAndroid Build Coastguard Worker        return self._fetch_cvd_version
994*800a58d9SAndroid Build Coastguard Worker
995*800a58d9SAndroid Build Coastguard Worker    @property
996*800a58d9SAndroid Build Coastguard Worker    def num(self):
997*800a58d9SAndroid Build Coastguard Worker        """Return num of instances."""
998*800a58d9SAndroid Build Coastguard Worker        return self._num_of_instances
999*800a58d9SAndroid Build Coastguard Worker
1000*800a58d9SAndroid Build Coastguard Worker    @property
1001*800a58d9SAndroid Build Coastguard Worker    def num_avds_per_instance(self):
1002*800a58d9SAndroid Build Coastguard Worker        """Return num_avds_per_instance."""
1003*800a58d9SAndroid Build Coastguard Worker        return self._num_avds_per_instance
1004*800a58d9SAndroid Build Coastguard Worker
1005*800a58d9SAndroid Build Coastguard Worker    @property
1006*800a58d9SAndroid Build Coastguard Worker    def report_internal_ip(self):
1007*800a58d9SAndroid Build Coastguard Worker        """Return report internal ip."""
1008*800a58d9SAndroid Build Coastguard Worker        return self._report_internal_ip
1009*800a58d9SAndroid Build Coastguard Worker
1010*800a58d9SAndroid Build Coastguard Worker    @property
1011*800a58d9SAndroid Build Coastguard Worker    def disable_external_ip(self):
1012*800a58d9SAndroid Build Coastguard Worker        """Return disable_external_ip."""
1013*800a58d9SAndroid Build Coastguard Worker        return self._disable_external_ip
1014*800a58d9SAndroid Build Coastguard Worker
1015*800a58d9SAndroid Build Coastguard Worker    @property
1016*800a58d9SAndroid Build Coastguard Worker    def kernel_build_info(self):
1017*800a58d9SAndroid Build Coastguard Worker        """Return kernel build info."""
1018*800a58d9SAndroid Build Coastguard Worker        return self._kernel_build_info
1019*800a58d9SAndroid Build Coastguard Worker
1020*800a58d9SAndroid Build Coastguard Worker    @property
1021*800a58d9SAndroid Build Coastguard Worker    def boot_build_info(self):
1022*800a58d9SAndroid Build Coastguard Worker        """Return boot build info."""
1023*800a58d9SAndroid Build Coastguard Worker        return self._boot_build_info
1024*800a58d9SAndroid Build Coastguard Worker
1025*800a58d9SAndroid Build Coastguard Worker    @property
1026*800a58d9SAndroid Build Coastguard Worker    def bootloader_build_info(self):
1027*800a58d9SAndroid Build Coastguard Worker        """Return bootloader build info."""
1028*800a58d9SAndroid Build Coastguard Worker        return self._bootloader_build_info
1029*800a58d9SAndroid Build Coastguard Worker
1030*800a58d9SAndroid Build Coastguard Worker    @property
1031*800a58d9SAndroid Build Coastguard Worker    def android_efi_loader_build_info(self):
1032*800a58d9SAndroid Build Coastguard Worker        """Return android efi loader build info."""
1033*800a58d9SAndroid Build Coastguard Worker        return self._android_efi_loader_build_info
1034*800a58d9SAndroid Build Coastguard Worker
1035*800a58d9SAndroid Build Coastguard Worker    @property
1036*800a58d9SAndroid Build Coastguard Worker    def flavor(self):
1037*800a58d9SAndroid Build Coastguard Worker        """Return flavor."""
1038*800a58d9SAndroid Build Coastguard Worker        return self._flavor
1039*800a58d9SAndroid Build Coastguard Worker
1040*800a58d9SAndroid Build Coastguard Worker    @property
1041*800a58d9SAndroid Build Coastguard Worker    def cfg(self):
1042*800a58d9SAndroid Build Coastguard Worker        """Return cfg instance."""
1043*800a58d9SAndroid Build Coastguard Worker        return self._cfg
1044*800a58d9SAndroid Build Coastguard Worker
1045*800a58d9SAndroid Build Coastguard Worker    @property
1046*800a58d9SAndroid Build Coastguard Worker    def image_download_dir(self):
1047*800a58d9SAndroid Build Coastguard Worker        """Return image download dir."""
1048*800a58d9SAndroid Build Coastguard Worker        return self._image_download_dir
1049*800a58d9SAndroid Build Coastguard Worker
1050*800a58d9SAndroid Build Coastguard Worker    @image_download_dir.setter
1051*800a58d9SAndroid Build Coastguard Worker    def image_download_dir(self, value):
1052*800a58d9SAndroid Build Coastguard Worker        """Set image download dir."""
1053*800a58d9SAndroid Build Coastguard Worker        self._image_download_dir = value
1054*800a58d9SAndroid Build Coastguard Worker
1055*800a58d9SAndroid Build Coastguard Worker    @property
1056*800a58d9SAndroid Build Coastguard Worker    def serial_log_file(self):
1057*800a58d9SAndroid Build Coastguard Worker        """Return serial log file path."""
1058*800a58d9SAndroid Build Coastguard Worker        return self._serial_log_file
1059*800a58d9SAndroid Build Coastguard Worker
1060*800a58d9SAndroid Build Coastguard Worker    @property
1061*800a58d9SAndroid Build Coastguard Worker    def disk_type(self):
1062*800a58d9SAndroid Build Coastguard Worker        """Return disk type."""
1063*800a58d9SAndroid Build Coastguard Worker        return self._disk_type
1064*800a58d9SAndroid Build Coastguard Worker
1065*800a58d9SAndroid Build Coastguard Worker    @property
1066*800a58d9SAndroid Build Coastguard Worker    def base_instance_num(self):
1067*800a58d9SAndroid Build Coastguard Worker        """Return base instance num."""
1068*800a58d9SAndroid Build Coastguard Worker        return self._base_instance_num
1069*800a58d9SAndroid Build Coastguard Worker
1070*800a58d9SAndroid Build Coastguard Worker    @property
1071*800a58d9SAndroid Build Coastguard Worker    def gpu(self):
1072*800a58d9SAndroid Build Coastguard Worker        """Return gpu."""
1073*800a58d9SAndroid Build Coastguard Worker        return self._gpu
1074*800a58d9SAndroid Build Coastguard Worker
1075*800a58d9SAndroid Build Coastguard Worker    @property
1076*800a58d9SAndroid Build Coastguard Worker    def emulator_build_id(self):
1077*800a58d9SAndroid Build Coastguard Worker        """Return emulator_build_id."""
1078*800a58d9SAndroid Build Coastguard Worker        return self._emulator_build_id
1079*800a58d9SAndroid Build Coastguard Worker
1080*800a58d9SAndroid Build Coastguard Worker    @property
1081*800a58d9SAndroid Build Coastguard Worker    def emulator_build_target(self):
1082*800a58d9SAndroid Build Coastguard Worker        """Return emulator_build_target."""
1083*800a58d9SAndroid Build Coastguard Worker        return self._emulator_build_target
1084*800a58d9SAndroid Build Coastguard Worker
1085*800a58d9SAndroid Build Coastguard Worker    @property
1086*800a58d9SAndroid Build Coastguard Worker    def emulator_zip(self):
1087*800a58d9SAndroid Build Coastguard Worker        """Return emulator_zip."""
1088*800a58d9SAndroid Build Coastguard Worker        return self._emulator_zip
1089*800a58d9SAndroid Build Coastguard Worker
1090*800a58d9SAndroid Build Coastguard Worker    @property
1091*800a58d9SAndroid Build Coastguard Worker    def client_adb_port(self):
1092*800a58d9SAndroid Build Coastguard Worker        """Return the client adb port."""
1093*800a58d9SAndroid Build Coastguard Worker        return self._client_adb_port
1094*800a58d9SAndroid Build Coastguard Worker
1095*800a58d9SAndroid Build Coastguard Worker    @property
1096*800a58d9SAndroid Build Coastguard Worker    def stable_host_image_name(self):
1097*800a58d9SAndroid Build Coastguard Worker        """Return the Cuttlefish host image name."""
1098*800a58d9SAndroid Build Coastguard Worker        return self._stable_host_image_name
1099*800a58d9SAndroid Build Coastguard Worker
1100*800a58d9SAndroid Build Coastguard Worker    @property
1101*800a58d9SAndroid Build Coastguard Worker    def stable_cheeps_host_image_name(self):
1102*800a58d9SAndroid Build Coastguard Worker        """Return the Cheeps host image name."""
1103*800a58d9SAndroid Build Coastguard Worker        return self._stable_cheeps_host_image_name
1104*800a58d9SAndroid Build Coastguard Worker
1105*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=invalid-name
1106*800a58d9SAndroid Build Coastguard Worker    @property
1107*800a58d9SAndroid Build Coastguard Worker    def stable_cheeps_host_image_project(self):
1108*800a58d9SAndroid Build Coastguard Worker        """Return the project hosting the Cheeps host image."""
1109*800a58d9SAndroid Build Coastguard Worker        return self._stable_cheeps_host_image_project
1110*800a58d9SAndroid Build Coastguard Worker
1111*800a58d9SAndroid Build Coastguard Worker    @property
1112*800a58d9SAndroid Build Coastguard Worker    def username(self):
1113*800a58d9SAndroid Build Coastguard Worker        """Return username."""
1114*800a58d9SAndroid Build Coastguard Worker        return self._username
1115*800a58d9SAndroid Build Coastguard Worker
1116*800a58d9SAndroid Build Coastguard Worker    @property
1117*800a58d9SAndroid Build Coastguard Worker    def password(self):
1118*800a58d9SAndroid Build Coastguard Worker        """Return password."""
1119*800a58d9SAndroid Build Coastguard Worker        return self._password
1120*800a58d9SAndroid Build Coastguard Worker
1121*800a58d9SAndroid Build Coastguard Worker    @property
1122*800a58d9SAndroid Build Coastguard Worker    def cheeps_betty_image(self):
1123*800a58d9SAndroid Build Coastguard Worker        """Return cheeps_betty_image."""
1124*800a58d9SAndroid Build Coastguard Worker        return self._cheeps_betty_image
1125*800a58d9SAndroid Build Coastguard Worker
1126*800a58d9SAndroid Build Coastguard Worker    @property
1127*800a58d9SAndroid Build Coastguard Worker    def cheeps_features(self):
1128*800a58d9SAndroid Build Coastguard Worker        """Return cheeps_features."""
1129*800a58d9SAndroid Build Coastguard Worker        return self._cheeps_features
1130*800a58d9SAndroid Build Coastguard Worker
1131*800a58d9SAndroid Build Coastguard Worker    @property
1132*800a58d9SAndroid Build Coastguard Worker    def boot_timeout_secs(self):
1133*800a58d9SAndroid Build Coastguard Worker        """Return boot_timeout_secs."""
1134*800a58d9SAndroid Build Coastguard Worker        return self._boot_timeout_secs
1135*800a58d9SAndroid Build Coastguard Worker
1136*800a58d9SAndroid Build Coastguard Worker    @property
1137*800a58d9SAndroid Build Coastguard Worker    def ins_timeout_secs(self):
1138*800a58d9SAndroid Build Coastguard Worker        """Return ins_timeout_secs."""
1139*800a58d9SAndroid Build Coastguard Worker        return self._ins_timeout_secs
1140*800a58d9SAndroid Build Coastguard Worker
1141*800a58d9SAndroid Build Coastguard Worker    @property
1142*800a58d9SAndroid Build Coastguard Worker    def ota_build_info(self):
1143*800a58d9SAndroid Build Coastguard Worker        """Return ota_build_info."""
1144*800a58d9SAndroid Build Coastguard Worker        return self._ota_build_info
1145*800a58d9SAndroid Build Coastguard Worker
1146*800a58d9SAndroid Build Coastguard Worker    @property
1147*800a58d9SAndroid Build Coastguard Worker    def host_package_build_info(self):
1148*800a58d9SAndroid Build Coastguard Worker        """Return host_package_build_info."""
1149*800a58d9SAndroid Build Coastguard Worker        return self._host_package_build_info
1150*800a58d9SAndroid Build Coastguard Worker
1151*800a58d9SAndroid Build Coastguard Worker    @property
1152*800a58d9SAndroid Build Coastguard Worker    def system_build_info(self):
1153*800a58d9SAndroid Build Coastguard Worker        """Return system_build_info."""
1154*800a58d9SAndroid Build Coastguard Worker        return self._system_build_info
1155*800a58d9SAndroid Build Coastguard Worker
1156*800a58d9SAndroid Build Coastguard Worker    @property
1157*800a58d9SAndroid Build Coastguard Worker    def local_instance_id(self):
1158*800a58d9SAndroid Build Coastguard Worker        """Return local_instance_id."""
1159*800a58d9SAndroid Build Coastguard Worker        return self._local_instance_id
1160*800a58d9SAndroid Build Coastguard Worker
1161*800a58d9SAndroid Build Coastguard Worker    @property
1162*800a58d9SAndroid Build Coastguard Worker    def instance_name_to_reuse(self):
1163*800a58d9SAndroid Build Coastguard Worker        """Return instance_name_to_reuse."""
1164*800a58d9SAndroid Build Coastguard Worker        return self._instance_name_to_reuse
1165*800a58d9SAndroid Build Coastguard Worker
1166*800a58d9SAndroid Build Coastguard Worker    @property
1167*800a58d9SAndroid Build Coastguard Worker    def remote_host(self):
1168*800a58d9SAndroid Build Coastguard Worker        """Return host."""
1169*800a58d9SAndroid Build Coastguard Worker        return self._remote_host
1170*800a58d9SAndroid Build Coastguard Worker
1171*800a58d9SAndroid Build Coastguard Worker    @property
1172*800a58d9SAndroid Build Coastguard Worker    def remote_image_dir(self):
1173*800a58d9SAndroid Build Coastguard Worker        """Return remote_image_dir."""
1174*800a58d9SAndroid Build Coastguard Worker        return self._remote_image_dir
1175*800a58d9SAndroid Build Coastguard Worker
1176*800a58d9SAndroid Build Coastguard Worker    @property
1177*800a58d9SAndroid Build Coastguard Worker    def host_user(self):
1178*800a58d9SAndroid Build Coastguard Worker        """Return host_user."""
1179*800a58d9SAndroid Build Coastguard Worker        return self._host_user
1180*800a58d9SAndroid Build Coastguard Worker
1181*800a58d9SAndroid Build Coastguard Worker    @property
1182*800a58d9SAndroid Build Coastguard Worker    def host_ssh_private_key_path(self):
1183*800a58d9SAndroid Build Coastguard Worker        """Return host_ssh_private_key_path."""
1184*800a58d9SAndroid Build Coastguard Worker        return self._host_ssh_private_key_path
1185*800a58d9SAndroid Build Coastguard Worker
1186*800a58d9SAndroid Build Coastguard Worker    @property
1187*800a58d9SAndroid Build Coastguard Worker    def no_pull_log(self):
1188*800a58d9SAndroid Build Coastguard Worker        """Return no_pull_log."""
1189*800a58d9SAndroid Build Coastguard Worker        return self._no_pull_log
1190*800a58d9SAndroid Build Coastguard Worker
1191*800a58d9SAndroid Build Coastguard Worker    @property
1192*800a58d9SAndroid Build Coastguard Worker    def mkcert(self):
1193*800a58d9SAndroid Build Coastguard Worker        """Return mkcert."""
1194*800a58d9SAndroid Build Coastguard Worker        return self._mkcert
1195*800a58d9SAndroid Build Coastguard Worker
1196*800a58d9SAndroid Build Coastguard Worker    @property
1197*800a58d9SAndroid Build Coastguard Worker    def gce_metadata(self):
1198*800a58d9SAndroid Build Coastguard Worker        """Return gce_metadata."""
1199*800a58d9SAndroid Build Coastguard Worker        return self._gce_metadata
1200*800a58d9SAndroid Build Coastguard Worker
1201*800a58d9SAndroid Build Coastguard Worker    @property
1202*800a58d9SAndroid Build Coastguard Worker    def gce_only(self):
1203*800a58d9SAndroid Build Coastguard Worker        """Return gce_only."""
1204*800a58d9SAndroid Build Coastguard Worker        return self._gce_only
1205*800a58d9SAndroid Build Coastguard Worker
1206*800a58d9SAndroid Build Coastguard Worker    @property
1207*800a58d9SAndroid Build Coastguard Worker    def oxygen(self):
1208*800a58d9SAndroid Build Coastguard Worker        """Return oxygen."""
1209*800a58d9SAndroid Build Coastguard Worker        return self._oxygen
1210*800a58d9SAndroid Build Coastguard Worker
1211*800a58d9SAndroid Build Coastguard Worker    @property
1212*800a58d9SAndroid Build Coastguard Worker    def openwrt(self):
1213*800a58d9SAndroid Build Coastguard Worker        """Return openwrt."""
1214*800a58d9SAndroid Build Coastguard Worker        return self._openwrt
1215*800a58d9SAndroid Build Coastguard Worker
1216*800a58d9SAndroid Build Coastguard Worker    @property
1217*800a58d9SAndroid Build Coastguard Worker    def use_launch_cvd(self):
1218*800a58d9SAndroid Build Coastguard Worker        """Return use_launch_cvd."""
1219*800a58d9SAndroid Build Coastguard Worker        return self._use_launch_cvd
1220*800a58d9SAndroid Build Coastguard Worker
1221*800a58d9SAndroid Build Coastguard Worker    @property
1222*800a58d9SAndroid Build Coastguard Worker    def launch_args(self):
1223*800a58d9SAndroid Build Coastguard Worker        """Return launch_args."""
1224*800a58d9SAndroid Build Coastguard Worker        return self._launch_args
1225*800a58d9SAndroid Build Coastguard Worker
1226*800a58d9SAndroid Build Coastguard Worker    @property
1227*800a58d9SAndroid Build Coastguard Worker    def cvd_host_package(self):
1228*800a58d9SAndroid Build Coastguard Worker        """Return cvd_host_package."""
1229*800a58d9SAndroid Build Coastguard Worker        return self._cvd_host_package
1230*800a58d9SAndroid Build Coastguard Worker
1231*800a58d9SAndroid Build Coastguard Worker    @property
1232*800a58d9SAndroid Build Coastguard Worker    def trusty_host_package(self):
1233*800a58d9SAndroid Build Coastguard Worker        """Return trusty_host_package."""
1234*800a58d9SAndroid Build Coastguard Worker        return self._trusty_host_package
1235*800a58d9SAndroid Build Coastguard Worker
1236*800a58d9SAndroid Build Coastguard Worker    @property
1237*800a58d9SAndroid Build Coastguard Worker    def trusty_build_info(self):
1238*800a58d9SAndroid Build Coastguard Worker        """Return trusty_build_info."""
1239*800a58d9SAndroid Build Coastguard Worker        return self._trusty_build_info
1240*800a58d9SAndroid Build Coastguard Worker
1241*800a58d9SAndroid Build Coastguard Worker    @property
1242*800a58d9SAndroid Build Coastguard Worker    def extra_files(self):
1243*800a58d9SAndroid Build Coastguard Worker        """Return extra_files."""
1244*800a58d9SAndroid Build Coastguard Worker        return self._extra_files
1245*800a58d9SAndroid Build Coastguard Worker
1246*800a58d9SAndroid Build Coastguard Worker    @property
1247*800a58d9SAndroid Build Coastguard Worker    def force_sync(self):
1248*800a58d9SAndroid Build Coastguard Worker        """Return force_sync."""
1249*800a58d9SAndroid Build Coastguard Worker        return self._force_sync
1250*800a58d9SAndroid Build Coastguard Worker
1251*800a58d9SAndroid Build Coastguard Worker    @property
1252*800a58d9SAndroid Build Coastguard Worker    def webrtc_device_id(self):
1253*800a58d9SAndroid Build Coastguard Worker        """Return webrtc_device_id."""
1254*800a58d9SAndroid Build Coastguard Worker        return self._webrtc_device_id
1255*800a58d9SAndroid Build Coastguard Worker
1256*800a58d9SAndroid Build Coastguard Worker    @property
1257*800a58d9SAndroid Build Coastguard Worker    def connect_hostname(self):
1258*800a58d9SAndroid Build Coastguard Worker        """Return connect_hostname"""
1259*800a58d9SAndroid Build Coastguard Worker        return self._connect_hostname
1260