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 |