1cef7893435aa41160dd1255c43cb8498279738ccChris Craik#!/usr/bin/env python
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2015 The Chromium Authors. All rights reserved.
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
5cef7893435aa41160dd1255c43cb8498279738ccChris Craik
6cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport argparse
7cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport logging
8cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os
9cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport sys
10cef7893435aa41160dd1255c43cb8498279738ccChris Craik
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikif __name__ == '__main__':
12cef7893435aa41160dd1255c43cb8498279738ccChris Craik  sys.path.append(os.path.abspath(os.path.join(
13cef7893435aa41160dd1255c43cb8498279738ccChris Craik      os.path.dirname(__file__), '..', '..', '..')))
14cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import device_blacklist
15cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import device_utils
16cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import fastboot_utils
17cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android.tools import script_common
18cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.constants import exit_codes
19cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.utils import run_tests_helper
20cef7893435aa41160dd1255c43cb8498279738ccChris Craik
21ee838d1c4002134ff5af32da272140586c4d31deJohn Recklogger = logging.getLogger(__name__)
22ee838d1c4002134ff5af32da272140586c4d31deJohn Reck
23cef7893435aa41160dd1255c43cb8498279738ccChris Craik
24cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef main():
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser = argparse.ArgumentParser()
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser.add_argument('build_path', help='Path to android build.')
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser.add_argument('-d', '--device', dest='devices', action='append',
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      help='Device(s) to flash.')
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser.add_argument('-v', '--verbose', default=0, action='count',
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik                      help='Verbose level (multiple times for more)')
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser.add_argument('-w', '--wipe', action='store_true',
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik                       help='If set, wipes user data')
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik  parser.add_argument('--blacklist-file', help='Device blacklist file.')
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik  args = parser.parse_args()
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik  run_tests_helper.SetLogLevel(args.verbose)
36cef7893435aa41160dd1255c43cb8498279738ccChris Craik
37cef7893435aa41160dd1255c43cb8498279738ccChris Craik  if args.blacklist_file:
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik    blacklist = device_blacklist.Blacklist(args.blacklist_file).Read()
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if blacklist:
40ee838d1c4002134ff5af32da272140586c4d31deJohn Reck      logger.critical('Device(s) in blacklist, not flashing devices:')
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik      for key in blacklist:
42ee838d1c4002134ff5af32da272140586c4d31deJohn Reck        logger.critical('  %s', key)
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik      return exit_codes.INFRA
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik  flashed_devices = []
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik  failed_devices = []
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def flash(device):
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik    fastboot = fastboot_utils.FastbootUtils(device)
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik    try:
51cef7893435aa41160dd1255c43cb8498279738ccChris Craik      fastboot.FlashDevice(args.build_path, wipe=args.wipe)
52cef7893435aa41160dd1255c43cb8498279738ccChris Craik      flashed_devices.append(device)
53cef7893435aa41160dd1255c43cb8498279738ccChris Craik    except Exception:  # pylint: disable=broad-except
54ee838d1c4002134ff5af32da272140586c4d31deJohn Reck      logger.exception('Device %s failed to flash.', str(device))
55cef7893435aa41160dd1255c43cb8498279738ccChris Craik      failed_devices.append(device)
56cef7893435aa41160dd1255c43cb8498279738ccChris Craik
57cef7893435aa41160dd1255c43cb8498279738ccChris Craik  devices = script_common.GetDevices(args.devices, args.blacklist_file)
58cef7893435aa41160dd1255c43cb8498279738ccChris Craik  device_utils.DeviceUtils.parallel(devices).pMap(flash)
59cef7893435aa41160dd1255c43cb8498279738ccChris Craik
60cef7893435aa41160dd1255c43cb8498279738ccChris Craik  if flashed_devices:
61ee838d1c4002134ff5af32da272140586c4d31deJohn Reck    logger.info('The following devices were flashed:')
62ee838d1c4002134ff5af32da272140586c4d31deJohn Reck    logger.info('  %s', ' '.join(str(d) for d in flashed_devices))
63cef7893435aa41160dd1255c43cb8498279738ccChris Craik  if failed_devices:
64ee838d1c4002134ff5af32da272140586c4d31deJohn Reck    logger.critical('The following devices failed to flash:')
65ee838d1c4002134ff5af32da272140586c4d31deJohn Reck    logger.critical('  %s', ' '.join(str(d) for d in failed_devices))
66cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return exit_codes.INFRA
67cef7893435aa41160dd1255c43cb8498279738ccChris Craik  return 0
68cef7893435aa41160dd1255c43cb8498279738ccChris Craik
69cef7893435aa41160dd1255c43cb8498279738ccChris Craikif __name__ == '__main__':
70cef7893435aa41160dd1255c43cb8498279738ccChris Craik  sys.exit(main())
71