| # 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.bin import sysinfo |
| 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 = 1 |
| BUG_TEMPLATE = { |
| 'cc': ['chromeos-installer-alerts@google.com'], |
| 'components': ['Internals>Installer'], |
| } |
| |
| # Skip provision special task for AU tests. |
| DEPENDENCIES = "skip_provision" |
| |
| # Disable server-side packaging support for this test. |
| # This control file is used as the template for paygen_au_canary suite, which |
| # creates the control files during paygen. Therefore, autotest server package |
| # does not have these test control files for paygen_au_canary suite. |
| REQUIRE_SSP = False |
| |
| 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: |
| |
| test_that <DUT-IPADDR> autoupdate_EndToEndTest --args="<ARGLIST>" |
| |
| 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') |
| 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_payload_uri=URI URI of the source full payload. None means don't |
| install a source image (assume it's preinstalled). |
| 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_payload_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). |
| |
| |
| To run locally: |
| 1. Find the Google Storage URIs of the images you want to use during the test. |
| You can choose payloads from this bucket: gs://chromeos-releases/ |
| |
| Sample from gs://chromeos-releases: |
| gs://chromeos-releases/dev-channel/samus/9433.0.0/payloads/chromeos_9433.0 |
| .0_samus_dev-channel_full_test.bin-1e2db02f3bd9d9ebe74dc81fc7038919 |
| |
| 2. Choose the devserver you want to use. |
| This test uses a devserver to control the autoupdate. You can point to a |
| devserver on your workstation to aid debugging or you can choose to use a |
| devserver in the lab. |
| |
| To start your own devserver, run this (outside the chroot): |
| src/platform/dev/devserver.py --port=8084 |
| |
| For a devserver running on your workstation use 127.0.0.1 as the hostname. |
| For a devserver running in the lab the port is usually 8082. |
| |
| Add this line to src/third_party/autotest/files/shadow_config.ini in the [CROS] section: |
| dev_server = http://<hostname>:<port> |
| |
| The devserver needs to be able to reach the DUT you choose in the next |
| section. Look up the dev_server_common.ini.erb (in repo chromeos_admin) for |
| dev_server & restricted_subnet fields to pick a devserver in the same |
| subnet with the testing DUT. |
| |
| 3. Choose the DUT you want to use for the test. |
| You can use a DUT on your desk connected to corp or you can lock a DUT |
| in the lab for use in the test. |
| |
| 4. Setup ssh correctly. |
| You will need to setup a number of ssh keys and then copy them to |
| your chroot so that you can ssh into a devserver from there. |
| |
| Run ssh-keygen to generate your id_rsa and id_rsa.pub files into ~/.ssh/ |
| |
| Download the testing_rsa ssh keys from here: |
| https://chromium.googlesource.com/chromiumos/chromite/+/master/ssh_keys |
| Save both to ~/.ssh |
| chmod 600 ~/.ssh/testing_rsa* (otherwise permissions are too loose and |
| will be ignored) |
| |
| Add these lines to your ~/.ssh/config |
| Host *.cros |
| User root |
| IdentityFile /usr/local/google/home/<your ldap here>/.ssh/testing_rsa |
| |
| You should now be able to ssh into DUTs in the lab without a password. |
| |
| To ssh into lab devservers you need to download the devserver key from: |
| https://valentine.corp.google.com/#/show/1519247593151324 |
| |
| Save the file to ~/.ssh/devserver and run chmod 600 on it. |
| Then add these lines to your ~/.ssh/config |
| |
| Host <devserver hostname> |
| User chromeos-test |
| IdentityFile %d/.ssh/devserver |
| UserKnownHostsFile /dev/null |
| StrictHostKeyChecking no |
| Protocol 2 |
| PreferredAuthentications publickey |
| |
| Check that you can now ssh into a lab devserver without a password. |
| |
| Finally and most importantly, copy the ssh files to your chroot's .ssh |
| folder so you can ssh from there. |
| |
| 5. 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.) |
| |
| 6. Kick off the test with test_that from a chroot. e.g |
| test_that <IP OF DUT> autoupdate_EndToEndTest |
| --args="target_release=10906.0.0 |
| source_payload_uri='gs://chromeos-releases/canary-channel/nami/10760.0 |
| .0/payloads/chromeos_10760.0.0_nami_canary-channel_full_test |
| .bin-cee25d306d164f7514e26efb34f8f57d' |
| target_payload_uri='gs://chromeos-releases/canary-channel/nami/10906.0 |
| .0/payloads/chromeos_10760.0.0-10906.0.0_nami_canary-channel_delta_test |
| .bin-98f9af8d919605fc3ee1391eaa79c7e6' |
| source_release=10760.0.0 update_type=delta" |
| |
| 7. Unlock any DUTs you locked for debugging when you are done. |
| |
| """ |
| |
| TEST_CONF_KEYS = ( |
| 'name', 'update_type', 'source_release', 'target_release', |
| 'source_payload_uri', 'source_archive_uri', 'target_payload_uri', |
| 'target_archive_uri') |
| |
| |
| args_dict = utils.args_to_dict(args) |
| |
| # Create test configuration based on command-line arguments (higher precedence, |
| # for test_that 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) |
| # Save preserved log after autoupdate is completed. |
| job.sysinfo.add_logdir( |
| sysinfo.logdir(constants.AUTOUPDATE_PRESERVE_LOG)) |
| try: |
| job.run_test( |
| "autoupdate_EndToEndTest", |
| tag='%s_%s' % (test_conf['name'], test_conf['update_type']), |
| host=host, test_conf=test_conf) |
| 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) |