xref: /aosp_15_r20/tools/acloud/public/actions/create_goldfish_action.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 Worker"""Action to create goldfish device instances.
17*800a58d9SAndroid Build Coastguard Worker
18*800a58d9SAndroid Build Coastguard WorkerA Goldfish device is an emulated android device based on the android
19*800a58d9SAndroid Build Coastguard Workeremulator.
20*800a58d9SAndroid Build Coastguard Worker"""
21*800a58d9SAndroid Build Coastguard Workerimport logging
22*800a58d9SAndroid Build Coastguard Workerimport os
23*800a58d9SAndroid Build Coastguard Workerimport re
24*800a58d9SAndroid Build Coastguard Worker
25*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors
26*800a58d9SAndroid Build Coastguard Workerfrom acloud.public.actions import base_device_factory
27*800a58d9SAndroid Build Coastguard Workerfrom acloud.public.actions import common_operations
28*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal import constants
29*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_build_client
30*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth
31*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import goldfish_compute_client
32*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils
33*800a58d9SAndroid Build Coastguard Worker
34*800a58d9SAndroid Build Coastguard Worker
35*800a58d9SAndroid Build Coastguard Workerlogger = logging.getLogger(__name__)
36*800a58d9SAndroid Build Coastguard Worker
37*800a58d9SAndroid Build Coastguard Worker_EMULATOR_INFO_FILENAME = "emulator-info.txt"
38*800a58d9SAndroid Build Coastguard Worker_SYSIMAGE_INFO_FILENAME = "android-info.txt"
39*800a58d9SAndroid Build Coastguard Worker_VERSION_PATTERN = r"version-.*=(\d+)"
40*800a58d9SAndroid Build Coastguard Worker
41*800a58d9SAndroid Build Coastguard Worker
42*800a58d9SAndroid Build Coastguard Workerclass GoldfishDeviceFactory(base_device_factory.BaseDeviceFactory):
43*800a58d9SAndroid Build Coastguard Worker    """A class that can produce a goldfish device.
44*800a58d9SAndroid Build Coastguard Worker
45*800a58d9SAndroid Build Coastguard Worker    Attributes:
46*800a58d9SAndroid Build Coastguard Worker        _cfg: An AcloudConfig instance.
47*800a58d9SAndroid Build Coastguard Worker        _build_target: String, the build target, e.g. aosp_x86-eng.
48*800a58d9SAndroid Build Coastguard Worker        _build_id: String, Build id, e.g. "2263051", "P2804227"
49*800a58d9SAndroid Build Coastguard Worker        _emulator_build_target: String, the emulator build target, e.g. aosp_x86-eng.
50*800a58d9SAndroid Build Coastguard Worker        _emulator_build_id: String, emulator build id.
51*800a58d9SAndroid Build Coastguard Worker        _gpu: String, GPU to attach to the device or None. e.g. "nvidia-tesla-k80"
52*800a58d9SAndroid Build Coastguard Worker        _blank_data_disk_size_gb: Integer, extra disk size
53*800a58d9SAndroid Build Coastguard Worker        _build_client: An AndroidBuildClient instance
54*800a58d9SAndroid Build Coastguard Worker        _branch: String, android branch name, e.g. git_master
55*800a58d9SAndroid Build Coastguard Worker        _emulator_branch: String, emulator branch name, e.g. "aosp-emu-master-dev"
56*800a58d9SAndroid Build Coastguard Worker    """
57*800a58d9SAndroid Build Coastguard Worker    LOG_FILES = ["/home/vsoc-01/emulator.log",
58*800a58d9SAndroid Build Coastguard Worker                 "/home/vsoc-01/log/logcat.log",
59*800a58d9SAndroid Build Coastguard Worker                 "/home/vsoc-01/log/adb.log",
60*800a58d9SAndroid Build Coastguard Worker                 "/var/log/daemon.log"]
61*800a58d9SAndroid Build Coastguard Worker
62*800a58d9SAndroid Build Coastguard Worker    def __init__(self,
63*800a58d9SAndroid Build Coastguard Worker                 cfg,
64*800a58d9SAndroid Build Coastguard Worker                 build_target,
65*800a58d9SAndroid Build Coastguard Worker                 build_id,
66*800a58d9SAndroid Build Coastguard Worker                 emulator_build_target,
67*800a58d9SAndroid Build Coastguard Worker                 emulator_build_id,
68*800a58d9SAndroid Build Coastguard Worker                 kernel_build_id=None,
69*800a58d9SAndroid Build Coastguard Worker                 kernel_branch=None,
70*800a58d9SAndroid Build Coastguard Worker                 kernel_build_target=None,
71*800a58d9SAndroid Build Coastguard Worker                 gpu=None,
72*800a58d9SAndroid Build Coastguard Worker                 avd_spec=None,
73*800a58d9SAndroid Build Coastguard Worker                 tags=None,
74*800a58d9SAndroid Build Coastguard Worker                 branch=None,
75*800a58d9SAndroid Build Coastguard Worker                 emulator_branch=None):
76*800a58d9SAndroid Build Coastguard Worker
77*800a58d9SAndroid Build Coastguard Worker        """Initialize.
78*800a58d9SAndroid Build Coastguard Worker
79*800a58d9SAndroid Build Coastguard Worker        Args:
80*800a58d9SAndroid Build Coastguard Worker            cfg: An AcloudConfig instance.
81*800a58d9SAndroid Build Coastguard Worker            build_target: String, the build target, e.g. aosp_x86-eng.
82*800a58d9SAndroid Build Coastguard Worker            build_id: String, Build id, e.g. "2263051", "P2804227"
83*800a58d9SAndroid Build Coastguard Worker            emulator_build_target: String, the emulator build target, e.g. aosp_x86-eng.
84*800a58d9SAndroid Build Coastguard Worker            emulator_build_id: String, emulator build id.
85*800a58d9SAndroid Build Coastguard Worker            gpu: String, GPU to attach to the device or None. e.g. "nvidia-tesla-k80"
86*800a58d9SAndroid Build Coastguard Worker            avd_spec: An AVDSpec instance.
87*800a58d9SAndroid Build Coastguard Worker            tags: A list of tags to associate with the instance. e.g.
88*800a58d9SAndroid Build Coastguard Worker                  ["http-server", "https-server"]
89*800a58d9SAndroid Build Coastguard Worker            branch: String, branch of the emulator build target.
90*800a58d9SAndroid Build Coastguard Worker            emulator_branch: String, branch of the emulator.
91*800a58d9SAndroid Build Coastguard Worker        """
92*800a58d9SAndroid Build Coastguard Worker
93*800a58d9SAndroid Build Coastguard Worker        self.credentials = auth.CreateCredentials(cfg)
94*800a58d9SAndroid Build Coastguard Worker
95*800a58d9SAndroid Build Coastguard Worker        compute_client = goldfish_compute_client.GoldfishComputeClient(
96*800a58d9SAndroid Build Coastguard Worker            cfg, self.credentials)
97*800a58d9SAndroid Build Coastguard Worker        super().__init__(compute_client)
98*800a58d9SAndroid Build Coastguard Worker
99*800a58d9SAndroid Build Coastguard Worker        # Private creation parameters
100*800a58d9SAndroid Build Coastguard Worker        self._cfg = cfg
101*800a58d9SAndroid Build Coastguard Worker        self._gpu = gpu
102*800a58d9SAndroid Build Coastguard Worker        self._avd_spec = avd_spec
103*800a58d9SAndroid Build Coastguard Worker        self._blank_data_disk_size_gb = cfg.extra_data_disk_size_gb
104*800a58d9SAndroid Build Coastguard Worker        self._extra_scopes = cfg.extra_scopes
105*800a58d9SAndroid Build Coastguard Worker        self._tags = tags
106*800a58d9SAndroid Build Coastguard Worker
107*800a58d9SAndroid Build Coastguard Worker        # Configure clients
108*800a58d9SAndroid Build Coastguard Worker        self._build_client = android_build_client.AndroidBuildClient(
109*800a58d9SAndroid Build Coastguard Worker            self.credentials)
110*800a58d9SAndroid Build Coastguard Worker
111*800a58d9SAndroid Build Coastguard Worker        # Get build info
112*800a58d9SAndroid Build Coastguard Worker        self.build_info = self._build_client.GetBuildInfo(
113*800a58d9SAndroid Build Coastguard Worker            build_target, build_id, branch)
114*800a58d9SAndroid Build Coastguard Worker        self.emulator_build_info = self._build_client.GetBuildInfo(
115*800a58d9SAndroid Build Coastguard Worker            emulator_build_target, emulator_build_id, emulator_branch)
116*800a58d9SAndroid Build Coastguard Worker        self.kernel_build_info = self._build_client.GetBuildInfo(
117*800a58d9SAndroid Build Coastguard Worker            kernel_build_target or cfg.kernel_build_target, kernel_build_id,
118*800a58d9SAndroid Build Coastguard Worker            kernel_branch)
119*800a58d9SAndroid Build Coastguard Worker
120*800a58d9SAndroid Build Coastguard Worker    def GetBuildInfoDict(self):
121*800a58d9SAndroid Build Coastguard Worker        """Get build info dictionary.
122*800a58d9SAndroid Build Coastguard Worker
123*800a58d9SAndroid Build Coastguard Worker        Returns:
124*800a58d9SAndroid Build Coastguard Worker          A build info dictionary
125*800a58d9SAndroid Build Coastguard Worker        """
126*800a58d9SAndroid Build Coastguard Worker        build_info_dict = {
127*800a58d9SAndroid Build Coastguard Worker            key: val for key, val in utils.GetDictItems(self.build_info) if val}
128*800a58d9SAndroid Build Coastguard Worker
129*800a58d9SAndroid Build Coastguard Worker        build_info_dict.update(
130*800a58d9SAndroid Build Coastguard Worker            {"emulator_%s" % key: val
131*800a58d9SAndroid Build Coastguard Worker             for key, val in utils.GetDictItems(self.emulator_build_info) if val}
132*800a58d9SAndroid Build Coastguard Worker            )
133*800a58d9SAndroid Build Coastguard Worker
134*800a58d9SAndroid Build Coastguard Worker        build_info_dict.update(
135*800a58d9SAndroid Build Coastguard Worker            {"kernel_%s" % key: val
136*800a58d9SAndroid Build Coastguard Worker             for key, val in utils.GetDictItems(self.kernel_build_info) if val}
137*800a58d9SAndroid Build Coastguard Worker            )
138*800a58d9SAndroid Build Coastguard Worker
139*800a58d9SAndroid Build Coastguard Worker        return build_info_dict
140*800a58d9SAndroid Build Coastguard Worker
141*800a58d9SAndroid Build Coastguard Worker    def CreateInstance(self):
142*800a58d9SAndroid Build Coastguard Worker        """Creates single configured goldfish device.
143*800a58d9SAndroid Build Coastguard Worker
144*800a58d9SAndroid Build Coastguard Worker        Override method from parent class.
145*800a58d9SAndroid Build Coastguard Worker
146*800a58d9SAndroid Build Coastguard Worker        Returns:
147*800a58d9SAndroid Build Coastguard Worker            String, the name of the created instance.
148*800a58d9SAndroid Build Coastguard Worker        """
149*800a58d9SAndroid Build Coastguard Worker        instance = self._compute_client.GenerateInstanceName(
150*800a58d9SAndroid Build Coastguard Worker            build_id=self.build_info.build_id,
151*800a58d9SAndroid Build Coastguard Worker            build_target=self.build_info.build_target)
152*800a58d9SAndroid Build Coastguard Worker
153*800a58d9SAndroid Build Coastguard Worker        self._compute_client.CreateInstance(
154*800a58d9SAndroid Build Coastguard Worker            instance=instance,
155*800a58d9SAndroid Build Coastguard Worker            image_name=self._cfg.stable_goldfish_host_image_name,
156*800a58d9SAndroid Build Coastguard Worker            image_project=self._cfg.stable_goldfish_host_image_project,
157*800a58d9SAndroid Build Coastguard Worker            build_target=self.build_info.build_target,
158*800a58d9SAndroid Build Coastguard Worker            branch=self.build_info.branch,
159*800a58d9SAndroid Build Coastguard Worker            build_id=self.build_info.build_id,
160*800a58d9SAndroid Build Coastguard Worker            emulator_branch=self.emulator_build_info.branch,
161*800a58d9SAndroid Build Coastguard Worker            emulator_build_id=self.emulator_build_info.build_id,
162*800a58d9SAndroid Build Coastguard Worker            emulator_build_target=self.emulator_build_info.build_target,
163*800a58d9SAndroid Build Coastguard Worker            kernel_branch=self.kernel_build_info.branch,
164*800a58d9SAndroid Build Coastguard Worker            kernel_build_id=self.kernel_build_info.build_id,
165*800a58d9SAndroid Build Coastguard Worker            kernel_build_target=self.kernel_build_info.build_target,
166*800a58d9SAndroid Build Coastguard Worker            gpu=self._gpu,
167*800a58d9SAndroid Build Coastguard Worker            blank_data_disk_size_gb=self._blank_data_disk_size_gb,
168*800a58d9SAndroid Build Coastguard Worker            avd_spec=self._avd_spec,
169*800a58d9SAndroid Build Coastguard Worker            tags=self._tags,
170*800a58d9SAndroid Build Coastguard Worker            extra_scopes=self._extra_scopes,
171*800a58d9SAndroid Build Coastguard Worker            launch_args=self._cfg.launch_args)
172*800a58d9SAndroid Build Coastguard Worker
173*800a58d9SAndroid Build Coastguard Worker        return instance
174*800a58d9SAndroid Build Coastguard Worker
175*800a58d9SAndroid Build Coastguard Worker
176*800a58d9SAndroid Build Coastguard Workerdef ParseBuildInfo(filename):
177*800a58d9SAndroid Build Coastguard Worker    """Parse build id based on a substring.
178*800a58d9SAndroid Build Coastguard Worker
179*800a58d9SAndroid Build Coastguard Worker    This will parse a file which contains build information to be used. For an
180*800a58d9SAndroid Build Coastguard Worker    emulator build, the file will contain the information about the
181*800a58d9SAndroid Build Coastguard Worker    corresponding stable system image build id. In emulator-info.txt, the file
182*800a58d9SAndroid Build Coastguard Worker    will contains the information about the corresponding stable emulator
183*800a58d9SAndroid Build Coastguard Worker    build id, for example "require version-emulator=5292001". In
184*800a58d9SAndroid Build Coastguard Worker    android-info.txt, the file will contains the information about a stable
185*800a58d9SAndroid Build Coastguard Worker    system image build id, for example
186*800a58d9SAndroid Build Coastguard Worker    "version-sysimage-git_pi-dev-sdk_gphone_x86_64-userdebug=4833817"
187*800a58d9SAndroid Build Coastguard Worker
188*800a58d9SAndroid Build Coastguard Worker    Args:
189*800a58d9SAndroid Build Coastguard Worker        filename: Name of file to parse.
190*800a58d9SAndroid Build Coastguard Worker
191*800a58d9SAndroid Build Coastguard Worker    Returns:
192*800a58d9SAndroid Build Coastguard Worker        Build id parsed from the file based on pattern
193*800a58d9SAndroid Build Coastguard Worker        Returns None if pattern not found in file
194*800a58d9SAndroid Build Coastguard Worker    """
195*800a58d9SAndroid Build Coastguard Worker    with open(filename) as build_info_file:
196*800a58d9SAndroid Build Coastguard Worker        for line in build_info_file:
197*800a58d9SAndroid Build Coastguard Worker            match = re.search(_VERSION_PATTERN, line)
198*800a58d9SAndroid Build Coastguard Worker            if match:
199*800a58d9SAndroid Build Coastguard Worker                return match.group(1)
200*800a58d9SAndroid Build Coastguard Worker    return None
201*800a58d9SAndroid Build Coastguard Worker
202*800a58d9SAndroid Build Coastguard Worker
203*800a58d9SAndroid Build Coastguard Workerdef _FetchBuildIdFromFile(cfg, build_target, build_id, filename):
204*800a58d9SAndroid Build Coastguard Worker    """Parse and fetch build id from a file based on a pattern.
205*800a58d9SAndroid Build Coastguard Worker
206*800a58d9SAndroid Build Coastguard Worker    Verify if one of the system image or emulator binary build id is missing.
207*800a58d9SAndroid Build Coastguard Worker    If found missing, then update according to the resource file.
208*800a58d9SAndroid Build Coastguard Worker
209*800a58d9SAndroid Build Coastguard Worker    Args:
210*800a58d9SAndroid Build Coastguard Worker        cfg: An AcloudConfig instance.
211*800a58d9SAndroid Build Coastguard Worker        build_target: Target name.
212*800a58d9SAndroid Build Coastguard Worker        build_id: Build id, a string, e.g. "2263051", "P2804227"
213*800a58d9SAndroid Build Coastguard Worker        filename: Name of file containing the build info.
214*800a58d9SAndroid Build Coastguard Worker
215*800a58d9SAndroid Build Coastguard Worker    Returns:
216*800a58d9SAndroid Build Coastguard Worker        A build id or None
217*800a58d9SAndroid Build Coastguard Worker    """
218*800a58d9SAndroid Build Coastguard Worker    build_client = android_build_client.AndroidBuildClient(
219*800a58d9SAndroid Build Coastguard Worker        auth.CreateCredentials(cfg))
220*800a58d9SAndroid Build Coastguard Worker
221*800a58d9SAndroid Build Coastguard Worker    with utils.TempDir() as tempdir:
222*800a58d9SAndroid Build Coastguard Worker        temp_filename = os.path.join(tempdir, filename)
223*800a58d9SAndroid Build Coastguard Worker        build_client.DownloadArtifact(build_target,
224*800a58d9SAndroid Build Coastguard Worker                                      build_id,
225*800a58d9SAndroid Build Coastguard Worker                                      filename,
226*800a58d9SAndroid Build Coastguard Worker                                      temp_filename)
227*800a58d9SAndroid Build Coastguard Worker
228*800a58d9SAndroid Build Coastguard Worker        return ParseBuildInfo(temp_filename)
229*800a58d9SAndroid Build Coastguard Worker
230*800a58d9SAndroid Build Coastguard Worker
231*800a58d9SAndroid Build Coastguard Worker#pylint: disable=too-many-locals
232*800a58d9SAndroid Build Coastguard Workerdef CreateDevices(avd_spec=None,
233*800a58d9SAndroid Build Coastguard Worker                  cfg=None,
234*800a58d9SAndroid Build Coastguard Worker                  build_target=None,
235*800a58d9SAndroid Build Coastguard Worker                  build_id=None,
236*800a58d9SAndroid Build Coastguard Worker                  emulator_build_id=None,
237*800a58d9SAndroid Build Coastguard Worker                  emulator_branch=None,
238*800a58d9SAndroid Build Coastguard Worker                  emulator_build_target=None,
239*800a58d9SAndroid Build Coastguard Worker                  kernel_build_id=None,
240*800a58d9SAndroid Build Coastguard Worker                  kernel_branch=None,
241*800a58d9SAndroid Build Coastguard Worker                  kernel_build_target=None,
242*800a58d9SAndroid Build Coastguard Worker                  gpu=None,
243*800a58d9SAndroid Build Coastguard Worker                  num=1,
244*800a58d9SAndroid Build Coastguard Worker                  serial_log_file=None,
245*800a58d9SAndroid Build Coastguard Worker                  autoconnect=False,
246*800a58d9SAndroid Build Coastguard Worker                  branch=None,
247*800a58d9SAndroid Build Coastguard Worker                  tags=None,
248*800a58d9SAndroid Build Coastguard Worker                  report_internal_ip=False,
249*800a58d9SAndroid Build Coastguard Worker                  boot_timeout_secs=None):
250*800a58d9SAndroid Build Coastguard Worker    """Create one or multiple Goldfish devices.
251*800a58d9SAndroid Build Coastguard Worker
252*800a58d9SAndroid Build Coastguard Worker    Args:
253*800a58d9SAndroid Build Coastguard Worker        avd_spec: An AVDSpec instance.
254*800a58d9SAndroid Build Coastguard Worker        cfg: An AcloudConfig instance.
255*800a58d9SAndroid Build Coastguard Worker        build_target: String, the build target, e.g. aosp_x86-eng.
256*800a58d9SAndroid Build Coastguard Worker        build_id: String, Build id, e.g. "2263051", "P2804227"
257*800a58d9SAndroid Build Coastguard Worker        branch: String, Branch name for system image.
258*800a58d9SAndroid Build Coastguard Worker        emulator_build_id: String, emulator build id.
259*800a58d9SAndroid Build Coastguard Worker        emulator_branch: String, emulator branch name.
260*800a58d9SAndroid Build Coastguard Worker        emulator_build_target: String, emulator build target.
261*800a58d9SAndroid Build Coastguard Worker        gpu: String, GPU to attach to the device or None. e.g. "nvidia-k80"
262*800a58d9SAndroid Build Coastguard Worker        kernel_build_id: Kernel build id, a string.
263*800a58d9SAndroid Build Coastguard Worker        kernel_branch: Kernel branch name, a string.
264*800a58d9SAndroid Build Coastguard Worker        kernel_build_target: Kernel build artifact, a string.
265*800a58d9SAndroid Build Coastguard Worker        num: Integer, Number of devices to create.
266*800a58d9SAndroid Build Coastguard Worker        serial_log_file: String, A path to a file where serial output should
267*800a58d9SAndroid Build Coastguard Worker                        be saved to.
268*800a58d9SAndroid Build Coastguard Worker        autoconnect: Boolean, Create ssh tunnel(s) and adb connect after device
269*800a58d9SAndroid Build Coastguard Worker                     creation.
270*800a58d9SAndroid Build Coastguard Worker        branch: String, Branch name for system image.
271*800a58d9SAndroid Build Coastguard Worker        tags: A list of tags to associate with the instance. e.g.
272*800a58d9SAndroid Build Coastguard Worker              ["http-server", "https-server"]
273*800a58d9SAndroid Build Coastguard Worker        report_internal_ip: Boolean to report the internal ip instead of
274*800a58d9SAndroid Build Coastguard Worker                            external ip.
275*800a58d9SAndroid Build Coastguard Worker        boot_timeout_secs: Integer, the maximum time in seconds used to
276*800a58d9SAndroid Build Coastguard Worker                           wait for the AVD to boot.
277*800a58d9SAndroid Build Coastguard Worker
278*800a58d9SAndroid Build Coastguard Worker    Returns:
279*800a58d9SAndroid Build Coastguard Worker        A Report instance.
280*800a58d9SAndroid Build Coastguard Worker    """
281*800a58d9SAndroid Build Coastguard Worker    client_adb_port = None
282*800a58d9SAndroid Build Coastguard Worker    if avd_spec:
283*800a58d9SAndroid Build Coastguard Worker        cfg = avd_spec.cfg
284*800a58d9SAndroid Build Coastguard Worker        build_target = avd_spec.remote_image[constants.BUILD_TARGET]
285*800a58d9SAndroid Build Coastguard Worker        build_id = avd_spec.remote_image[constants.BUILD_ID]
286*800a58d9SAndroid Build Coastguard Worker        branch = avd_spec.remote_image[constants.BUILD_BRANCH]
287*800a58d9SAndroid Build Coastguard Worker        num = avd_spec.num
288*800a58d9SAndroid Build Coastguard Worker        emulator_build_id = avd_spec.emulator_build_id
289*800a58d9SAndroid Build Coastguard Worker        emulator_build_target = avd_spec.emulator_build_target
290*800a58d9SAndroid Build Coastguard Worker        gpu = avd_spec.gpu
291*800a58d9SAndroid Build Coastguard Worker        serial_log_file = avd_spec.serial_log_file
292*800a58d9SAndroid Build Coastguard Worker        autoconnect = avd_spec.autoconnect
293*800a58d9SAndroid Build Coastguard Worker        report_internal_ip = avd_spec.report_internal_ip
294*800a58d9SAndroid Build Coastguard Worker        client_adb_port = avd_spec.client_adb_port
295*800a58d9SAndroid Build Coastguard Worker        boot_timeout_secs = avd_spec.boot_timeout_secs
296*800a58d9SAndroid Build Coastguard Worker
297*800a58d9SAndroid Build Coastguard Worker    if not emulator_build_target:
298*800a58d9SAndroid Build Coastguard Worker        emulator_build_target = cfg.emulator_build_target
299*800a58d9SAndroid Build Coastguard Worker
300*800a58d9SAndroid Build Coastguard Worker    # If emulator_build_id and emulator_branch is None, retrieve emulator
301*800a58d9SAndroid Build Coastguard Worker    # build id from platform build emulator-info.txt artifact
302*800a58d9SAndroid Build Coastguard Worker    # Example: require version-emulator=5292001
303*800a58d9SAndroid Build Coastguard Worker    if not emulator_build_id and not emulator_branch:
304*800a58d9SAndroid Build Coastguard Worker        logger.info("emulator_build_id not provided. "
305*800a58d9SAndroid Build Coastguard Worker                    "Attempting to get %s from build %s/%s.", _EMULATOR_INFO_FILENAME,
306*800a58d9SAndroid Build Coastguard Worker                    build_id, build_target)
307*800a58d9SAndroid Build Coastguard Worker        emulator_build_id = _FetchBuildIdFromFile(cfg,
308*800a58d9SAndroid Build Coastguard Worker                                                  build_target,
309*800a58d9SAndroid Build Coastguard Worker                                                  build_id,
310*800a58d9SAndroid Build Coastguard Worker                                                  _EMULATOR_INFO_FILENAME)
311*800a58d9SAndroid Build Coastguard Worker
312*800a58d9SAndroid Build Coastguard Worker    if not emulator_build_id:
313*800a58d9SAndroid Build Coastguard Worker        raise errors.CommandArgError("Emulator build id not found "
314*800a58d9SAndroid Build Coastguard Worker                                     "in %s" % _EMULATOR_INFO_FILENAME)
315*800a58d9SAndroid Build Coastguard Worker
316*800a58d9SAndroid Build Coastguard Worker    # If build_id and branch is None, retrieve build_id from
317*800a58d9SAndroid Build Coastguard Worker    # emulator build android-info.txt artifact
318*800a58d9SAndroid Build Coastguard Worker    # Example: version-sysimage-git_pi-dev-sdk_gphone_x86_64-userdebug=4833817
319*800a58d9SAndroid Build Coastguard Worker    if not build_id and not branch:
320*800a58d9SAndroid Build Coastguard Worker        build_id = _FetchBuildIdFromFile(cfg,
321*800a58d9SAndroid Build Coastguard Worker                                         emulator_build_target,
322*800a58d9SAndroid Build Coastguard Worker                                         emulator_build_id,
323*800a58d9SAndroid Build Coastguard Worker                                         _SYSIMAGE_INFO_FILENAME)
324*800a58d9SAndroid Build Coastguard Worker
325*800a58d9SAndroid Build Coastguard Worker    if not build_id:
326*800a58d9SAndroid Build Coastguard Worker        raise errors.CommandArgError("Emulator system image build id not found "
327*800a58d9SAndroid Build Coastguard Worker                                     "in %s" % _SYSIMAGE_INFO_FILENAME)
328*800a58d9SAndroid Build Coastguard Worker    logger.info(
329*800a58d9SAndroid Build Coastguard Worker        "Creating a goldfish device in project %s, build_target: %s, "
330*800a58d9SAndroid Build Coastguard Worker        "build_id: %s, emulator_bid: %s, emulator_branch: %s, kernel_build_id: %s, "
331*800a58d9SAndroid Build Coastguard Worker        "kernel_branch: %s, kernel_build_target: %s, GPU: %s, num: %s, "
332*800a58d9SAndroid Build Coastguard Worker        "serial_log_file: %s, "
333*800a58d9SAndroid Build Coastguard Worker        "autoconnect: %s", cfg.project, build_target, build_id,
334*800a58d9SAndroid Build Coastguard Worker        emulator_build_id, emulator_branch, kernel_build_id, kernel_branch,
335*800a58d9SAndroid Build Coastguard Worker        kernel_build_target, gpu, num, serial_log_file, autoconnect)
336*800a58d9SAndroid Build Coastguard Worker
337*800a58d9SAndroid Build Coastguard Worker    device_factory = GoldfishDeviceFactory(
338*800a58d9SAndroid Build Coastguard Worker        cfg, build_target, build_id,
339*800a58d9SAndroid Build Coastguard Worker        emulator_build_target,
340*800a58d9SAndroid Build Coastguard Worker        emulator_build_id, gpu=gpu,
341*800a58d9SAndroid Build Coastguard Worker        avd_spec=avd_spec, tags=tags,
342*800a58d9SAndroid Build Coastguard Worker        branch=branch,
343*800a58d9SAndroid Build Coastguard Worker        emulator_branch=emulator_branch,
344*800a58d9SAndroid Build Coastguard Worker        kernel_build_id=kernel_build_id,
345*800a58d9SAndroid Build Coastguard Worker        kernel_branch=kernel_branch,
346*800a58d9SAndroid Build Coastguard Worker        kernel_build_target=kernel_build_target)
347*800a58d9SAndroid Build Coastguard Worker
348*800a58d9SAndroid Build Coastguard Worker    return common_operations.CreateDevices("create_gf", cfg, device_factory,
349*800a58d9SAndroid Build Coastguard Worker                                           num, constants.TYPE_GF,
350*800a58d9SAndroid Build Coastguard Worker                                           report_internal_ip, autoconnect,
351*800a58d9SAndroid Build Coastguard Worker                                           serial_log_file, client_adb_port,
352*800a58d9SAndroid Build Coastguard Worker                                           boot_timeout_secs)
353