root / api / tests.py @ 7e2f9d4b
History | View | Annotate | Download (18.4 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['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['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['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 |
|