# Copyright (c) 2014 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 datetime import logging import re import common from autotest_lib.client.common_lib import error, global_config from autotest_lib.server import test from autotest_lib.server.hosts import moblab_host DEFAULT_IMAGE_STORAGE_SERVER = global_config.global_config.get_config_value( 'CROS', 'image_storage_server') STORAGE_SERVER_REGEX = '(gs://|/).*/' DEFAULT_SERVICES_INIT_TIMEOUT_M = 5 class MoblabTest(test.test): """Base class for Moblab tests. """ def initialize( self, host, boto_path='', image_storage_server=DEFAULT_IMAGE_STORAGE_SERVER, services_init_timeout_m=DEFAULT_SERVICES_INIT_TIMEOUT_M, ): """Initialize the Moblab Host. * Installs a boto file. * Sets up the image storage server for this test. * Finds and adds DUTs on the testing subnet. @param boto_path: Path to the boto file we want to install. @param image_storage_server: image storage server to use for grabbing images from Google Storage. @param services_init_timeout_m: Timeout (in minuts) for moblab DUT's upstart service initialzation after boot. """ super(MoblabTest, self).initialize() self._start_time = datetime.datetime.now() self._host = host # When passed in from test_that or run_suite, all incoming arguments are # str. self._host.verify_moblab_services( timeout_m=int(services_init_timeout_m)) self._host.wait_afe_up() self._host.install_boto_file(boto_path) self._set_image_storage_server(image_storage_server) self._host.find_and_add_duts() self._host.verify_duts() self._host.verify_special_tasks_complete() @property def elapsed(self): """A datetime.timedleta for time elapsed since start of test.""" return datetime.datetime.now() - self._start_time def _set_image_storage_server(self, image_storage_server): """Set the image storage server. @param image_storage_server: Name of image storage server to use. Must follow format or gs://bucket-name/ (Note trailing slash is required). @raises error.TestError if the image_storage_server is incorrectly formatted. """ if not re.match(STORAGE_SERVER_REGEX, image_storage_server): raise error.TestError( 'Image Storage Server supplied (%s) is not in the correct ' 'format. Remote paths must be of the form "gs://.*/" and ' 'local paths of the form "/.*/"' % image_storage_server) logging.info('Setting image_storage_server to %s', image_storage_server) # If the image_storage_server is already set, delete it. self._host.run('sed -i /image_storage_server/d %s' % moblab_host.SHADOW_CONFIG_PATH, ignore_status=True) self._host.run("sed -i '/\[CROS\]/ a\image_storage_server: " "%s' %s" %(image_storage_server, moblab_host.SHADOW_CONFIG_PATH))