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