Statistics
| Branch: | Tag: | Revision:

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

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

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

182 5bef1f49 Ilias Tsitsimpis
    """
183 5bef1f49 Ilias Tsitsimpis
    def __init__(self, value=None):
184 5bef1f49 Ilias Tsitsimpis
        self.val = value
185 5bef1f49 Ilias Tsitsimpis
186 5bef1f49 Ilias Tsitsimpis
    def __get__(self, obj, objtype=None):
187 5bef1f49 Ilias Tsitsimpis
        return self.val
188 5bef1f49 Ilias Tsitsimpis
189 5bef1f49 Ilias Tsitsimpis
    def __set__(self, obj, value):
190 5bef1f49 Ilias Tsitsimpis
        self.val = value
191 5bef1f49 Ilias Tsitsimpis
192 5bef1f49 Ilias Tsitsimpis
193 5bef1f49 Ilias Tsitsimpis
# --------------------------------------------------------------------
194 5bef1f49 Ilias Tsitsimpis
# BurninTests class
195 4c52d5bf Ilias Tsitsimpis
# Too many public methods (45/20). pylint: disable-msg=R0904
196 4c52d5bf Ilias Tsitsimpis
class BurninTests(unittest.TestCase):
197 4c52d5bf Ilias Tsitsimpis
    """Common class that all burnin tests should implement"""
198 12ef696f Ilias Tsitsimpis
    clients = Clients()
199 6f2b9836 Ilias Tsitsimpis
    run_id = None
200 79a5c431 Ilias Tsitsimpis
    use_ipv6 = None
201 79a5c431 Ilias Tsitsimpis
    action_timeout = None
202 79a5c431 Ilias Tsitsimpis
    action_warning = None
203 79a5c431 Ilias Tsitsimpis
    query_interval = None
204 f772699c Ilias Tsitsimpis
    system_user = None
205 6c78720b Ilias Tsitsimpis
    images = None
206 6c78720b Ilias Tsitsimpis
    flavors = None
207 8c67f82e Ilias Tsitsimpis
    delete_stale = False
208 24d1788b Ilias Tsitsimpis
    temp_directory = None
209 2c60bfa6 Ilias Tsitsimpis
    failfast = None
210 49517b8a Stavros Sachtouris
    temp_containers = []
211 49517b8a Stavros Sachtouris
212 12ef696f Ilias Tsitsimpis
213 5bef1f49 Ilias Tsitsimpis
    quotas = Proper(value=None)
214 5bef1f49 Ilias Tsitsimpis
215 4c52d5bf Ilias Tsitsimpis
    @classmethod
216 4c52d5bf Ilias Tsitsimpis
    def setUpClass(cls):  # noqa
217 4c52d5bf Ilias Tsitsimpis
        """Initialize BurninTests"""
218 4c52d5bf Ilias Tsitsimpis
        cls.suite_name = cls.__name__
219 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_start(cls.suite_name)
220 4c52d5bf Ilias Tsitsimpis
221 4c52d5bf Ilias Tsitsimpis
        # Set test parameters
222 4c52d5bf Ilias Tsitsimpis
        cls.longMessage = True
223 4c52d5bf Ilias Tsitsimpis
224 fe15cd00 Ilias Tsitsimpis
    def test_000_clients_setup(self):
225 4c52d5bf Ilias Tsitsimpis
        """Initializing astakos/cyclades/pithos clients"""
226 4c52d5bf Ilias Tsitsimpis
        # Update class attributes
227 5bef1f49 Ilias Tsitsimpis
        self.clients.initialize_clients()
228 12ef696f Ilias Tsitsimpis
        self.info("Astakos auth url is %s", self.clients.auth_url)
229 12ef696f Ilias Tsitsimpis
        self.info("Cyclades url is %s", self.clients.compute_url)
230 60a80953 Ilias Tsitsimpis
        self.info("Network url is %s", self.clients.network_url)
231 79a5c431 Ilias Tsitsimpis
        self.info("Pithos url is %s", self.clients.pithos_url)
232 f772699c Ilias Tsitsimpis
        self.info("Image url is %s", self.clients.image_url)
233 5bef1f49 Ilias Tsitsimpis
234 5bef1f49 Ilias Tsitsimpis
        self.quotas = self._get_quotas()
235 3e5bbd85 Ilias Tsitsimpis
        self.info("  Disk usage is %s bytes",
236 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.disk']['usage'])
237 5bef1f49 Ilias Tsitsimpis
        self.info("  VM usage is %s",
238 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.vm']['usage'])
239 3e5bbd85 Ilias Tsitsimpis
        self.info("  DiskSpace usage is %s bytes",
240 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['pithos.diskspace']['usage'])
241 3e5bbd85 Ilias Tsitsimpis
        self.info("  Ram usage is %s bytes",
242 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.ram']['usage'])
243 60a80953 Ilias Tsitsimpis
        self.info("  Floating IPs usage is %s",
244 60a80953 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.floating_ip']['usage'])
245 5bef1f49 Ilias Tsitsimpis
        self.info("  CPU usage is %s",
246 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.cpu']['usage'])
247 5bef1f49 Ilias Tsitsimpis
        self.info("  Network usage is %s",
248 5bef1f49 Ilias Tsitsimpis
                  self.quotas['system']['cyclades.network.private']['usage'])
249 f772699c Ilias Tsitsimpis
250 08f1780b Ilias Tsitsimpis
    def _run_tests(self, tcases):
251 08f1780b Ilias Tsitsimpis
        """Run some generated testcases"""
252 08f1780b Ilias Tsitsimpis
        global success  # Using global. pylint: disable-msg=C0103,W0603,W0602
253 08f1780b Ilias Tsitsimpis
254 08f1780b Ilias Tsitsimpis
        for tcase in tcases:
255 08f1780b Ilias Tsitsimpis
            self.info("Running testsuite %s", tcase.__name__)
256 08f1780b Ilias Tsitsimpis
            success = run_test(tcase) and success
257 08f1780b Ilias Tsitsimpis
            if self.failfast and not success:
258 08f1780b Ilias Tsitsimpis
                break
259 08f1780b Ilias Tsitsimpis
260 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
261 6f2b9836 Ilias Tsitsimpis
    # Loggers helper functions
262 4c52d5bf Ilias Tsitsimpis
    def log(self, msg, *args):
263 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
264 4c52d5bf Ilias Tsitsimpis
        logger.log(self.suite_name, msg, *args)
265 4c52d5bf Ilias Tsitsimpis
266 4c52d5bf Ilias Tsitsimpis
    def info(self, msg, *args):
267 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
268 4c52d5bf Ilias Tsitsimpis
        logger.info(self.suite_name, msg, *args)
269 4c52d5bf Ilias Tsitsimpis
270 4c52d5bf Ilias Tsitsimpis
    def debug(self, msg, *args):
271 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
272 4c52d5bf Ilias Tsitsimpis
        logger.debug(self.suite_name, msg, *args)
273 4c52d5bf Ilias Tsitsimpis
274 4c52d5bf Ilias Tsitsimpis
    def warning(self, msg, *args):
275 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
276 4c52d5bf Ilias Tsitsimpis
        logger.warning(self.suite_name, msg, *args)
277 4c52d5bf Ilias Tsitsimpis
278 4c52d5bf Ilias Tsitsimpis
    def error(self, msg, *args):
279 4c52d5bf Ilias Tsitsimpis
        """Pass the section value to logger"""
280 4c52d5bf Ilias Tsitsimpis
        logger.error(self.suite_name, msg, *args)
281 4c52d5bf Ilias Tsitsimpis
282 6f2b9836 Ilias Tsitsimpis
    # ----------------------------------
283 6f2b9836 Ilias Tsitsimpis
    # Helper functions that every testsuite may need
284 6f2b9836 Ilias Tsitsimpis
    def _get_uuid(self):
285 6f2b9836 Ilias Tsitsimpis
        """Get our uuid"""
286 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
287 6f2b9836 Ilias Tsitsimpis
        uuid = authenticate['access']['user']['id']
288 6f2b9836 Ilias Tsitsimpis
        self.info("User's uuid is %s", uuid)
289 6f2b9836 Ilias Tsitsimpis
        return uuid
290 6f2b9836 Ilias Tsitsimpis
291 6f2b9836 Ilias Tsitsimpis
    def _get_username(self):
292 6f2b9836 Ilias Tsitsimpis
        """Get our User Name"""
293 6f2b9836 Ilias Tsitsimpis
        authenticate = self.clients.astakos.authenticate()
294 6f2b9836 Ilias Tsitsimpis
        username = authenticate['access']['user']['name']
295 6f2b9836 Ilias Tsitsimpis
        self.info("User's name is %s", username)
296 6f2b9836 Ilias Tsitsimpis
        return username
297 6f2b9836 Ilias Tsitsimpis
298 f772699c Ilias Tsitsimpis
    def _create_tmp_directory(self):
299 24d1788b Ilias Tsitsimpis
        """Create a tmp directory"""
300 24d1788b Ilias Tsitsimpis
        temp_dir = tempfile.mkdtemp(dir=self.temp_directory)
301 f772699c Ilias Tsitsimpis
        self.info("Temp directory %s created", temp_dir)
302 f772699c Ilias Tsitsimpis
        return temp_dir
303 f772699c Ilias Tsitsimpis
304 f772699c Ilias Tsitsimpis
    def _remove_tmp_directory(self, tmp_dir):
305 f772699c Ilias Tsitsimpis
        """Remove a tmp directory"""
306 f772699c Ilias Tsitsimpis
        try:
307 f772699c Ilias Tsitsimpis
            shutil.rmtree(tmp_dir)
308 f772699c Ilias Tsitsimpis
            self.info("Temp directory %s deleted", tmp_dir)
309 f772699c Ilias Tsitsimpis
        except OSError:
310 f772699c Ilias Tsitsimpis
            pass
311 f772699c Ilias Tsitsimpis
312 fe81ddd7 Stavros Sachtouris
    def _create_large_file(self, size):
313 fe81ddd7 Stavros Sachtouris
        """Create a large file at fs"""
314 fe81ddd7 Stavros Sachtouris
        f = NamedTemporaryFile()
315 fe81ddd7 Stavros Sachtouris
        Ki = size / 8
316 fe81ddd7 Stavros Sachtouris
        c = ['|', '/', '-', '\\']
317 eea28492 Stavros Sachtouris
        stderr.write('\tCreate file %s  ' % f.name)
318 fe81ddd7 Stavros Sachtouris
        for i, bytes in enumerate([b * Ki for b in range(size / Ki)]):
319 fe81ddd7 Stavros Sachtouris
            f.seek(bytes)
320 fe81ddd7 Stavros Sachtouris
            f.write(urandom(Ki))
321 fe81ddd7 Stavros Sachtouris
            f.flush()
322 fe81ddd7 Stavros Sachtouris
            stderr.write('\b' + c[i % 4])
323 fe81ddd7 Stavros Sachtouris
            stderr.flush()
324 fe81ddd7 Stavros Sachtouris
        stderr.write('\n')
325 fe81ddd7 Stavros Sachtouris
        stderr.flush()
326 fe81ddd7 Stavros Sachtouris
        f.seek(0)
327 fe81ddd7 Stavros Sachtouris
        return f
328 fe81ddd7 Stavros Sachtouris
329 eea28492 Stavros Sachtouris
    def _create_boring_file(self, num_of_blocks):
330 eea28492 Stavros Sachtouris
        """Create a file with some blocks being the same"""
331 eea28492 Stavros Sachtouris
332 eea28492 Stavros Sachtouris
        def chargen():
333 eea28492 Stavros Sachtouris
            """10 + 2 * 26 + 26 = 88"""
334 eea28492 Stavros Sachtouris
            while True:
335 eea28492 Stavros Sachtouris
                for CH in xrange(10):
336 eea28492 Stavros Sachtouris
                    yield '%s' % CH
337 eea28492 Stavros Sachtouris
                for CH in ascii_letters:
338 eea28492 Stavros Sachtouris
                    yield CH
339 eea28492 Stavros Sachtouris
                for CH in '~!@#$%^&*()_+`-=:";|<>?,./':
340 eea28492 Stavros Sachtouris
                    yield CH
341 eea28492 Stavros Sachtouris
342 eea28492 Stavros Sachtouris
        c = ['|', '/', '-', '\\']
343 eea28492 Stavros Sachtouris
        tmpFile = NamedTemporaryFile()
344 eea28492 Stavros Sachtouris
        stderr.write('\tCreate file %s  ' % tmpFile.name)
345 eea28492 Stavros Sachtouris
        block_size = 4 * 1024 * 1024
346 eea28492 Stavros Sachtouris
        chars, i = chargen(), 0
347 eea28492 Stavros Sachtouris
        while num_of_blocks:
348 eea28492 Stavros Sachtouris
            fslice = 3 if num_of_blocks > 3 else num_of_blocks
349 eea28492 Stavros Sachtouris
            tmpFile.write(fslice * block_size * chars.next())
350 eea28492 Stavros Sachtouris
            num_of_blocks -= fslice
351 eea28492 Stavros Sachtouris
            stderr.write('\b' + c[i % 4])
352 eea28492 Stavros Sachtouris
            stderr.flush()
353 eea28492 Stavros Sachtouris
            i += 1
354 eea28492 Stavros Sachtouris
        tmpFile.seek(0)
355 eea28492 Stavros Sachtouris
        stderr.write('\n')
356 eea28492 Stavros Sachtouris
        stderr.flush()
357 eea28492 Stavros Sachtouris
        return tmpFile
358 eea28492 Stavros Sachtouris
359 f772699c Ilias Tsitsimpis
    def _get_uuid_of_system_user(self):
360 f772699c Ilias Tsitsimpis
        """Get the uuid of the system user
361 f772699c Ilias Tsitsimpis

362 f772699c Ilias Tsitsimpis
        This is the user that upload the 'official' images.
363 f772699c Ilias Tsitsimpis

364 f772699c Ilias Tsitsimpis
        """
365 f772699c Ilias Tsitsimpis
        self.info("Getting the uuid of the system user")
366 f772699c Ilias Tsitsimpis
        system_users = None
367 f772699c Ilias Tsitsimpis
        if self.system_user is not None:
368 eca500f3 Ilias Tsitsimpis
            try:
369 eca500f3 Ilias Tsitsimpis
                su_type, su_value = parse_typed_option(self.system_user)
370 f772699c Ilias Tsitsimpis
                if su_type == "name":
371 f772699c Ilias Tsitsimpis
                    system_users = [su_value]
372 f772699c Ilias Tsitsimpis
                elif su_type == "id":
373 f772699c Ilias Tsitsimpis
                    self.info("System user's uuid is %s", su_value)
374 f772699c Ilias Tsitsimpis
                    return su_value
375 f772699c Ilias Tsitsimpis
                else:
376 f772699c Ilias Tsitsimpis
                    self.error("Unrecognized system-user type %s", su_type)
377 f772699c Ilias Tsitsimpis
                    self.fail("Unrecognized system-user type")
378 eca500f3 Ilias Tsitsimpis
            except ValueError:
379 eca500f3 Ilias Tsitsimpis
                msg = "Invalid system-user format: %s. Must be [id|name]:.+"
380 eca500f3 Ilias Tsitsimpis
                self.warning(msg, self.system_user)
381 f772699c Ilias Tsitsimpis
382 f772699c Ilias Tsitsimpis
        if system_users is None:
383 f772699c Ilias Tsitsimpis
            system_users = SYSTEM_USERS
384 f772699c Ilias Tsitsimpis
385 a59fbcea Stavros Sachtouris
        uuids = self.clients.astakos.get_uuids(system_users)
386 f772699c Ilias Tsitsimpis
        for su_name in system_users:
387 f772699c Ilias Tsitsimpis
            self.info("Trying username %s", su_name)
388 f772699c Ilias Tsitsimpis
            if su_name in uuids:
389 f772699c Ilias Tsitsimpis
                self.info("System user's uuid is %s", uuids[su_name])
390 f772699c Ilias Tsitsimpis
                return uuids[su_name]
391 f772699c Ilias Tsitsimpis
392 f772699c Ilias Tsitsimpis
        self.warning("No system user found")
393 f772699c Ilias Tsitsimpis
        return None
394 f772699c Ilias Tsitsimpis
395 6c78720b Ilias Tsitsimpis
    def _skip_if(self, condition, msg):
396 6c78720b Ilias Tsitsimpis
        """Skip tests"""
397 6c78720b Ilias Tsitsimpis
        if condition:
398 6c78720b Ilias Tsitsimpis
            self.info("Test skipped: %s" % msg)
399 6c78720b Ilias Tsitsimpis
            self.skipTest(msg)
400 6c78720b Ilias Tsitsimpis
401 f772699c Ilias Tsitsimpis
    # ----------------------------------
402 f772699c Ilias Tsitsimpis
    # Flavors
403 fe15cd00 Ilias Tsitsimpis
    def _get_list_of_flavors(self, detail=False):
404 fe15cd00 Ilias Tsitsimpis
        """Get (detailed) list of flavors"""
405 fe15cd00 Ilias Tsitsimpis
        if detail:
406 fe15cd00 Ilias Tsitsimpis
            self.info("Getting detailed list of flavors")
407 fe15cd00 Ilias Tsitsimpis
        else:
408 fe15cd00 Ilias Tsitsimpis
            self.info("Getting simple list of flavors")
409 fe15cd00 Ilias Tsitsimpis
        flavors = self.clients.compute.list_flavors(detail=detail)
410 fe15cd00 Ilias Tsitsimpis
        return flavors
411 fe15cd00 Ilias Tsitsimpis
412 6c78720b Ilias Tsitsimpis
    def _find_flavors(self, patterns, flavors=None):
413 6c78720b Ilias Tsitsimpis
        """Find a list of suitable flavors to use
414 6c78720b Ilias Tsitsimpis

415 6c78720b Ilias Tsitsimpis
        The patterns is a list of `typed_options'. A list of all flavors
416 6c78720b Ilias Tsitsimpis
        matching this patterns will be returned.
417 6c78720b Ilias Tsitsimpis

418 6c78720b Ilias Tsitsimpis
        """
419 6c78720b Ilias Tsitsimpis
        if flavors is None:
420 6c78720b Ilias Tsitsimpis
            flavors = self._get_list_of_flavors(detail=True)
421 6c78720b Ilias Tsitsimpis
422 6c78720b Ilias Tsitsimpis
        ret_flavors = []
423 6c78720b Ilias Tsitsimpis
        for ptrn in patterns:
424 eca500f3 Ilias Tsitsimpis
            try:
425 eca500f3 Ilias Tsitsimpis
                flv_type, flv_value = parse_typed_option(ptrn)
426 eca500f3 Ilias Tsitsimpis
            except ValueError:
427 6c78720b Ilias Tsitsimpis
                msg = "Invalid flavor format: %s. Must be [id|name]:.+"
428 6c78720b Ilias Tsitsimpis
                self.warning(msg, ptrn)
429 6c78720b Ilias Tsitsimpis
                continue
430 eca500f3 Ilias Tsitsimpis
431 6c78720b Ilias Tsitsimpis
            if flv_type == "name":
432 6c78720b Ilias Tsitsimpis
                # Filter flavor by name
433 6c78720b Ilias Tsitsimpis
                msg = "Trying to find a flavor with name %s"
434 6c78720b Ilias Tsitsimpis
                self.info(msg, flv_value)
435 6c78720b Ilias Tsitsimpis
                filtered_flvs = \
436 6c78720b Ilias Tsitsimpis
                    [f for f in flavors if
437 6c78720b Ilias Tsitsimpis
                     re.search(flv_value, f['name'], flags=re.I) is not None]
438 6c78720b Ilias Tsitsimpis
            elif flv_type == "id":
439 6c78720b Ilias Tsitsimpis
                # Filter flavors by id
440 6c78720b Ilias Tsitsimpis
                msg = "Trying to find a flavor with id %s"
441 6c78720b Ilias Tsitsimpis
                self.info(msg, flv_value)
442 6c78720b Ilias Tsitsimpis
                filtered_flvs = \
443 6c78720b Ilias Tsitsimpis
                    [f for f in flavors if str(f['id']) == flv_value]
444 6c78720b Ilias Tsitsimpis
            else:
445 6c78720b Ilias Tsitsimpis
                self.error("Unrecognized flavor type %s", flv_type)
446 6c78720b Ilias Tsitsimpis
                self.fail("Unrecognized flavor type")
447 6c78720b Ilias Tsitsimpis
448 6c78720b Ilias Tsitsimpis
            # Append and continue
449 6c78720b Ilias Tsitsimpis
            ret_flavors.extend(filtered_flvs)
450 6c78720b Ilias Tsitsimpis
451 6c78720b Ilias Tsitsimpis
        self.assertGreater(len(ret_flavors), 0,
452 6c78720b Ilias Tsitsimpis
                           "No matching flavors found")
453 6c78720b Ilias Tsitsimpis
        return ret_flavors
454 6c78720b Ilias Tsitsimpis
455 f772699c Ilias Tsitsimpis
    # ----------------------------------
456 f772699c Ilias Tsitsimpis
    # Images
457 f772699c Ilias Tsitsimpis
    def _get_list_of_images(self, detail=False):
458 f772699c Ilias Tsitsimpis
        """Get (detailed) list of images"""
459 f772699c Ilias Tsitsimpis
        if detail:
460 f772699c Ilias Tsitsimpis
            self.info("Getting detailed list of images")
461 f772699c Ilias Tsitsimpis
        else:
462 f772699c Ilias Tsitsimpis
            self.info("Getting simple list of images")
463 f772699c Ilias Tsitsimpis
        images = self.clients.image.list_public(detail=detail)
464 f772699c Ilias Tsitsimpis
        # Remove images registered by burnin
465 f772699c Ilias Tsitsimpis
        images = [img for img in images
466 f772699c Ilias Tsitsimpis
                  if not img['name'].startswith(SNF_TEST_PREFIX)]
467 f772699c Ilias Tsitsimpis
        return images
468 f772699c Ilias Tsitsimpis
469 f772699c Ilias Tsitsimpis
    def _get_list_of_sys_images(self, images=None):
470 f772699c Ilias Tsitsimpis
        """Get (detailed) list of images registered by system user or by me"""
471 f772699c Ilias Tsitsimpis
        self.info("Getting list of images registered by system user or by me")
472 f772699c Ilias Tsitsimpis
        if images is None:
473 f772699c Ilias Tsitsimpis
            images = self._get_list_of_images(detail=True)
474 f772699c Ilias Tsitsimpis
475 f772699c Ilias Tsitsimpis
        su_uuid = self._get_uuid_of_system_user()
476 f772699c Ilias Tsitsimpis
        my_uuid = self._get_uuid()
477 f772699c Ilias Tsitsimpis
        ret_images = [i for i in images
478 f772699c Ilias Tsitsimpis
                      if i['owner'] == su_uuid or i['owner'] == my_uuid]
479 f772699c Ilias Tsitsimpis
480 f772699c Ilias Tsitsimpis
        return ret_images
481 f772699c Ilias Tsitsimpis
482 6c78720b Ilias Tsitsimpis
    def _find_images(self, patterns, images=None):
483 6c78720b Ilias Tsitsimpis
        """Find a list of suitable images to use
484 f772699c Ilias Tsitsimpis

485 6c78720b Ilias Tsitsimpis
        The patterns is a list of `typed_options'. A list of all images
486 6c78720b Ilias Tsitsimpis
        matching this patterns will be returned.
487 f772699c Ilias Tsitsimpis

488 f772699c Ilias Tsitsimpis
        """
489 f772699c Ilias Tsitsimpis
        if images is None:
490 f772699c Ilias Tsitsimpis
            images = self._get_list_of_sys_images()
491 f772699c Ilias Tsitsimpis
492 6c78720b Ilias Tsitsimpis
        ret_images = []
493 f772699c Ilias Tsitsimpis
        for ptrn in patterns:
494 eca500f3 Ilias Tsitsimpis
            try:
495 eca500f3 Ilias Tsitsimpis
                img_type, img_value = parse_typed_option(ptrn)
496 eca500f3 Ilias Tsitsimpis
            except ValueError:
497 f772699c Ilias Tsitsimpis
                msg = "Invalid image format: %s. Must be [id|name]:.+"
498 f772699c Ilias Tsitsimpis
                self.warning(msg, ptrn)
499 f772699c Ilias Tsitsimpis
                continue
500 eca500f3 Ilias Tsitsimpis
501 f772699c Ilias Tsitsimpis
            if img_type == "name":
502 f772699c Ilias Tsitsimpis
                # Filter image by name
503 f772699c Ilias Tsitsimpis
                msg = "Trying to find an image with name %s"
504 f772699c Ilias Tsitsimpis
                self.info(msg, img_value)
505 f772699c Ilias Tsitsimpis
                filtered_imgs = \
506 f772699c Ilias Tsitsimpis
                    [i for i in images if
507 f772699c Ilias Tsitsimpis
                     re.search(img_value, i['name'], flags=re.I) is not None]
508 f772699c Ilias Tsitsimpis
            elif img_type == "id":
509 f772699c Ilias Tsitsimpis
                # Filter images by id
510 f772699c Ilias Tsitsimpis
                msg = "Trying to find an image with id %s"
511 f772699c Ilias Tsitsimpis
                self.info(msg, img_value)
512 f772699c Ilias Tsitsimpis
                filtered_imgs = \
513 f772699c Ilias Tsitsimpis
                    [i for i in images if
514 f772699c Ilias Tsitsimpis
                     i['id'].lower() == img_value.lower()]
515 f772699c Ilias Tsitsimpis
            else:
516 f772699c Ilias Tsitsimpis
                self.error("Unrecognized image type %s", img_type)
517 f772699c Ilias Tsitsimpis
                self.fail("Unrecognized image type")
518 f772699c Ilias Tsitsimpis
519 6c78720b Ilias Tsitsimpis
            # Append and continue
520 6c78720b Ilias Tsitsimpis
            ret_images.extend(filtered_imgs)
521 f772699c Ilias Tsitsimpis
522 6c78720b Ilias Tsitsimpis
        self.assertGreater(len(ret_images), 0,
523 6c78720b Ilias Tsitsimpis
                           "No matching images found")
524 6c78720b Ilias Tsitsimpis
        return ret_images
525 f772699c Ilias Tsitsimpis
526 f772699c Ilias Tsitsimpis
    # ----------------------------------
527 f772699c Ilias Tsitsimpis
    # Pithos
528 79a5c431 Ilias Tsitsimpis
    def _set_pithos_account(self, account):
529 f772699c Ilias Tsitsimpis
        """Set the Pithos account"""
530 79a5c431 Ilias Tsitsimpis
        assert account, "No pithos account was given"
531 79a5c431 Ilias Tsitsimpis
532 f772699c Ilias Tsitsimpis
        self.info("Setting Pithos account to %s", account)
533 79a5c431 Ilias Tsitsimpis
        self.clients.pithos.account = account
534 79a5c431 Ilias Tsitsimpis
535 f772699c Ilias Tsitsimpis
    def _set_pithos_container(self, container):
536 f772699c Ilias Tsitsimpis
        """Set the Pithos container"""
537 f772699c Ilias Tsitsimpis
        assert container, "No pithos container was given"
538 f772699c Ilias Tsitsimpis
539 f772699c Ilias Tsitsimpis
        self.info("Setting Pithos container to %s", container)
540 f772699c Ilias Tsitsimpis
        self.clients.pithos.container = container
541 f772699c Ilias Tsitsimpis
542 79a5c431 Ilias Tsitsimpis
    def _get_list_of_containers(self, account=None):
543 79a5c431 Ilias Tsitsimpis
        """Get list of containers"""
544 79a5c431 Ilias Tsitsimpis
        if account is not None:
545 79a5c431 Ilias Tsitsimpis
            self._set_pithos_account(account)
546 79a5c431 Ilias Tsitsimpis
        self.info("Getting list of containers")
547 79a5c431 Ilias Tsitsimpis
        return self.clients.pithos.list_containers()
548 79a5c431 Ilias Tsitsimpis
549 79a5c431 Ilias Tsitsimpis
    def _create_pithos_container(self, container):
550 79a5c431 Ilias Tsitsimpis
        """Create a pithos container
551 79a5c431 Ilias Tsitsimpis

552 79a5c431 Ilias Tsitsimpis
        If the container exists, nothing will happen
553 79a5c431 Ilias Tsitsimpis

554 79a5c431 Ilias Tsitsimpis
        """
555 79a5c431 Ilias Tsitsimpis
        assert container, "No pithos container was given"
556 79a5c431 Ilias Tsitsimpis
557 79a5c431 Ilias Tsitsimpis
        self.info("Creating pithos container %s", container)
558 49517b8a Stavros Sachtouris
        self.clients.pithos.create_container(container)
559 49517b8a Stavros Sachtouris
        self.temp_containers.append(container)
560 79a5c431 Ilias Tsitsimpis
561 5bef1f49 Ilias Tsitsimpis
    # ----------------------------------
562 5bef1f49 Ilias Tsitsimpis
    # Quotas
563 5bef1f49 Ilias Tsitsimpis
    def _get_quotas(self):
564 5bef1f49 Ilias Tsitsimpis
        """Get quotas"""
565 3e5bbd85 Ilias Tsitsimpis
        self.info("Getting quotas")
566 a59fbcea Stavros Sachtouris
        return self.clients.astakos.get_quotas()
567 5bef1f49 Ilias Tsitsimpis
568 3e5bbd85 Ilias Tsitsimpis
    # Invalid argument name. pylint: disable-msg=C0103
569 3e5bbd85 Ilias Tsitsimpis
    # Too many arguments. pylint: disable-msg=R0913
570 3e5bbd85 Ilias Tsitsimpis
    def _check_quotas(self, disk=None, vm=None, diskspace=None,
571 60a80953 Ilias Tsitsimpis
                      ram=None, ip=None, cpu=None, network=None):
572 3e5bbd85 Ilias Tsitsimpis
        """Check that quotas' changes are consistent"""
573 3e5bbd85 Ilias Tsitsimpis
        assert any(v is None for v in
574 60a80953 Ilias Tsitsimpis
                   [disk, vm, diskspace, ram, ip, cpu, network]), \
575 3e5bbd85 Ilias Tsitsimpis
            "_check_quotas require arguments"
576 3e5bbd85 Ilias Tsitsimpis
577 3e5bbd85 Ilias Tsitsimpis
        self.info("Check that quotas' changes are consistent")
578 3e5bbd85 Ilias Tsitsimpis
        old_quotas = self.quotas
579 3e5bbd85 Ilias Tsitsimpis
        new_quotas = self._get_quotas()
580 3e5bbd85 Ilias Tsitsimpis
        self.quotas = new_quotas
581 3e5bbd85 Ilias Tsitsimpis
582 3e5bbd85 Ilias Tsitsimpis
        # Check Disk usage
583 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
584 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.disk', disk)
585 3e5bbd85 Ilias Tsitsimpis
        # Check VM usage
586 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
587 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.vm', vm)
588 3e5bbd85 Ilias Tsitsimpis
        # Check DiskSpace usage
589 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
590 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'pithos.diskspace', diskspace)
591 3e5bbd85 Ilias Tsitsimpis
        # Check Ram usage
592 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
593 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.ram', ram)
594 60a80953 Ilias Tsitsimpis
        # Check Floating IPs usage
595 60a80953 Ilias Tsitsimpis
        self._check_quotas_aux(
596 60a80953 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.floating_ip', ip)
597 3e5bbd85 Ilias Tsitsimpis
        # Check CPU usage
598 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
599 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.cpu', cpu)
600 3e5bbd85 Ilias Tsitsimpis
        # Check Network usage
601 3e5bbd85 Ilias Tsitsimpis
        self._check_quotas_aux(
602 3e5bbd85 Ilias Tsitsimpis
            old_quotas, new_quotas, 'cyclades.network.private', network)
603 3e5bbd85 Ilias Tsitsimpis
604 3e5bbd85 Ilias Tsitsimpis
    def _check_quotas_aux(self, old_quotas, new_quotas, resource, value):
605 3e5bbd85 Ilias Tsitsimpis
        """Auxiliary function for _check_quotas"""
606 3e5bbd85 Ilias Tsitsimpis
        old_value = old_quotas['system'][resource]['usage']
607 3e5bbd85 Ilias Tsitsimpis
        new_value = new_quotas['system'][resource]['usage']
608 3e5bbd85 Ilias Tsitsimpis
        if value is not None:
609 3e5bbd85 Ilias Tsitsimpis
            assert isinstance(value, int), \
610 3e5bbd85 Ilias Tsitsimpis
                "%s value has to be integer" % resource
611 3e5bbd85 Ilias Tsitsimpis
            old_value += value
612 3e5bbd85 Ilias Tsitsimpis
        self.assertEqual(old_value, new_value,
613 3e5bbd85 Ilias Tsitsimpis
                         "%s quotas don't match" % resource)
614 3e5bbd85 Ilias Tsitsimpis
615 4c52d5bf Ilias Tsitsimpis
616 4c52d5bf Ilias Tsitsimpis
# --------------------------------------------------------------------
617 12ef696f Ilias Tsitsimpis
# Initialize Burnin
618 8c67f82e Ilias Tsitsimpis
def initialize(opts, testsuites, stale_testsuites):
619 12ef696f Ilias Tsitsimpis
    """Initalize burnin
620 12ef696f Ilias Tsitsimpis

621 12ef696f Ilias Tsitsimpis
    Initialize our logger and burnin state
622 12ef696f Ilias Tsitsimpis

623 12ef696f Ilias Tsitsimpis
    """
624 12ef696f Ilias Tsitsimpis
    # Initialize logger
625 12ef696f Ilias Tsitsimpis
    global logger  # Using global statement. pylint: disable-msg=C0103,W0603
626 2afd10bf Ilias Tsitsimpis
    curr_time = datetime.datetime.now()
627 12ef696f Ilias Tsitsimpis
    logger = Log(opts.log_folder, verbose=opts.verbose,
628 0c1833c8 Ilias Tsitsimpis
                 use_colors=opts.use_colors, in_parallel=False,
629 ee89df69 Ilias Tsitsimpis
                 log_level=opts.log_level, curr_time=curr_time)
630 12ef696f Ilias Tsitsimpis
631 12ef696f Ilias Tsitsimpis
    # Initialize clients
632 12ef696f Ilias Tsitsimpis
    Clients.auth_url = opts.auth_url
633 12ef696f Ilias Tsitsimpis
    Clients.token = opts.token
634 12ef696f Ilias Tsitsimpis
635 12ef696f Ilias Tsitsimpis
    # Pass the rest options to BurninTests
636 79a5c431 Ilias Tsitsimpis
    BurninTests.use_ipv6 = opts.use_ipv6
637 79a5c431 Ilias Tsitsimpis
    BurninTests.action_timeout = opts.action_timeout
638 79a5c431 Ilias Tsitsimpis
    BurninTests.action_warning = opts.action_warning
639 79a5c431 Ilias Tsitsimpis
    BurninTests.query_interval = opts.query_interval
640 f772699c Ilias Tsitsimpis
    BurninTests.system_user = opts.system_user
641 6c78720b Ilias Tsitsimpis
    BurninTests.flavors = opts.flavors
642 6c78720b Ilias Tsitsimpis
    BurninTests.images = opts.images
643 8c67f82e Ilias Tsitsimpis
    BurninTests.delete_stale = opts.delete_stale
644 24d1788b Ilias Tsitsimpis
    BurninTests.temp_directory = opts.temp_directory
645 2c60bfa6 Ilias Tsitsimpis
    BurninTests.failfast = opts.failfast
646 79a5c431 Ilias Tsitsimpis
    BurninTests.run_id = SNF_TEST_PREFIX + \
647 2afd10bf Ilias Tsitsimpis
        datetime.datetime.strftime(curr_time, "%Y%m%d%H%M%S")
648 12ef696f Ilias Tsitsimpis
649 12ef696f Ilias Tsitsimpis
    # Choose tests to run
650 8c67f82e Ilias Tsitsimpis
    if opts.show_stale:
651 8c67f82e Ilias Tsitsimpis
        # We will run the stale_testsuites
652 3eaf0ec5 Ilias Tsitsimpis
        return (stale_testsuites, True)
653 8c67f82e Ilias Tsitsimpis
654 12ef696f Ilias Tsitsimpis
    if opts.tests != "all":
655 12ef696f Ilias Tsitsimpis
        testsuites = opts.tests
656 12ef696f Ilias Tsitsimpis
    if opts.exclude_tests is not None:
657 12ef696f Ilias Tsitsimpis
        testsuites = [tsuite for tsuite in testsuites
658 12ef696f Ilias Tsitsimpis
                      if tsuite not in opts.exclude_tests]
659 12ef696f Ilias Tsitsimpis
660 3eaf0ec5 Ilias Tsitsimpis
    return (testsuites, opts.failfast)
661 12ef696f Ilias Tsitsimpis
662 12ef696f Ilias Tsitsimpis
663 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
664 12ef696f Ilias Tsitsimpis
# Run Burnin
665 ee89df69 Ilias Tsitsimpis
def run_burnin(testsuites, failfast=False):
666 12ef696f Ilias Tsitsimpis
    """Run burnin testsuites"""
667 08f1780b Ilias Tsitsimpis
    # Using global. pylint: disable-msg=C0103,W0603,W0602
668 08f1780b Ilias Tsitsimpis
    global logger, success
669 12ef696f Ilias Tsitsimpis
670 12ef696f Ilias Tsitsimpis
    success = True
671 08f1780b Ilias Tsitsimpis
    run_tests(testsuites, failfast=failfast)
672 12ef696f Ilias Tsitsimpis
673 12ef696f Ilias Tsitsimpis
    # Clean up our logger
674 eca500f3 Ilias Tsitsimpis
    del logger
675 12ef696f Ilias Tsitsimpis
676 12ef696f Ilias Tsitsimpis
    # Return
677 12ef696f Ilias Tsitsimpis
    return 0 if success else 1
678 12ef696f Ilias Tsitsimpis
679 12ef696f Ilias Tsitsimpis
680 08f1780b Ilias Tsitsimpis
def run_tests(tcases, failfast=False):
681 08f1780b Ilias Tsitsimpis
    """Run some testcases"""
682 08f1780b Ilias Tsitsimpis
    global success  # Using global. pylint: disable-msg=C0103,W0603,W0602
683 08f1780b Ilias Tsitsimpis
684 08f1780b Ilias Tsitsimpis
    for tcase in tcases:
685 08f1780b Ilias Tsitsimpis
        was_success = run_test(tcase)
686 08f1780b Ilias Tsitsimpis
        success = success and was_success
687 08f1780b Ilias Tsitsimpis
        if failfast and not success:
688 08f1780b Ilias Tsitsimpis
            break
689 08f1780b Ilias Tsitsimpis
690 08f1780b Ilias Tsitsimpis
691 6c78720b Ilias Tsitsimpis
def run_test(tcase):
692 6c78720b Ilias Tsitsimpis
    """Run a testcase"""
693 6c78720b Ilias Tsitsimpis
    tsuite = unittest.TestLoader().loadTestsFromTestCase(tcase)
694 6c78720b Ilias Tsitsimpis
    results = tsuite.run(BurninTestResult())
695 6c78720b Ilias Tsitsimpis
696 6c78720b Ilias Tsitsimpis
    return was_successful(tcase.__name__, results.wasSuccessful())
697 6c78720b Ilias Tsitsimpis
698 6c78720b Ilias Tsitsimpis
699 12ef696f Ilias Tsitsimpis
# --------------------------------------------------------------------
700 4c52d5bf Ilias Tsitsimpis
# Helper functions
701 08f1780b Ilias Tsitsimpis
def was_successful(tsuite, successful):
702 4c52d5bf Ilias Tsitsimpis
    """Handle whether a testsuite was succesful or not"""
703 08f1780b Ilias Tsitsimpis
    if successful:
704 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_success(tsuite)
705 12ef696f Ilias Tsitsimpis
        return True
706 4c52d5bf Ilias Tsitsimpis
    else:
707 4c52d5bf Ilias Tsitsimpis
        logger.testsuite_failure(tsuite)
708 12ef696f Ilias Tsitsimpis
        return False
709 f772699c Ilias Tsitsimpis
710 f772699c Ilias Tsitsimpis
711 f772699c Ilias Tsitsimpis
def parse_typed_option(value):
712 f772699c Ilias Tsitsimpis
    """Parse typed options (flavors and images)
713 f772699c Ilias Tsitsimpis

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

716 f772699c Ilias Tsitsimpis
    """
717 f772699c Ilias Tsitsimpis
    try:
718 f772699c Ilias Tsitsimpis
        [type_, val] = value.strip().split(':')
719 f772699c Ilias Tsitsimpis
        if type_ not in ["id", "name"]:
720 f772699c Ilias Tsitsimpis
            raise ValueError
721 f772699c Ilias Tsitsimpis
        return type_, val
722 f772699c Ilias Tsitsimpis
    except ValueError:
723 eca500f3 Ilias Tsitsimpis
        raise