Statistics
| Branch: | Tag: | Revision:

root / snf-tools / synnefo_tools / burnin / common.py @ 79a5c431

History | View | Annotate | Download (11 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 4c52d5bf Ilias Tsitsimpis
import sys
40 6f2b9836 Ilias Tsitsimpis
import datetime
41 4c52d5bf Ilias Tsitsimpis
import traceback
42 4c52d5bf Ilias Tsitsimpis
# Use backported unittest functionality if Python < 2.7
43 4c52d5bf Ilias Tsitsimpis
try:
44 4c52d5bf Ilias Tsitsimpis
    import unittest2 as unittest
45 4c52d5bf Ilias Tsitsimpis
except ImportError:
46 4c52d5bf Ilias Tsitsimpis
    if sys.version_info < (2, 7):
47 4c52d5bf Ilias Tsitsimpis
        raise Exception("The unittest2 package is required for Python < 2.7")
48 4c52d5bf Ilias Tsitsimpis
    import unittest
49 4c52d5bf Ilias Tsitsimpis
50 4c52d5bf Ilias Tsitsimpis
from kamaki.clients.astakos import AstakosClient
51 4c52d5bf Ilias Tsitsimpis
from kamaki.clients.compute import ComputeClient
52 79a5c431 Ilias Tsitsimpis
from kamaki.clients.pithos import PithosClient
53 4c52d5bf Ilias Tsitsimpis
54 12ef696f Ilias Tsitsimpis
from synnefo_tools.burnin.logger import Log
55 4c52d5bf Ilias Tsitsimpis
56 4c52d5bf Ilias Tsitsimpis
57 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
58 4c52d5bf Ilias Tsitsimpis
# Global variables
59 4c52d5bf Ilias Tsitsimpis
logger = None  # Invalid constant name. pylint: disable-msg=C0103
60 12ef696f Ilias Tsitsimpis
SNF_TEST_PREFIX = "snf-test-"
61 4c52d5bf Ilias Tsitsimpis
CONNECTION_RETRY_LIMIT = 2
62 4c52d5bf Ilias Tsitsimpis
63 4c52d5bf Ilias Tsitsimpis
64 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
65 4c52d5bf Ilias Tsitsimpis
# BurninTestResult class
66 4c52d5bf Ilias Tsitsimpis
class BurninTestResult(unittest.TestResult):
67 4c52d5bf Ilias Tsitsimpis
    """Modify the TextTestResult class"""
68 4c52d5bf Ilias Tsitsimpis
    def __init__(self):
69 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).__init__()
70 4c52d5bf Ilias Tsitsimpis
71 4c52d5bf Ilias Tsitsimpis
        # Test parameters
72 4c52d5bf Ilias Tsitsimpis
        self.failfast = True
73 4c52d5bf Ilias Tsitsimpis
74 4c52d5bf Ilias Tsitsimpis
    def startTest(self, test):  # noqa
75 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test is about to be run"""
76 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).startTest(test)
77 fe15cd00 Ilias Tsitsimpis
        logger.log(test.__class__.__name__, test.shortDescription())
78 4c52d5bf Ilias Tsitsimpis
79 4c52d5bf Ilias Tsitsimpis
    # Method could be a function. pylint: disable-msg=R0201
80 4c52d5bf Ilias Tsitsimpis
    def _test_failed(self, test, err):
81 4c52d5bf Ilias Tsitsimpis
        """Test failed"""
82 79a5c431 Ilias Tsitsimpis
        # Get class name
83 79a5c431 Ilias Tsitsimpis
        if test.__class__.__name__ == "_ErrorHolder":
84 79a5c431 Ilias Tsitsimpis
            class_name = test.id().split('.')[-1].rstrip(')')
85 79a5c431 Ilias Tsitsimpis
        else:
86 79a5c431 Ilias Tsitsimpis
            class_name = test.__class__.__name__
87 fe15cd00 Ilias Tsitsimpis
        err_msg = str(test) + "... failed (%s)."
88 6f2b9836 Ilias Tsitsimpis
        timestamp = datetime.datetime.strftime(
89 6f2b9836 Ilias Tsitsimpis
            datetime.datetime.now(), "%a %b %d %Y %H:%M:%S")
90 79a5c431 Ilias Tsitsimpis
        logger.error(class_name, err_msg, timestamp)
91 4c52d5bf Ilias Tsitsimpis
        (err_type, err_value, err_trace) = err
92 4c52d5bf Ilias Tsitsimpis
        trcback = traceback.format_exception(err_type, err_value, err_trace)
93 79a5c431 Ilias Tsitsimpis
        logger.info(class_name, trcback)
94 4c52d5bf Ilias Tsitsimpis
95 4c52d5bf Ilias Tsitsimpis
    def addError(self, test, err):  # noqa
96 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test raises an unexpected exception"""
97 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).addError(test, err)
98 4c52d5bf Ilias Tsitsimpis
        self._test_failed(test, err)
99 4c52d5bf Ilias Tsitsimpis
100 4c52d5bf Ilias Tsitsimpis
    def addFailure(self, test, err):  # noqa
101 4c52d5bf Ilias Tsitsimpis
        """Called when the test case test signals a failure"""
102 4c52d5bf Ilias Tsitsimpis
        super(BurninTestResult, self).addFailure(test, err)
103 4c52d5bf Ilias Tsitsimpis
        self._test_failed(test, err)
104 4c52d5bf Ilias Tsitsimpis
105 4c52d5bf Ilias Tsitsimpis
106 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
107 4c52d5bf Ilias Tsitsimpis
# BurninTests class
108 12ef696f Ilias Tsitsimpis
# Too few public methods (0/2). pylint: disable-msg=R0903
109 12ef696f Ilias Tsitsimpis
class Clients(object):
110 12ef696f Ilias Tsitsimpis
    """Our kamaki clients"""
111 12ef696f Ilias Tsitsimpis
    auth_url = None
112 12ef696f Ilias Tsitsimpis
    token = None
113 79a5c431 Ilias Tsitsimpis
    # Astakos
114 12ef696f Ilias Tsitsimpis
    astakos = None
115 12ef696f Ilias Tsitsimpis
    retry = CONNECTION_RETRY_LIMIT
116 79a5c431 Ilias Tsitsimpis
    # Compute
117 12ef696f Ilias Tsitsimpis
    compute = None
118 12ef696f Ilias Tsitsimpis
    compute_url = None
119 79a5c431 Ilias Tsitsimpis
    # Cyclades
120 79a5c431 Ilias Tsitsimpis
    cyclades = None
121 79a5c431 Ilias Tsitsimpis
    # Pithos
122 79a5c431 Ilias Tsitsimpis
    pithos = None
123 79a5c431 Ilias Tsitsimpis
    pithos_url = None
124 12ef696f Ilias Tsitsimpis
125 12ef696f Ilias Tsitsimpis
126 4c52d5bf Ilias Tsitsimpis
# Too many public methods (45/20). pylint: disable-msg=R0904
127 4c52d5bf Ilias Tsitsimpis
class BurninTests(unittest.TestCase):
128 4c52d5bf Ilias Tsitsimpis
    """Common class that all burnin tests should implement"""
129 12ef696f Ilias Tsitsimpis
    clients = Clients()
130 6f2b9836 Ilias Tsitsimpis
    run_id = None
131 79a5c431 Ilias Tsitsimpis
    use_ipv6 = None
132 79a5c431 Ilias Tsitsimpis
    action_timeout = None
133 79a5c431 Ilias Tsitsimpis
    action_warning = None
134 79a5c431 Ilias Tsitsimpis
    query_interval = None
135 12ef696f Ilias Tsitsimpis
136 4c52d5bf Ilias Tsitsimpis
    @classmethod
137 4c52d5bf Ilias Tsitsimpis
    def setUpClass(cls):  # noqa
138 4c52d5bf Ilias Tsitsimpis
        """Initialize BurninTests"""
139 4c52d5bf Ilias Tsitsimpis
        cls.suite_name = cls.__name__
140 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_start(cls.suite_name)
141 4c52d5bf Ilias Tsitsimpis
142 4c52d5bf Ilias Tsitsimpis
        # Set test parameters
143 4c52d5bf Ilias Tsitsimpis
        cls.longMessage = True
144 4c52d5bf Ilias Tsitsimpis
145 fe15cd00 Ilias Tsitsimpis
    def _setattr(self, attr, value):
146 fe15cd00 Ilias Tsitsimpis
        """Used by tests to set an attribute to TestCase
147 fe15cd00 Ilias Tsitsimpis

148 fe15cd00 Ilias Tsitsimpis
        Since each instance of the TestCase will only be used to run a single
149 fe15cd00 Ilias Tsitsimpis
        test method (a new fixture is created for each test) the attributes can
150 fe15cd00 Ilias Tsitsimpis
        not be saved in the class instance. Instead the class itself should be
151 fe15cd00 Ilias Tsitsimpis
        used.
152 fe15cd00 Ilias Tsitsimpis

153 fe15cd00 Ilias Tsitsimpis
        """
154 fe15cd00 Ilias Tsitsimpis
        setattr(self.__class__, attr, value)
155 fe15cd00 Ilias Tsitsimpis
156 fe15cd00 Ilias Tsitsimpis
    def test_000_clients_setup(self):
157 4c52d5bf Ilias Tsitsimpis
        """Initializing astakos/cyclades/pithos clients"""
158 4c52d5bf Ilias Tsitsimpis
        # Update class attributes
159 12ef696f Ilias Tsitsimpis
        self.info("Astakos auth url is %s", self.clients.auth_url)
160 12ef696f Ilias Tsitsimpis
        self.clients.astakos = AstakosClient(
161 12ef696f Ilias Tsitsimpis
            self.clients.auth_url, self.clients.token)
162 12ef696f Ilias Tsitsimpis
        self.clients.astakos.CONNECTION_RETRY_LIMIT = self.clients.retry
163 12ef696f Ilias Tsitsimpis
164 12ef696f Ilias Tsitsimpis
        self.clients.compute_url = \
165 12ef696f Ilias Tsitsimpis
            self.clients.astakos.get_service_endpoints('compute')['publicURL']
166 12ef696f Ilias Tsitsimpis
        self.info("Cyclades url is %s", self.clients.compute_url)
167 12ef696f Ilias Tsitsimpis
        self.clients.compute = ComputeClient(
168 12ef696f Ilias Tsitsimpis
            self.clients.compute_url, self.clients.token)
169 12ef696f Ilias Tsitsimpis
        self.clients.compute.CONNECTION_RETRY_LIMIT = self.clients.retry
170 4c52d5bf Ilias Tsitsimpis
171 79a5c431 Ilias Tsitsimpis
        self.clients.pithos_url = self.clients.astakos.\
172 79a5c431 Ilias Tsitsimpis
            get_service_endpoints('object-store')['publicURL']
173 79a5c431 Ilias Tsitsimpis
        self.info("Pithos url is %s", self.clients.pithos_url)
174 79a5c431 Ilias Tsitsimpis
        self.clients.pithos = PithosClient(
175 79a5c431 Ilias Tsitsimpis
            self.clients.pithos_url, self.clients.token)
176 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.CONNECTION_RETRY_LIMIT = self.clients.retry
177 79a5c431 Ilias Tsitsimpis
178 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
179 6f2b9836 Ilias Tsitsimpis
    # Loggers helper functions
180 4c52d5bf Ilias Tsitsimpis
    def log(self, msg, *args):
181 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
182 4c52d5bf Ilias Tsitsimpis
        logger.log(self.suite_name, msg, *args)
183 4c52d5bf Ilias Tsitsimpis
184 4c52d5bf Ilias Tsitsimpis
    def info(self, msg, *args):
185 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
186 4c52d5bf Ilias Tsitsimpis
        logger.info(self.suite_name, msg, *args)
187 4c52d5bf Ilias Tsitsimpis
188 4c52d5bf Ilias Tsitsimpis
    def debug(self, msg, *args):
189 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
190 4c52d5bf Ilias Tsitsimpis
        logger.debug(self.suite_name, msg, *args)
191 4c52d5bf Ilias Tsitsimpis
192 4c52d5bf Ilias Tsitsimpis
    def warning(self, msg, *args):
193 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
194 4c52d5bf Ilias Tsitsimpis
        logger.warning(self.suite_name, msg, *args)
195 4c52d5bf Ilias Tsitsimpis
196 4c52d5bf Ilias Tsitsimpis
    def error(self, msg, *args):
197 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
198 4c52d5bf Ilias Tsitsimpis
        logger.error(self.suite_name, msg, *args)
199 4c52d5bf Ilias Tsitsimpis
200 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
201 6f2b9836 Ilias Tsitsimpis
    # Helper functions that every testsuite may need
202 6f2b9836 Ilias Tsitsimpis
    def _get_uuid(self):
203 6f2b9836 Ilias Tsitsimpis
        """Get our uuid"""
204 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
205 6f2b9836 Ilias Tsitsimpis
        uuid = authenticate['access']['user']['id']
206 6f2b9836 Ilias Tsitsimpis
        self.info("User's uuid is %s", uuid)
207 6f2b9836 Ilias Tsitsimpis
        return uuid
208 6f2b9836 Ilias Tsitsimpis
209 6f2b9836 Ilias Tsitsimpis
    def _get_username(self):
210 6f2b9836 Ilias Tsitsimpis
        """Get our User Name"""
211 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
212 6f2b9836 Ilias Tsitsimpis
        username = authenticate['access']['user']['name']
213 6f2b9836 Ilias Tsitsimpis
        self.info("User's name is %s", username)
214 6f2b9836 Ilias Tsitsimpis
        return username
215 6f2b9836 Ilias Tsitsimpis
216 fe15cd00 Ilias Tsitsimpis
    def _get_list_of_flavors(self, detail=False):
217 fe15cd00 Ilias Tsitsimpis
        """Get (detailed) list of flavors"""
218 fe15cd00 Ilias Tsitsimpis
        if detail:
219 fe15cd00 Ilias Tsitsimpis
            self.info("Getting detailed list of flavors")
220 fe15cd00 Ilias Tsitsimpis
        else:
221 fe15cd00 Ilias Tsitsimpis
            self.info("Getting simple list of flavors")
222 fe15cd00 Ilias Tsitsimpis
        flavors = self.clients.compute.list_flavors(detail=detail)
223 fe15cd00 Ilias Tsitsimpis
        return flavors
224 fe15cd00 Ilias Tsitsimpis
225 79a5c431 Ilias Tsitsimpis
    def _set_pithos_account(self, account):
226 79a5c431 Ilias Tsitsimpis
        """Set the pithos account"""
227 79a5c431 Ilias Tsitsimpis
        assert account, "No pithos account was given"
228 79a5c431 Ilias Tsitsimpis
229 79a5c431 Ilias Tsitsimpis
        self.info("Setting pithos account to %s", account)
230 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.account = account
231 79a5c431 Ilias Tsitsimpis
232 79a5c431 Ilias Tsitsimpis
    def _get_list_of_containers(self, account=None):
233 79a5c431 Ilias Tsitsimpis
        """Get list of containers"""
234 79a5c431 Ilias Tsitsimpis
        if account is not None:
235 79a5c431 Ilias Tsitsimpis
            self._set_pithos_account(account)
236 79a5c431 Ilias Tsitsimpis
        self.info("Getting list of containers")
237 79a5c431 Ilias Tsitsimpis
        return self.clients.pithos.list_containers()
238 79a5c431 Ilias Tsitsimpis
239 79a5c431 Ilias Tsitsimpis
    def _create_pithos_container(self, container):
240 79a5c431 Ilias Tsitsimpis
        """Create a pithos container
241 79a5c431 Ilias Tsitsimpis

242 79a5c431 Ilias Tsitsimpis
        If the container exists, nothing will happen
243 79a5c431 Ilias Tsitsimpis

244 79a5c431 Ilias Tsitsimpis
        """
245 79a5c431 Ilias Tsitsimpis
        assert container, "No pithos container was given"
246 79a5c431 Ilias Tsitsimpis
247 79a5c431 Ilias Tsitsimpis
        self.info("Creating pithos container %s", container)
248 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.container = container
249 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.container_put()
250 79a5c431 Ilias Tsitsimpis
251 4c52d5bf Ilias Tsitsimpis
252 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
253 12ef696f Ilias Tsitsimpis
# Initialize Burnin
254 12ef696f Ilias Tsitsimpis
def initialize(opts, testsuites):
255 12ef696f Ilias Tsitsimpis
    """Initalize burnin
256 12ef696f Ilias Tsitsimpis

257 12ef696f Ilias Tsitsimpis
    Initialize our logger and burnin state
258 12ef696f Ilias Tsitsimpis

259 12ef696f Ilias Tsitsimpis
    """
260 12ef696f Ilias Tsitsimpis
    # Initialize logger
261 12ef696f Ilias Tsitsimpis
    global logger  # Using global statement. pylint: disable-msg=C0103,W0603
262 12ef696f Ilias Tsitsimpis
    logger = Log(opts.log_folder, verbose=opts.verbose,
263 0c1833c8 Ilias Tsitsimpis
                 use_colors=opts.use_colors, in_parallel=False,
264 0c1833c8 Ilias Tsitsimpis
                 quiet=opts.quiet)
265 12ef696f Ilias Tsitsimpis
266 12ef696f Ilias Tsitsimpis
    # Initialize clients
267 12ef696f Ilias Tsitsimpis
    Clients.auth_url = opts.auth_url
268 12ef696f Ilias Tsitsimpis
    Clients.token = opts.token
269 12ef696f Ilias Tsitsimpis
270 12ef696f Ilias Tsitsimpis
    # Pass the rest options to BurninTests
271 79a5c431 Ilias Tsitsimpis
    BurninTests.use_ipv6 = opts.use_ipv6
272 79a5c431 Ilias Tsitsimpis
    BurninTests.action_timeout = opts.action_timeout
273 79a5c431 Ilias Tsitsimpis
    BurninTests.action_warning = opts.action_warning
274 79a5c431 Ilias Tsitsimpis
    BurninTests.query_interval = opts.query_interval
275 79a5c431 Ilias Tsitsimpis
    BurninTests.run_id = SNF_TEST_PREFIX + \
276 79a5c431 Ilias Tsitsimpis
        datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d%H%M%S")
277 12ef696f Ilias Tsitsimpis
278 12ef696f Ilias Tsitsimpis
    # Choose tests to run
279 12ef696f Ilias Tsitsimpis
    if opts.tests != "all":
280 12ef696f Ilias Tsitsimpis
        testsuites = opts.tests
281 12ef696f Ilias Tsitsimpis
    if opts.exclude_tests is not None:
282 12ef696f Ilias Tsitsimpis
        testsuites = [tsuite for tsuite in testsuites
283 12ef696f Ilias Tsitsimpis
                      if tsuite not in opts.exclude_tests]
284 12ef696f Ilias Tsitsimpis
285 12ef696f Ilias Tsitsimpis
    return testsuites
286 12ef696f Ilias Tsitsimpis
287 12ef696f Ilias Tsitsimpis
288 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
289 12ef696f Ilias Tsitsimpis
# Run Burnin
290 0c1833c8 Ilias Tsitsimpis
def run(testsuites, failfast=False, final_report=False):
291 12ef696f Ilias Tsitsimpis
    """Run burnin testsuites"""
292 12ef696f Ilias Tsitsimpis
    global logger  # Using global. pylint: disable-msg=C0103,W0603,W0602
293 12ef696f Ilias Tsitsimpis
294 12ef696f Ilias Tsitsimpis
    success = True
295 12ef696f Ilias Tsitsimpis
    for tcase in testsuites:
296 12ef696f Ilias Tsitsimpis
        tsuite = unittest.TestLoader().loadTestsFromTestCase(tcase)
297 12ef696f Ilias Tsitsimpis
        results = tsuite.run(BurninTestResult())
298 fe15cd00 Ilias Tsitsimpis
299 fe15cd00 Ilias Tsitsimpis
        was_success = was_successful(tcase.__name__, results.wasSuccessful())
300 fe15cd00 Ilias Tsitsimpis
        success = success and was_success
301 0c1833c8 Ilias Tsitsimpis
        if failfast and not success:
302 0c1833c8 Ilias Tsitsimpis
            break
303 12ef696f Ilias Tsitsimpis
304 0c1833c8 Ilias Tsitsimpis
    # Are we going to print final report?
305 0c1833c8 Ilias Tsitsimpis
    if final_report:
306 0c1833c8 Ilias Tsitsimpis
        logger.print_logfile_to_stdout()
307 12ef696f Ilias Tsitsimpis
    # Clean up our logger
308 12ef696f Ilias Tsitsimpis
    del(logger)
309 12ef696f Ilias Tsitsimpis
310 12ef696f Ilias Tsitsimpis
    # Return
311 12ef696f Ilias Tsitsimpis
    return 0 if success else 1
312 12ef696f Ilias Tsitsimpis
313 12ef696f Ilias Tsitsimpis
314 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
315 4c52d5bf Ilias Tsitsimpis
# Helper functions
316 12ef696f Ilias Tsitsimpis
def was_successful(tsuite, success):
317 4c52d5bf Ilias Tsitsimpis
    """Handle whether a testsuite was succesful or not"""
318 4c52d5bf Ilias Tsitsimpis
    if success:
319 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_success(tsuite)
320 12ef696f Ilias Tsitsimpis
        return True
321 4c52d5bf Ilias Tsitsimpis
    else:
322 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_failure(tsuite)
323 12ef696f Ilias Tsitsimpis
        return False