blob: c30837f087c6dbbd1ab74baeb1891b76fe4b9ba7 [file] [log] [blame]
Keun Soo Yimb293fdb2016-09-21 16:03:44 -07001#!/usr/bin/env python
2#
3# Copyright 2016 - The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Sam Chiu42ac7c52018-10-22 12:27:34 +080016r"""
17Welcome to
18 ___ _______ ____ __ _____
19 / _ |/ ___/ / / __ \/ / / / _ \
20 / __ / /__/ /__/ /_/ / /_/ / // /
21/_/ |_\___/____/\____/\____/____/
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070022
Sam Chiu42ac7c52018-10-22 12:27:34 +080023
24This a tool to create Android Virtual Devices locally/remotely.
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070025
26- Prerequisites:
Sam Chiu42ac7c52018-10-22 12:27:34 +080027 The manual will be available at
28 https://android.googlesource.com/platform/tools/acloud/+/master/README.md
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070029
Sam Chiu42ac7c52018-10-22 12:27:34 +080030- To get started:
31 - Create instances:
32 1) To create a remote cuttlefish instance with the local built image.
33 Example:
chojoyce1c4ecc92018-12-06 14:16:44 +080034 $ acloud create --local-image
35 Or specify built image dir:
36 $ acloud create --local-image /tmp/image_dir
Sam Chiu42ac7c52018-10-22 12:27:34 +080037 2) To create a local cuttlefish instance using the image which has been
38 built out in your workspace.
39 Example:
40 $ acloud create --local-instance --local-image
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070041
Sam Chiu42ac7c52018-10-22 12:27:34 +080042 - Delete instances:
43 $ acloud delete
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070044
Sam Chiu42ac7c52018-10-22 12:27:34 +080045Try $acloud [cmd] --help for further details.
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070046
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070047"""
Kevin Cheng1ea015f2019-01-08 09:10:58 -080048
49from __future__ import print_function
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070050import argparse
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070051import logging
Kevin Cheng1ea015f2019-01-08 09:10:58 -080052import platform
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070053import sys
Sam Chiue791f602019-05-03 15:18:10 +080054import traceback
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070055
Kevin Cheng1ea015f2019-01-08 09:10:58 -080056# TODO: Remove this once we switch over to embedded launcher.
57# Exit out if python version is < 2.7.13 due to b/120883119.
58if (sys.version_info.major == 2
59 and sys.version_info.minor == 7
60 and sys.version_info.micro < 13):
61 print("Acloud requires python version 2.7.13+ (currently @ %d.%d.%d)" %
62 (sys.version_info.major, sys.version_info.minor,
63 sys.version_info.micro))
64 print("Update your 2.7 python with:")
65 # pylint: disable=invalid-name
66 os_type = platform.system().lower()
67 if os_type == "linux":
68 print(" apt-get install python2.7")
69 elif os_type == "darwin":
70 print(" brew install python@2 (and then follow instructions at "
71 "https://docs.python-guide.org/starting/install/osx/)")
72 print(" - or -")
73 print(" POSIXLY_CORRECT=1 port -N install python27")
74 sys.exit(1)
75
Sam Chiue791f602019-05-03 15:18:10 +080076# By Default silence root logger's stream handler since 3p lib may initial
77# root logger no matter what level we're using. The acloud logger behavior will
78# be defined in _SetupLogging(). This also could workaround to get rid of below
79# oauth2client warning:
Sam Chiu29d858f2018-08-14 20:06:25 +080080# 'No handlers could be found for logger "oauth2client.contrib.multistore_file'
Sam Chiue791f602019-05-03 15:18:10 +080081DEFAULT_STREAM_HANDLER = logging.StreamHandler()
82DEFAULT_STREAM_HANDLER.setLevel(logging.CRITICAL)
83logging.getLogger().addHandler(DEFAULT_STREAM_HANDLER)
Kevin Chengb5963882018-05-09 00:06:27 -070084
Kevin Chengf4137c62018-05-22 16:06:58 -070085# pylint: disable=wrong-import-position
Sam Chiu7de3b232018-12-06 19:45:52 +080086from acloud import errors
Kevin Cheng6001db32018-10-23 12:34:20 -070087from acloud.create import create
88from acloud.create import create_args
89from acloud.delete import delete
90from acloud.delete import delete_args
Sam Chiue791f602019-05-03 15:18:10 +080091from acloud.internal import constants
cylan4569dca2018-11-02 12:12:53 +080092from acloud.reconnect import reconnect
93from acloud.reconnect import reconnect_args
Sam Chiu56c58892018-10-25 09:53:19 +080094from acloud.list import list as list_instances
95from acloud.list import list_args
Kevin Cheng6001db32018-10-23 12:34:20 -070096from acloud.metrics import metrics
Keun Soo Yimb293fdb2016-09-21 16:03:44 -070097from acloud.public import acloud_common
98from acloud.public import config
99from acloud.public import device_driver
Kevin Chengb5963882018-05-09 00:06:27 -0700100from acloud.public.actions import create_cuttlefish_action
101from acloud.public.actions import create_goldfish_action
Kevin Chengee6030f2018-06-26 10:55:30 -0700102from acloud.setup import setup
103from acloud.setup import setup_args
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700104
Sam Chiu445941f2018-10-04 11:54:40 +0800105LOGGING_FMT = "%(asctime)s |%(levelname)s| %(module)s:%(lineno)s| %(message)s"
Sam Chiu29d858f2018-08-14 20:06:25 +0800106ACLOUD_LOGGER = "acloud"
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700107
108# Commands
Kevin Chengb5963882018-05-09 00:06:27 -0700109CMD_CREATE_CUTTLEFISH = "create_cf"
110CMD_CREATE_GOLDFISH = "create_gf"
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700111CMD_CLEANUP = "cleanup"
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700112
113
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700114# pylint: disable=too-many-statements
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700115def _ParseArgs(args):
116 """Parse args.
117
118 Args:
119 args: Argument list passed from main.
120
121 Returns:
122 Parsed args.
123 """
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700124 usage = ",".join([
Sam Chiue669ef72018-10-16 16:23:37 +0800125 setup_args.CMD_SETUP,
126 create_args.CMD_CREATE,
Sam Chiu56c58892018-10-25 09:53:19 +0800127 list_args.CMD_LIST,
Kevin Chengeb85e862018-10-09 15:35:13 -0700128 delete_args.CMD_DELETE,
cylan4569dca2018-11-02 12:12:53 +0800129 reconnect_args.CMD_RECONNECT,
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700130 ])
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700131 parser = argparse.ArgumentParser(
132 description=__doc__,
133 formatter_class=argparse.RawDescriptionHelpFormatter,
Sam Chiu42ac7c52018-10-22 12:27:34 +0800134 usage="acloud {" + usage + "} ...")
Kevin Cheng6bd8d132019-02-25 23:00:38 -0800135 subparsers = parser.add_subparsers(metavar="{" + usage + "}")
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700136 subparser_list = []
137
Kevin Chengb5963882018-05-09 00:06:27 -0700138 # Command "create_cf", create cuttlefish instances
139 create_cf_parser = subparsers.add_parser(CMD_CREATE_CUTTLEFISH)
140 create_cf_parser.required = False
141 create_cf_parser.set_defaults(which=CMD_CREATE_CUTTLEFISH)
142 create_cf_parser.add_argument(
Kevin Chengb5963882018-05-09 00:06:27 -0700143 "--branch",
144 type=str,
145 dest="branch",
146 help="Android branch, e.g. git_master")
147 create_cf_parser.add_argument(
Kevin Chengb5963882018-05-09 00:06:27 -0700148 "--kernel_build_id",
Kevin Chengcf5bbf52019-05-09 16:17:08 -0700149 "--kernel-build-id",
Kevin Chengb5963882018-05-09 00:06:27 -0700150 type=str,
151 dest="kernel_build_id",
152 required=False,
153 help="Android kernel build id, e.g. 4586590. This is to test a new"
Kevin Chengcf5bbf52019-05-09 16:17:08 -0700154 " kernel build with a particular Android build (--build_id). If neither"
155 " kernel_branch nor kernel_build_id are specified, the kernel that's"
156 " bundled with the Android build would be used.")
157 create_cf_parser.add_argument(
158 "--kernel_branch",
159 "--kernel-branch",
160 type=str,
161 dest="kernel_branch",
162 required=False,
163 help="Android kernel build branch name, e.g."
164 " kernel-common-android-4.14. This is to test a new kernel build with a"
165 " particular Android build (--build-id). If specified without"
166 " specifying kernel_build_id, the last green build in the branch will"
167 " be used. If neither kernel_branch nor kernel_build_id are specified,"
168 " the kernel that's bundled with the Android build would be used.")
Kevin Cheng4eeb9d42019-06-05 10:17:18 -0700169 create_cf_parser.add_argument(
170 "--system_branch",
171 type=str,
172 dest="system_branch",
173 help="Branch to consume the system image (system.img) from, will "
174 "default to what is defined by --branch. "
175 "That feature allows to (automatically) test various combinations "
176 "of vendor.img (CF, e.g.) and system images (GSI, e.g.). ",
177 required=False)
178 create_cf_parser.add_argument(
179 "--system_build_id",
180 type=str,
181 dest="system_build_id",
182 help="System image build id, e.g. 2145099, P2804227",
183 required=False)
184 create_cf_parser.add_argument(
185 "--system_build_target",
186 type=str,
187 dest="system_build_target",
188 help="System image build target, specify if different from "
189 "--build_target",
190 required=False)
Kevin Chengb5963882018-05-09 00:06:27 -0700191
Kevin Cheng3087af52018-08-13 13:26:50 -0700192 create_args.AddCommonCreateArgs(create_cf_parser)
Kevin Chengb5963882018-05-09 00:06:27 -0700193 subparser_list.append(create_cf_parser)
194
195 # Command "create_gf", create goldfish instances
196 # In order to create a goldfish device we need the following parameters:
197 # 1. The emulator build we wish to use, this is the binary that emulates
198 # an android device. See go/emu-dev for more
199 # 2. A system-image. This is the android release we wish to run on the
200 # emulated hardware.
201 create_gf_parser = subparsers.add_parser(CMD_CREATE_GOLDFISH)
202 create_gf_parser.required = False
203 create_gf_parser.set_defaults(which=CMD_CREATE_GOLDFISH)
204 create_gf_parser.add_argument(
Kevin Chengb5963882018-05-09 00:06:27 -0700205 "--branch",
206 type=str,
207 dest="branch",
208 help="Android branch, e.g. git_master")
209 create_gf_parser.add_argument(
Kevin Chengb5963882018-05-09 00:06:27 -0700210 "--emulator_build_id",
211 type=str,
212 dest="emulator_build_id",
213 required=False,
214 help="Emulator build used to run the images. e.g. 4669466.")
215 create_gf_parser.add_argument(
Kevin Cheng85187b72019-06-04 15:38:45 -0700216 "--emulator_branch",
217 type=str,
218 dest="emulator_branch",
219 required=False,
220 help="Emulator build branch name, e.g. aosp-emu-master-dev. If specified"
221 " without emulator_build_id, the last green build will be used.")
222 create_gf_parser.add_argument(
Kevin Chengb5963882018-05-09 00:06:27 -0700223 "--gpu",
224 type=str,
225 dest="gpu",
226 required=False,
227 default=None,
228 help="GPU accelerator to use if any."
229 " e.g. nvidia-tesla-k80, omit to use swiftshader")
230 create_gf_parser.add_argument(
Kevin Chengbced4af2018-06-26 10:35:01 -0700231 "--base_image",
232 type=str,
233 dest="base_image",
234 required=False,
235 help="Name of the goldfish base image to be used to create the instance. "
236 "This will override stable_goldfish_host_image_name from config. "
237 "e.g. emu-dev-cts-061118")
Erwin Jansenf39798d2019-05-14 21:06:44 -0700238 create_gf_parser.add_argument(
239 "--tags",
240 dest="tags",
241 nargs="*",
242 required=False,
243 default=None,
244 help="Tags to be set on to the created instance. e.g. https-server.")
Kevin Cheng7be06d62019-06-14 16:00:15 -0700245 create_gf_parser.add_argument(
246 "--kernel_build_id",
247 type=str,
248 dest="kernel_build_id",
249 help="Android kernel build id, e.g. 4586590. This is to test a new"
250 " kernel build with a particular Android build (--build_id). If neither"
251 " kernel_branch nor kernel_build_id are specified, the kernel that's"
252 " bundled with the Android build would be used.")
253 create_gf_parser.add_argument(
254 "--kernel_branch",
255 type=str,
256 dest="kernel_branch",
257 help="Android kernel build branch name, "
258 "e.g. kernel-common-android-4.14. This is to test a new kernel build "
259 "with a particular Android build (--build_id). If specified without "
260 "specifying kernel_build_id, the last green build in the branch will "
261 "be used. If neither kernel_branch nor kernel_build_id are specified, "
262 "the kernel that's bundled with the Android build would be used.")
Kevin Chengb5963882018-05-09 00:06:27 -0700263
Kevin Cheng3087af52018-08-13 13:26:50 -0700264 create_args.AddCommonCreateArgs(create_gf_parser)
Kevin Chengb5963882018-05-09 00:06:27 -0700265 subparser_list.append(create_gf_parser)
266
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700267 # Command "cleanup"
268 cleanup_parser = subparsers.add_parser(CMD_CLEANUP)
269 cleanup_parser.required = False
270 cleanup_parser.set_defaults(which=CMD_CLEANUP)
271 cleanup_parser.add_argument(
272 "--expiration_mins",
273 type=int,
274 dest="expiration_mins",
275 required=True,
276 help="Garbage collect all gce instances, gce images, cached disk "
277 "images that are older than |expiration_mins|.")
278 subparser_list.append(cleanup_parser)
279
Kevin Chengeb85e862018-10-09 15:35:13 -0700280 # Command "create"
281 subparser_list.append(create_args.GetCreateArgParser(subparsers))
282
Kevin Chengee6030f2018-06-26 10:55:30 -0700283 # Command "setup"
284 subparser_list.append(setup_args.GetSetupArgParser(subparsers))
285
Sam Chiu56c58892018-10-25 09:53:19 +0800286 # Command "delete"
Kevin Chengeb85e862018-10-09 15:35:13 -0700287 subparser_list.append(delete_args.GetDeleteArgParser(subparsers))
288
Sam Chiu56c58892018-10-25 09:53:19 +0800289 # Command "list"
290 subparser_list.append(list_args.GetListArgParser(subparsers))
291
cylan4569dca2018-11-02 12:12:53 +0800292 # Command "Reconnect"
293 subparser_list.append(reconnect_args.GetReconnectArgParser(subparsers))
294
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700295 # Add common arguments.
Kevin Chengb21d7712018-05-24 14:54:55 -0700296 for subparser in subparser_list:
297 acloud_common.AddCommonArguments(subparser)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700298
299 return parser.parse_args(args)
300
301
herbertxue2625b042018-08-16 23:28:20 +0800302# pylint: disable=too-many-branches
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700303def _VerifyArgs(parsed_args):
304 """Verify args.
305
306 Args:
307 parsed_args: Parsed args.
308
309 Raises:
310 errors.CommandArgError: If args are invalid.
311 """
herbertxue2625b042018-08-16 23:28:20 +0800312 if parsed_args.which == create_args.CMD_CREATE:
313 create_args.VerifyArgs(parsed_args)
Kevin Cheng84d3eed2018-08-16 15:16:00 -0700314 if parsed_args.which == CMD_CREATE_CUTTLEFISH:
Kevin Chengb5963882018-05-09 00:06:27 -0700315 if not parsed_args.build_id or not parsed_args.build_target:
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700316 raise errors.CommandArgError(
317 "Must specify --build_id and --build_target")
Kevin Chengb5963882018-05-09 00:06:27 -0700318 if parsed_args.which == CMD_CREATE_GOLDFISH:
Kevin Cheng85187b72019-06-04 15:38:45 -0700319 if not parsed_args.emulator_build_id and not parsed_args.build_id and (
320 not parsed_args.emulator_branch and not parsed_args.branch):
321 raise errors.CommandArgError(
322 "Must specify either --build_id or --branch or "
323 "--emulator_branch or --emulator_build_id")
Kevin Cheng84d3eed2018-08-16 15:16:00 -0700324 if not parsed_args.build_target:
325 raise errors.CommandArgError("Must specify --build_target")
Kevin Chengb5963882018-05-09 00:06:27 -0700326
327 if parsed_args.which in [
Kevin Cheng3087af52018-08-13 13:26:50 -0700328 create_args.CMD_CREATE, CMD_CREATE_CUTTLEFISH, CMD_CREATE_GOLDFISH
Kevin Chengb5963882018-05-09 00:06:27 -0700329 ]:
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700330 if (parsed_args.serial_log_file
331 and not parsed_args.serial_log_file.endswith(".tar.gz")):
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700332 raise errors.CommandArgError(
333 "--serial_log_file must ends with .tar.gz")
Kevin Cheng3031f8a2018-05-16 13:21:51 -0700334 if (parsed_args.logcat_file
335 and not parsed_args.logcat_file.endswith(".tar.gz")):
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700336 raise errors.CommandArgError(
337 "--logcat_file must ends with .tar.gz")
338
339
Sam Chiu29d858f2018-08-14 20:06:25 +0800340def _SetupLogging(log_file, verbose):
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700341 """Setup logging.
342
Sam Chiu29d858f2018-08-14 20:06:25 +0800343 This function define the logging policy in below manners.
344 - without -v , -vv ,--log_file:
345 Only display critical log and print() message on screen.
346
347 - with -v:
348 Display INFO log and set StreamHandler to acloud parent logger to turn on
349 ONLY acloud modules logging.(silence all 3p libraries)
350
351 - with -vv:
352 Display INFO/DEBUG log and set StreamHandler to root logger to turn on all
353 acloud modules and 3p libraries logging.
354
355 - with --log_file.
356 Dump logs to FileHandler with DEBUG level.
357
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700358 Args:
Sam Chiu29d858f2018-08-14 20:06:25 +0800359 log_file: String, if not None, dump the log to log file.
360 verbose: Int, if verbose = 1(-v), log at INFO level and turn on
361 logging on libraries to a StreamHandler.
362 If verbose = 2(-vv), log at DEBUG level and turn on logging on
363 all libraries and 3rd party libraries to a StreamHandler.
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700364 """
Sam Chiu29d858f2018-08-14 20:06:25 +0800365 # Define logging level and hierarchy by verbosity.
366 shandler_level = None
367 logger = None
368 if verbose == 0:
369 shandler_level = logging.CRITICAL
370 logger = logging.getLogger(ACLOUD_LOGGER)
371 elif verbose == 1:
372 shandler_level = logging.INFO
373 logger = logging.getLogger(ACLOUD_LOGGER)
374 elif verbose > 1:
375 shandler_level = logging.DEBUG
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700376 logger = logging.getLogger()
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700377
Sam Chiu29d858f2018-08-14 20:06:25 +0800378 # Add StreamHandler by default.
379 shandler = logging.StreamHandler()
380 shandler.setFormatter(logging.Formatter(LOGGING_FMT))
381 shandler.setLevel(shandler_level)
382 logger.addHandler(shandler)
383 # Set the default level to DEBUG, the other handlers will handle
384 # their own levels via the args supplied (-v and --log_file).
385 logger.setLevel(logging.DEBUG)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700386
Sam Chiu29d858f2018-08-14 20:06:25 +0800387 # Add FileHandler if log_file is provided.
Sam Chiufde41e92018-08-07 18:37:02 +0800388 if log_file:
Sam Chiu29d858f2018-08-14 20:06:25 +0800389 fhandler = logging.FileHandler(filename=log_file)
390 fhandler.setFormatter(logging.Formatter(LOGGING_FMT))
391 fhandler.setLevel(logging.DEBUG)
392 logger.addHandler(fhandler)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700393
394
Erwin Jansen95559242018-11-08 15:38:18 -0800395def main(argv=None):
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700396 """Main entry.
397
398 Args:
399 argv: A list of system arguments.
400
401 Returns:
402 0 if success. None-zero if fails.
403 """
Erwin Jansen95559242018-11-08 15:38:18 -0800404 if argv is None:
405 argv = sys.argv[1:]
406
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700407 args = _ParseArgs(argv)
Sam Chiu29d858f2018-08-14 20:06:25 +0800408 _SetupLogging(args.log_file, args.verbose)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700409 _VerifyArgs(args)
410
Sam Chiuc64f3432018-08-17 11:19:06 +0800411 cfg = config.GetAcloudConfig(args)
Kevin Cheng3087af52018-08-13 13:26:50 -0700412 # TODO: Move this check into the functions it is actually needed.
Fang Dengcef4b112017-03-02 11:20:17 -0800413 # Check access.
Kevin Cheng3087af52018-08-13 13:26:50 -0700414 # device_driver.CheckAccess(cfg)
Fang Dengcef4b112017-03-02 11:20:17 -0800415
Kevin Chengee6030f2018-06-26 10:55:30 -0700416 report = None
chojoyce7a361732018-11-26 16:26:13 +0800417 if args.which == create_args.CMD_CREATE:
Kevin Chengc3d0d5e2018-08-14 14:22:44 -0700418 create.Run(args)
Kevin Chengb5963882018-05-09 00:06:27 -0700419 elif args.which == CMD_CREATE_CUTTLEFISH:
420 report = create_cuttlefish_action.CreateDevices(
421 cfg=cfg,
422 build_target=args.build_target,
423 build_id=args.build_id,
Kevin Cheng81d43952019-06-07 11:37:45 -0700424 branch=args.branch,
Kevin Chengb5963882018-05-09 00:06:27 -0700425 kernel_build_id=args.kernel_build_id,
Kevin Chengcf5bbf52019-05-09 16:17:08 -0700426 kernel_branch=args.kernel_branch,
Kevin Cheng4eeb9d42019-06-05 10:17:18 -0700427 system_branch=args.system_branch,
428 system_build_id=args.system_build_id,
429 system_build_target=args.system_build_target,
Kevin Chengb5963882018-05-09 00:06:27 -0700430 num=args.num,
431 serial_log_file=args.serial_log_file,
432 logcat_file=args.logcat_file,
Kevin Cheng86d43c72018-08-30 10:59:14 -0700433 autoconnect=args.autoconnect,
434 report_internal_ip=args.report_internal_ip)
Kevin Chengb5963882018-05-09 00:06:27 -0700435 elif args.which == CMD_CREATE_GOLDFISH:
436 report = create_goldfish_action.CreateDevices(
437 cfg=cfg,
438 build_target=args.build_target,
439 build_id=args.build_id,
440 emulator_build_id=args.emulator_build_id,
Kevin Cheng85187b72019-06-04 15:38:45 -0700441 branch=args.branch,
442 emulator_branch=args.emulator_branch,
Kevin Cheng7be06d62019-06-14 16:00:15 -0700443 kernel_build_id=args.kernel_build_id,
444 kernel_branch=args.kernel_branch,
Kevin Chengb5963882018-05-09 00:06:27 -0700445 gpu=args.gpu,
446 num=args.num,
447 serial_log_file=args.serial_log_file,
448 logcat_file=args.logcat_file,
Kevin Cheng84d3eed2018-08-16 15:16:00 -0700449 autoconnect=args.autoconnect,
Erwin Jansenf39798d2019-05-14 21:06:44 -0700450 tags=args.tags,
Kevin Cheng86d43c72018-08-30 10:59:14 -0700451 report_internal_ip=args.report_internal_ip)
Sam Chiu56c58892018-10-25 09:53:19 +0800452 elif args.which == delete_args.CMD_DELETE:
Kevin Chengeb85e862018-10-09 15:35:13 -0700453 report = delete.Run(args)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700454 elif args.which == CMD_CLEANUP:
455 report = device_driver.Cleanup(cfg, args.expiration_mins)
Sam Chiu56c58892018-10-25 09:53:19 +0800456 elif args.which == list_args.CMD_LIST:
457 list_instances.Run(args)
cylan4569dca2018-11-02 12:12:53 +0800458 elif args.which == reconnect_args.CMD_RECONNECT:
459 reconnect.Run(args)
Kevin Chengee6030f2018-06-26 10:55:30 -0700460 elif args.which == setup_args.CMD_SETUP:
herbertxue34776bb2018-07-03 21:57:48 +0800461 setup.Run(args)
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700462 else:
463 sys.stderr.write("Invalid command %s" % args.which)
464 return 2
465
herbertxue07293a32018-11-05 20:40:11 +0800466 if report and args.report_file:
Kevin Chengee6030f2018-06-26 10:55:30 -0700467 report.Dump(args.report_file)
468 if report.errors:
469 msg = "\n".join(report.errors)
470 sys.stderr.write("Encountered the following errors:\n%s\n" % msg)
471 return 1
Keun Soo Yimb293fdb2016-09-21 16:03:44 -0700472 return 0
Tri Vo8e292532016-10-01 16:55:51 -0700473
474
475if __name__ == "__main__":
Sam Chiue791f602019-05-03 15:18:10 +0800476 EXIT_CODE = None
477 EXCEPTION_STACKTRACE = None
478 EXCEPTION_LOG = None
479 metrics.LogUsage(sys.argv[1:])
480 try:
481 EXIT_CODE = main(sys.argv[1:])
482 except Exception as e:
483 EXIT_CODE = constants.EXIT_BY_ERROR
484 EXCEPTION_STACKTRACE = traceback.format_exc()
485 EXCEPTION_LOG = str(e)
486 raise
487 finally:
488 # Log Exit event here to calculate the consuming time.
489 metrics.LogExitEvent(EXIT_CODE,
490 stacktrace=EXCEPTION_STACKTRACE,
491 logs=EXCEPTION_LOG)