Revision 3e5bbd85
b/snf-tools/synnefo_tools/burnin/common.py | ||
---|---|---|
59 | 59 |
SNF_TEST_PREFIX = "snf-test-" |
60 | 60 |
CONNECTION_RETRY_LIMIT = 2 |
61 | 61 |
SYSTEM_USERS = ["images@okeanos.grnet.gr", "images@demo.synnefo.org"] |
62 |
KB = 2**10 |
|
63 |
MB = 2**20 |
|
64 |
GB = 2**30 |
|
62 | 65 |
|
63 | 66 |
|
64 | 67 |
# -------------------------------------------------------------------- |
... | ... | |
205 | 208 |
self.info("Image url is %s", self.clients.image_url) |
206 | 209 |
|
207 | 210 |
self.quotas = self._get_quotas() |
208 |
self.info(" Disk usage is %s", |
|
211 |
self.info(" Disk usage is %s bytes",
|
|
209 | 212 |
self.quotas['system']['cyclades.disk']['usage']) |
210 | 213 |
self.info(" VM usage is %s", |
211 | 214 |
self.quotas['system']['cyclades.vm']['usage']) |
212 |
self.info(" DiskSpace usage is %s", |
|
215 |
self.info(" DiskSpace usage is %s bytes",
|
|
213 | 216 |
self.quotas['system']['pithos.diskspace']['usage']) |
214 |
self.info(" Ram usage is %s", |
|
217 |
self.info(" Ram usage is %s bytes",
|
|
215 | 218 |
self.quotas['system']['cyclades.ram']['usage']) |
216 | 219 |
self.info(" CPU usage is %s", |
217 | 220 |
self.quotas['system']['cyclades.cpu']['usage']) |
... | ... | |
480 | 483 |
# Quotas |
481 | 484 |
def _get_quotas(self): |
482 | 485 |
"""Get quotas""" |
483 |
self.info("Getting quotas for user %s", self._get_uuid())
|
|
486 |
self.info("Getting quotas")
|
|
484 | 487 |
astakos_client = self.clients.astakos.get_client() |
485 | 488 |
return astakos_client.get_quotas() |
486 | 489 |
|
490 |
# Invalid argument name. pylint: disable-msg=C0103 |
|
491 |
# Too many arguments. pylint: disable-msg=R0913 |
|
492 |
def _check_quotas(self, disk=None, vm=None, diskspace=None, |
|
493 |
ram=None, cpu=None, network=None): |
|
494 |
"""Check that quotas' changes are consistent""" |
|
495 |
assert any(v is None for v in |
|
496 |
[disk, vm, diskspace, ram, cpu, network]), \ |
|
497 |
"_check_quotas require arguments" |
|
498 |
|
|
499 |
self.info("Check that quotas' changes are consistent") |
|
500 |
old_quotas = self.quotas |
|
501 |
new_quotas = self._get_quotas() |
|
502 |
self.quotas = new_quotas |
|
503 |
|
|
504 |
# Check Disk usage |
|
505 |
self._check_quotas_aux( |
|
506 |
old_quotas, new_quotas, 'cyclades.disk', disk) |
|
507 |
# Check VM usage |
|
508 |
self._check_quotas_aux( |
|
509 |
old_quotas, new_quotas, 'cyclades.vm', vm) |
|
510 |
# Check DiskSpace usage |
|
511 |
self._check_quotas_aux( |
|
512 |
old_quotas, new_quotas, 'pithos.diskspace', diskspace) |
|
513 |
# Check Ram usage |
|
514 |
self._check_quotas_aux( |
|
515 |
old_quotas, new_quotas, 'cyclades.ram', ram) |
|
516 |
# Check CPU usage |
|
517 |
self._check_quotas_aux( |
|
518 |
old_quotas, new_quotas, 'cyclades.cpu', cpu) |
|
519 |
# Check Network usage |
|
520 |
self._check_quotas_aux( |
|
521 |
old_quotas, new_quotas, 'cyclades.network.private', network) |
|
522 |
|
|
523 |
def _check_quotas_aux(self, old_quotas, new_quotas, resource, value): |
|
524 |
"""Auxiliary function for _check_quotas""" |
|
525 |
old_value = old_quotas['system'][resource]['usage'] |
|
526 |
new_value = new_quotas['system'][resource]['usage'] |
|
527 |
if value is not None: |
|
528 |
assert isinstance(value, int), \ |
|
529 |
"%s value has to be integer" % resource |
|
530 |
old_value += value |
|
531 |
self.assertEqual(old_value, new_value, |
|
532 |
"%s quotas don't match" % resource) |
|
533 |
|
|
487 | 534 |
|
488 | 535 |
# -------------------------------------------------------------------- |
489 | 536 |
# Initialize Burnin |
b/snf-tools/synnefo_tools/burnin/cyclades_common.py | ||
---|---|---|
46 | 46 |
import tempfile |
47 | 47 |
import subprocess |
48 | 48 |
|
49 |
from synnefo_tools.burnin.common import BurninTests |
|
49 |
from synnefo_tools.burnin.common import BurninTests, MB, GB
|
|
50 | 50 |
|
51 | 51 |
|
52 | 52 |
# Too many public methods. pylint: disable-msg=R0904 |
... | ... | |
127 | 127 |
self.assertEqual(server['image']['id'], image['id']) |
128 | 128 |
self.assertEqual(server['status'], "BUILD") |
129 | 129 |
|
130 |
# Verify quotas |
|
131 |
self._check_quotas(disk=+int(flavor['disk'])*GB, |
|
132 |
vm=+1, |
|
133 |
ram=+int(flavor['ram'])*MB, |
|
134 |
cpu=+int(flavor['vcpus'])) |
|
135 |
|
|
130 | 136 |
return server |
131 | 137 |
|
138 |
def _verify_quotas_deleted(self, flavors): |
|
139 |
"""Verify quotas for a number of deleted servers""" |
|
140 |
used_disk = 0 |
|
141 |
used_vm = 0 |
|
142 |
used_ram = 0 |
|
143 |
used_cpu = 0 |
|
144 |
for flavor in flavors: |
|
145 |
used_disk += int(flavor['disk']) * GB |
|
146 |
used_vm += 1 |
|
147 |
used_ram += int(flavor['ram']) * MB |
|
148 |
used_cpu += int(flavor['vcpus']) |
|
149 |
self._check_quotas(disk=-used_disk, |
|
150 |
vm=-used_vm, |
|
151 |
ram=-used_ram, |
|
152 |
cpu=-used_cpu) |
|
153 |
|
|
132 | 154 |
def _get_connection_username(self, server): |
133 | 155 |
"""Determine the username to use to connect to the server""" |
134 | 156 |
users = server['metadata'].get("users", None) |
... | ... | |
360 | 382 |
self.assertIsNotNone(nid, "Could not find network card") |
361 | 383 |
self.clients.cyclades.disconnect_server(server['id'], nid) |
362 | 384 |
|
385 |
def _create_network(self, name, cidr="10.0.1.0/28", dhcp=True): |
|
386 |
"""Create a new private network""" |
|
387 |
network = self.clients.cyclades.create_network( |
|
388 |
name, cidr=cidr, dhcp=dhcp) |
|
389 |
self.info("Network with id %s created", network['id']) |
|
390 |
|
|
391 |
# Verify quotas |
|
392 |
self._check_quotas(network=+1) |
|
393 |
|
|
394 |
#Test if the right name is assigned |
|
395 |
self.assertEqual(network['name'], name) |
|
396 |
|
|
397 |
return network |
|
398 |
|
|
363 | 399 |
|
364 | 400 |
class Retry(Exception): |
365 | 401 |
"""Retry the action |
b/snf-tools/synnefo_tools/burnin/images_tests.py | ||
---|---|---|
166 | 166 |
"""Upload the image to Pithos""" |
167 | 167 |
self._set_pithos_account(self._get_uuid()) |
168 | 168 |
self._create_pithos_container("burnin-images") |
169 |
file_size = os.path.getsize(self.temp_image_file) |
|
169 | 170 |
with open(self.temp_image_file, "r+b") as fin: |
170 | 171 |
self.clients.pithos.upload_object(self.temp_image_name, fin) |
171 | 172 |
|
173 |
# Verify quotas |
|
174 |
self._check_quotas(diskspace=file_size) |
|
175 |
|
|
172 | 176 |
def test_009_register_image(self): |
173 | 177 |
"""Register image to Plankton""" |
174 | 178 |
location = "pithos://" + self._get_uuid() + \ |
... | ... | |
192 | 196 |
# Remove uploaded image |
193 | 197 |
self.info("Deleting uploaded image %s", self.temp_image_name) |
194 | 198 |
self.clients.pithos.del_object(self.temp_image_name) |
199 |
# Verify quotas |
|
200 |
file_size = os.path.getsize(self.temp_image_file) |
|
201 |
self._check_quotas(diskspace=-file_size) |
|
195 | 202 |
self.temp_image_name = None |
196 | 203 |
# Remove temp directory |
197 | 204 |
self.info("Deleting temp directory %s", self.temp_dir) |
b/snf-tools/synnefo_tools/burnin/logger.py | ||
---|---|---|
72 | 72 |
|
73 | 73 |
# -------------------------------------------------------------------- |
74 | 74 |
# Helper functions |
75 |
def _blue(msg):
|
|
76 |
"""Blue color"""
|
|
77 |
return "\x1b[1;34m" + str(msg) + "\x1b[0m"
|
|
75 |
def _cyan(msg):
|
|
76 |
"""Bold High Intensity Cyan color"""
|
|
77 |
return "\x1b[1;96m" + str(msg) + "\x1b[0m"
|
|
78 | 78 |
|
79 | 79 |
|
80 | 80 |
def _yellow(msg): |
... | ... | |
467 | 467 |
else: |
468 | 468 |
return color_fun(msg) + "\n" |
469 | 469 |
else: |
470 |
args = tuple([_blue(arg) for arg in args])
|
|
470 |
args = tuple([_cyan(arg) for arg in args])
|
|
471 | 471 |
return _format_message(msg, *args) |
472 | 472 |
else: |
473 | 473 |
return _format_message(msg, *args) |
b/snf-tools/synnefo_tools/burnin/network_tests.py | ||
---|---|---|
114 | 114 |
def test_006_create_network(self): |
115 | 115 |
"""Submit a create network request""" |
116 | 116 |
name = self.run_id |
117 |
self.network = self.clients.cyclades.create_network( |
|
118 |
name, cidr="10.0.1.0/28", dhcp=True) |
|
119 |
self.info("Network with id %s created", self.network['id']) |
|
120 |
|
|
121 |
#Test if right the name is assigned |
|
122 |
self.assertEqual(self.network['name'], name) |
|
117 |
self.network = self._create_network(name) |
|
123 | 118 |
|
124 | 119 |
self._insist_on_network_transition( |
125 | 120 |
self.network, ["BUILD"], "ACTIVE") |
... | ... | |
217 | 212 |
networks = [net['id'] for net in self._get_list_of_networks()] |
218 | 213 |
self.assertNotIn(self.network['id'], networks) |
219 | 214 |
|
215 |
# Verify quotas |
|
216 |
self._check_quotas(network=-1) |
|
217 |
|
|
220 | 218 |
def test_015_cleanup_servers(self): |
221 | 219 |
"""Cleanup servers created for this test""" |
222 | 220 |
self.clients.cyclades.delete_server(self.server_a['server']['id']) |
... | ... | |
226 | 224 |
self.server_a['server'], ["ACTIVE"], "DELETED") |
227 | 225 |
self._insist_on_server_transition( |
228 | 226 |
self.server_b['server'], ["ACTIVE"], "DELETED") |
227 |
|
|
228 |
# Verify quotas |
|
229 |
self._verify_quotas_deleted([self.server_a['flavor'], |
|
230 |
self.server_b['flavor']]) |
b/snf-tools/synnefo_tools/burnin/pithos_tests.py | ||
---|---|---|
36 | 36 |
|
37 | 37 |
""" |
38 | 38 |
|
39 |
import os |
|
39 | 40 |
import random |
40 | 41 |
import tempfile |
41 | 42 |
|
... | ... | |
90 | 91 |
# Upload the file, |
91 | 92 |
# The container is the one choosen during the `create_container' |
92 | 93 |
self.clients.pithos.upload_object("test.txt", fout) |
94 |
# Verify quotas |
|
95 |
self._check_quotas(diskspace=+os.fstat(fout.fileno()).st_size) |
|
93 | 96 |
|
94 | 97 |
def test_005_download_file(self): |
95 | 98 |
"""Test downloading the file from Pithos""" |
... | ... | |
108 | 111 |
self.info("Removing the file %s from container %s", |
109 | 112 |
"test.txt", self.created_container) |
110 | 113 |
# The container is the one choosen during the `create_container' |
114 |
content_length = \ |
|
115 |
self.clients.pithos.get_object_info("test.txt")['content-length'] |
|
111 | 116 |
self.clients.pithos.del_object("test.txt") |
112 | 117 |
|
118 |
# Verify quotas |
|
119 |
self._check_quotas(diskspace=-int(content_length)) |
|
120 |
|
|
113 | 121 |
self.info("Removing the container %s", self.created_container) |
114 | 122 |
self.clients.pithos.purge_container() |
115 | 123 |
|
b/snf-tools/synnefo_tools/burnin/server_tests.py | ||
---|---|---|
262 | 262 |
def test_022_server_becomes_deleted(self): |
263 | 263 |
"""Test server becomes DELETED""" |
264 | 264 |
self._insist_on_server_transition(self.server, ["ACTIVE"], "DELETED") |
265 |
# Verify quotas |
|
266 |
self._verify_quotas_deleted([self.use_flavor]) |
|
265 | 267 |
|
266 | 268 |
def test_023_server_no_longer(self): |
267 | 269 |
"""Test server is no longer in server list""" |
Also available in: Unified diff