blob: 478c4c2b4b79d858f84d770eaf898d3c4830ceee [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
Kuang-che Wu28980b22019-07-31 19:51:45 +080067 image_path = cros_util.prepare_prebuilt_image(opts.default_chromeos_root,
68 opts.board, opts.version)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080069
70 if cros_util.cros_flash_with_retry(
71 opts.default_chromeos_root,
72 opts.dut,
73 opts.board,
74 image_path,
75 version=opts.version,
76 clobber_stateful=opts.clobber_stateful,
77 disable_rootfs_verification=opts.disable_rootfs_verification,
78 repair_callback=cros_lab_util.repair):
79 return 0
80 return 1
81
82
Kuang-che Wu2ea804f2017-11-28 17:11:41 +080083def main(args=None):
84 common.init()
85 parser = create_argument_parser()
86 opts = parser.parse_args(args)
87 common.config_logging(opts)
88
Kuang-che Wu44278142019-03-04 11:33:57 +080089 if not cros_util.is_good_dut(opts.dut):
90 logger.error('%r is not a good DUT', opts.dut)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080091 if not cros_lab_util.repair(opts.dut):
Kuang-che Wu0476d1f2019-03-04 19:27:01 +080092 sys.exit(cli.EXIT_CODE_FATAL)
Kuang-che Wu414d67f2019-05-28 11:28:57 +080093 if not opts.board:
94 opts.board = cros_util.query_dut_board(opts.dut)
95
96 try:
97 returncode = switch(opts)
98 except Exception:
99 logger.exception('switch failed')
100 returncode = 1
101
102 # No matter switching succeeded or not, DUT must be in good state.
103 # switch() already tried repairing if possible, no repair here.
104 if not cros_util.is_good_dut(opts.dut):
105 logger.fatal('%r is not a good DUT', opts.dut)
106 returncode = cli.EXIT_CODE_FATAL
107 logger.info('done')
108 sys.exit(returncode)
Kuang-che Wu2ea804f2017-11-28 17:11:41 +0800109
110
111if __name__ == '__main__':
112 main()