blob: 64858eba91998aee12e8cd3e04228d32113c6bae [file] [log] [blame]
Kuang-che Wu2ea804f2017-11-28 17:11:41 +08001#!/usr/bin/env python2
Kuang-che Wu6e4beca2018-06-27 17:45:02 +08002# -*- coding: utf-8 -*-
Kuang-che Wu2ea804f2017-11-28 17:11:41 +08003# Copyright 2017 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6"""Switcher for ChromeOS prebuilt"""
7
8from __future__ import print_function
9import argparse
10import logging
11import os
Kuang-che Wu44278142019-03-04 11:33:57 +080012import sys
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080013
14from bisect_kit import cli
15from bisect_kit import common
16from bisect_kit import configure
Kuang-che Wu414d67f2019-05-28 11:28:57 +080017from bisect_kit import cros_lab_util
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080018from bisect_kit import cros_util
19
20logger = logging.getLogger(__name__)
21
22
23def create_argument_parser():
24 parser = argparse.ArgumentParser(description=__doc__)
25 common.add_common_arguments(parser)
26 parser.add_argument(
27 'dut',
28 nargs='?',
29 type=cli.argtype_notempty,
30 metavar='DUT',
31 default=configure.get('DUT', ''))
32 parser.add_argument(
33 'version',
34 nargs='?',
35 type=cros_util.argtype_cros_version,
36 metavar='CROS_VERSION',
37 default=configure.get('CROS_VERSION', ''),
38 help='ChromeOS version number, short (10162.0.0) or full (R64-10162.0.0)')
39 parser.add_argument(
40 '--board',
41 metavar='BOARD',
42 default=configure.get('BOARD', ''),
43 help='ChromeOS board name')
44 parser.add_argument(
45 '--clobber-stateful',
Kuang-che Wu86fbde52019-01-18 15:41:00 +080046 '--clobber_stateful',
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080047 action='store_true',
48 help='Clobber stateful partition when performing update')
49 parser.add_argument(
50 '--no-disable-rootfs-verification',
Kuang-che Wu86fbde52019-01-18 15:41:00 +080051 '--no_disable_rootfs_verification',
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080052 dest='disable_rootfs_verification',
53 action='store_false',
54 help="Don't disable rootfs verification after update is completed")
55 parser.add_argument(
56 '--default_chromeos_root',
57 type=cli.argtype_dir_path,
58 default=configure.get('DEFAULT_CHROMEOS_ROOT',
Kuang-che Wu927231f2018-07-24 14:21:56 +080059 os.path.expanduser('~/chromiumos')),
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080060 help='Default chromeos tree to run "cros flash" (default: %(default)s)')
61
62 return parser
63
64
Kuang-che Wu414d67f2019-05-28 11:28:57 +080065def switch(opts):
66 # TODO(kcwu): clear cache of cros flash
67 image_path = cros_util.prepare_prebuilt_image(opts.board, opts.version)
68
69 if cros_util.cros_flash_with_retry(
70 opts.default_chromeos_root,
71 opts.dut,
72 opts.board,
73 image_path,
74 version=opts.version,
75 clobber_stateful=opts.clobber_stateful,
76 disable_rootfs_verification=opts.disable_rootfs_verification,
77 repair_callback=cros_lab_util.repair):
78 return 0
79 return 1
80
81
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080082def main(args=None):
83 common.init()
84 parser = create_argument_parser()
85 opts = parser.parse_args(args)
86 common.config_logging(opts)
87
Kuang-che Wu44278142019-03-04 11:33:57 +080088 if not cros_util.is_good_dut(opts.dut):
89 logger.error('%r is not a good DUT', opts.dut)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080090 if not cros_lab_util.repair(opts.dut):
Kuang-che Wu0476d1f2019-03-04 19:27:01 +080091 sys.exit(cli.EXIT_CODE_FATAL)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080092 if not opts.board:
93 opts.board = cros_util.query_dut_board(opts.dut)
94
95 try:
96 returncode = switch(opts)
97 except Exception:
98 logger.exception('switch failed')
99 returncode = 1
100
101 # No matter switching succeeded or not, DUT must be in good state.
102 # switch() already tried repairing if possible, no repair here.
103 if not cros_util.is_good_dut(opts.dut):
104 logger.fatal('%r is not a good DUT', opts.dut)
105 returncode = cli.EXIT_CODE_FATAL
106 logger.info('done')
107 sys.exit(returncode)
Kuang-che Wu2ea804f2017-11-28 17:11:41 +0800108
109
110if __name__ == '__main__':
111 main()