| #!/usr/bin/env python2 |
| # Copyright 2015 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Main routine for the `deploy` command line tool. |
| |
| # Purpose |
| This command automates key steps for several use cases relating to DUTs |
| in the Autotest Test Lab: |
| * Deploying a DUT+Servo assembly with a DUT that is fresh from the |
| factory. |
| * Redeploying an existing DUT+Servo assembly to a new location. |
| * Manually repairing a DUT+Servo assembly that has failed automated |
| repair. |
| |
| # Syntax |
| |
| deploy <subcommand> [options] [HOSTNAME ...] |
| |
| ## Available subcommands: |
| servo: Validate that the servo is in working order, and then install |
| the repair image for the target DUTs on the servo's USB stick. |
| firmware: Install dev-signed RO+RW firmware on the target DUTs, and |
| then install the image from the servo USB stick to the target |
| DUTs. |
| test-image: Install the image from the servo USB stick to the target |
| DUTs. |
| repair: Install the image from the servo USB stick to the target |
| DUTs. Differs from the 'test-image' subcommand in that certain |
| default behaviors are different. |
| |
| For all subcommands, the servo part of the assembly must be fully |
| functional for deployment to succeed. |
| |
| For all subcommands except the `servo` subcommand, installing the |
| current repair imge on the servo's USB stick may be skipped to save |
| time. If this step is skipped, the user is responsible for making |
| sure the correct image is on the stick prior to running the command. |
| |
| For the `servo` subcommand, the DUT need not be present or in working |
| order. Other subcommands require the DUT to meet certain requirements, |
| outlined below. |
| |
| For the `firmware` subcommand, the DUT must begin in dev-mode, with |
| hardware write-protect disabled. At successful completion, the DUT is |
| in verified boot mode. |
| |
| For the `test-image` and `repair` subcommands, the DUT must already have |
| dev-signed firmware installed, and must be in verified boot mode. |
| |
| ## Available options: |
| |
| -w / --web SERVER |
| Specify an alternative AFE RPC service. |
| |
| -d / --dir DIRECTORY |
| Specify a directory where logs from the command will be stored. |
| By default, a new directory will be created under ~/Documents. |
| |
| -i / --build BUILD |
| Install the given BUILD onto the servo USB stick, and update the AFE |
| to make that build the default repair image for the target DUTS. |
| BUILD is specified in a form like 'R66-10447.0.0'. |
| |
| -f / --hostname_file FILE |
| Specifies a CSV formatted file with information about the target DUTs. |
| When supplied, this overrides any HOSTNAME arguments on the command |
| line. |
| |
| -b / --board BOARD |
| Specifies the board to assume for all target DUTs. |
| |
| -m / --model MODEL |
| Specifies the model to assume for all target DUTs. |
| |
| --[no]stageusb |
| This option isn't available for the `servo` subcommand. For other |
| subcommands, when true this option enables the servo validation and |
| installation steps performed by the `servo` subcommand. |
| |
| ## Command line arguments: |
| |
| HOSTNAME ... |
| If no `-f` option is supplied, the command line must have a list of |
| the hostnames of the target DUTs. |
| """ |
| |
| import sys |
| |
| import common |
| from autotest_lib.site_utils.deployment import cmdparse |
| from autotest_lib.site_utils.deployment import install |
| |
| |
| def main(argv): |
| """Standard main routine. |
| |
| @param argv Command line arguments including `sys.argv[0]`. |
| """ |
| install.install_duts(cmdparse.parse_command(argv)) |
| |
| |
| if __name__ == '__main__': |
| try: |
| main(sys.argv) |
| except KeyboardInterrupt: |
| pass |
| except EnvironmentError as e: |
| sys.stderr.write('Unexpected OS error:\n %s\n' % e) |
| except Exception as e: |
| sys.stderr.write('Unexpected exception:\n %s\n' % e) |