1492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi# Use of this source code is governed by a BSD-style license that can be
3492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi# found in the LICENSE file.
43dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu
53dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhuimport datetime
6492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basiimport logging
7492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basiimport re
8492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
9be3585f95e656a9cb35df305c173545d9723bc43Prathmesh Prabhuimport common
10492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basifrom autotest_lib.client.common_lib import error, global_config
11492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basifrom autotest_lib.server import test
12492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basifrom autotest_lib.server.hosts import moblab_host
13492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
14492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
15492242d0e51e400cfe7077c7d245cebb3314f8faSimran BasiDEFAULT_IMAGE_STORAGE_SERVER = global_config.global_config.get_config_value(
16492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        'CROS', 'image_storage_server')
171affd71e99ea67d56e4d3bc794ca8164957c2400Prathmesh PrabhuSTORAGE_SERVER_REGEX = '(gs://|/).*/'
18e4e50a50f03c31071048f846067c2c3635afd318Prathmesh PrabhuDEFAULT_SERVICES_INIT_TIMEOUT_M = 5
19492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
20492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
21492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basiclass MoblabTest(test.test):
22492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi    """Base class for Moblab tests.
23492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi    """
24492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
25e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu    def initialize(
26e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu            self,
27e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu            host,
28e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu            boto_path='',
29e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu            image_storage_server=DEFAULT_IMAGE_STORAGE_SERVER,
30e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu            services_init_timeout_m=DEFAULT_SERVICES_INIT_TIMEOUT_M,
31e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu    ):
32492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        """Initialize the Moblab Host.
33492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
34492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        * Installs a boto file.
35492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        * Sets up the image storage server for this test.
36492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        * Finds and adds DUTs on the testing subnet.
37492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
38492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        @param boto_path: Path to the boto file we want to install.
39492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        @param image_storage_server: image storage server to use for grabbing
40e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu                images from Google Storage.
41e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu        @param services_init_timeout_m: Timeout (in minuts) for moblab DUT's
42e4e50a50f03c31071048f846067c2c3635afd318Prathmesh Prabhu                upstart service initialzation after boot.
43492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        """
44492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        super(MoblabTest, self).initialize()
453dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu        self._start_time = datetime.datetime.now()
46492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        self._host = host
479d29be848b4bb6b20a8f9f83fe67c9abadb49a7bPrathmesh Prabhu        # When passed in from test_that or run_suite, all incoming arguments are
489d29be848b4bb6b20a8f9f83fe67c9abadb49a7bPrathmesh Prabhu        # str.
499d29be848b4bb6b20a8f9f83fe67c9abadb49a7bPrathmesh Prabhu        self._host.verify_moblab_services(
509d29be848b4bb6b20a8f9f83fe67c9abadb49a7bPrathmesh Prabhu                timeout_m=int(services_init_timeout_m))
51d7cf1a006871030854ecbb6c9325b5df9010aaf9Keith Haddow        self._host.wait_afe_up()
52178ce7d5a00df6a9837af867cae9887dbe7f962eSimran Basi        self._host.install_boto_file(boto_path)
53be3585f95e656a9cb35df305c173545d9723bc43Prathmesh Prabhu        self._set_image_storage_server(image_storage_server)
54492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        self._host.find_and_add_duts()
55d7cf1a006871030854ecbb6c9325b5df9010aaf9Keith Haddow        self._host.verify_duts()
56d7cf1a006871030854ecbb6c9325b5df9010aaf9Keith Haddow        self._host.verify_special_tasks_complete()
57492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
58492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
593dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu    @property
603dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu    def elapsed(self):
613dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu        """A datetime.timedleta for time elapsed since start of test."""
623dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu        return datetime.datetime.now() - self._start_time
633dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu
643dc370160a024416bc4a31cafd7a67455c74c4f6Prathmesh Prabhu
65be3585f95e656a9cb35df305c173545d9723bc43Prathmesh Prabhu    def _set_image_storage_server(self, image_storage_server):
66492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        """Set the image storage server.
67492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
68492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        @param image_storage_server: Name of image storage server to use. Must
69492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi                                     follow format or gs://bucket-name/
70492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi                                     (Note trailing slash is required).
71492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi
72492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        @raises error.TestError if the image_storage_server is incorrectly
73492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi                                formatted.
74492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        """
75492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        if not re.match(STORAGE_SERVER_REGEX, image_storage_server):
76492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi            raise error.TestError(
771affd71e99ea67d56e4d3bc794ca8164957c2400Prathmesh Prabhu                    'Image Storage Server supplied (%s) is not in the correct '
781affd71e99ea67d56e4d3bc794ca8164957c2400Prathmesh Prabhu                    'format. Remote paths must be of the form "gs://.*/" and '
791affd71e99ea67d56e4d3bc794ca8164957c2400Prathmesh Prabhu                    'local paths of the form "/.*/"' % image_storage_server)
801affd71e99ea67d56e4d3bc794ca8164957c2400Prathmesh Prabhu        logging.info('Setting image_storage_server to %s', image_storage_server)
81492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        # If the image_storage_server is already set, delete it.
82492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        self._host.run('sed -i /image_storage_server/d %s' %
83492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi                       moblab_host.SHADOW_CONFIG_PATH, ignore_status=True)
84492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi        self._host.run("sed -i '/\[CROS\]/ a\image_storage_server: "
85492242d0e51e400cfe7077c7d245cebb3314f8faSimran Basi                       "%s' %s" %(image_storage_server,
86d7cf1a006871030854ecbb6c9325b5df9010aaf9Keith Haddow                                  moblab_host.SHADOW_CONFIG_PATH))
87