Statistics
| Branch: | Tag: | Revision:

root / snf-tools / synnefo_tools / burnin / common.py @ cb9edcdf

History | View | Annotate | Download (23 kB)

1 4c52d5bf Ilias Tsitsimpis
# Copyright 2013 GRNET S.A. All rights reserved.
2 4c52d5bf Ilias Tsitsimpis
#
3 4c52d5bf Ilias Tsitsimpis
# Redistribution and use in source and binary forms, with or
4 4c52d5bf Ilias Tsitsimpis
# without modification, are permitted provided that the following
5 4c52d5bf Ilias Tsitsimpis
# conditions are met:
6 4c52d5bf Ilias Tsitsimpis
#
7 4c52d5bf Ilias Tsitsimpis
#   1. Redistributions of source code must retain the above
8 4c52d5bf Ilias Tsitsimpis
#      copyright notice, this list of conditions and the following
9 4c52d5bf Ilias Tsitsimpis
#      disclaimer.
10 4c52d5bf Ilias Tsitsimpis
#
11 4c52d5bf Ilias Tsitsimpis
#   2. Redistributions in binary form must reproduce the above
12 4c52d5bf Ilias Tsitsimpis
#      copyright notice, this list of conditions and the following
13 4c52d5bf Ilias Tsitsimpis
#      disclaimer in the documentation and/or other materials
14 4c52d5bf Ilias Tsitsimpis
#      provided with the distribution.
15 4c52d5bf Ilias Tsitsimpis
#
16 4c52d5bf Ilias Tsitsimpis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 4c52d5bf Ilias Tsitsimpis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 4c52d5bf Ilias Tsitsimpis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 4c52d5bf Ilias Tsitsimpis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 4c52d5bf Ilias Tsitsimpis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 4c52d5bf Ilias Tsitsimpis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 4c52d5bf Ilias Tsitsimpis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 4c52d5bf Ilias Tsitsimpis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 4c52d5bf Ilias Tsitsimpis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 4c52d5bf Ilias Tsitsimpis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 4c52d5bf Ilias Tsitsimpis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 4c52d5bf Ilias Tsitsimpis
# POSSIBILITY OF SUCH DAMAGE.
28 4c52d5bf Ilias Tsitsimpis
#
29 4c52d5bf Ilias Tsitsimpis
# The views and conclusions contained in the software and
30 4c52d5bf Ilias Tsitsimpis
# documentation are those of the authors and should not be
31 4c52d5bf Ilias Tsitsimpis
# interpreted as representing official policies, either expressed
32 4c52d5bf Ilias Tsitsimpis
# or implied, of GRNET S.A.
33 4c52d5bf Ilias Tsitsimpis
34 4c52d5bf Ilias Tsitsimpis
"""
35 4c52d5bf Ilias Tsitsimpis
Common utils for burnin tests
36 4c52d5bf Ilias Tsitsimpis

37 4c52d5bf Ilias Tsitsimpis
"""
38 4c52d5bf Ilias Tsitsimpis
39 f772699c Ilias Tsitsimpis
import re
40 f772699c Ilias Tsitsimpis
import shutil
41 d11c80c0 Ilias Tsitsimpis
import unittest
42 6f2b9836 Ilias Tsitsimpis
import datetime
43 f772699c Ilias Tsitsimpis
import tempfile
44 4c52d5bf Ilias Tsitsimpis
import traceback
45 4c52d5bf Ilias Tsitsimpis
46 60a80953 Ilias Tsitsimpis
from kamaki.clients.cyclades import CycladesClient, CycladesNetworkClient
47 cb9edcdf Ilias Tsitsimpis
from kamaki.clients.astakos import CachedAstakosClient
48 4c52d5bf Ilias Tsitsimpis
from kamaki.clients.compute import ComputeClient
49 79a5c431 Ilias Tsitsimpis
from kamaki.clients.pithos import PithosClient
50 f772699c Ilias Tsitsimpis
from kamaki.clients.image import ImageClient
51 4c52d5bf Ilias Tsitsimpis
52 12ef696f Ilias Tsitsimpis
from synnefo_tools.burnin.logger import Log
53 4c52d5bf Ilias Tsitsimpis
54 4c52d5bf Ilias Tsitsimpis
55 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
56 4c52d5bf Ilias Tsitsimpis
# Global variables
57 08f1780b Ilias Tsitsimpis
logger = None   # Invalid constant name. pylint: disable-msg=C0103
58 08f1780b Ilias Tsitsimpis
success = None  # Invalid constant name. pylint: disable-msg=C0103
59 12ef696f Ilias Tsitsimpis
SNF_TEST_PREFIX = "snf-test-"
60 4c52d5bf Ilias Tsitsimpis
CONNECTION_RETRY_LIMIT = 2
61 f772699c Ilias Tsitsimpis
SYSTEM_USERS = ["images@okeanos.grnet.gr", "images@demo.synnefo.org"]
62 3e5bbd85 Ilias Tsitsimpis
KB = 2**10
63 3e5bbd85 Ilias Tsitsimpis
MB = 2**20
64 3e5bbd85 Ilias Tsitsimpis
GB = 2**30
65 4c52d5bf Ilias Tsitsimpis
66 4c52d5bf Ilias Tsitsimpis
67 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
68 4c52d5bf Ilias Tsitsimpis
# BurninTestResult class
69 4c52d5bf Ilias Tsitsimpis
class BurninTestResult(unittest.TestResult):
70 4c52d5bf Ilias Tsitsimpis
    """Modify the TextTestResult class"""
71 4c52d5bf Ilias Tsitsimpis
    def __init__(self):
72 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).__init__()
73 4c52d5bf Ilias Tsitsimpis
74 4c52d5bf Ilias Tsitsimpis
        # Test parameters
75 4c52d5bf Ilias Tsitsimpis
        self.failfast = True
76 4c52d5bf Ilias Tsitsimpis
77 4c52d5bf Ilias Tsitsimpis
    def startTest(self, test):  # noqa
78 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test is about to be run"""
79 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).startTest(test)
80 fe15cd00 Ilias Tsitsimpis
        logger.log(test.__class__.__name__, test.shortDescription())
81 4c52d5bf Ilias Tsitsimpis
82 4c52d5bf Ilias Tsitsimpis
    # Method could be a function. pylint: disable-msg=R0201
83 4c52d5bf Ilias Tsitsimpis
    def _test_failed(self, test, err):
84 4c52d5bf Ilias Tsitsimpis
        """Test failed"""
85 79a5c431 Ilias Tsitsimpis
        # Get class name
86 79a5c431 Ilias Tsitsimpis
        if test.__class__.__name__ == "_ErrorHolder":
87 79a5c431 Ilias Tsitsimpis
            class_name = test.id().split('.')[-1].rstrip(')')
88 79a5c431 Ilias Tsitsimpis
        else:
89 79a5c431 Ilias Tsitsimpis
            class_name = test.__class__.__name__
90 fe15cd00 Ilias Tsitsimpis
        err_msg = str(test) + "... failed (%s)."
91 6f2b9836 Ilias Tsitsimpis
        timestamp = datetime.datetime.strftime(
92 6f2b9836 Ilias Tsitsimpis
            datetime.datetime.now(), "%a %b %d %Y %H:%M:%S")
93 79a5c431 Ilias Tsitsimpis
        logger.error(class_name, err_msg, timestamp)
94 4c52d5bf Ilias Tsitsimpis
        (err_type, err_value, err_trace) = err
95 4c52d5bf Ilias Tsitsimpis
        trcback = traceback.format_exception(err_type, err_value, err_trace)
96 79a5c431 Ilias Tsitsimpis
        logger.info(class_name, trcback)
97 4c52d5bf Ilias Tsitsimpis
98 4c52d5bf Ilias Tsitsimpis
    def addError(self, test, err):  # noqa
99 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test raises an unexpected exception"""
100 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).addError(test, err)
101 4c52d5bf Ilias Tsitsimpis
        self._test_failed(test, err)
102 4c52d5bf Ilias Tsitsimpis
103 4c52d5bf Ilias Tsitsimpis
    def addFailure(self, test, err):  # noqa
104 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test signals a failure"""
105 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).addFailure(test, err)
106 4c52d5bf Ilias Tsitsimpis
        self._test_failed(test, err)
107 4c52d5bf Ilias Tsitsimpis
108 4c52d5bf Ilias Tsitsimpis
109 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
110 5bef1f49 Ilias Tsitsimpis
# Helper Classes
111 6c78720b Ilias Tsitsimpis
# Too few public methods. pylint: disable-msg=R0903
112 6c78720b Ilias Tsitsimpis
# Too many instance attributes. pylint: disable-msg=R0902
113 12ef696f Ilias Tsitsimpis
class Clients(object):
114 12ef696f Ilias Tsitsimpis
    """Our kamaki clients"""
115 12ef696f Ilias Tsitsimpis
    auth_url = None
116 12ef696f Ilias Tsitsimpis
    token = None
117 79a5c431 Ilias Tsitsimpis
    # Astakos
118 12ef696f Ilias Tsitsimpis
    astakos = None
119 12ef696f Ilias Tsitsimpis
    retry = CONNECTION_RETRY_LIMIT
120 79a5c431 Ilias Tsitsimpis
    # Compute
121 12ef696f Ilias Tsitsimpis
    compute = None
122 12ef696f Ilias Tsitsimpis
    compute_url = None
123 79a5c431 Ilias Tsitsimpis
    # Cyclades
124 79a5c431 Ilias Tsitsimpis
    cyclades = None
125 60a80953 Ilias Tsitsimpis
    # Network
126 60a80953 Ilias Tsitsimpis
    network = None
127 60a80953 Ilias Tsitsimpis
    network_url = None
128 79a5c431 Ilias Tsitsimpis
    # Pithos
129 79a5c431 Ilias Tsitsimpis
    pithos = None
130 79a5c431 Ilias Tsitsimpis
    pithos_url = None
131 f772699c Ilias Tsitsimpis
    # Image
132 f772699c Ilias Tsitsimpis
    image = None
133 f772699c Ilias Tsitsimpis
    image_url = None
134 12ef696f Ilias Tsitsimpis
135 5bef1f49 Ilias Tsitsimpis
    def initialize_clients(self):
136 5bef1f49 Ilias Tsitsimpis
        """Initialize all the Kamaki Clients"""
137 cb9edcdf Ilias Tsitsimpis
        self.astakos = CachedAstakosClient(self.auth_url, self.token)
138 5bef1f49 Ilias Tsitsimpis
        self.astakos.CONNECTION_RETRY_LIMIT = self.retry
139 5bef1f49 Ilias Tsitsimpis
140 5bef1f49 Ilias Tsitsimpis
        self.compute_url = \
141 5bef1f49 Ilias Tsitsimpis
            self.astakos.get_service_endpoints('compute')['publicURL']
142 5bef1f49 Ilias Tsitsimpis
        self.compute = ComputeClient(self.compute_url, self.token)
143 5bef1f49 Ilias Tsitsimpis
        self.compute.CONNECTION_RETRY_LIMIT = self.retry
144 5bef1f49 Ilias Tsitsimpis
145 5bef1f49 Ilias Tsitsimpis
        self.cyclades = CycladesClient(self.compute_url, self.token)
146 5bef1f49 Ilias Tsitsimpis
        self.cyclades.CONNECTION_RETRY_LIMIT = self.retry
147 5bef1f49 Ilias Tsitsimpis
148 60a80953 Ilias Tsitsimpis
        self.network_url = \
149 60a80953 Ilias Tsitsimpis
            self.astakos.get_service_endpoints('network')['publicURL']
150 60a80953 Ilias Tsitsimpis
        self.network = CycladesNetworkClient(self.network_url, self.token)
151 60a80953 Ilias Tsitsimpis
        self.network.CONNECTION_RETRY_LIMIT = self.retry
152 60a80953 Ilias Tsitsimpis
153 5bef1f49 Ilias Tsitsimpis
        self.pithos_url = self.astakos.\
154 5bef1f49 Ilias Tsitsimpis
            get_service_endpoints('object-store')['publicURL']
155 5bef1f49 Ilias Tsitsimpis
        self.pithos = PithosClient(self.pithos_url, self.token)
156 5bef1f49 Ilias Tsitsimpis
        self.pithos.CONNECTION_RETRY_LIMIT = self.retry
157 5bef1f49 Ilias Tsitsimpis
158 5bef1f49 Ilias Tsitsimpis
        self.image_url = \
159 5bef1f49 Ilias Tsitsimpis
            self.astakos.get_service_endpoints('image')['publicURL']
160 5bef1f49 Ilias Tsitsimpis
        self.image = ImageClient(self.image_url, self.token)
161 5bef1f49 Ilias Tsitsimpis
        self.image.CONNECTION_RETRY_LIMIT = self.retry
162 5bef1f49 Ilias Tsitsimpis
163 5bef1f49 Ilias Tsitsimpis
164 5bef1f49 Ilias Tsitsimpis
class Proper(object):
165 5bef1f49 Ilias Tsitsimpis
    """A descriptor used by tests implementing the TestCase class
166 5bef1f49 Ilias Tsitsimpis

167 5bef1f49 Ilias Tsitsimpis
    Since each instance of the TestCase will only be used to run a single
168 5bef1f49 Ilias Tsitsimpis
    test method (a new fixture is created for each test) the attributes can
169 5bef1f49 Ilias Tsitsimpis
    not be saved in the class instances. Instead we use descriptors.
170 12ef696f Ilias Tsitsimpis

171 5bef1f49 Ilias Tsitsimpis
    """
172 5bef1f49 Ilias Tsitsimpis
    def __init__(self, value=None):
173 5bef1f49 Ilias Tsitsimpis
        self.val = value
174 5bef1f49 Ilias Tsitsimpis
175 5bef1f49 Ilias Tsitsimpis
    def __get__(self, obj, objtype=None):
176 5bef1f49 Ilias Tsitsimpis
        return self.val
177 5bef1f49 Ilias Tsitsimpis
178 5bef1f49 Ilias Tsitsimpis
    def __set__(self, obj, value):
179 5bef1f49 Ilias Tsitsimpis
        self.val = value
180 5bef1f49 Ilias Tsitsimpis
181 5bef1f49 Ilias Tsitsimpis
182 5bef1f49 Ilias Tsitsimpis
# --------------------------------------------------------------------
183 5bef1f49 Ilias Tsitsimpis
# BurninTests class
184 4c52d5bf Ilias Tsitsimpis
# Too many public methods (45/20). pylint: disable-msg=R0904
185 4c52d5bf Ilias Tsitsimpis
class BurninTests(unittest.TestCase):
186 4c52d5bf Ilias Tsitsimpis
    """Common class that all burnin tests should implement"""
187 12ef696f Ilias Tsitsimpis
    clients = Clients()
188 6f2b9836 Ilias Tsitsimpis
    run_id = None
189 79a5c431 Ilias Tsitsimpis
    use_ipv6 = None
190 79a5c431 Ilias Tsitsimpis
    action_timeout = None
191 79a5c431 Ilias Tsitsimpis
    action_warning = None
192 79a5c431 Ilias Tsitsimpis
    query_interval = None
193 f772699c Ilias Tsitsimpis
    system_user = None
194 6c78720b Ilias Tsitsimpis
    images = None
195 6c78720b Ilias Tsitsimpis
    flavors = None
196 8c67f82e Ilias Tsitsimpis
    delete_stale = False
197 24d1788b Ilias Tsitsimpis
    temp_directory = None
198 2c60bfa6 Ilias Tsitsimpis
    failfast = None
199 12ef696f Ilias Tsitsimpis
200 5bef1f49 Ilias Tsitsimpis
    quotas = Proper(value=None)
201 5bef1f49 Ilias Tsitsimpis
202 4c52d5bf Ilias Tsitsimpis
    @classmethod
203 4c52d5bf Ilias Tsitsimpis
    def setUpClass(cls):  # noqa
204 4c52d5bf Ilias Tsitsimpis
        """Initialize BurninTests"""
205 4c52d5bf Ilias Tsitsimpis
        cls.suite_name = cls.__name__
206 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_start(cls.suite_name)
207 4c52d5bf Ilias Tsitsimpis
208 4c52d5bf Ilias Tsitsimpis
        # Set test parameters
209 4c52d5bf Ilias Tsitsimpis
        cls.longMessage = True
210 4c52d5bf Ilias Tsitsimpis
211 fe15cd00 Ilias Tsitsimpis
    def test_000_clients_setup(self):
212 4c52d5bf Ilias Tsitsimpis
        """Initializing astakos/cyclades/pithos clients"""
213 4c52d5bf Ilias Tsitsimpis
        # Update class attributes
214 5bef1f49 Ilias Tsitsimpis
        self.clients.initialize_clients()
215 12ef696f Ilias Tsitsimpis
        self.info("Astakos auth url is %s", self.clients.auth_url)
216 12ef696f Ilias Tsitsimpis
        self.info("Cyclades url is %s", self.clients.compute_url)
217 60a80953 Ilias Tsitsimpis
        self.info("Network url is %s", self.clients.network_url)
218 79a5c431 Ilias Tsitsimpis
        self.info("Pithos url is %s", self.clients.pithos_url)
219 f772699c Ilias Tsitsimpis
        self.info("Image url is %s", self.clients.image_url)
220 5bef1f49 Ilias Tsitsimpis
221 5bef1f49 Ilias Tsitsimpis
        self.quotas = self._get_quotas()
222 3e5bbd85 Ilias Tsitsimpis
        self.info("  Disk usage is %s bytes",
223 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.disk']['usage'])
224 5bef1f49 Ilias Tsitsimpis
        self.info("  VM usage is %s",
225 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.vm']['usage'])
226 3e5bbd85 Ilias Tsitsimpis
        self.info("  DiskSpace usage is %s bytes",
227 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['pithos.diskspace']['usage'])
228 3e5bbd85 Ilias Tsitsimpis
        self.info("  Ram usage is %s bytes",
229 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.ram']['usage'])
230 60a80953 Ilias Tsitsimpis
        self.info("  Floating IPs usage is %s",
231 60a80953 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.floating_ip']['usage'])
232 5bef1f49 Ilias Tsitsimpis
        self.info("  CPU usage is %s",
233 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.cpu']['usage'])
234 5bef1f49 Ilias Tsitsimpis
        self.info("  Network usage is %s",
235 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.network.private']['usage'])
236 f772699c Ilias Tsitsimpis
237 08f1780b Ilias Tsitsimpis
    def _run_tests(self, tcases):
238 08f1780b Ilias Tsitsimpis
        """Run some generated testcases"""
239 08f1780b Ilias Tsitsimpis
        global success  # Using global. pylint: disable-msg=C0103,W0603,W0602
240 08f1780b Ilias Tsitsimpis
241 08f1780b Ilias Tsitsimpis
        for tcase in tcases:
242 08f1780b Ilias Tsitsimpis
            self.info("Running testsuite %s", tcase.__name__)
243 08f1780b Ilias Tsitsimpis
            success = run_test(tcase) and success
244 08f1780b Ilias Tsitsimpis
            if self.failfast and not success:
245 08f1780b Ilias Tsitsimpis
                break
246 08f1780b Ilias Tsitsimpis
247 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
248 6f2b9836 Ilias Tsitsimpis
    # Loggers helper functions
249 4c52d5bf Ilias Tsitsimpis
    def log(self, msg, *args):
250 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
251 4c52d5bf Ilias Tsitsimpis
        logger.log(self.suite_name, msg, *args)
252 4c52d5bf Ilias Tsitsimpis
253 4c52d5bf Ilias Tsitsimpis
    def info(self, msg, *args):
254 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
255 4c52d5bf Ilias Tsitsimpis
        logger.info(self.suite_name, msg, *args)
256 4c52d5bf Ilias Tsitsimpis
257 4c52d5bf Ilias Tsitsimpis
    def debug(self, msg, *args):
258 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
259 4c52d5bf Ilias Tsitsimpis
        logger.debug(self.suite_name, msg, *args)
260 4c52d5bf Ilias Tsitsimpis
261 4c52d5bf Ilias Tsitsimpis
    def warning(self, msg, *args):
262 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
263 4c52d5bf Ilias Tsitsimpis
        logger.warning(self.suite_name, msg, *args)
264 4c52d5bf Ilias Tsitsimpis
265 4c52d5bf Ilias Tsitsimpis
    def error(self, msg, *args):
266 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
267 4c52d5bf Ilias Tsitsimpis
        logger.error(self.suite_name, msg, *args)
268 4c52d5bf Ilias Tsitsimpis
269 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
270 6f2b9836 Ilias Tsitsimpis
    # Helper functions that every testsuite may need
271 6f2b9836 Ilias Tsitsimpis
    def _get_uuid(self):
272 6f2b9836 Ilias Tsitsimpis
        """Get our uuid"""
273 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
274 6f2b9836 Ilias Tsitsimpis
        uuid = authenticate['access']['user']['id']
275 6f2b9836 Ilias Tsitsimpis
        self.info("User's uuid is %s", uuid)
276 6f2b9836 Ilias Tsitsimpis
        return uuid
277 6f2b9836 Ilias Tsitsimpis
278 6f2b9836 Ilias Tsitsimpis
    def _get_username(self):
279 6f2b9836 Ilias Tsitsimpis
        """Get our User Name"""
280 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
281 6f2b9836 Ilias Tsitsimpis
        username = authenticate['access']['user']['name']
282 6f2b9836 Ilias Tsitsimpis
        self.info("User's name is %s", username)
283 6f2b9836 Ilias Tsitsimpis
        return username
284 6f2b9836 Ilias Tsitsimpis
285 f772699c Ilias Tsitsimpis
    def _create_tmp_directory(self):
286 24d1788b Ilias Tsitsimpis
        """Create a tmp directory"""
287 24d1788b Ilias Tsitsimpis
        temp_dir = tempfile.mkdtemp(dir=self.temp_directory)
288 f772699c Ilias Tsitsimpis
        self.info("Temp directory %s created", temp_dir)
289 f772699c Ilias Tsitsimpis
        return temp_dir
290 f772699c Ilias Tsitsimpis
291 f772699c Ilias Tsitsimpis
    def _remove_tmp_directory(self, tmp_dir):
292 f772699c Ilias Tsitsimpis
        """Remove a tmp directory"""
293 f772699c Ilias Tsitsimpis
        try:
294 f772699c Ilias Tsitsimpis
            shutil.rmtree(tmp_dir)
295 f772699c Ilias Tsitsimpis
            self.info("Temp directory %s deleted", tmp_dir)
296 f772699c Ilias Tsitsimpis
        except OSError:
297 f772699c Ilias Tsitsimpis
            pass
298 f772699c Ilias Tsitsimpis
299 f772699c Ilias Tsitsimpis
    def _get_uuid_of_system_user(self):
300 f772699c Ilias Tsitsimpis
        """Get the uuid of the system user
301 f772699c Ilias Tsitsimpis

302 f772699c Ilias Tsitsimpis
        This is the user that upload the 'official' images.
303 f772699c Ilias Tsitsimpis

304 f772699c Ilias Tsitsimpis
        """
305 f772699c Ilias Tsitsimpis
        self.info("Getting the uuid of the system user")
306 f772699c Ilias Tsitsimpis
        system_users = None
307 f772699c Ilias Tsitsimpis
        if self.system_user is not None:
308 f772699c Ilias Tsitsimpis
            parsed_su = parse_typed_option(self.system_user)
309 f772699c Ilias Tsitsimpis
            if parsed_su is None:
310 f772699c Ilias Tsitsimpis
                msg = "Invalid system-user format: %s. Must be [id|name]:.+"
311 f772699c Ilias Tsitsimpis
                self.warning(msg, self.system_user)
312 f772699c Ilias Tsitsimpis
            else:
313 f772699c Ilias Tsitsimpis
                su_type, su_value = parsed_su
314 f772699c Ilias Tsitsimpis
                if su_type == "name":
315 f772699c Ilias Tsitsimpis
                    system_users = [su_value]
316 f772699c Ilias Tsitsimpis
                elif su_type == "id":
317 f772699c Ilias Tsitsimpis
                    self.info("System user's uuid is %s", su_value)
318 f772699c Ilias Tsitsimpis
                    return su_value
319 f772699c Ilias Tsitsimpis
                else:
320 f772699c Ilias Tsitsimpis
                    self.error("Unrecognized system-user type %s", su_type)
321 f772699c Ilias Tsitsimpis
                    self.fail("Unrecognized system-user type")
322 f772699c Ilias Tsitsimpis
323 f772699c Ilias Tsitsimpis
        if system_users is None:
324 f772699c Ilias Tsitsimpis
            system_users = SYSTEM_USERS
325 f772699c Ilias Tsitsimpis
326 f772699c Ilias Tsitsimpis
        uuids = self.clients.astakos.usernames2uuids(system_users)
327 f772699c Ilias Tsitsimpis
        for su_name in system_users:
328 f772699c Ilias Tsitsimpis
            self.info("Trying username %s", su_name)
329 f772699c Ilias Tsitsimpis
            if su_name in uuids:
330 f772699c Ilias Tsitsimpis
                self.info("System user's uuid is %s", uuids[su_name])
331 f772699c Ilias Tsitsimpis
                return uuids[su_name]
332 f772699c Ilias Tsitsimpis
333 f772699c Ilias Tsitsimpis
        self.warning("No system user found")
334 f772699c Ilias Tsitsimpis
        return None
335 f772699c Ilias Tsitsimpis
336 6c78720b Ilias Tsitsimpis
    def _skip_if(self, condition, msg):
337 6c78720b Ilias Tsitsimpis
        """Skip tests"""
338 6c78720b Ilias Tsitsimpis
        if condition:
339 6c78720b Ilias Tsitsimpis
            self.info("Test skipped: %s" % msg)
340 6c78720b Ilias Tsitsimpis
            self.skipTest(msg)
341 6c78720b Ilias Tsitsimpis
342 f772699c Ilias Tsitsimpis
    # ----------------------------------
343 f772699c Ilias Tsitsimpis
    # Flavors
344 fe15cd00 Ilias Tsitsimpis
    def _get_list_of_flavors(self, detail=False):
345 fe15cd00 Ilias Tsitsimpis
        """Get (detailed) list of flavors"""
346 fe15cd00 Ilias Tsitsimpis
        if detail:
347 fe15cd00 Ilias Tsitsimpis
            self.info("Getting detailed list of flavors")
348 fe15cd00 Ilias Tsitsimpis
        else:
349 fe15cd00 Ilias Tsitsimpis
            self.info("Getting simple list of flavors")
350 fe15cd00 Ilias Tsitsimpis
        flavors = self.clients.compute.list_flavors(detail=detail)
351 fe15cd00 Ilias Tsitsimpis
        return flavors
352 fe15cd00 Ilias Tsitsimpis
353 6c78720b Ilias Tsitsimpis
    def _find_flavors(self, patterns, flavors=None):
354 6c78720b Ilias Tsitsimpis
        """Find a list of suitable flavors to use
355 6c78720b Ilias Tsitsimpis

356 6c78720b Ilias Tsitsimpis
        The patterns is a list of `typed_options'. A list of all flavors
357 6c78720b Ilias Tsitsimpis
        matching this patterns will be returned.
358 6c78720b Ilias Tsitsimpis

359 6c78720b Ilias Tsitsimpis
        """
360 6c78720b Ilias Tsitsimpis
        if flavors is None:
361 6c78720b Ilias Tsitsimpis
            flavors = self._get_list_of_flavors(detail=True)
362 6c78720b Ilias Tsitsimpis
363 6c78720b Ilias Tsitsimpis
        ret_flavors = []
364 6c78720b Ilias Tsitsimpis
        for ptrn in patterns:
365 6c78720b Ilias Tsitsimpis
            parsed_ptrn = parse_typed_option(ptrn)
366 6c78720b Ilias Tsitsimpis
            if parsed_ptrn is None:
367 6c78720b Ilias Tsitsimpis
                msg = "Invalid flavor format: %s. Must be [id|name]:.+"
368 6c78720b Ilias Tsitsimpis
                self.warning(msg, ptrn)
369 6c78720b Ilias Tsitsimpis
                continue
370 6c78720b Ilias Tsitsimpis
            flv_type, flv_value = parsed_ptrn
371 6c78720b Ilias Tsitsimpis
            if flv_type == "name":
372 6c78720b Ilias Tsitsimpis
                # Filter flavor by name
373 6c78720b Ilias Tsitsimpis
                msg = "Trying to find a flavor with name %s"
374 6c78720b Ilias Tsitsimpis
                self.info(msg, flv_value)
375 6c78720b Ilias Tsitsimpis
                filtered_flvs = \
376 6c78720b Ilias Tsitsimpis
                    [f for f in flavors if
377 6c78720b Ilias Tsitsimpis
                     re.search(flv_value, f['name'], flags=re.I) is not None]
378 6c78720b Ilias Tsitsimpis
            elif flv_type == "id":
379 6c78720b Ilias Tsitsimpis
                # Filter flavors by id
380 6c78720b Ilias Tsitsimpis
                msg = "Trying to find a flavor with id %s"
381 6c78720b Ilias Tsitsimpis
                self.info(msg, flv_value)
382 6c78720b Ilias Tsitsimpis
                filtered_flvs = \
383 6c78720b Ilias Tsitsimpis
                    [f for f in flavors if str(f['id']) == flv_value]
384 6c78720b Ilias Tsitsimpis
            else:
385 6c78720b Ilias Tsitsimpis
                self.error("Unrecognized flavor type %s", flv_type)
386 6c78720b Ilias Tsitsimpis
                self.fail("Unrecognized flavor type")
387 6c78720b Ilias Tsitsimpis
388 6c78720b Ilias Tsitsimpis
            # Append and continue
389 6c78720b Ilias Tsitsimpis
            ret_flavors.extend(filtered_flvs)
390 6c78720b Ilias Tsitsimpis
391 6c78720b Ilias Tsitsimpis
        self.assertGreater(len(ret_flavors), 0,
392 6c78720b Ilias Tsitsimpis
                           "No matching flavors found")
393 6c78720b Ilias Tsitsimpis
        return ret_flavors
394 6c78720b Ilias Tsitsimpis
395 f772699c Ilias Tsitsimpis
    # ----------------------------------
396 f772699c Ilias Tsitsimpis
    # Images
397 f772699c Ilias Tsitsimpis
    def _get_list_of_images(self, detail=False):
398 f772699c Ilias Tsitsimpis
        """Get (detailed) list of images"""
399 f772699c Ilias Tsitsimpis
        if detail:
400 f772699c Ilias Tsitsimpis
            self.info("Getting detailed list of images")
401 f772699c Ilias Tsitsimpis
        else:
402 f772699c Ilias Tsitsimpis
            self.info("Getting simple list of images")
403 f772699c Ilias Tsitsimpis
        images = self.clients.image.list_public(detail=detail)
404 f772699c Ilias Tsitsimpis
        # Remove images registered by burnin
405 f772699c Ilias Tsitsimpis
        images = [img for img in images
406 f772699c Ilias Tsitsimpis
                  if not img['name'].startswith(SNF_TEST_PREFIX)]
407 f772699c Ilias Tsitsimpis
        return images
408 f772699c Ilias Tsitsimpis
409 f772699c Ilias Tsitsimpis
    def _get_list_of_sys_images(self, images=None):
410 f772699c Ilias Tsitsimpis
        """Get (detailed) list of images registered by system user or by me"""
411 f772699c Ilias Tsitsimpis
        self.info("Getting list of images registered by system user or by me")
412 f772699c Ilias Tsitsimpis
        if images is None:
413 f772699c Ilias Tsitsimpis
            images = self._get_list_of_images(detail=True)
414 f772699c Ilias Tsitsimpis
415 f772699c Ilias Tsitsimpis
        su_uuid = self._get_uuid_of_system_user()
416 f772699c Ilias Tsitsimpis
        my_uuid = self._get_uuid()
417 f772699c Ilias Tsitsimpis
        ret_images = [i for i in images
418 f772699c Ilias Tsitsimpis
                      if i['owner'] == su_uuid or i['owner'] == my_uuid]
419 f772699c Ilias Tsitsimpis
420 f772699c Ilias Tsitsimpis
        return ret_images
421 f772699c Ilias Tsitsimpis
422 6c78720b Ilias Tsitsimpis
    def _find_images(self, patterns, images=None):
423 6c78720b Ilias Tsitsimpis
        """Find a list of suitable images to use
424 f772699c Ilias Tsitsimpis

425 6c78720b Ilias Tsitsimpis
        The patterns is a list of `typed_options'. A list of all images
426 6c78720b Ilias Tsitsimpis
        matching this patterns will be returned.
427 f772699c Ilias Tsitsimpis

428 f772699c Ilias Tsitsimpis
        """
429 f772699c Ilias Tsitsimpis
        if images is None:
430 f772699c Ilias Tsitsimpis
            images = self._get_list_of_sys_images()
431 f772699c Ilias Tsitsimpis
432 6c78720b Ilias Tsitsimpis
        ret_images = []
433 f772699c Ilias Tsitsimpis
        for ptrn in patterns:
434 f772699c Ilias Tsitsimpis
            parsed_ptrn = parse_typed_option(ptrn)
435 f772699c Ilias Tsitsimpis
            if parsed_ptrn is None:
436 f772699c Ilias Tsitsimpis
                msg = "Invalid image format: %s. Must be [id|name]:.+"
437 f772699c Ilias Tsitsimpis
                self.warning(msg, ptrn)
438 f772699c Ilias Tsitsimpis
                continue
439 f772699c Ilias Tsitsimpis
            img_type, img_value = parsed_ptrn
440 f772699c Ilias Tsitsimpis
            if img_type == "name":
441 f772699c Ilias Tsitsimpis
                # Filter image by name
442 f772699c Ilias Tsitsimpis
                msg = "Trying to find an image with name %s"
443 f772699c Ilias Tsitsimpis
                self.info(msg, img_value)
444 f772699c Ilias Tsitsimpis
                filtered_imgs = \
445 f772699c Ilias Tsitsimpis
                    [i for i in images if
446 f772699c Ilias Tsitsimpis
                     re.search(img_value, i['name'], flags=re.I) is not None]
447 f772699c Ilias Tsitsimpis
            elif img_type == "id":
448 f772699c Ilias Tsitsimpis
                # Filter images by id
449 f772699c Ilias Tsitsimpis
                msg = "Trying to find an image with id %s"
450 f772699c Ilias Tsitsimpis
                self.info(msg, img_value)
451 f772699c Ilias Tsitsimpis
                filtered_imgs = \
452 f772699c Ilias Tsitsimpis
                    [i for i in images if
453 f772699c Ilias Tsitsimpis
                     i['id'].lower() == img_value.lower()]
454 f772699c Ilias Tsitsimpis
            else:
455 f772699c Ilias Tsitsimpis
                self.error("Unrecognized image type %s", img_type)
456 f772699c Ilias Tsitsimpis
                self.fail("Unrecognized image type")
457 f772699c Ilias Tsitsimpis
458 6c78720b Ilias Tsitsimpis
            # Append and continue
459 6c78720b Ilias Tsitsimpis
            ret_images.extend(filtered_imgs)
460 f772699c Ilias Tsitsimpis
461 6c78720b Ilias Tsitsimpis
        self.assertGreater(len(ret_images), 0,
462 6c78720b Ilias Tsitsimpis
                           "No matching images found")
463 6c78720b Ilias Tsitsimpis
        return ret_images
464 f772699c Ilias Tsitsimpis
465 f772699c Ilias Tsitsimpis
    # ----------------------------------
466 f772699c Ilias Tsitsimpis
    # Pithos
467 79a5c431 Ilias Tsitsimpis
    def _set_pithos_account(self, account):
468 f772699c Ilias Tsitsimpis
        """Set the Pithos account"""
469 79a5c431 Ilias Tsitsimpis
        assert account, "No pithos account was given"
470 79a5c431 Ilias Tsitsimpis
471 f772699c Ilias Tsitsimpis
        self.info("Setting Pithos account to %s", account)
472 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.account = account
473 79a5c431 Ilias Tsitsimpis
474 f772699c Ilias Tsitsimpis
    def _set_pithos_container(self, container):
475 f772699c Ilias Tsitsimpis
        """Set the Pithos container"""
476 f772699c Ilias Tsitsimpis
        assert container, "No pithos container was given"
477 f772699c Ilias Tsitsimpis
478 f772699c Ilias Tsitsimpis
        self.info("Setting Pithos container to %s", container)
479 f772699c Ilias Tsitsimpis
        self.clients.pithos.container = container
480 f772699c Ilias Tsitsimpis
481 79a5c431 Ilias Tsitsimpis
    def _get_list_of_containers(self, account=None):
482 79a5c431 Ilias Tsitsimpis
        """Get list of containers"""
483 79a5c431 Ilias Tsitsimpis
        if account is not None:
484 79a5c431 Ilias Tsitsimpis
            self._set_pithos_account(account)
485 79a5c431 Ilias Tsitsimpis
        self.info("Getting list of containers")
486 79a5c431 Ilias Tsitsimpis
        return self.clients.pithos.list_containers()
487 79a5c431 Ilias Tsitsimpis
488 79a5c431 Ilias Tsitsimpis
    def _create_pithos_container(self, container):
489 79a5c431 Ilias Tsitsimpis
        """Create a pithos container
490 79a5c431 Ilias Tsitsimpis

491 79a5c431 Ilias Tsitsimpis
        If the container exists, nothing will happen
492 79a5c431 Ilias Tsitsimpis

493 79a5c431 Ilias Tsitsimpis
        """
494 79a5c431 Ilias Tsitsimpis
        assert container, "No pithos container was given"
495 79a5c431 Ilias Tsitsimpis
496 79a5c431 Ilias Tsitsimpis
        self.info("Creating pithos container %s", container)
497 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.container = container
498 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.container_put()
499 79a5c431 Ilias Tsitsimpis
500 5bef1f49 Ilias Tsitsimpis
    # ----------------------------------
501 5bef1f49 Ilias Tsitsimpis
    # Quotas
502 5bef1f49 Ilias Tsitsimpis
    def _get_quotas(self):
503 5bef1f49 Ilias Tsitsimpis
        """Get quotas"""
504 3e5bbd85 Ilias Tsitsimpis
        self.info("Getting quotas")
505 5bef1f49 Ilias Tsitsimpis
        astakos_client = self.clients.astakos.get_client()
506 5bef1f49 Ilias Tsitsimpis
        return astakos_client.get_quotas()
507 5bef1f49 Ilias Tsitsimpis
508 3e5bbd85 Ilias Tsitsimpis
    # Invalid argument name. pylint: disable-msg=C0103
509 3e5bbd85 Ilias Tsitsimpis
    # Too many arguments. pylint: disable-msg=R0913
510 3e5bbd85 Ilias Tsitsimpis
    def _check_quotas(self, disk=None, vm=None, diskspace=None,
511 60a80953 Ilias Tsitsimpis
                      ram=None, ip=None, cpu=None, network=None):
512 3e5bbd85 Ilias Tsitsimpis
        """Check that quotas' changes are consistent"""
513 3e5bbd85 Ilias Tsitsimpis
        assert any(v is None for v in
514 60a80953 Ilias Tsitsimpis
                   [disk, vm, diskspace, ram, ip, cpu, network]), \
515 3e5bbd85 Ilias Tsitsimpis
            "_check_quotas require arguments"
516 3e5bbd85 Ilias Tsitsimpis
517 3e5bbd85 Ilias Tsitsimpis
        self.info("Check that quotas' changes are consistent")
518 3e5bbd85 Ilias Tsitsimpis
        old_quotas = self.quotas
519 3e5bbd85 Ilias Tsitsimpis
        new_quotas = self._get_quotas()
520 3e5bbd85 Ilias Tsitsimpis
        self.quotas = new_quotas
521 3e5bbd85 Ilias Tsitsimpis
522 3e5bbd85 Ilias Tsitsimpis
        # Check Disk usage
523 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
524 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.disk', disk)
525 3e5bbd85 Ilias Tsitsimpis
        # Check VM usage
526 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
527 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.vm', vm)
528 3e5bbd85 Ilias Tsitsimpis
        # Check DiskSpace usage
529 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
530 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'pithos.diskspace', diskspace)
531 3e5bbd85 Ilias Tsitsimpis
        # Check Ram usage
532 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
533 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.ram', ram)
534 60a80953 Ilias Tsitsimpis
        # Check Floating IPs usage
535 60a80953 Ilias Tsitsimpis
        self._check_quotas_aux(
536 60a80953 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.floating_ip', ip)
537 3e5bbd85 Ilias Tsitsimpis
        # Check CPU usage
538 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
539 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.cpu', cpu)
540 3e5bbd85 Ilias Tsitsimpis
        # Check Network usage
541 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
542 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.network.private', network)
543 3e5bbd85 Ilias Tsitsimpis
544 3e5bbd85 Ilias Tsitsimpis
    def _check_quotas_aux(self, old_quotas, new_quotas, resource, value):
545 3e5bbd85 Ilias Tsitsimpis
        """Auxiliary function for _check_quotas"""
546 3e5bbd85 Ilias Tsitsimpis
        old_value = old_quotas['system'][resource]['usage']
547 3e5bbd85 Ilias Tsitsimpis
        new_value = new_quotas['system'][resource]['usage']
548 3e5bbd85 Ilias Tsitsimpis
        if value is not None:
549 3e5bbd85 Ilias Tsitsimpis
            assert isinstance(value, int), \
550 3e5bbd85 Ilias Tsitsimpis
                "%s value has to be integer" % resource
551 3e5bbd85 Ilias Tsitsimpis
            old_value += value
552 3e5bbd85 Ilias Tsitsimpis
        self.assertEqual(old_value, new_value,
553 3e5bbd85 Ilias Tsitsimpis
                         "%s quotas don't match" % resource)
554 3e5bbd85 Ilias Tsitsimpis
555 4c52d5bf Ilias Tsitsimpis
556 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
557 12ef696f Ilias Tsitsimpis
# Initialize Burnin
558 8c67f82e Ilias Tsitsimpis
def initialize(opts, testsuites, stale_testsuites):
559 12ef696f Ilias Tsitsimpis
    """Initalize burnin
560 12ef696f Ilias Tsitsimpis

561 12ef696f Ilias Tsitsimpis
    Initialize our logger and burnin state
562 12ef696f Ilias Tsitsimpis

563 12ef696f Ilias Tsitsimpis
    """
564 12ef696f Ilias Tsitsimpis
    # Initialize logger
565 12ef696f Ilias Tsitsimpis
    global logger  # Using global statement. pylint: disable-msg=C0103,W0603
566 2afd10bf Ilias Tsitsimpis
    curr_time = datetime.datetime.now()
567 12ef696f Ilias Tsitsimpis
    logger = Log(opts.log_folder, verbose=opts.verbose,
568 0c1833c8 Ilias Tsitsimpis
                 use_colors=opts.use_colors, in_parallel=False,
569 ee89df69 Ilias Tsitsimpis
                 log_level=opts.log_level, curr_time=curr_time)
570 12ef696f Ilias Tsitsimpis
571 12ef696f Ilias Tsitsimpis
    # Initialize clients
572 12ef696f Ilias Tsitsimpis
    Clients.auth_url = opts.auth_url
573 12ef696f Ilias Tsitsimpis
    Clients.token = opts.token
574 12ef696f Ilias Tsitsimpis
575 12ef696f Ilias Tsitsimpis
    # Pass the rest options to BurninTests
576 79a5c431 Ilias Tsitsimpis
    BurninTests.use_ipv6 = opts.use_ipv6
577 79a5c431 Ilias Tsitsimpis
    BurninTests.action_timeout = opts.action_timeout
578 79a5c431 Ilias Tsitsimpis
    BurninTests.action_warning = opts.action_warning
579 79a5c431 Ilias Tsitsimpis
    BurninTests.query_interval = opts.query_interval
580 f772699c Ilias Tsitsimpis
    BurninTests.system_user = opts.system_user
581 6c78720b Ilias Tsitsimpis
    BurninTests.flavors = opts.flavors
582 6c78720b Ilias Tsitsimpis
    BurninTests.images = opts.images
583 8c67f82e Ilias Tsitsimpis
    BurninTests.delete_stale = opts.delete_stale
584 24d1788b Ilias Tsitsimpis
    BurninTests.temp_directory = opts.temp_directory
585 2c60bfa6 Ilias Tsitsimpis
    BurninTests.failfast = opts.failfast
586 79a5c431 Ilias Tsitsimpis
    BurninTests.run_id = SNF_TEST_PREFIX + \
587 2afd10bf Ilias Tsitsimpis
        datetime.datetime.strftime(curr_time, "%Y%m%d%H%M%S")
588 12ef696f Ilias Tsitsimpis
589 12ef696f Ilias Tsitsimpis
    # Choose tests to run
590 8c67f82e Ilias Tsitsimpis
    if opts.show_stale:
591 8c67f82e Ilias Tsitsimpis
        # We will run the stale_testsuites
592 3eaf0ec5 Ilias Tsitsimpis
        return (stale_testsuites, True)
593 8c67f82e Ilias Tsitsimpis
594 12ef696f Ilias Tsitsimpis
    if opts.tests != "all":
595 12ef696f Ilias Tsitsimpis
        testsuites = opts.tests
596 12ef696f Ilias Tsitsimpis
    if opts.exclude_tests is not None:
597 12ef696f Ilias Tsitsimpis
        testsuites = [tsuite for tsuite in testsuites
598 12ef696f Ilias Tsitsimpis
                      if tsuite not in opts.exclude_tests]
599 12ef696f Ilias Tsitsimpis
600 3eaf0ec5 Ilias Tsitsimpis
    return (testsuites, opts.failfast)
601 12ef696f Ilias Tsitsimpis
602 12ef696f Ilias Tsitsimpis
603 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
604 12ef696f Ilias Tsitsimpis
# Run Burnin
605 ee89df69 Ilias Tsitsimpis
def run_burnin(testsuites, failfast=False):
606 12ef696f Ilias Tsitsimpis
    """Run burnin testsuites"""
607 08f1780b Ilias Tsitsimpis
    # Using global. pylint: disable-msg=C0103,W0603,W0602
608 08f1780b Ilias Tsitsimpis
    global logger, success
609 12ef696f Ilias Tsitsimpis
610 12ef696f Ilias Tsitsimpis
    success = True
611 08f1780b Ilias Tsitsimpis
    run_tests(testsuites, failfast=failfast)
612 12ef696f Ilias Tsitsimpis
613 12ef696f Ilias Tsitsimpis
    # Clean up our logger
614 12ef696f Ilias Tsitsimpis
    del(logger)
615 12ef696f Ilias Tsitsimpis
616 12ef696f Ilias Tsitsimpis
    # Return
617 12ef696f Ilias Tsitsimpis
    return 0 if success else 1
618 12ef696f Ilias Tsitsimpis
619 12ef696f Ilias Tsitsimpis
620 08f1780b Ilias Tsitsimpis
def run_tests(tcases, failfast=False):
621 08f1780b Ilias Tsitsimpis
    """Run some testcases"""
622 08f1780b Ilias Tsitsimpis
    global success  # Using global. pylint: disable-msg=C0103,W0603,W0602
623 08f1780b Ilias Tsitsimpis
624 08f1780b Ilias Tsitsimpis
    for tcase in tcases:
625 08f1780b Ilias Tsitsimpis
        was_success = run_test(tcase)
626 08f1780b Ilias Tsitsimpis
        success = success and was_success
627 08f1780b Ilias Tsitsimpis
        if failfast and not success:
628 08f1780b Ilias Tsitsimpis
            break
629 08f1780b Ilias Tsitsimpis
630 08f1780b Ilias Tsitsimpis
631 6c78720b Ilias Tsitsimpis
def run_test(tcase):
632 6c78720b Ilias Tsitsimpis
    """Run a testcase"""
633 6c78720b Ilias Tsitsimpis
    tsuite = unittest.TestLoader().loadTestsFromTestCase(tcase)
634 6c78720b Ilias Tsitsimpis
    results = tsuite.run(BurninTestResult())
635 6c78720b Ilias Tsitsimpis
636 6c78720b Ilias Tsitsimpis
    return was_successful(tcase.__name__, results.wasSuccessful())
637 6c78720b Ilias Tsitsimpis
638 6c78720b Ilias Tsitsimpis
639 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
640 4c52d5bf Ilias Tsitsimpis
# Helper functions
641 08f1780b Ilias Tsitsimpis
def was_successful(tsuite, successful):
642 4c52d5bf Ilias Tsitsimpis
    """Handle whether a testsuite was succesful or not"""
643 08f1780b Ilias Tsitsimpis
    if successful:
644 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_success(tsuite)
645 12ef696f Ilias Tsitsimpis
        return True
646 4c52d5bf Ilias Tsitsimpis
    else:
647 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_failure(tsuite)
648 12ef696f Ilias Tsitsimpis
        return False
649 f772699c Ilias Tsitsimpis
650 f772699c Ilias Tsitsimpis
651 f772699c Ilias Tsitsimpis
def parse_typed_option(value):
652 f772699c Ilias Tsitsimpis
    """Parse typed options (flavors and images)
653 f772699c Ilias Tsitsimpis

654 f772699c Ilias Tsitsimpis
    The options are in the form 'id:123-345' or 'name:^Debian Base$'
655 f772699c Ilias Tsitsimpis

656 f772699c Ilias Tsitsimpis
    """
657 f772699c Ilias Tsitsimpis
    try:
658 f772699c Ilias Tsitsimpis
        [type_, val] = value.strip().split(':')
659 f772699c Ilias Tsitsimpis
        if type_ not in ["id", "name"]:
660 f772699c Ilias Tsitsimpis
            raise ValueError
661 f772699c Ilias Tsitsimpis
        return type_, val
662 f772699c Ilias Tsitsimpis
    except ValueError:
663 f772699c Ilias Tsitsimpis
        return None