blob: f8dcf8132b3e9ceed3597625daa2d1f8cfba168c [file] [log] [blame]
Kuang-che Wu875c89a2020-01-08 14:30:55 +08001#!/usr/bin/env python3
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():
Kuang-che Wud2d6e412021-01-28 16:26:41 +080024 parents = [common.common_argument_parser, common.session_optional_parser]
25 parser = argparse.ArgumentParser(description=__doc__, parents=parents)
Kuang-che Wufe1e88a2019-09-10 21:52:25 +080026 cli.patching_argparser_exit(parser)
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080027 parser.add_argument(
Kuang-che Wu0ebbf7c2019-08-28 18:19:19 +080028 '--dut',
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080029 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
Zheng-Jie Chang127c3302019-09-10 17:17:04 +080067 if cros_util.is_cros_snapshot_version(opts.version):
68 image_path = cros_util.prepare_snapshot_image(opts.default_chromeos_root,
69 opts.board, opts.version)
70 else:
71 image_path = cros_util.prepare_prebuilt_image(opts.default_chromeos_root,
72 opts.board, opts.version)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080073
74 if cros_util.cros_flash_with_retry(
75 opts.default_chromeos_root,
76 opts.dut,
77 opts.board,
78 image_path,
79 version=opts.version,
80 clobber_stateful=opts.clobber_stateful,
81 disable_rootfs_verification=opts.disable_rootfs_verification,
Kuang-che Wu2ac9a922020-09-03 16:50:12 +080082 repair_callback=cros_lab_util.repair,
83 force_reboot_callback=cros_lab_util.reboot_via_servo):
Kuang-che Wu414d67f2019-05-28 11:28:57 +080084 return 0
85 return 1
86
87
Kuang-che Wufe1e88a2019-09-10 21:52:25 +080088@cli.fatal_error_handler
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080089def main(args=None):
90 common.init()
91 parser = create_argument_parser()
92 opts = parser.parse_args(args)
93 common.config_logging(opts)
94
Kuang-che Wu44278142019-03-04 11:33:57 +080095 if not cros_util.is_good_dut(opts.dut):
96 logger.error('%r is not a good DUT', opts.dut)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080097 if not cros_lab_util.repair(opts.dut):
Kuang-che Wu0476d1f2019-03-04 19:27:01 +080098 sys.exit(cli.EXIT_CODE_FATAL)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080099 if not opts.board:
100 opts.board = cros_util.query_dut_board(opts.dut)
101
102 try:
103 returncode = switch(opts)
104 except Exception:
105 logger.exception('switch failed')
106 returncode = 1
107
108 # No matter switching succeeded or not, DUT must be in good state.
109 # switch() already tried repairing if possible, no repair here.
110 if not cros_util.is_good_dut(opts.dut):
111 logger.fatal('%r is not a good DUT', opts.dut)
112 returncode = cli.EXIT_CODE_FATAL
113 logger.info('done')
114 sys.exit(returncode)
Kuang-che Wu2ea804f2017-11-28 17:11:41 +0800115
116
117if __name__ == '__main__':
118 main()