Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ 7584d408

History | View | Annotate | Download (21.2 kB)

1 894f6b7e Dimitris Moraitis
#
2 894f6b7e Dimitris Moraitis
# Unit Tests for api
3 894f6b7e Dimitris Moraitis
#
4 285a1fa8 Dimitris Moraitis
# Provides automated tests for api module
5 894f6b7e Dimitris Moraitis
#
6 285a1fa8 Dimitris Moraitis
# Copyright 2011 Greek Research and Technology Network
7 894f6b7e Dimitris Moraitis
#
8 894f6b7e Dimitris Moraitis
9 34244492 Markos Gogoulos
import datetime
10 a237869d Faidon Liambotis
from django.utils import simplejson as json
11 894f6b7e Dimitris Moraitis
from django.test import TestCase
12 894f6b7e Dimitris Moraitis
from django.test.client import Client
13 e646ebe5 Dimitris Moraitis
from synnefo.db.models import VirtualMachine, VirtualMachineGroup
14 e646ebe5 Dimitris Moraitis
from synnefo.db.models import Flavor, Image
15 7e2f9d4b Giorgos Verigakis
from synnefo.api.tests_redux import APIReduxTestCase
16 5fb55fba Georgios Gousios
from synnefo.api.tests_auth import AuthTestCase
17 7e2f9d4b Giorgos Verigakis
18 5fb55fba Georgios Gousios
from synnefo.logic import utils
19 894f6b7e Dimitris Moraitis
20 894f6b7e Dimitris Moraitis
class APITestCase(TestCase):
21 e646ebe5 Dimitris Moraitis
    fixtures = ['api_test_data', ]
22 d2e5f1d1 Markos Gogoulos
    test_server_id = 1001
23 d2e5f1d1 Markos Gogoulos
    test_image_id = 1
24 d2e5f1d1 Markos Gogoulos
    test_flavor_id = 1
25 a8acbbac Markos Gogoulos
    test_group_id = 1
26 d2e5f1d1 Markos Gogoulos
    test_wrong_server_id = 99999999
27 d2e5f1d1 Markos Gogoulos
    test_wrong_image_id = 99999999
28 d2e5f1d1 Markos Gogoulos
    test_wrong_flavor_id = 99999999
29 a8acbbac Markos Gogoulos
    test_wrong_group_id = 99999999
30 d2e5f1d1 Markos Gogoulos
    #make the testing with these id's
31 d2e5f1d1 Markos Gogoulos
32 894f6b7e Dimitris Moraitis
    def setUp(self):
33 7de0c985 Dimitris Moraitis
        self.client = Client()
34 894f6b7e Dimitris Moraitis
35 e646ebe5 Dimitris Moraitis
    def test_api_version(self):
36 285a1fa8 Dimitris Moraitis
        """ check rackspace cloud servers API version
37 6781c0d0 Dimitris Moraitis
        """
38 7de0c985 Dimitris Moraitis
        response = self.client.get('/api/v1.0/')
39 894f6b7e Dimitris Moraitis
        # Check that the response is 200 OK.
40 894f6b7e Dimitris Moraitis
        self.assertEqual(response.status_code, 200)
41 54c30633 Markos Gogoulos
        api_version = json.loads(response.content)['version']
42 54c30633 Markos Gogoulos
        self.assertEqual(api_version['status'], 'CURRENT')
43 e646ebe5 Dimitris Moraitis
        self.assertEqual(api_version['wadl'],
44 e646ebe5 Dimitris Moraitis
            'http://docs.rackspacecloud.com/servers/api/v1.0/application.wadl')
45 e646ebe5 Dimitris Moraitis
        self.assertEqual(api_version['docURL'],
46 e646ebe5 Dimitris Moraitis
    'http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf')
47 54c30633 Markos Gogoulos
        self.assertEqual(api_version['id'], 'v1.0')
48 54c30633 Markos Gogoulos
49 e646ebe5 Dimitris Moraitis
    def test_server_list(self):
50 6781c0d0 Dimitris Moraitis
        """ test if the expected list of servers is returned by the API
51 e646ebe5 Dimitris Moraitis
        """
52 7de0c985 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers')
53 6781c0d0 Dimitris Moraitis
        vms_from_api = json.loads(response.content)['servers']
54 668c1361 Markos Gogoulos
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
55 6781c0d0 Dimitris Moraitis
        self.assertEqual(len(vms_from_api), len(vms_from_db))
56 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
57 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
58 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
59 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
60 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
61 54c30633 Markos Gogoulos
62 e646ebe5 Dimitris Moraitis
    def test_server_details(self):
63 668c1361 Markos Gogoulos
        """ test if the expected server is returned by the API
64 e646ebe5 Dimitris Moraitis
        """
65 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers/' +
66 e646ebe5 Dimitris Moraitis
                                   str(self.test_server_id))
67 668c1361 Markos Gogoulos
        vm_from_api = json.loads(response.content)['server']
68 d2e5f1d1 Markos Gogoulos
        vm_from_db = VirtualMachine.objects.get(id=self.test_server_id)
69 b335768e Markos Gogoulos
        self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
70 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
71 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['id'], vm_from_db.id)
72 b335768e Markos Gogoulos
        self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
73 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['name'], vm_from_db.name)
74 dbccf323 Vassilios Karakoidas
        self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
75 668c1361 Markos Gogoulos
        self.assertTrue(response.status_code in [200,203])
76 668c1361 Markos Gogoulos
77 54c30633 Markos Gogoulos
78 e646ebe5 Dimitris Moraitis
    def test_servers_details(self):
79 685ab2b6 Markos Gogoulos
        """ test if the servers details are returned by the API
80 685ab2b6 Markos Gogoulos
        """
81 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers/detail')
82 54c30633 Markos Gogoulos
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
83 54c30633 Markos Gogoulos
        id_list = [vm.id for vm in vms_from_db]
84 685ab2b6 Markos Gogoulos
        number = 0
85 685ab2b6 Markos Gogoulos
        for vm_id in id_list:
86 685ab2b6 Markos Gogoulos
            vm_from_api = json.loads(response.content)['servers'][number]
87 685ab2b6 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_id)
88 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
89 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
90 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
91 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
92 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
93 dbccf323 Vassilios Karakoidas
            self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
94 685ab2b6 Markos Gogoulos
            number += 1
95 54c30633 Markos Gogoulos
        vms_from_api = json.loads(response.content)['servers']
96 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
97 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
98 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
99 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
100 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
101 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
102 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
103 dbccf323 Vassilios Karakoidas
            self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
104 685ab2b6 Markos Gogoulos
        self.assertTrue(response.status_code in [200,203])
105 685ab2b6 Markos Gogoulos
106 54c30633 Markos Gogoulos
107 e646ebe5 Dimitris Moraitis
    def test_wrong_server(self):
108 e646ebe5 Dimitris Moraitis
        """ test 404 response if server does not exist
109 685ab2b6 Markos Gogoulos
        """
110 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers/' +
111 e646ebe5 Dimitris Moraitis
                                   str(self.test_wrong_server_id))
112 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
113 685ab2b6 Markos Gogoulos
114 e646ebe5 Dimitris Moraitis
    def test_create_server_empty(self):
115 7de0c985 Dimitris Moraitis
        """ test if the create server call returns a 400 badRequest if no
116 7de0c985 Dimitris Moraitis
            attributes are specified
117 7de0c985 Dimitris Moraitis
        """
118 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers', {})
119 7de0c985 Dimitris Moraitis
        self.assertEqual(response.status_code, 400)
120 54c30633 Markos Gogoulos
121 e646ebe5 Dimitris Moraitis
    def test_create_server(self):
122 685ab2b6 Markos Gogoulos
        """ test if the create server call returns the expected response
123 685ab2b6 Markos Gogoulos
            if a valid request has been speficied
124 7de0c985 Dimitris Moraitis
        """
125 7de0c985 Dimitris Moraitis
        request = {
126 285a1fa8 Dimitris Moraitis
                    "server": {
127 e646ebe5 Dimitris Moraitis
                        "name": "new-server-test",
128 e646ebe5 Dimitris Moraitis
                        "imageRef": 1,
129 e646ebe5 Dimitris Moraitis
                        "flavorRef": 1,
130 e646ebe5 Dimitris Moraitis
                        "metadata": {
131 285a1fa8 Dimitris Moraitis
                            "My Server Name": "Apache1"
132 285a1fa8 Dimitris Moraitis
                        },
133 e646ebe5 Dimitris Moraitis
                        "personality": []
134 285a1fa8 Dimitris Moraitis
                    }
135 7de0c985 Dimitris Moraitis
        }
136 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers',
137 e646ebe5 Dimitris Moraitis
                                    json.dumps(request),
138 685ab2b6 Markos Gogoulos
                                    content_type='application/json')
139 285a1fa8 Dimitris Moraitis
        self.assertEqual(response.status_code, 202)
140 e646ebe5 Dimitris Moraitis
        #TODO: check response.content
141 e646ebe5 Dimitris Moraitis
        #TODO: check create server with wrong options (eg non existing flavor)
142 668c1361 Markos Gogoulos
143 e646ebe5 Dimitris Moraitis
    def test_server_polling(self):
144 34244492 Markos Gogoulos
        """ test if the server polling works as expected
145 34244492 Markos Gogoulos
        """
146 34244492 Markos Gogoulos
        response = self.client.get('/api/v1.0/servers/detail')
147 34244492 Markos Gogoulos
        vms_from_api_initial = json.loads(response.content)['servers']
148 34244492 Markos Gogoulos
        then = datetime.datetime.now().isoformat().split('.')[0]
149 e646ebe5 Dimitris Moraitis
150 34244492 Markos Gogoulos
        #isoformat also gives miliseconds that are not needed
151 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers/detail?changes-since=%s'
152 e646ebe5 Dimitris Moraitis
                                   % then)
153 34244492 Markos Gogoulos
        self.assertEqual(len(response.content), 0)
154 34244492 Markos Gogoulos
        #no changes were made
155 34244492 Markos Gogoulos
156 34244492 Markos Gogoulos
        #now create a machine. Then check if it is on the list
157 34244492 Markos Gogoulos
        request = {
158 34244492 Markos Gogoulos
                    "server": {
159 e646ebe5 Dimitris Moraitis
                        "name": "new-server-test",
160 e646ebe5 Dimitris Moraitis
                        "imageRef": 1,
161 e646ebe5 Dimitris Moraitis
                        "flavorRef": 1,
162 e646ebe5 Dimitris Moraitis
                        "metadata": {
163 34244492 Markos Gogoulos
                            "My Server Name": "Apache1"
164 34244492 Markos Gogoulos
                        },
165 e646ebe5 Dimitris Moraitis
                        "personality": []
166 34244492 Markos Gogoulos
                    }
167 34244492 Markos Gogoulos
        }
168 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers',
169 e646ebe5 Dimitris Moraitis
                                    json.dumps(request),
170 34244492 Markos Gogoulos
                                    content_type='application/json')
171 34244492 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
172 34244492 Markos Gogoulos
173 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/servers/detail?changes-since=%s'
174 e646ebe5 Dimitris Moraitis
                                   % then)
175 34244492 Markos Gogoulos
        vms_from_api_after = json.loads(response.content)['servers']
176 e646ebe5 Dimitris Moraitis
        #make sure the newly created server is included on the updated list
177 34244492 Markos Gogoulos
        self.assertEqual(len(vms_from_api_after), 1)
178 34244492 Markos Gogoulos
179 e646ebe5 Dimitris Moraitis
    def test_reboot_server(self):
180 668c1361 Markos Gogoulos
        """ test if the specified server is rebooted
181 668c1361 Markos Gogoulos
        """
182 685ab2b6 Markos Gogoulos
        request = {
183 685ab2b6 Markos Gogoulos
            "reboot": '{"type" : "HARD"}'
184 685ab2b6 Markos Gogoulos
            }
185 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
186 e646ebe5 Dimitris Moraitis
                                    str(self.test_server_id) + '/action',
187 685ab2b6 Markos Gogoulos
                                    json.dumps(request),
188 e646ebe5 Dimitris Moraitis
                                    content_type='application/json')
189 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
190 685ab2b6 Markos Gogoulos
        #server id that does not exist
191 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
192 e646ebe5 Dimitris Moraitis
                                    str(self.test_wrong_server_id) + '/action',
193 e646ebe5 Dimitris Moraitis
                                   json.dumps(request),
194 685ab2b6 Markos Gogoulos
                                   content_type='application/json')
195 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
196 668c1361 Markos Gogoulos
197 e646ebe5 Dimitris Moraitis
    def test_shutdown_server(self):
198 668c1361 Markos Gogoulos
        """ test if the specified server is shutdown
199 668c1361 Markos Gogoulos
        """
200 685ab2b6 Markos Gogoulos
        request = {
201 e646ebe5 Dimitris Moraitis
            "shutdown": {"timeout": "5"}
202 685ab2b6 Markos Gogoulos
            }
203 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
204 e646ebe5 Dimitris Moraitis
                                    str(self.test_server_id) + '/action',
205 e646ebe5 Dimitris Moraitis
                                    json.dumps(request),
206 e646ebe5 Dimitris Moraitis
                                    content_type='application/json')
207 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
208 685ab2b6 Markos Gogoulos
        #server id that does not exist
209 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
210 e646ebe5 Dimitris Moraitis
                                    str(self.test_wrong_server_id) + '/action',
211 e646ebe5 Dimitris Moraitis
                                    json.dumps(request),
212 685ab2b6 Markos Gogoulos
                                    content_type='application/json')
213 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
214 668c1361 Markos Gogoulos
215 e646ebe5 Dimitris Moraitis
    def test_start_server(self):
216 668c1361 Markos Gogoulos
        """ test if the specified server is started
217 668c1361 Markos Gogoulos
        """
218 685ab2b6 Markos Gogoulos
        request = {
219 e646ebe5 Dimitris Moraitis
            "start": {"type": "NORMAL"}
220 685ab2b6 Markos Gogoulos
            }
221 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
222 e646ebe5 Dimitris Moraitis
                                    str(self.test_server_id) + '/action',
223 685ab2b6 Markos Gogoulos
                                    json.dumps(request),
224 e646ebe5 Dimitris Moraitis
                                    content_type='application/json')
225 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
226 685ab2b6 Markos Gogoulos
        #server id that does not exist
227 e646ebe5 Dimitris Moraitis
        response = self.client.post('/api/v1.0/servers/' +
228 e646ebe5 Dimitris Moraitis
                                    str(self.test_wrong_server_id) + '/action',
229 e646ebe5 Dimitris Moraitis
                                    json.dumps(request),
230 685ab2b6 Markos Gogoulos
                                    content_type='application/json')
231 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
232 668c1361 Markos Gogoulos
233 e646ebe5 Dimitris Moraitis
    def test_delete_server(self):
234 668c1361 Markos Gogoulos
        """ test if the specified server is deleted
235 668c1361 Markos Gogoulos
        """
236 e646ebe5 Dimitris Moraitis
        response = self.client.delete('/api/v1.0/servers/' +
237 e646ebe5 Dimitris Moraitis
                                      str(self.test_server_id))
238 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
239 e646ebe5 Dimitris Moraitis
        #server id that does not exist
240 e646ebe5 Dimitris Moraitis
        response = self.client.delete('/api/v1.0/servers/' +
241 e646ebe5 Dimitris Moraitis
                                      str(self.test_wrong_server_id))
242 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
243 668c1361 Markos Gogoulos
244 e646ebe5 Dimitris Moraitis
    def test_flavor_list(self):
245 668c1361 Markos Gogoulos
        """ test if the expected list of flavors is returned by the API
246 e646ebe5 Dimitris Moraitis
        """
247 668c1361 Markos Gogoulos
        response = self.client.get('/api/v1.0/flavors')
248 668c1361 Markos Gogoulos
        flavors_from_api = json.loads(response.content)['flavors']
249 668c1361 Markos Gogoulos
        flavors_from_db = Flavor.objects.all()
250 668c1361 Markos Gogoulos
        self.assertEqual(len(flavors_from_api), len(flavors_from_db))
251 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
252 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
253 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
254 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
255 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
256 668c1361 Markos Gogoulos
257 e646ebe5 Dimitris Moraitis
    def test_flavors_details(self):
258 685ab2b6 Markos Gogoulos
        """ test if the flavors details are returned by the API
259 668c1361 Markos Gogoulos
        """
260 f3af8b40 Dimitris Moraitis
        response = self.client.get('/api/v1.0/flavors/detail')
261 f3af8b40 Dimitris Moraitis
        flavors_from_db = Flavor.objects.all()
262 f3af8b40 Dimitris Moraitis
        flavors_from_api = json.loads(response.content)['flavors']
263 e646ebe5 Dimitris Moraitis
264 f3af8b40 Dimitris Moraitis
        # Assert that all flavors in the db appear inthe API call result
265 f3af8b40 Dimitris Moraitis
        for i in range(0, len(flavors_from_db)):
266 f3af8b40 Dimitris Moraitis
            flavor_from_api = flavors_from_api[i]
267 f3af8b40 Dimitris Moraitis
            flavor_from_db = Flavor.objects.get(id=flavors_from_db[i].id)
268 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
269 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
270 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
271 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
272 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
273 f3af8b40 Dimitris Moraitis
274 e646ebe5 Dimitris Moraitis
        # Assert that all flavors returned by the API also exist in the db
275 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
276 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
277 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
278 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
279 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
280 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
281 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
282 7de0c985 Dimitris Moraitis
283 e646ebe5 Dimitris Moraitis
        # Check if we have the right status_code
284 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
285 7de0c985 Dimitris Moraitis
286 e646ebe5 Dimitris Moraitis
    def test_flavor_details(self):
287 685ab2b6 Markos Gogoulos
        """ test if the expected flavor is returned by the API
288 668c1361 Markos Gogoulos
        """
289 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/flavors/' +
290 e646ebe5 Dimitris Moraitis
                                   str(self.test_flavor_id))
291 668c1361 Markos Gogoulos
        flavor_from_api = json.loads(response.content)['flavor']
292 d2e5f1d1 Markos Gogoulos
        flavor_from_db = Flavor.objects.get(id=self.test_flavor_id)
293 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
294 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
295 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
296 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
297 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
298 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
299 668c1361 Markos Gogoulos
300 e646ebe5 Dimitris Moraitis
    def test_wrong_flavor(self):
301 e646ebe5 Dimitris Moraitis
        """ test 404 result when requesting a flavor that does not exist
302 668c1361 Markos Gogoulos
        """
303 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/flavors/' +
304 e646ebe5 Dimitris Moraitis
                                   str(self.test_wrong_flavor_id))
305 ffffd5fe Markos Gogoulos
        self.assertTrue(response.status_code in [404, 503])
306 668c1361 Markos Gogoulos
307 e646ebe5 Dimitris Moraitis
    def test_image_list(self):
308 668c1361 Markos Gogoulos
        """ test if the expected list of images is returned by the API
309 e646ebe5 Dimitris Moraitis
        """
310 668c1361 Markos Gogoulos
        response = self.client.get('/api/v1.0/images')
311 668c1361 Markos Gogoulos
        images_from_api = json.loads(response.content)['images']
312 668c1361 Markos Gogoulos
        images_from_db = Image.objects.all()
313 668c1361 Markos Gogoulos
        self.assertEqual(len(images_from_api), len(images_from_db))
314 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
315 54c30633 Markos Gogoulos
        for image_from_api in images_from_api:
316 54c30633 Markos Gogoulos
            image_from_db = Image.objects.get(id=image_from_api['id'])
317 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
318 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
319 668c1361 Markos Gogoulos
320 e646ebe5 Dimitris Moraitis
    def test_image_details(self):
321 668c1361 Markos Gogoulos
        """ test if the expected image is returned by the API
322 668c1361 Markos Gogoulos
        """
323 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/images/' +
324 e646ebe5 Dimitris Moraitis
                                   str(self.test_image_id))
325 668c1361 Markos Gogoulos
        image_from_api = json.loads(response.content)['image']
326 d2e5f1d1 Markos Gogoulos
        image_from_db = Image.objects.get(id=self.test_image_id)
327 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['name'], image_from_db.name)
328 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['id'], image_from_db.id)
329 e646ebe5 Dimitris Moraitis
        self.assertEqual(image_from_api['serverId'],
330 e646ebe5 Dimitris Moraitis
                        image_from_db.sourcevm and image_from_db.sourcevm.id or
331 e646ebe5 Dimitris Moraitis
                        "")
332 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['size'], image_from_db.size)
333 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['status'], image_from_db.state)
334 e646ebe5 Dimitris Moraitis
        self.assertEqual(image_from_api['metadata']['meta']['key']
335 e646ebe5 Dimitris Moraitis
                         ['description'],
336 e646ebe5 Dimitris Moraitis
                         image_from_db.description)
337 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
338 668c1361 Markos Gogoulos
339 e646ebe5 Dimitris Moraitis
    def test_images_details(self):
340 668c1361 Markos Gogoulos
        """ test if the images details are returned by the API
341 668c1361 Markos Gogoulos
        """
342 f3af8b40 Dimitris Moraitis
        response = self.client.get('/api/v1.0/images/detail')
343 f3af8b40 Dimitris Moraitis
        images_from_api = json.loads(response.content)['images']
344 f3af8b40 Dimitris Moraitis
        images_from_db = Image.objects.all()
345 f3af8b40 Dimitris Moraitis
        for i in range(0, len(images_from_db)):
346 f3af8b40 Dimitris Moraitis
            image_from_db = Image.objects.get(id=images_from_db[i].id)
347 f3af8b40 Dimitris Moraitis
            image_from_api = images_from_api[i]
348 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
349 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
350 e646ebe5 Dimitris Moraitis
            self.assertEqual(image_from_api['serverId'],
351 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm and
352 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm.id or "")
353 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['size'], image_from_db.size)
354 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['status'], image_from_db.state)
355 e646ebe5 Dimitris Moraitis
            self.assertEqual(image_from_api['metadata']['meta']['key']
356 e646ebe5 Dimitris Moraitis
                             ['description'],
357 e646ebe5 Dimitris Moraitis
                             image_from_db.description)
358 f3af8b40 Dimitris Moraitis
359 54c30633 Markos Gogoulos
        for image_from_api in images_from_api:
360 54c30633 Markos Gogoulos
            image_from_db = Image.objects.get(id=image_from_api['id'])
361 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
362 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
363 e646ebe5 Dimitris Moraitis
            self.assertEqual(image_from_api['serverId'],
364 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm and
365 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm.id or "")
366 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['size'], image_from_db.size)
367 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['status'], image_from_db.state)
368 e646ebe5 Dimitris Moraitis
            self.assertEqual(image_from_api['metadata']['meta']['key']
369 e646ebe5 Dimitris Moraitis
                             ['description'],
370 e646ebe5 Dimitris Moraitis
                             image_from_db.description)
371 685ab2b6 Markos Gogoulos
372 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
373 668c1361 Markos Gogoulos
374 e646ebe5 Dimitris Moraitis
    def test_wrong_image(self):
375 e646ebe5 Dimitris Moraitis
        """ test 404 result if a non existent image is requested
376 668c1361 Markos Gogoulos
        """
377 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/images/' +
378 e646ebe5 Dimitris Moraitis
                                   str(self.test_wrong_image_id))
379 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
380 73469364 Markos Gogoulos
381 e646ebe5 Dimitris Moraitis
    def test_server_metadata(self):
382 73469364 Markos Gogoulos
        """ test server's metadata (add, edit)
383 73469364 Markos Gogoulos
        """
384 73469364 Markos Gogoulos
        request = {
385 e646ebe5 Dimitris Moraitis
            "metadata": {
386 e646ebe5 Dimitris Moraitis
                "metadata_key": "name",
387 e646ebe5 Dimitris Moraitis
                "metadata_value": "a fancy name"
388 e646ebe5 Dimitris Moraitis
                }
389 73469364 Markos Gogoulos
            }
390 e646ebe5 Dimitris Moraitis
        response = self.client.put('/api/v1.0/servers' +
391 e646ebe5 Dimitris Moraitis
                                    str(self.test_server_id),
392 73469364 Markos Gogoulos
                                    json.dumps(request),
393 e646ebe5 Dimitris Moraitis
                                    content_type='application/json')
394 73469364 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
395 73469364 Markos Gogoulos
        #TODO: not working atm, due to problem with django piston and PUT
396 a8acbbac Markos Gogoulos
397 e646ebe5 Dimitris Moraitis
    def test_vm_group_list(self):
398 a8acbbac Markos Gogoulos
        """ test if the expected list of groups is returned by the API
399 e646ebe5 Dimitris Moraitis
        """
400 a8acbbac Markos Gogoulos
        response = self.client.get('/api/v1.0/groups')
401 a8acbbac Markos Gogoulos
        groups_from_api = json.loads(response.content)['groups']
402 a8acbbac Markos Gogoulos
        groups_from_db = VirtualMachineGroup.objects.all()
403 a8acbbac Markos Gogoulos
        self.assertEqual(len(groups_from_api), len(groups_from_db))
404 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
405 a8acbbac Markos Gogoulos
        for group_from_api in groups_from_api:
406 e646ebe5 Dimitris Moraitis
            group_from_db = VirtualMachineGroup.objects.get(
407 e646ebe5 Dimitris Moraitis
                id=group_from_api['id']
408 e646ebe5 Dimitris Moraitis
                )
409 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['id'], group_from_db.id)
410 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['name'], group_from_db.name)
411 a8acbbac Markos Gogoulos
412 e646ebe5 Dimitris Moraitis
    def test_vm_group_details(self):
413 a8acbbac Markos Gogoulos
        """ test if the expected virtual machine group is returned by the API
414 a8acbbac Markos Gogoulos
        """
415 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/groups/' +
416 e646ebe5 Dimitris Moraitis
                                   str(self.test_group_id))
417 a8acbbac Markos Gogoulos
        group_from_api = json.loads(response.content)['group']
418 a8acbbac Markos Gogoulos
        group_from_db = VirtualMachineGroup.objects.get(id=self.test_group_id)
419 a8acbbac Markos Gogoulos
        self.assertEqual(group_from_api['name'], group_from_db.name)
420 a8acbbac Markos Gogoulos
        self.assertEqual(group_from_api['id'], group_from_db.id)
421 e646ebe5 Dimitris Moraitis
        self.assertEqual(group_from_api['server_id'],
422 e646ebe5 Dimitris Moraitis
                         [machine.id
423 e646ebe5 Dimitris Moraitis
                          for machine in group_from_db.machines.all()])
424 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
425 a8acbbac Markos Gogoulos
426 e646ebe5 Dimitris Moraitis
    def test_wrong_vm_group(self):
427 e646ebe5 Dimitris Moraitis
        """ test 404 result if a non existent VM group is requested
428 a8acbbac Markos Gogoulos
        """
429 e646ebe5 Dimitris Moraitis
        response = self.client.get('/api/v1.0/groups/' +
430 e646ebe5 Dimitris Moraitis
                                   str(self.test_wrong_group_id))
431 a8acbbac Markos Gogoulos
        self.assertEqual(response.status_code, 404)
432 a8acbbac Markos Gogoulos
433 e646ebe5 Dimitris Moraitis
    def test_groups_details(self):
434 a8acbbac Markos Gogoulos
        """ test if the groups details are returned by the API
435 a8acbbac Markos Gogoulos
        """
436 a8acbbac Markos Gogoulos
        response = self.client.get('/api/v1.0/groups/detail')
437 a8acbbac Markos Gogoulos
        groups_from_api = json.loads(response.content)['groups']
438 a8acbbac Markos Gogoulos
        groups_from_db = VirtualMachineGroup.objects.all()
439 a8acbbac Markos Gogoulos
        for i in range(0, len(groups_from_db)):
440 e646ebe5 Dimitris Moraitis
            group_from_db = VirtualMachineGroup.objects.get(
441 e646ebe5 Dimitris Moraitis
                id=groups_from_db[i].id)
442 a8acbbac Markos Gogoulos
            group_from_api = groups_from_api[i]
443 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['name'], group_from_db.name)
444 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['id'], group_from_db.id)
445 e646ebe5 Dimitris Moraitis
            self.assertEqual(group_from_api['server_id'],
446 e646ebe5 Dimitris Moraitis
                             [machine.id
447 e646ebe5 Dimitris Moraitis
                              for machine in group_from_db.machines.all()])
448 a8acbbac Markos Gogoulos
        for group_from_api in groups_from_api:
449 e646ebe5 Dimitris Moraitis
            group_from_db = VirtualMachineGroup.objects.get(
450 e646ebe5 Dimitris Moraitis
                id=group_from_api['id'])
451 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['name'], group_from_db.name)
452 a8acbbac Markos Gogoulos
            self.assertEqual(group_from_api['id'], group_from_db.id)
453 e646ebe5 Dimitris Moraitis
            self.assertEqual(group_from_api['server_id'],
454 e646ebe5 Dimitris Moraitis
                             [machine.id
455 e646ebe5 Dimitris Moraitis
                              for machine in group_from_db.machines.all()])
456 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])