blob: 51cc4ab868fd073c14b582947c1f5e7ef6ea9a17 [file] [log] [blame]
# 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, utils
from autotest_lib.client.cros import constants
from autotest_lib.server import host_attributes
AUTHOR = "Chromium OS"
NAME = "autoupdate_EndToEndTest"
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "platform"
TEST_TYPE = "server"
JOB_RETRIES = 2
DOC = """
This is an end-to-end update test of Chrome OS releases. Given a test
configuration, it will perform an end-to-end test of a Chrome OS update
payload. A test configuration can be given as command-line arguments (see
below) or instantiated inline as local varibles.
To invoke this test locally with an attached servo board:
run_remote_tests.sh \
--args="<ARGLIST>" \
--remote=<DUT-IPADDR \
--ssh_connect_timeout 2 \ # Make the test run faster
--ssh_connection_attempts 2 \ # when not using test
autoupdate_EndToEndTest
where ARGLIST is a whitespace separated list of the following key=value pairs.
Values pertaining to the test case include:
name=TAG name tag for the test (e.g. 'nmo', 'npo' or 'fsi')
image_type=test|mp type of images used, either 'test' or 'mp'
update_type=full|delta type of update being applied, either 'full' or 'delta'
source_release=REL source image release version (e.g. 2672.0.0)
target_release=REL target image release version (e.g. 2673.0.0)
source_image_uri=URI URI of the source image / payload. Image must be used
if use_servo specified.
source_archive_uri=URI (optional) URI of where the artifacts for the source
image (e.g. stateful update) are located. If not
provided, the test will attempt using the same
location as source_image_uri. This is required for
any test where the location of the full (source)
payload is separate from that of its build artifacts
(e.g. it is in gs://chromeos-releases/).
target_payload_uri=URI URI of the target payload
target_archive_uri=URI (optional) URI of where the artifacts for the target
image (e.g. stateful update) are located. If not
provided, the test will attempt using the test job's
repo ID (if present), otherwise default to the same
location as target_payload_uri. Normally, this is
only needed for local (non-AFE) runs where the
payload location is separate from that of the build
artifacts (e.g. it is in gs://chromeos-releases).
Other values pertaining to the test environment include:
servo_host=HOST host running servod (if not set, servo won't be used)
servo_port=PORT servod's IP port (default: servod's default port)
Please note, this test spawns omaha server instances (devserver) on a devserver
configured in your global_config using autotest's ssh mechanism. This means that
if you are running this locally and intend to use a local devserver, you will
need to setup your ssh keys for public key authentication e.g. create keys,
ssh-add the private key, add the public key to your authorized keys and finally
enable public key authentication in your sshd config.
To run locally:
Create src/third_party/autotest/files/shadow_config.ini:
[CROS]
devserver_dir = <full repo path>/src/platform/dev
dev_server = http://<hostname>:8080
Configure SSH for passwordless loopback access to your account.
ssh-keygen (If you don't already have SSH keys setup)
cp ~/.ssh/id_rsa chroot/home/<user>/.ssh/
# This is NOT permanent, you'll have to redo it about once a day.
sudo sed -i 's/PubkeyAuthentication no/PubkeyAuthentication yes/' \
/etc/ssh/sshd_config
sudo /etc/init.d/ssh restart
Enter a chroot, and ssh to <hostname>. If it doesn't work, fix that.
Make sure you have your gsutil permissions (your .boto file).
Your .boto file must be available inside the chroot.
cp ~/.boto chroot/home/<user>/
Make sure the gsutil command is available outside the chroot (note:
the gsutil package in Ubuntu is not what you're looking for.)
Start a devserver (outside the chroot):
src/platform/dev/devserver.py
(Note: DO NOT use start_devserver! Even though it gives the impression of
running the server outside the chroot, it actually starts a chroot and runs
the server inside of it.)
To make sure your test edits are used:
cros_sdk
cros_workon start autotest
Example:
cros_sdk
test_that <dut_ip> autoupdate_EndToEndTest \
--args="target_release=<Target Build Id> \
source_image_uri=<Full Payload URI> \
target_payload_uri=<Delta Payload URI>"
Sample Full URL:
gs://chromeos-image-archive/lumpy-release/R30-4462.0.0/
chromeos_R30-4462.0.0_lumpy_full_dev.bin
Sample target build id:
4463.0.0
Sample Delta URL:
gs://chromeos-image-archive/lumpy-release/R30-4463.0.0/
chromeos_R30-4462.0.0_R30-4463.0.0_lumpy_delta_dev.bin
"""
TEST_CONF_KEYS = (
'name', 'image_type', 'update_type', 'source_release', 'target_release',
'source_image_uri', 'source_archive_uri', 'target_payload_uri',
'target_archive_uri')
args_dict = utils.args_to_dict(args)
use_servo = args_dict.get('servo_host', False)
servo_args = None
if use_servo:
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)
# Create test configuration based on command-line arguments (higher precedence,
# for run_remote_tests.sh invocation) and local variables (lower precedence,
# for Autotest front-end invocation).
test_conf = {}
for key in TEST_CONF_KEYS:
test_conf[key] = args_dict.get(key) or locals().get(key)
def run_test(machine):
"""Execute a test configuration on a given machine."""
host = hosts.create_host(machine, servo_args=servo_args)
# Save preserved log after autoupdate is completed.
job.sysinfo.add_logdir(constants.AUTOUPDATE_PRESERVE_LOG)
try:
job.run_test(
"autoupdate_EndToEndTest",
tag='%s_%s_%s' % (
test_conf['name'], test_conf['image_type'],
test_conf['update_type']),
host=host, test_conf=test_conf, use_servo=use_servo)
except Exception as e:
if not issubclass(type(e), error.TestBaseException):
error_msg = 'Received test error: %s' % e
logging.error(error_msg)
raise error.TestError(error_msg)
raise
# Invoke parallel tests.
parallel_simple(run_test, machines)