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 |