Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ 4e6f9904

History | View | Annotate | Download (18.5 kB)

1
#
2
# Unit Tests for api
3
#
4
# Provides automated tests for api module
5
#
6
# Copyright 2011 Greek Research and Technology Network
7
#
8

    
9
from django.test import TestCase
10
from django.test.client import Client
11
import simplejson as json
12
from synnefo.db.models import VirtualMachine, Flavor, Image, VirtualMachineGroup
13
from synnefo.api.tests_redux import APIReduxTestCase
14

    
15

    
16
class APITestCase(TestCase):
17
    fixtures = [ 'api_test_data' ]
18
    test_server_id = 1001
19
    test_image_id = 1
20
    test_flavor_id = 1
21
    test_group_id = 1
22
    test_wrong_server_id = 99999999
23
    test_wrong_image_id = 99999999
24
    test_wrong_flavor_id = 99999999
25
    test_wrong_group_id = 99999999
26
    #make the testing with these id's
27

    
28

    
29
    def setUp(self):
30
        self.client = Client()
31

    
32
    def testAPIVersion(self):
33
        """ check rackspace cloud servers API version
34
        """
35
        response = self.client.get('/api/v1.0/')
36
        # Check that the response is 200 OK.
37
        self.assertEqual(response.status_code, 200)
38
        api_version = json.loads(response.content)['version']
39
        self.assertEqual(api_version['status'], 'CURRENT')
40
        self.assertEqual(api_version['wadl'], 'http://docs.rackspacecloud.com/servers/api/v1.0/application.wadl')
41
        self.assertEqual(api_version['docURL'], 'http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf')
42
        self.assertEqual(api_version['id'], 'v1.0')
43

    
44

    
45
    def testServerList(self):
46
        """ test if the expected list of servers is returned by the API
47
        """        
48
        response = self.client.get('/api/v1.0/servers')
49
        vms_from_api = json.loads(response.content)['servers']
50
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
51
        self.assertEqual(len(vms_from_api), len(vms_from_db))
52
        self.assertTrue(response.status_code in [200,203])
53
        for vm_from_api in vms_from_api:
54
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
55
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
56
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
57

    
58

    
59
    def testServerDetails(self):
60
        """ test if the expected server is returned by the API
61
        """        
62
        response = self.client.get('/api/v1.0/servers/' + str(self.test_server_id))
63
        vm_from_api = json.loads(response.content)['server']
64
        vm_from_db = VirtualMachine.objects.get(id=self.test_server_id)
65
        self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
66
        self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
67
        self.assertEqual(vm_from_api['id'], vm_from_db.id)
68
        self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
69
        self.assertEqual(vm_from_api['name'], vm_from_db.name)
70
        self.assertEqual(vm_from_api['status'], vm_from_db.rsapi_state)
71
        self.assertTrue(response.status_code in [200,203])
72

    
73

    
74
    def testServersDetails(self):
75
        """ test if the servers details are returned by the API
76
        """
77
        response = self.client.get('/api/v1.0/servers/detail')     
78
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
79
        id_list = [vm.id for vm in vms_from_db]
80
        number = 0
81
        for vm_id in id_list:
82
            vm_from_api = json.loads(response.content)['servers'][number]
83
            vm_from_db = VirtualMachine.objects.get(id=vm_id)
84
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
85
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
86
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
87
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
88
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
89
            self.assertEqual(vm_from_api['status'], vm_from_db.rsapi_state)
90
            number += 1
91
        vms_from_api = json.loads(response.content)['servers']
92
        for vm_from_api in vms_from_api:
93
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
94
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
95
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
96
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
97
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
98
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
99
            self.assertEqual(vm_from_api['status'], vm_from_db.rsapi_state)            
100
        self.assertTrue(response.status_code in [200,203])
101

    
102

    
103
    def testWrongServer(self):
104
        """ test if a non existent server is asked, if a 404 itemNotFound returned
105
        """
106
        response = self.client.get('/api/v1.0/servers/' + str(self.test_wrong_server_id))
107
        self.assertEqual(response.status_code, 404)
108

    
109

    
110
    def testCreateServerEmpty(self):
111
        """ test if the create server call returns a 400 badRequest if no
112
            attributes are specified
113
        """
114
        response = self.client.post('/api/v1.0/servers',{})
115
        self.assertEqual(response.status_code, 400)
116

    
117

    
118
    def testCreateServer(self):
119
        """ test if the create server call returns the expected response
120
            if a valid request has been speficied
121
        """
122
        request = {
123
                    "server": {
124
                        "name"          : "new-server-test",
125
                        "imageRef"       : 1,
126
                        "flavorRef"      : 1,
127
                        "metadata"      : {
128
                            "My Server Name": "Apache1"
129
                        },
130
                        "personality"   : []
131
                    }
132
        }
133
        response = self.client.post('/api/v1.0/servers', 
134
                                    json.dumps(request), 
135
                                    content_type='application/json')
136
        self.assertEqual(response.status_code, 202)
137
        #TODO: check response.content      
138
        #TODO: check create server with wrong options (eg flavor that not exist)
139
    
140

    
141
    def testRebootServer(self):
142
        """ test if the specified server is rebooted
143
        """
144
        request = {
145
            "reboot": '{"type" : "HARD"}'
146
            }
147
        response = self.client.post('/api/v1.0/servers/' + str(self.test_server_id) + '/action', 
148
                                    json.dumps(request),
149
                                    content_type='application/json')  
150
        self.assertEqual(response.status_code, 202)
151
        #server id that does not exist
152
        response = self.client.post('/api/v1.0/servers/' + str(self.test_wrong_server_id) + '/action', 
153
                                   json.dumps(request), 
154
                                   content_type='application/json')
155
        self.assertEqual(response.status_code, 404)
156

    
157

    
158
    def testShutdownServer(self):
159
        """ test if the specified server is shutdown
160
        """
161
        request = {
162
            "shutdown": {"timeout" : "5"}
163
            }
164
        response = self.client.post('/api/v1.0/servers/' + str(self.test_server_id) + '/action',
165
                                    json.dumps(request), 
166
                                    content_type='application/json')  
167
        self.assertEqual(response.status_code, 202)
168
        #server id that does not exist
169
        response = self.client.post('/api/v1.0/servers/' + str(self.test_wrong_server_id) + '/action',
170
                                    json.dumps(request), 
171
                                    content_type='application/json')
172
        self.assertEqual(response.status_code, 404)
173

    
174

    
175
    def testStartServer(self):
176
        """ test if the specified server is started
177
        """
178
        request = {
179
            "start": {"type" : "NORMAL"}
180
            }
181
        response = self.client.post('/api/v1.0/servers/' + str(self.test_server_id) + '/action', 
182
                                    json.dumps(request),
183
                                    content_type='application/json')  
184
        self.assertEqual(response.status_code, 202)
185
        #server id that does not exist
186
        response = self.client.post('/api/v1.0/servers/' + str(self.test_wrong_server_id) + '/action', 
187
                                    json.dumps(request), 
188
                                    content_type='application/json')
189
        self.assertEqual(response.status_code, 404)
190

    
191
    def testDeleteServer(self):
192
        """ test if the specified server is deleted
193
        """
194
        response = self.client.delete('/api/v1.0/servers/' + str(self.test_server_id))
195
        self.assertEqual(response.status_code, 202)
196
        #server id that does not exist      
197
        response = self.client.delete('/api/v1.0/servers/' + str(self.test_wrong_server_id))  
198
        self.assertEqual(response.status_code, 404)
199

    
200

    
201
    def testFlavorList(self):
202
        """ test if the expected list of flavors is returned by the API
203
        """        
204
        response = self.client.get('/api/v1.0/flavors')
205
        flavors_from_api = json.loads(response.content)['flavors']
206
        flavors_from_db = Flavor.objects.all()
207
        self.assertEqual(len(flavors_from_api), len(flavors_from_db))
208
        self.assertTrue(response.status_code in [200,203])
209
        for flavor_from_api in flavors_from_api:
210
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
211
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
212
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
213

    
214

    
215
    def testFlavorsDetails(self):
216
        """ test if the flavors details are returned by the API
217
        """
218
        response = self.client.get('/api/v1.0/flavors/detail')
219
        flavors_from_db = Flavor.objects.all()
220
        flavors_from_api = json.loads(response.content)['flavors']
221
        
222
        # Assert that all flavors in the db appear inthe API call result
223
        for i in range(0, len(flavors_from_db)):
224
            flavor_from_api = flavors_from_api[i]
225
            flavor_from_db = Flavor.objects.get(id=flavors_from_db[i].id)
226
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
227
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
228
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
229
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
230
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
231

    
232
        # Assert that all flavors that appear in the API call result are also in the db             
233
        for flavor_from_api in flavors_from_api:
234
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
235
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
236
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
237
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
238
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
239
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
240
        
241
        # Check if we have the right status_code
242
        self.assertTrue(response.status_code in [200,203])
243

    
244

    
245
    def testFlavorDetails(self):
246
        """ test if the expected flavor is returned by the API
247
        """
248
        response = self.client.get('/api/v1.0/flavors/' + str(self.test_flavor_id))
249
        flavor_from_api = json.loads(response.content)['flavor']
250
        flavor_from_db = Flavor.objects.get(id=self.test_flavor_id)
251
        self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
252
        self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
253
        self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
254
        self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
255
        self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
256
        self.assertTrue(response.status_code in [200,203])
257

    
258

    
259
    def testWrongFlavor(self):
260
        """ test if a non existent flavor is asked, if a 404 itemNotFound returned
261
        """
262
        response = self.client.get('/api/v1.0/flavors/' + str(self.test_wrong_flavor_id))
263
        self.assertTrue(response.status_code in [404, 503])
264

    
265
    def testImageList(self):
266
        """ test if the expected list of images is returned by the API
267
        """        
268
        response = self.client.get('/api/v1.0/images')
269
        images_from_api = json.loads(response.content)['images']
270
        images_from_db = Image.objects.all()
271
        self.assertEqual(len(images_from_api), len(images_from_db))
272
        self.assertTrue(response.status_code in [200,203])
273
        for image_from_api in images_from_api:
274
            image_from_db = Image.objects.get(id=image_from_api['id'])
275
            self.assertEqual(image_from_api['id'], image_from_db.id)
276
            self.assertEqual(image_from_api['name'], image_from_db.name)
277

    
278

    
279
    def testImageDetails(self):
280
        """ test if the expected image is returned by the API
281
        """
282
        response = self.client.get('/api/v1.0/images/' + str(self.test_image_id))
283
        image_from_api = json.loads(response.content)['image']
284
        image_from_db = Image.objects.get(id=self.test_image_id)
285
        self.assertEqual(image_from_api['name'], image_from_db.name)
286
        self.assertEqual(image_from_api['id'], image_from_db.id)
287
        self.assertEqual(image_from_api['serverId'], image_from_db.sourcevm and image_from_db.sourcevm.id or "")
288
        self.assertEqual(image_from_api['size'], image_from_db.size)
289
        self.assertEqual(image_from_api['status'], image_from_db.state)
290
        self.assertEqual(image_from_api['metadata']['meta']['key']['description'], image_from_db.description)
291
        self.assertTrue(response.status_code in [200,203])
292

    
293

    
294
    def testImagesDetails(self):
295
        """ test if the images details are returned by the API
296
        """
297
        response = self.client.get('/api/v1.0/images/detail')
298
        images_from_api = json.loads(response.content)['images']
299
        images_from_db = Image.objects.all()
300
        for i in range(0, len(images_from_db)):
301
            image_from_db = Image.objects.get(id=images_from_db[i].id)
302
            image_from_api = images_from_api[i]
303
            self.assertEqual(image_from_api['name'], image_from_db.name)
304
            self.assertEqual(image_from_api['id'], image_from_db.id)
305
            self.assertEqual(image_from_api['serverId'], image_from_db.sourcevm and image_from_db.sourcevm.id or "")
306
            self.assertEqual(image_from_api['size'], image_from_db.size)
307
            self.assertEqual(image_from_api['status'], image_from_db.state)
308
            self.assertEqual(image_from_api['metadata']['meta']['key']['description'], image_from_db.description)
309

    
310
        for image_from_api in images_from_api:
311
            image_from_db = Image.objects.get(id=image_from_api['id'])
312
            self.assertEqual(image_from_api['name'], image_from_db.name)
313
            self.assertEqual(image_from_api['id'], image_from_db.id)
314
            self.assertEqual(image_from_api['serverId'], image_from_db.sourcevm and image_from_db.sourcevm.id or "")
315
            self.assertEqual(image_from_api['size'], image_from_db.size)
316
            self.assertEqual(image_from_api['status'], image_from_db.state)
317
            self.assertEqual(image_from_api['metadata']['meta']['key']['description'], image_from_db.description)
318
            
319
        self.assertTrue(response.status_code in [200,203])
320

    
321

    
322
    def testWrongImage(self):
323
        """ test if a non existent image is asked, if a 404 itemNotFound returned
324
        """
325
        response = self.client.get('/api/v1.0/images/' + str(self.test_wrong_image_id))
326
        self.assertEqual(response.status_code, 404)
327

    
328

    
329
    def testServerMetadata(self):
330
        """ test server's metadata (add, edit)
331
        """
332
        request = {
333
            "metadata": {"metadata_key" : "name", "metadata_value" : "a fancy name"}
334
            }
335
        response = self.client.put('/api/v1.0/servers' + str(self.test_server_id), 
336
                                    json.dumps(request),
337
                                    content_type='application/json')  
338
        self.assertEqual(response.status_code, 404)
339
        #TODO: not working atm, due to problem with django piston and PUT
340

    
341
    def testVMgroupList(self):
342
        """ test if the expected list of groups is returned by the API
343
        """        
344
        response = self.client.get('/api/v1.0/groups')
345
        groups_from_api = json.loads(response.content)['groups']
346
        groups_from_db = VirtualMachineGroup.objects.all()
347
        self.assertEqual(len(groups_from_api), len(groups_from_db))
348
        self.assertTrue(response.status_code in [200,203])
349
        for group_from_api in groups_from_api:
350
            group_from_db = VirtualMachineGroup.objects.get(id=group_from_api['id'])
351
            self.assertEqual(group_from_api['id'], group_from_db.id)
352
            self.assertEqual(group_from_api['name'], group_from_db.name)
353

    
354
    def testVMgroupDetails(self):
355
        """ test if the expected virtual machine group is returned by the API
356
        """
357
        response = self.client.get('/api/v1.0/groups/' + str(self.test_group_id))
358
        group_from_api = json.loads(response.content)['group']
359
        group_from_db = VirtualMachineGroup.objects.get(id=self.test_group_id)
360
        self.assertEqual(group_from_api['name'], group_from_db.name)
361
        self.assertEqual(group_from_api['id'], group_from_db.id)
362
        self.assertEqual(group_from_api['server_id'], [machine.id for machine in group_from_db.machines.all()])
363
        self.assertTrue(response.status_code in [200,203])
364

    
365
    def testWrongVMgroup(self):
366
        """ test if a non existent VMgroup is asked, if a 404 itemNotFound returned
367
        """
368
        response = self.client.get('/api/v1.0/groups/' + str(self.test_wrong_group_id))
369
        self.assertEqual(response.status_code, 404)
370

    
371
    def testgroupsDetails(self):
372
        """ test if the groups details are returned by the API
373
        """
374
        response = self.client.get('/api/v1.0/groups/detail')
375
        groups_from_api = json.loads(response.content)['groups']
376
        groups_from_db = VirtualMachineGroup.objects.all()
377
        for i in range(0, len(groups_from_db)):
378
            group_from_db = VirtualMachineGroup.objects.get(id=groups_from_db[i].id)
379
            group_from_api = groups_from_api[i]
380
            self.assertEqual(group_from_api['name'], group_from_db.name)
381
            self.assertEqual(group_from_api['id'], group_from_db.id)
382
            self.assertEqual(group_from_api['server_id'], [machine.id for machine in group_from_db.machines.all()])
383
        for group_from_api in groups_from_api:
384
            group_from_db = VirtualMachineGroup.objects.get(id=group_from_api['id'])
385
            self.assertEqual(group_from_api['name'], group_from_db.name)
386
            self.assertEqual(group_from_api['id'], group_from_db.id)
387
            self.assertEqual(group_from_api['server_id'], [machine.id for machine in group_from_db.machines.all()])            
388
        self.assertTrue(response.status_code in [200,203])
389