Revision 03493855

b/kamaki/clients/compute_rest_api.py
92 92
        :returns: request response
93 93
        """
94 94
        data = json_data
95
        if json_data is not None:
95
        if json_data:
96 96
            data = json.dumps(json_data)
97 97
            self.set_header('Content-Type', 'application/json')
98 98
            self.set_header('Content-Length', len(data))
b/kamaki/clients/livetest/cyclades.py
30 30
# documentation are those of the authors and should not be
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33
from mock import patch
34
from unittest import TestCase
35 33

  
36
from kamaki.clients import ClientError
34
import time
37 35

  
36
from kamaki.clients import livetest, ClientError
37
from kamaki.clients.cyclades import CycladesClient
38 38

  
39
class Cyclades(TestCase):
40
    """Set up a Cyclades thorough test"""
39

  
40
class Cyclades(livetest.Generic):
41
    """Set up a Cyclades test"""
41 42
    def setUp(self):
42
        self.url = 'http://cyclades.example.com'
43
        self.token = 'cyc14d3s70k3n'
44
        from kamaki.clients.cyclades import CycladesClient
45
        self.cyclades = CycladesClient(self.url, self.token)
43
        print
44
        with open(self['image', 'details']) as f:
45
            self.img_details = eval(f.read())
46
        self.img = self.img_details['id']
47
        with open(self['flavor', 'details']) as f:
48
            self._flavor_details = eval(f.read())
49
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
50

  
51
        self.servers = {}
52
        self.now = time.mktime(time.gmtime())
53
        self.servname1 = 'serv' + unicode(self.now)
54
        self.servname2 = self.servname1 + '_v2'
55
        self.servname1 += '_v1'
56
        self.flavorid = 1
57
        #servers have to be created at the begining...
58
        self.networks = {}
59
        self.netname1 = 'net' + unicode(self.now)
60
        self.netname2 = 'net' + unicode(self.now) + '_v2'
61

  
62
        self.client = CycladesClient(self['compute', 'url'], self['token'])
46 63

  
47 64
    def tearDown(self):
48
        pass
65
        """Destoy servers used in testing"""
66
        for net in self.networks.keys():
67
            self._delete_network(net)
68
        for server in self.servers.values():
69
            self._delete_server(server['id'])
70
            print('DEL VM %s (%s)' % (server['id'], server['name']))
71

  
72
    def test_000(self):
73
        "Prepare a full Cyclades test scenario"
74
        self.server1 = self._create_server(
75
            self.servname1,
76
            self.flavorid,
77
            self.img)
78
        self.server2 = self._create_server(
79
            self.servname2,
80
            self.flavorid + 2,
81
            self.img)
82
        super(self.__class__, self).test_000()
83

  
84
    def _create_server(self, servername, flavorid, imageid, personality=None):
85
        server = self.client.create_server(
86
            servername,
87
            flavorid,
88
            imageid,
89
            personality)
90
        print('CREATE VM %s (%s)' % (server['id'], server['name']))
91
        self.servers[servername] = server
92
        return server
93

  
94
    def _delete_server(self, servid):
95
        try:
96
            current_state = self.client.get_server_details(servid)
97
            current_state = current_state['status']
98
            if current_state == 'DELETED':
99
                return
100
            self.client.delete_server(servid)
101
            self._wait_for_status(servid, current_state)
102
            self.client.delete_server(servid)
103
        except:
104
            return
105

  
106
    def _create_network(self, netname, **kwargs):
107
        net = self.client.create_network(netname, **kwargs)
108
        self.networks[net['id']] = net
109
        return net
110

  
111
    def _delete_network(self, netid):
112
        if not netid in self.networks:
113
            return None
114
        print('Disconnect nics of network %s' % netid)
115
        self.client.disconnect_network_nics(netid)
116

  
117
        def netwait(wait):
118
            try:
119
                self.client.delete_network(netid)
120
            except ClientError:
121
                time.sleep(wait)
122
        self.do_with_progress_bar(
123
            netwait,
124
            'Delete network %s' % netid,
125
            self._waits[:7])
126
        return self.networks.pop(netid)
127

  
128
    def _wait_for_network(self, netid, status):
129

  
130
        def netwait(wait):
131
            r = self.client.get_network_details(netid)
132
            if r['status'] == status:
133
                return
134
            time.sleep(wait)
135
        self.do_with_progress_bar(
136
            netwait,
137
            'Wait network %s to reach status %s' % (netid, status),
138
            self._waits[:5])
139

  
140
    def _wait_for_nic(self, netid, servid, in_creation=True):
141
        self._wait_for_network(netid, 'ACTIVE')
142

  
143
        def nicwait(wait):
144
            nics = self.client.list_server_nics(servid)
145
            for net in nics:
146
                found_nic = net['network_id'] == netid
147
                if (in_creation and found_nic) or not (
148
                        in_creation or found_nic):
149
                    return
150
            time.sleep(wait)
151
        self.do_with_progress_bar(
152
            nicwait,
153
            'Wait nic-%s-%s to %sconnect' % (
154
                netid,
155
                servid,
156
                '' if in_creation else 'dis'),
157
            self._waits[:5])
158
        for net in self.client.list_server_nics(servid):
159
            if netid == net['network_id']:
160
                return True
161
        return False
162

  
163
    def _has_status(self, servid, status):
164
        r = self.client.get_server_details(servid)
165
        return r['status'] == status
166

  
167
    def _wait_for_status(self, servid, status):
168
        (wait_bar, wait_cb) = self._safe_progress_bar(
169
            'Server %s in %s' % (servid, status))
170
        self.client.wait_server(servid, status, wait_cb=wait_cb)
171
        self._safe_progress_bar_finish(wait_bar)
49 172

  
50
    """
51 173
    def test_parallel_creation(self):
52
        ""test create with multiple threads
174
        """test create with multiple threads
53 175
        Do not use this in regular livetest
54
        ""
176
        """
55 177
        from kamaki.clients import SilentEvent
56 178
        c1 = SilentEvent(
57 179
            self._create_server,
......
103 225
        c8.start()
104 226

  
105 227
    def test_create_server(self):
106
        ""Test create_server""
228
        """Test create_server"""
107 229
        self.server1 = self._create_server(
108 230
            self.servname1,
109 231
            self.flavorid,
......
118 240
        self.assertEqual(self.server1["status"], "BUILD")
119 241

  
120 242
    def test_list_servers(self):
121
        ""Test list servers""
243
        """Test list servers"""
122 244
        self.server1 = self._create_server(
123 245
            self.servname1,
124 246
            self.flavorid,
......
133 255
        servers = self.client.list_servers()
134 256
        dservers = self.client.list_servers(detail=True)
135 257

  
136
        ""detailed and simple are same size""
258
        """detailed and simple are same size"""
137 259
        self.assertEqual(len(dservers), len(servers))
138 260
        for i in range(len(servers)):
139 261
            for field in (
......
147 269
                self.assertFalse(field in servers[i])
148 270
                self.assertTrue(field in dservers[i])
149 271

  
150
        ""detailed and simple contain same names""
272
        """detailed and simple contain same names"""
151 273
        names = sorted(map(lambda x: x["name"], servers))
152 274
        dnames = sorted(map(lambda x: x["name"], dservers))
153 275
        self.assertEqual(names, dnames)
154 276

  
155 277
    def _test_0030_wait_test_servers_to_build(self):
156
        ""Pseudo-test to wait for VMs to load""
278
        """Pseudo-test to wait for VMs to load"""
157 279
        print('')
158 280
        self._wait_for_status(self.server1['id'], 'BUILD')
159 281
        self._wait_for_status(self.server2['id'], 'BUILD')
160 282

  
161 283
    def test_get_server_details(self):
162
        ""Test get_server_details""
284
        """Test get_server_details"""
163 285
        self.server1 = self._create_server(
164 286
            self.servname1,
165 287
            self.flavorid,
......
175 297
        self.assertEqual(r["status"], "ACTIVE")
176 298

  
177 299
    def test_update_server_name(self):
178
        ""Test update_server_name""
300
        """Test update_server_name"""
179 301
        self.server1 = self._create_server(
180 302
            self.servname1,
181 303
            self.flavorid,
......
194 316
        self.servers[new_name] = changed
195 317

  
196 318
    def test_reboot_server(self):
197
        ""Test reboot server""
319
        """Test reboot server"""
198 320
        self.server1 = self._create_server(
199 321
            self.servname1,
200 322
            self.flavorid,
......
216 338
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
217 339

  
218 340
    def _test_0070_wait_test_servers_to_reboot(self):
219
        ""Pseudo-test to wait for VMs to load""
341
        """Pseudo-test to wait for VMs to load"""
220 342
        print('')
221 343
        self._wait_for_status(self.server1['id'], 'REBOOT')
222 344
        self._wait_for_status(self.server2['id'], 'REBOOT')
223 345

  
224 346
    def test_create_server_metadata(self):
225
        ""Test create_server_metadata""
347
        """Test create_server_metadata"""
226 348
        self.server1 = self._create_server(
227 349
            self.servname1,
228 350
            self.flavorid,
......
239 361
        self.assert_dicts_are_deeply_equal(r1, r2)
240 362

  
241 363
    def test_get_server_metadata(self):
242
        ""Test get server_metadata""
364
        """Test get server_metadata"""
243 365
        self.server1 = self._create_server(
244 366
            self.servname1,
245 367
            self.flavorid,
......
255 377
        self.assertEqual(r['mymeta_0'], 'val_0')
256 378

  
257 379
    def test_update_server_metadata(self):
258
        ""Test update_server_metadata""
380
        """Test update_server_metadata"""
259 381
        self.server1 = self._create_server(
260 382
            self.servname1,
261 383
            self.flavorid,
......
274 396
        self.assertTrue(r2['mymeta3'], 'val3')
275 397

  
276 398
    def test_delete_server_metadata(self):
277
        ""Test delete_server_metadata""
399
        """Test delete_server_metadata"""
278 400
        self.server1 = self._create_server(
279 401
            self.servname1,
280 402
            self.flavorid,
......
295 417
            self.assertEqual(err.status, 404)
296 418

  
297 419
    def test_list_flavors(self):
298
        ""Test flavors_get""
420
        """Test flavors_get"""
299 421
        self._test_0120_list_flavors()
300 422

  
301 423
    def _test_0120_list_flavors(self):
......
305 427
        self.assertTrue('SNF:disk_template' in r[0])
306 428

  
307 429
    def test_get_flavor_details(self):
308
        ""Test test_get_flavor_details""
430
        """Test test_get_flavor_details"""
309 431
        self._test_0130_get_flavor_details()
310 432

  
311 433
    def _test_0130_get_flavor_details(self):
......
313 435
        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
314 436

  
315 437
    def test_list_images(self):
316
        ""Test list_images""
438
        """Test list_images"""
317 439
        self._test_0140_list_images()
318 440

  
319 441
    def _test_0140_list_images(self):
......
326 448
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
327 449

  
328 450
    def test_get_image_details(self):
329
        ""Test image_details""
451
        """Test image_details"""
330 452
        self._test_0150_get_image_details()
331 453

  
332 454
    def _test_0150_get_image_details(self):
......
334 456
        self.assert_dicts_are_deeply_equal(r, self.img_details)
335 457

  
336 458
    def test_get_image_metadata(self):
337
        ""Test get_image_metadata""
459
        """Test get_image_metadata"""
338 460
        self._test_0160_get_image_metadata()
339 461

  
340 462
    def _test_0160_get_image_metadata(self):
......
346 468
            self.assertEqual(r[key], val)
347 469

  
348 470
    def test_shutdown_server(self):
349
        ""Test shutdown_server""
471
        """Test shutdown_server"""
350 472
        self.server1 = self._create_server(
351 473
            self.servname1,
352 474
            self.flavorid,
......
361 483
        self.assertEqual(r['status'], 'STOPPED')
362 484

  
363 485
    def test_start_server(self):
364
        ""Test start_server""
486
        """Test start_server"""
365 487
        self.server1 = self._create_server(
366 488
            self.servname1,
367 489
            self.flavorid,
......
378 500
        self.assertEqual(r['status'], 'ACTIVE')
379 501

  
380 502
    def test_get_server_console(self):
381
        ""Test get_server_console""
503
        """Test get_server_console"""
382 504
        self.server2 = self._create_server(
383 505
            self.servname2,
384 506
            self.flavorid + 2,
......
394 516
        self.assertTrue('type' in r)
395 517

  
396 518
    def test_get_firewall_profile(self):
397
        ""Test get_firewall_profile""
519
        """Test get_firewall_profile"""
398 520
        self.server1 = self._create_server(
399 521
            self.servname1,
400 522
            self.flavorid,
......
407 529
        self.assertTrue(fprofile in self.PROFILES)
408 530

  
409 531
    def test_set_firewall_profile(self):
410
        ""Test set_firewall_profile""
532
        """Test set_firewall_profile"""
411 533
        self.server1 = self._create_server(
412 534
            self.servname1,
413 535
            self.flavorid,
......
459 581
            self.assertTrue(term in r)
460 582

  
461 583
    def test_create_network(self):
462
        ""Test create_network""
584
        """Test create_network"""
463 585
        self._test_0230_create_network()
464 586

  
465 587
    def _test_0230_create_network(self):
......
490 612
            self.assertEqual(self.network1[param], val)
491 613

  
492 614
    def test_connect_server(self):
493
        ""Test connect_server""
615
        """Test connect_server"""
494 616
        self.server1 = self._create_server(
495 617
            self.servname1,
496 618
            self.flavorid,
......
507 629
            self.server1['id']))
508 630

  
509 631
    def test_disconnect_server(self):
510
        ""Test disconnect_server""
632
        """Test disconnect_server"""
511 633
        self.test_connect_server()
512 634
        self._test_0250_disconnect_server()
513 635

  
......
523 645
        self._wait_for_network(self.network2['id'], 'ACTIVE')
524 646

  
525 647
    def test_list_server_nics(self):
526
        ""Test list_server_nics""
648
        """Test list_server_nics"""
527 649
        self.server1 = self._create_server(
528 650
            self.servname1,
529 651
            self.flavorid,
......
544 666
        self.assertTrue(len(r) > len0)
545 667

  
546 668
    def test_list_networks(self):
547
        ""Test list_network""
669
        """Test list_network"""
548 670
        self.network1 = self._create_network(self.netname1)
549 671
        self._wait_for_network(self.network1['id'], 'ACTIVE')
550 672
        self._test_0290_list_networks()
......
569 691
                self.assertTrue(term in net.keys())
570 692

  
571 693
    def test_get_network_details(self):
694
        """Test get_network_details"""
572 695
        self.network1 = self._create_network(self.netname1)
573 696
        self._test_0300_get_network_details()
574 697

  
......
604 727
        r = self.client.get_network_details(self.network2['id'])
605 728
        self.assertEqual(r['name'], updated_name)
606 729

  
607
    "" Don't have auth to test this
730
    """ Don't have auth to test this
608 731
    def test_delete_image(self):
609 732
        ""Test delete_image""
610 733
        self._test_0330_delete_image()
b/kamaki/clients/test/__init__.py
35 35
from time import sleep
36 36

  
37 37
from kamaki.clients.test.astakos import Astakos
38
#from kamaki.clients.test.cyclades import Cyclades
38
from kamaki.clients.test.cyclades import Cyclades
39 39
from kamaki.clients.test.image import Image
40 40
#from kamaki.clients.test.pithos import Pithos
41 41

  
......
64 64
        while self.can_finish < methodid and wait < 4:
65 65
            sleep(wait)
66 66
            wait = 2 * wait
67
        self._value = methodid
67 68
        self.assertTrue(wait < 4)
68 69

  
69 70
    def setUp(self):
70 71
        from kamaki.clients import SilentEvent
71 72
        self.SE = SilentEvent
72 73

  
73
    def test_parallel(self):
74
    def test_threads(self):
74 75
        threads = []
75 76
        for i in range(4):
76 77
            threads.append(self.SE(self.thread_content, i))
b/kamaki/clients/test/cyclades.py
30 30
# documentation are those of the authors and should not be
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33
from mock import patch, Mock
34
from unittest import TestCase
35
from json import loads
36

  
37
from kamaki.clients import Client, ClientError
38

  
39
img_ref = "1m4g3-r3f3r3nc3"
40
vm_name = "my new VM"
41
fid = 42
42
vm_send = dict(server=dict(
43
    flavorRef=fid,
44
    name=vm_name,
45
    imageRef=img_ref,
46
    metadata=dict(os="debian", users="root")))
47
vm_recv = dict(server=dict(
48
    status="BUILD",
49
    updated="2013-03-01T10:04:00.637152+00:00",
50
    hostId="",
51
    name=vm_name, imageRef=img_ref,
52
    created="2013-03-01T10:04:00.087324+00:00",
53
    flavorRef=fid,
54
    adminPass="n0n3sh@11p@55",
55
    suspended=False,
56
    progress=0,
57
    id=31173,
58
    metadata=dict(values=dict(os="debian", users="root"))))
59
img_recv = dict(image=dict(
60
    status="ACTIVE",
61
    updated="2013-02-26T11:10:14+00:00",
62
    name="Debian Base",
63
    created="2013-02-26T11:03:29+00:00",
64
    progress=100,
65
    id=img_ref,
66
    metadata=dict(values=dict(
67
        partition_table="msdos",
68
        kernel="2.6.32",
69
        osfamily="linux",
70
        users="root",
71
        gui="No GUI",
72
        sortorder="1",
73
        os="debian",
74
        root_partition="1",
75
        description="Debian 6.0.7 (Squeeze) Base System"))))
76

  
77

  
78
class Cyclades(TestCase):
79

  
80
    def assert_dicts_are_deeply_equal(self, d1, d2):
81
        for k, v in d1.items():
82
            self.assertTrue(k in d2)
83
            if isinstance(v, dict):
84
                self.assert_dicts_are_deeply_equal(v, d2[k])
85
            else:
86
                self.assertEqual(unicode(v), unicode(d2[k]))
87

  
88
    class FR(object):
89
        """FR stands for Fake Response"""
90
        json = vm_recv
91
        headers = {}
92
        content = json
93
        status = None
94
        status_code = 200
95

  
96
        def release(self):
97
            pass
33 98

  
34
import time
35

  
36
from kamaki.clients import livetest, ClientError
37
from kamaki.clients.cyclades import CycladesClient
38

  
39

  
40
class Cyclades(livetest.Generic):
41 99
    """Set up a Cyclades thorough test"""
42 100
    def setUp(self):
43
        print
44
        with open(self['image', 'details']) as f:
45
            self.img_details = eval(f.read())
46
        self.img = self.img_details['id']
47
        with open(self['flavor', 'details']) as f:
48
            self._flavor_details = eval(f.read())
49
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
50

  
51
        self.servers = {}
52
        self.now = time.mktime(time.gmtime())
53
        self.servname1 = 'serv' + unicode(self.now)
54
        self.servname2 = self.servname1 + '_v2'
55
        self.servname1 += '_v1'
56
        self.flavorid = 1
57
        #servers have to be created at the begining...
58
        self.networks = {}
59
        self.netname1 = 'net' + unicode(self.now)
60
        self.netname2 = 'net' + unicode(self.now) + '_v2'
61

  
62
        self.client = CycladesClient(self['compute', 'url'], self['token'])
101
        self.url = 'http://cyclades.example.com'
102
        self.token = 'cyc14d3s70k3n'
103
        from kamaki.clients.cyclades import CycladesClient
104
        self.client = CycladesClient(self.url, self.token)
105
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
106
        self.C = KamakiHTTPConnection
63 107

  
64 108
    def tearDown(self):
65
        """Destoy servers used in testing"""
66
        for net in self.networks.keys():
67
            self._delete_network(net)
68
        for server in self.servers.values():
69
            self._delete_server(server['id'])
70
            print('DEL VM %s (%s)' % (server['id'], server['name']))
71

  
72
    def test_000(self):
73
        "Prepare a full Cyclades test scenario"
74
        self.server1 = self._create_server(
75
            self.servname1,
76
            self.flavorid,
77
            self.img)
78
        self.server2 = self._create_server(
79
            self.servname2,
80
            self.flavorid + 2,
81
            self.img)
82
        super(self.__class__, self).test_000()
83

  
84
    def _create_server(self, servername, flavorid, imageid, personality=None):
85
        server = self.client.create_server(
86
            servername,
87
            flavorid,
88
            imageid,
89
            personality)
90
        print('CREATE VM %s (%s)' % (server['id'], server['name']))
91
        self.servers[servername] = server
92
        return server
93

  
94
    def _delete_server(self, servid):
95
        try:
96
            current_state = self.client.get_server_details(servid)
97
            current_state = current_state['status']
98
            if current_state == 'DELETED':
99
                return
100
            self.client.delete_server(servid)
101
            self._wait_for_status(servid, current_state)
102
            self.client.delete_server(servid)
103
        except:
104
            return
105

  
106
    def _create_network(self, netname, **kwargs):
107
        net = self.client.create_network(netname, **kwargs)
108
        self.networks[net['id']] = net
109
        return net
110

  
111
    def _delete_network(self, netid):
112
        if not netid in self.networks:
113
            return None
114
        print('Disconnect nics of network %s' % netid)
115
        self.client.disconnect_network_nics(netid)
116

  
117
        def netwait(wait):
118
            try:
119
                self.client.delete_network(netid)
120
            except ClientError:
121
                time.sleep(wait)
122
        self.do_with_progress_bar(
123
            netwait,
124
            'Delete network %s' % netid,
125
            self._waits[:7])
126
        return self.networks.pop(netid)
127

  
128
    def _wait_for_network(self, netid, status):
129

  
130
        def netwait(wait):
131
            r = self.client.get_network_details(netid)
132
            if r['status'] == status:
133
                return
134
            time.sleep(wait)
135
        self.do_with_progress_bar(
136
            netwait,
137
            'Wait network %s to reach status %s' % (netid, status),
138
            self._waits[:5])
139

  
140
    def _wait_for_nic(self, netid, servid, in_creation=True):
141
        self._wait_for_network(netid, 'ACTIVE')
142

  
143
        def nicwait(wait):
144
            nics = self.client.list_server_nics(servid)
145
            for net in nics:
146
                found_nic = net['network_id'] == netid
147
                if (in_creation and found_nic) or not (
148
                        in_creation or found_nic):
149
                    return
150
            time.sleep(wait)
151
        self.do_with_progress_bar(
152
            nicwait,
153
            'Wait nic-%s-%s to %sconnect' % (
154
                netid,
155
                servid,
156
                '' if in_creation else 'dis'),
157
            self._waits[:5])
158
        for net in self.client.list_server_nics(servid):
159
            if netid == net['network_id']:
160
                return True
161
        return False
162

  
163
    def _has_status(self, servid, status):
164
        r = self.client.get_server_details(servid)
165
        return r['status'] == status
166

  
167
    def _wait_for_status(self, servid, status):
168
        (wait_bar, wait_cb) = self._safe_progress_bar(
169
            'Server %s in %s' % (servid, status))
170
        self.client.wait_server(servid, status, wait_cb=wait_cb)
171
        self._safe_progress_bar_finish(wait_bar)
172

  
173
    def test_parallel_creation(self):
174
        """test create with multiple threads
175
        Do not use this in regular livetest
176
        """
177
        from kamaki.clients import SilentEvent
178
        c1 = SilentEvent(
179
            self._create_server,
180
            self.servname1,
181
            self.flavorid,
182
            self.img)
183
        c2 = SilentEvent(
184
            self._create_server,
185
            self.servname2,
186
            self.flavorid + 2,
187
            self.img)
188
        c3 = SilentEvent(
189
            self._create_server,
190
            self.servname1,
191
            self.flavorid,
192
            self.img)
193
        c4 = SilentEvent(
194
            self._create_server,
195
            self.servname2,
196
            self.flavorid + 2,
197
            self.img)
198
        c5 = SilentEvent(
199
            self._create_server,
200
            self.servname1,
201
            self.flavorid,
202
            self.img)
203
        c6 = SilentEvent(
204
            self._create_server,
205
            self.servname2,
206
            self.flavorid + 2,
207
            self.img)
208
        c7 = SilentEvent(
209
            self._create_server,
210
            self.servname1,
211
            self.flavorid,
212
            self.img)
213
        c8 = SilentEvent(
214
            self._create_server,
215
            self.servname2,
216
            self.flavorid + 2,
217
            self.img)
218
        c1.start()
219
        c2.start()
220
        c3.start()
221
        c4.start()
222
        c5.start()
223
        c6.start()
224
        c7.start()
225
        c8.start()
109
        pass
226 110

  
227 111
    def test_create_server(self):
228
        """Test create_server"""
229
        self.server1 = self._create_server(
230
            self.servname1,
231
            self.flavorid,
232
            self.img)
233
        self._wait_for_status(self.server1['id'], 'BUILD')
234
        self._test_0010_create_server()
235

  
236
    def _test_0010_create_server(self):
237
        self.assertEqual(self.server1["name"], self.servname1)
238
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
239
        self.assertEqual(self.server1["imageRef"], self.img)
240
        self.assertEqual(self.server1["status"], "BUILD")
112
        self.client.get_image_details = Mock(return_value=img_recv['image'])
113
        with patch.object(Client, 'request', side_effect=ClientError(
114
                'REQUEST ENTITY TOO LARGE',
115
                status=403)):
116
            self.assertRaises(
117
                ClientError,
118
                self.client.create_server,
119
                vm_name, fid, img_ref)
120

  
121
        with patch.object(
122
                self.C,
123
                'perform_request',
124
                return_value=self.FR()) as perform_req:
125
            self.assertRaises(
126
                ClientError,
127
                self.client.create_server,
128
                vm_name, fid, img_ref)
129
            self.FR.status_code = 202
130
            r = self.client.create_server(vm_name, fid, img_ref)
131
            self.assertEqual(self.client.http_client.url, self.url)
132
            self.assertEqual(self.client.http_client.path, '/servers')
133
            (method, data, a_headers, a_params) = perform_req.call_args[0]
134
            self.assert_dicts_are_deeply_equal(loads(data), vm_send)
135
            self.assert_dicts_are_deeply_equal(r, vm_recv['server'])
136
            prsn = 'Personality string (does not work with real servers)'
137
            self.client.create_server(vm_name, fid, img_ref, prsn)
138
            (method, data, a_headers, a_params) = perform_req.call_args[0]
139
            data = loads(data)
140
            self.assertTrue('personality' in data['server'])
141
            self.assertEqual(prsn, data['server']['personality'])
241 142

  
143
    """
242 144
    def test_list_servers(self):
243
        """Test list servers"""
244
        self.server1 = self._create_server(
245
            self.servname1,
246
            self.flavorid,
247
            self.img)
248
        self.server2 = self._create_server(
249
            self.servname2,
250
            self.flavorid + 2,
251
            self.img)
252
        self._test_0020_list_servers()
253 145

  
254
    def _test_0020_list_servers(self):
255 146
        servers = self.client.list_servers()
256 147
        dservers = self.client.list_servers(detail=True)
257 148

  
258
        """detailed and simple are same size"""
149
        ""detailed and simple are same size""
259 150
        self.assertEqual(len(dservers), len(servers))
260 151
        for i in range(len(servers)):
261 152
            for field in (
......
269 160
                self.assertFalse(field in servers[i])
270 161
                self.assertTrue(field in dservers[i])
271 162

  
272
        """detailed and simple contain same names"""
163
        ""detailed and simple contain same names""
273 164
        names = sorted(map(lambda x: x["name"], servers))
274 165
        dnames = sorted(map(lambda x: x["name"], dservers))
275 166
        self.assertEqual(names, dnames)
276 167

  
277 168
    def _test_0030_wait_test_servers_to_build(self):
278
        """Pseudo-test to wait for VMs to load"""
279
        print('')
280
        self._wait_for_status(self.server1['id'], 'BUILD')
281
        self._wait_for_status(self.server2['id'], 'BUILD')
282

  
283
    def test_get_server_details(self):
284
        """Test get_server_details"""
285 169
        self.server1 = self._create_server(
286 170
            self.servname1,
287 171
            self.flavorid,
......
290 174
        self._test_0040_get_server_details()
291 175

  
292 176
    def _test_0040_get_server_details(self):
293
        r = self.client.get_server_details(self.server1['id'])
294
        self.assertEqual(r["name"], self.servname1)
295
        self.assertEqual(r["flavorRef"], self.flavorid)
296
        self.assertEqual(r["imageRef"], self.img)
297
        self.assertEqual(r["status"], "ACTIVE")
298

  
299
    def test_update_server_name(self):
300
        """Test update_server_name"""
301 177
        self.server1 = self._create_server(
302 178
            self.servname1,
303 179
            self.flavorid,
......
316 192
        self.servers[new_name] = changed
317 193

  
318 194
    def test_reboot_server(self):
319
        """Test reboot server"""
320
        self.server1 = self._create_server(
321
            self.servname1,
322
            self.flavorid,
323
            self.img)
324
        self._wait_for_status(self.server1['id'], 'BUILD')
325
        self.server2 = self._create_server(
326
            self.servname2,
327
            self.flavorid + 1,
328
            self.img)
329
        self._wait_for_status(self.server2['id'], 'BUILD')
330
        self._test_0060_reboot_server()
331
        self._wait_for_status(self.server1['id'], 'REBOOT')
332
        self._wait_for_status(self.server2['id'], 'REBOOT')
333

  
334
    def _test_0060_reboot_server(self):
335
        self.client.reboot_server(self.server1['id'])
336
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
337
        self.client.reboot_server(self.server2['id'], hard=True)
338
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
339

  
340
    def _test_0070_wait_test_servers_to_reboot(self):
341
        """Pseudo-test to wait for VMs to load"""
342 195
        print('')
343 196
        self._wait_for_status(self.server1['id'], 'REBOOT')
344 197
        self._wait_for_status(self.server2['id'], 'REBOOT')
345 198

  
346 199
    def test_create_server_metadata(self):
347
        """Test create_server_metadata"""
348
        self.server1 = self._create_server(
349
            self.servname1,
350
            self.flavorid,
351
            self.img)
352
        self._test_0080_create_server_metadata()
353

  
354
    def _test_0080_create_server_metadata(self):
355 200
        r1 = self.client.create_server_metadata(
356 201
            self.server1['id'],
357 202
            'mymeta',
......
361 206
        self.assert_dicts_are_deeply_equal(r1, r2)
362 207

  
363 208
    def test_get_server_metadata(self):
364
        """Test get server_metadata"""
365
        self.server1 = self._create_server(
366
            self.servname1,
367
            self.flavorid,
368
            self.img)
369
        self._test_0090_get_server_metadata()
370

  
371
    def _test_0090_get_server_metadata(self):
372 209
        self.client.create_server_metadata(
373 210
            self.server1['id'],
374 211
            'mymeta_0',
......
377 214
        self.assertEqual(r['mymeta_0'], 'val_0')
378 215

  
379 216
    def test_update_server_metadata(self):
380
        """Test update_server_metadata"""
381
        self.server1 = self._create_server(
382
            self.servname1,
383
            self.flavorid,
384
            self.img)
385
        self._test_0100_update_server_metadata()
386

  
387
    def _test_0100_update_server_metadata(self):
388 217
        r1 = self.client.create_server_metadata(
389 218
            self.server1['id'],
390 219
            'mymeta3',
......
396 225
        self.assertTrue(r2['mymeta3'], 'val3')
397 226

  
398 227
    def test_delete_server_metadata(self):
399
        """Test delete_server_metadata"""
400
        self.server1 = self._create_server(
401
            self.servname1,
402
            self.flavorid,
403
            self.img)
404
        self._test_0110_delete_server_metadata()
405

  
406
    def _test_0110_delete_server_metadata(self):
407 228
        r1 = self.client.create_server_metadata(
408 229
            self.server1['id'],
409 230
            'mymeta',
......
417 238
            self.assertEqual(err.status, 404)
418 239

  
419 240
    def test_list_flavors(self):
420
        """Test flavors_get"""
421
        self._test_0120_list_flavors()
422

  
423
    def _test_0120_list_flavors(self):
424 241
        r = self.client.list_flavors()
425 242
        self.assertTrue(len(r) > 1)
426 243
        r = self.client.list_flavors(detail=True)
427 244
        self.assertTrue('SNF:disk_template' in r[0])
428 245

  
429 246
    def test_get_flavor_details(self):
430
        """Test test_get_flavor_details"""
431
        self._test_0130_get_flavor_details()
432

  
433
    def _test_0130_get_flavor_details(self):
434 247
        r = self.client.get_flavor_details(self.flavorid)
435 248
        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
436 249

  
437 250
    def test_list_images(self):
438
        """Test list_images"""
439
        self._test_0140_list_images()
440

  
441
    def _test_0140_list_images(self):
442 251
        r = self.client.list_images()
443 252
        self.assertTrue(len(r) > 1)
444 253
        r = self.client.list_images(detail=True)
......
448 257
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
449 258

  
450 259
    def test_get_image_details(self):
451
        """Test image_details"""
452
        self._test_0150_get_image_details()
453

  
454
    def _test_0150_get_image_details(self):
455 260
        r = self.client.get_image_details(self.img)
456 261
        self.assert_dicts_are_deeply_equal(r, self.img_details)
457 262

  
458 263
    def test_get_image_metadata(self):
459
        """Test get_image_metadata"""
460
        self._test_0160_get_image_metadata()
461

  
462
    def _test_0160_get_image_metadata(self):
463 264
        r = self.client.get_image_metadata(self.img)
464 265
        self.assert_dicts_are_deeply_equal(
465 266
            self.img_details['metadata']['values'], r)
......
468 269
            self.assertEqual(r[key], val)
469 270

  
470 271
    def test_shutdown_server(self):
471
        """Test shutdown_server"""
472
        self.server1 = self._create_server(
473
            self.servname1,
474
            self.flavorid,
475
            self.img)
476
        self._wait_for_status(self.server1['id'], 'BUILD')
477
        self._test_0170_shutdown_server()
478

  
479
    def _test_0170_shutdown_server(self):
480 272
        self.client.shutdown_server(self.server1['id'])
481 273
        self._wait_for_status(self.server1['id'], 'ACTIVE')
482 274
        r = self.client.get_server_details(self.server1['id'])
483 275
        self.assertEqual(r['status'], 'STOPPED')
484 276

  
485 277
    def test_start_server(self):
486
        """Test start_server"""
487
        self.server1 = self._create_server(
488
            self.servname1,
489
            self.flavorid,
490
            self.img)
491
        self._wait_for_status(self.server1['id'], 'BUILD')
492
        self.client.shutdown_server(self.server1['id'])
493
        self._wait_for_status(self.server1['id'], 'ACTIVE')
494
        self._test_0180_start_server()
495

  
496
    def _test_0180_start_server(self):
497 278
        self.client.start_server(self.server1['id'])
498 279
        self._wait_for_status(self.server1['id'], 'STOPPED')
499 280
        r = self.client.get_server_details(self.server1['id'])
500 281
        self.assertEqual(r['status'], 'ACTIVE')
501 282

  
502 283
    def test_get_server_console(self):
503
        """Test get_server_console"""
504
        self.server2 = self._create_server(
505
            self.servname2,
506
            self.flavorid + 2,
507
            self.img)
508
        self._wait_for_status(self.server2['id'], 'BUILD')
509
        self._test_0190_get_server_console()
510

  
511
    def _test_0190_get_server_console(self):
512 284
        r = self.client.get_server_console(self.server2['id'])
513 285
        self.assertTrue('host' in r)
514 286
        self.assertTrue('password' in r)
......
516 288
        self.assertTrue('type' in r)
517 289

  
518 290
    def test_get_firewall_profile(self):
519
        """Test get_firewall_profile"""
520
        self.server1 = self._create_server(
521
            self.servname1,
522
            self.flavorid,
523
            self.img)
524
        self._test_0200_get_firewall_profile()
525

  
526
    def _test_0200_get_firewall_profile(self):
527 291
        self._wait_for_status(self.server1['id'], 'BUILD')
528 292
        fprofile = self.client.get_firewall_profile(self.server1['id'])
529 293
        self.assertTrue(fprofile in self.PROFILES)
530 294

  
531 295
    def test_set_firewall_profile(self):
532
        """Test set_firewall_profile"""
533
        self.server1 = self._create_server(
534
            self.servname1,
535
            self.flavorid,
536
            self.img)
537
        self._test_0210_set_firewall_profile()
538

  
539
    def _test_0210_set_firewall_profile(self):
540

  
541 296
        self._wait_for_status(self.server1['id'], 'BUILD')
542 297
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
543 298
        fprofile = self.client.get_firewall_profile(self.server1['id'])
......
568 323
            count_success += 1
569 324

  
570 325
    def test_get_server_stats(self):
571
        self.server1 = self._create_server(
572
            self.servname1,
573
            self.flavorid,
574
            self.img)
575
        self._test_0220_get_server_stats()
576

  
577
    def _test_0220_get_server_stats(self):
578 326
        r = self.client.get_server_stats(self.server1['id'])
579 327
        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
580 328
        for term in it:
581 329
            self.assertTrue(term in r)
582 330

  
583 331
    def test_create_network(self):
584
        """Test create_network"""
585
        self._test_0230_create_network()
586

  
587
    def _test_0230_create_network(self):
588 332
        print('\twith no params')
589 333
        self.network1 = self._create_network(self.netname1)
590 334
        self._wait_for_network(self.network1['id'], 'ACTIVE')
......
612 356
            self.assertEqual(self.network1[param], val)
613 357

  
614 358
    def test_connect_server(self):
615
        """Test connect_server"""
616
        self.server1 = self._create_server(
617
            self.servname1,
618
            self.flavorid,
619
            self.img)
620
        self.network1 = self._create_network(self.netname1)
621
        self._wait_for_status(self.server1['id'], 'BUILD')
622
        self._wait_for_network(self.network1['id'], 'ACTIVE')
623
        self._test_0240_connect_server()
624

  
625
    def _test_0250_connect_server(self):
626 359
        self.client.connect_server(self.server1['id'], self.network1['id'])
627 360
        self.assertTrue(self._wait_for_nic(
628 361
            self.network1['id'],
629 362
            self.server1['id']))
630 363

  
631 364
    def test_disconnect_server(self):
632
        """Test disconnect_server"""
633
        self.test_connect_server()
634
        self._test_0250_disconnect_server()
635

  
636
    def _test_0250_disconnect_server(self):
637 365
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
638 366
        self.assertTrue(self._wait_for_nic(
639 367
            self.network1['id'],
......
641 369
            in_creation=False))
642 370

  
643 371
    def _test_0260_wait_for_second_network(self):
644
        self.network2 = self._create_network(self.netname2)
645
        self._wait_for_network(self.network2['id'], 'ACTIVE')
646

  
647
    def test_list_server_nics(self):
648
        """Test list_server_nics"""
649 372
        self.server1 = self._create_server(
650 373
            self.servname1,
651 374
            self.flavorid,
......
666 389
        self.assertTrue(len(r) > len0)
667 390

  
668 391
    def test_list_networks(self):
669
        """Test list_network"""
670
        self.network1 = self._create_network(self.netname1)
671
        self._wait_for_network(self.network1['id'], 'ACTIVE')
672
        self._test_0290_list_networks()
673

  
674
    def _test_0290_list_networks(self):
675 392
        r = self.client.list_networks()
676 393
        self.assertTrue(len(r) > 1)
677 394
        ids = [net['id'] for net in r]
......
691 408
                self.assertTrue(term in net.keys())
692 409

  
693 410
    def test_get_network_details(self):
694
        """Test get_network_details"""
695
        self.network1 = self._create_network(self.netname1)
696
        self._test_0300_get_network_details()
697

  
698
    def _test_0300_get_network_details(self):
699 411
        r = self.client.get_network_details(self.network1['id'])
700 412
        net1 = dict(self.network1)
701 413
        net1.pop('status')
......
707 419
        self.assert_dicts_are_deeply_equal(net1, r)
708 420

  
709 421
    def test_update_network_name(self):
710
        self.network2 = self._create_network(self.netname2)
711
        self._test_0310_update_network_name()
712

  
713
    def _test_0310_update_network_name(self):
714 422
        updated_name = self.netname2 + '_upd'
715 423
        self.client.update_network_name(self.network2['id'], updated_name)
716 424

  
......
727 435
        r = self.client.get_network_details(self.network2['id'])
728 436
        self.assertEqual(r['name'], updated_name)
729 437

  
730
    """ Don't have auth to test this
731 438
    def test_delete_image(self):
732
        ""Test delete_image""
733
        self._test_0330_delete_image()
734
    def _test_0330_delete_image(self):
735 439
        images = self.client.list_images()
736 440
        self.client.delete_image(images[2]['id'])
737 441
        try:
......
740 444
            self.assertEqual(err.status, 404)
741 445

  
742 446
    def test_create_image_metadata(self):
743
        ""Test create_image_metadata""
744
        self._test_0340_create_image_metadata()
745
    def _test_0340_create_image_metadata(self):
746 447
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
747 448
        self.assertEqual(r['mykey'], 'myval')
748 449

  
749 450
    def test_update_image_metadata(self):
750
        ""Test update_image_metadata""
751
        self._test_0350_update_image_metadata()
752
    def _test_0350_update_image_metadata(self):
753 451
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
754 452
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
755 453
        self.assertEqual(r['mykey0'], 'myval0')
756 454

  
757 455
    def test_delete_image_metadata(self):
758
        ""Test delete_image_metadata""
759
        self._test_0360_delete_image_metadata()
760
    def _test_0360_delete_image_metadata(self):
761 456
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
762 457
        self.client.delete_image_metadata(self.img, 'mykey1')
763 458
        r = self.client.get_image_metadata(self.img)
b/kamaki/clients/test/image.py
128 128

  
129 129
class Image(TestCase):
130 130

  
131
    def assert_dicts_are_deeply_equal(self, d1, d2):
132
        for k, v in d1.items():
133
            self.assertTrue(k in d2)
134
            if isinstance(v, dict):
135
                self.assert_dicts_are_deeply_equal(v, d2[k])
136
            else:
137
                self.assertEqual(unicode(v), unicode(d2[k]))
138

  
131 139
    class FR(object):
132 140
        json = example_images
133 141
        headers = {}
......
139 147
            pass
140 148

  
141 149
    def setUp(self):
142
        self.imgname = 'img_%s' % self.now
143 150
        self.url = 'http://image.example.com'
144 151
        self.token = 'an1m@g370k3n=='
145 152
        from kamaki.clients.image import ImageClient
146 153
        self.client = ImageClient(self.url, self.token)
147
        self.cyclades_url = 'http://cyclades.example.com'
148
        from kamaki.clients.cyclades import CycladesClient
149
        self.cyclades = CycladesClient(self.cyclades_url, self.token)
150 154
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
151 155
        self.C = KamakiHTTPConnection
152 156

  
......
154 158
        self.FR.json = example_images
155 159
        self.FR.status_code = 200
156 160

  
157
    def assert_dicts_are_deeply_equal(self, d1, d2):
158
        for k, v in d1.items():
159
            self.assertTrue(k in d2)
160
            if isinstance(v, dict):
161
                self.assert_dicts_are_deeply_equal(v, d2[k])
162
            else:
163
                self.assertEqual(unicode(v), unicode(d2[k]))
164

  
165 161
    def test_list_public(self):
166 162
        with patch.object(
167 163
            self.C,

Also available in: Unified diff