1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6from autotest_lib.client.common_lib import error, utils 7from autotest_lib.client.cros import constants 8from autotest_lib.server import host_attributes 9 10AUTHOR = "Chromium OS" 11NAME = "autoupdate_EndToEndTest" 12TIME = "MEDIUM" 13TEST_CATEGORY = "Functional" 14TEST_CLASS = "platform" 15TEST_TYPE = "server" 16JOB_RETRIES = 1 17BUG_TEMPLATE = { 18 'cc': ['chromeos-installer-alerts@google.com'], 19 'components': ['Internals>Installer'], 20} 21 22# Skip provision special task for AU tests. 23DEPENDENCIES = "skip_provision" 24 25# Disable server-side packaging support for this test. 26# This control file is used as the template for paygen_au_canary suite, which 27# creates the control files during paygen. Therefore, autotest server package 28# does not have these test control files for paygen_au_canary suite. 29REQUIRE_SSP = False 30 31DOC = """ 32This is an end-to-end update test of Chrome OS releases. Given a test 33configuration, it will perform an end-to-end test of a Chrome OS update 34payload. A test configuration can be given as command-line arguments (see 35below) or instantiated inline as local varibles. 36 37To invoke this test locally: 38 39 test_that <DUT-IPADDR> autoupdate_EndToEndTest --args="<ARGLIST>" 40 41where ARGLIST is a whitespace separated list of the following key=value pairs. 42Values pertaining to the test case include: 43 44 name=TAG name tag for the test (e.g. 'nmo', 'npo' or 'fsi') 45 update_type=full|delta type of update being applied, either 'full' or 'delta' 46 source_release=REL source image release version (e.g. 2672.0.0) 47 target_release=REL target image release version (e.g. 2673.0.0) 48 source_payload_uri=URI URI of the source full payload. None means don't 49 install a source image (assume it's preinstalled). 50 source_archive_uri=URI (optional) URI of where the artifacts for the source 51 image (e.g. stateful update) are located. If not 52 provided, the test will attempt using the same 53 location as source_payload_uri. This is required for 54 any test where the location of the full (source) 55 payload is separate from that of its build artifacts 56 (e.g. it is in gs://chromeos-releases/). 57 target_payload_uri=URI URI of the target payload 58 target_archive_uri=URI (optional) URI of where the artifacts for the target 59 image (e.g. stateful update) are located. If not 60 provided, the test will attempt using the test job's 61 repo ID (if present), otherwise default to the same 62 location as target_payload_uri. Normally, this is 63 only needed for local (non-AFE) runs where the 64 payload location is separate from that of the build 65 artifacts (e.g. it is in gs://chromeos-releases). 66 67 68To run locally: 691. Find the Google Storage URIs of the images you want to use during the test. 70 You can choose payloads from either of these two buckets: 71 gs://chromeos-image-archive/ 72 gs://chromeos-releases/ 73 74 Sample full payload URL: 75 gs://chromeos-image-archive/lumpy-release/R30-4462.0.0/ 76 chromeos_R30-4462.0.0_lumpy_full_dev.bin 77 78 Sample delta payload URL: 79 gs://chromeos-image-archive/lumpy-release/R30-4463.0.0/ 80 chromeos_R30-4462.0.0_R30-4463.0.0_lumpy_delta_dev.bin 81 82 Sample from gs://chromeos-releases: 83 gs://chromeos-releases/dev-channel/samus/9433.0.0/payloads/chromeos_9433.0 84 .0_samus_dev-channel_full_test.bin-1e2db02f3bd9d9ebe74dc81fc7038919 85 862. Choose the devserver you want to use. 87 This test uses a devserver to control the autoupdate. You can point to a 88 devserver on your workstation to aid debugging or you can choose to use a 89 devserver in the lab. 90 91 To start your own devserver, run this (outside the chroot): 92 src/platform/dev/devserver.py --port=8084 93 94 (Note: DO NOT use start_devserver! Even though it gives the impression of 95 running the server outside the chroot, it actually starts a chroot and runs 96 the server inside of it.) 97 98 Create src/third_party/autotest/files/shadow_config.ini and add these lines: 99 [CROS] 100 devserver_dir = ~/chromiumos/src/platform/dev 101 dev_server = http://<hostname>:<port> 102 103 For a devserver running on your workstation use 127.0.0.1 as the hostname. 104 For a devserver running in the lab the port is usually 8082. 105 106 The devserver needs to be able to reach the DUT you choose in the next 107 section. Look up the dev_server_common.ini.erb (in repo chromeos_admin) for 108 dev_server & restricted_subnet fields to pick a devserver in the same 109 subnet with the testing DUT. 110 1113. Choose the DUT you want to use for the test. 112 You can use a DUT on your desk connected to corp or you can lock a DUT 113 in the lab for use in the test. 114 1154. Setup ssh correctly (Helpful for debugging, skip as needed) 116 Run ssh-keygen to generate your id_rsa and id_rsa.pub files into ~/.ssh/ 117 118 Download the testing_rsa ssh keys from here: 119 https://chromium.googlesource.com/chromiumos/chromite/+/master/ssh_keys 120 Save both to ~/.ssh 121 chmod 600 ~/.ssh/testing_rsa* (otherwise permissions are too loose and 122 will be ignored) 123 124 Add these lines to your ~/.ssh/config 125 Host *.cros 126 User root 127 IdentityFile /usr/local/google/home/<your ldap here>/.ssh/testing_rsa 128 129 You should now be able to ssh into DUTs in the lab without a password. 130 131 To ssh into lab devservers you need to download the chromium key file from: 132 chromeos_internal//chromeos-admin/puppet/modules/users/files/chromeos 133 -test/ssh/chromium 134 135 Save the file to ~/.ssh/ and run chmod 600 on it. 136 Then add these lines to your ~/.ssh/config 137 138 Host <devserver hostname> 139 GSSAPITrustDns no 140 GSSAPIDelegateCredentials no 141 GSSAPIAuthentication no 142 ForwardAgent no 143 ForwardX11 no 144 PreferredAuthentications publickey 145 StrictHostKeyChecking no 146 User chromeos-test 147 IdentityFile %d/.ssh/chromium 148 149 Check that you can now ssh into a lab devserver without a password. 150 151 Copy the ssh files to your chroot's .ssh folder to ssh from there. 152 1535. Make sure you have your gsutil permissions (your .boto file). 154 Your .boto file must be available inside the chroot. 155 cp ~/.boto chroot/home/<user>/ 156 157 Make sure the gsutil command is available outside the chroot (note: 158 the gsutil package in Ubuntu is not what you're looking for.) 159 1606. Kick off the test with test_that from a chroot. e.g 161 test_that <IP OF DUT> autoupdate_EndToEndTest 162 --args="target_release=9436.0.0 163 source_payload_uri='gs://chromeos-image-archive/samus-release/ 164 R59-9433.0.0/chromeos_R59-9433.0.0_samus_full_dev.bin' 165 target_payload_uri='gs://chromeos-image-archive/samus-release/ 166 R59-9436.0.0/chromeos_R59-9436.0.0_samus_full_dev.bin' 167 source_release=9433.0.0 update_type=full" 168 1697. Unlock any DUTs you locked for debugging when you are done. 170 171""" 172 173TEST_CONF_KEYS = ( 174 'name', 'update_type', 'source_release', 'target_release', 175 'source_payload_uri', 'source_archive_uri', 'target_payload_uri', 176 'target_archive_uri') 177 178 179args_dict = utils.args_to_dict(args) 180 181# Create test configuration based on command-line arguments (higher precedence, 182# for test_that invocation) and local variables (lower precedence, 183# for Autotest front-end invocation). 184test_conf = {} 185for key in TEST_CONF_KEYS: 186 test_conf[key] = args_dict.get(key) or locals().get(key) 187 188 189def run_test(machine): 190 """Execute a test configuration on a given machine.""" 191 host = hosts.create_host(machine) 192 # Save preserved log after autoupdate is completed. 193 job.sysinfo.add_logdir(constants.AUTOUPDATE_PRESERVE_LOG) 194 try: 195 job.run_test( 196 "autoupdate_EndToEndTest", 197 tag='%s_%s' % (test_conf['name'], test_conf['update_type']), 198 host=host, test_conf=test_conf) 199 except Exception as e: 200 if not issubclass(type(e), error.TestBaseException): 201 error_msg = 'Received test error: %s' % e 202 logging.error(error_msg) 203 raise error.TestError(error_msg) 204 205 raise 206 207 208# Invoke parallel tests. 209parallel_simple(run_test, machines) 210