| # Copyright (c) 2012 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. |
| |
| import logging |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib import utils |
| from autotest_lib.client.common_lib.cros import dev_server |
| from autotest_lib.server import host_attributes |
| |
| AUTHOR = "Chrome OS Team" |
| NAME = "platform_InstallTestImage" |
| TIME = "MEDIUM" |
| TEST_CATEGORY = "Install" |
| TEST_CLASS = "platform" |
| TEST_TYPE = "server" |
| |
| DOC = """ |
| This test installs a specified test image onto a servo-connected DUT. |
| The principle purpose is to allow installing a known-good image onto |
| a wedged unit that would otherwise have to be re-imaged manually. |
| |
| Here is the command to install a recovery image with a locally attached |
| servo: |
| test_that -b ${BOARD} ${IP_ADDRESS} \ |
| --args="image=$IMAGE_PATH" platform_InstallTestImage |
| |
| """ |
| |
| args_dict = utils.args_to_dict(args) |
| servo_args = hosts.CrosHost.get_servo_arguments(args_dict) |
| |
| def run(machine): |
| # Setup the client machine. |
| host = hosts.create_host(machine, servo_args=servo_args) |
| # If we're invoked from test_that, the user can pass an |
| # optional "image" argument. If it's omitted, we want to pass |
| # `None` to the test. That will cause the test to assume |
| # there's an image pre-installed on USB. This is convenient, |
| # because it can save the time of a long download. |
| # |
| # If we're called from the AFE, there won't be an "image" |
| # argument, and we want to ask the dev server to stage a test |
| # image. |
| # |
| # To distinguish the two cases above, we ask the host for |
| # the name of the default image we should stage. When we're |
| # called from test_that, this call should fail when we |
| # try to look the host up in the AFE database. Otherwise, if we |
| # get a valid image name, we use it to stage a build. |
| image_url = args_dict.get("image") |
| if image_url is None: |
| try: |
| # This fails if the board type can't be determined. |
| image_name = host._get_cros_repair_image_name() |
| except error.AutoservError as e: |
| # Failed, so assume this is test_that. |
| logging.info("Can't find build to stage: %s.", e) |
| logging.info("Assuming this is an invocation from test_that " |
| "with a pre-installed USB image") |
| else: |
| # Succeeded, so stage the build and get its URL. |
| # N.B. Failures from staging the build at this point |
| # are fatal by design. |
| image_url = host.stage_image_for_servo(image_name) |
| logging.info("Using staged image: %s", image_url) |
| job.run_test("platform_InstallTestImage", host=host, |
| disable_sysinfo=True, image_url=image_url) |
| |
| parallel_simple(run, machines) |