Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ aa197ee4

History | View | Annotate | Download (38.3 kB)

1 894f6b7e Dimitris Moraitis
#
2 883de713 Giorgos Verigakis
# Copyright (c) 2010 Greek Research and Technology Network
3 894f6b7e Dimitris Moraitis
#
4 894f6b7e Dimitris Moraitis
5 53b1eea6 Giorgos Verigakis
from __future__ import with_statement
6 53b1eea6 Giorgos Verigakis
7 53b1eea6 Giorgos Verigakis
from collections import defaultdict
8 8b01f7f3 Giorgos Verigakis
from email.utils import parsedate
9 ba6ded2a Giorgos Verigakis
from random import choice, randint, sample
10 8b01f7f3 Giorgos Verigakis
from time import mktime
11 8b01f7f3 Giorgos Verigakis
12 a237869d Faidon Liambotis
from django.utils import simplejson as json
13 894f6b7e Dimitris Moraitis
from django.test import TestCase
14 894f6b7e Dimitris Moraitis
from django.test.client import Client
15 883de713 Giorgos Verigakis
16 968b3e04 Giorgos Verigakis
from synnefo.db.models import *
17 40777cc8 Giorgos Verigakis
from synnefo.logic.utils import get_rsapi_state
18 40777cc8 Giorgos Verigakis
19 40777cc8 Giorgos Verigakis
20 40777cc8 Giorgos Verigakis
class AaiClient(Client):
21 40777cc8 Giorgos Verigakis
    def request(self, **request):
22 40777cc8 Giorgos Verigakis
        request['HTTP_X_AUTH_TOKEN'] = '46e427d657b20defe352804f0eb6f8a2'
23 40777cc8 Giorgos Verigakis
        return super(AaiClient, self).request(**request)
24 894f6b7e Dimitris Moraitis
25 883de713 Giorgos Verigakis
26 894f6b7e Dimitris Moraitis
class APITestCase(TestCase):
27 883de713 Giorgos Verigakis
    fixtures = ['api_test_data']
28 d2e5f1d1 Markos Gogoulos
    test_server_id = 1001
29 d2e5f1d1 Markos Gogoulos
    test_image_id = 1
30 d2e5f1d1 Markos Gogoulos
    test_flavor_id = 1
31 a8acbbac Markos Gogoulos
    test_group_id = 1
32 d2e5f1d1 Markos Gogoulos
    test_wrong_server_id = 99999999
33 d2e5f1d1 Markos Gogoulos
    test_wrong_image_id = 99999999
34 d2e5f1d1 Markos Gogoulos
    test_wrong_flavor_id = 99999999
35 a8acbbac Markos Gogoulos
    test_wrong_group_id = 99999999
36 d2e5f1d1 Markos Gogoulos
    #make the testing with these id's
37 d2e5f1d1 Markos Gogoulos
38 894f6b7e Dimitris Moraitis
    def setUp(self):
39 40777cc8 Giorgos Verigakis
        self.client = AaiClient()
40 894f6b7e Dimitris Moraitis
41 e646ebe5 Dimitris Moraitis
    def test_api_version(self):
42 883de713 Giorgos Verigakis
        """Check API version."""
43 aa197ee4 Vangelis Koukis
44 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/')
45 894f6b7e Dimitris Moraitis
        self.assertEqual(response.status_code, 200)
46 54c30633 Markos Gogoulos
        api_version = json.loads(response.content)['version']
47 883de713 Giorgos Verigakis
        self.assertEqual(api_version['id'], 'v1.1')
48 54c30633 Markos Gogoulos
        self.assertEqual(api_version['status'], 'CURRENT')
49 54c30633 Markos Gogoulos
50 e646ebe5 Dimitris Moraitis
    def test_server_list(self):
51 883de713 Giorgos Verigakis
        """Test if the expected list of servers is returned."""
52 aa197ee4 Vangelis Koukis
53 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers')
54 883de713 Giorgos Verigakis
        vms_from_api = json.loads(response.content)['servers']['values']
55 668c1361 Markos Gogoulos
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
56 6781c0d0 Dimitris Moraitis
        self.assertEqual(len(vms_from_api), len(vms_from_db))
57 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
58 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
59 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
60 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
61 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
62 54c30633 Markos Gogoulos
63 e646ebe5 Dimitris Moraitis
    def test_server_details(self):
64 883de713 Giorgos Verigakis
        """Test if the expected server is returned."""
65 aa197ee4 Vangelis Koukis
66 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/%d' % 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 40777cc8 Giorgos Verigakis
        self.assertEqual(vm_from_api['status'], get_rsapi_state(vm_from_db))
75 883de713 Giorgos Verigakis
        self.assertTrue(response.status_code in [200, 203])
76 668c1361 Markos Gogoulos
77 e646ebe5 Dimitris Moraitis
    def test_servers_details(self):
78 883de713 Giorgos Verigakis
        """Test if the servers details are returned."""
79 aa197ee4 Vangelis Koukis
80 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail')
81 ba15eb15 Vangelis Koukis
82 ba15eb15 Vangelis Koukis
        # Make sure both DB and API responses are sorted by id,
83 ba15eb15 Vangelis Koukis
        # to allow for 1-1 comparisons
84 ba15eb15 Vangelis Koukis
        vms_from_db = VirtualMachine.objects.filter(deleted=False).order_by('id')
85 ba15eb15 Vangelis Koukis
        vms_from_api = json.loads(response.content)['servers']['values']
86 ba15eb15 Vangelis Koukis
        vms_from_api = sorted(vms_from_api, key=lambda vm: vm['id'])
87 ba15eb15 Vangelis Koukis
        self.assertEqual(len(vms_from_db), len(vms_from_api))
88 ba15eb15 Vangelis Koukis
89 54c30633 Markos Gogoulos
        id_list = [vm.id for vm in vms_from_db]
90 685ab2b6 Markos Gogoulos
        number = 0
91 685ab2b6 Markos Gogoulos
        for vm_id in id_list:
92 ba15eb15 Vangelis Koukis
            vm_from_api = vms_from_api[number]
93 685ab2b6 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_id)
94 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
95 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
96 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
97 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
98 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
99 40777cc8 Giorgos Verigakis
            self.assertEqual(vm_from_api['status'], get_rsapi_state(vm_from_db))
100 685ab2b6 Markos Gogoulos
            number += 1
101 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
102 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
103 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
104 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
105 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
106 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
107 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
108 40777cc8 Giorgos Verigakis
            self.assertEqual(vm_from_api['status'], get_rsapi_state(vm_from_db))
109 685ab2b6 Markos Gogoulos
        self.assertTrue(response.status_code in [200,203])
110 685ab2b6 Markos Gogoulos
111 e646ebe5 Dimitris Moraitis
    def test_wrong_server(self):
112 883de713 Giorgos Verigakis
        """Test 404 response if server does not exist."""
113 aa197ee4 Vangelis Koukis
114 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/%d' % self.test_wrong_server_id)
115 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
116 685ab2b6 Markos Gogoulos
117 e646ebe5 Dimitris Moraitis
    def test_create_server_empty(self):
118 883de713 Giorgos Verigakis
        """Test if the create server call returns a 400 badRequest if
119 883de713 Giorgos Verigakis
           no attributes are specified."""
120 aa197ee4 Vangelis Koukis
121 883de713 Giorgos Verigakis
        response = self.client.post('/api/v1.1/servers', {})
122 7de0c985 Dimitris Moraitis
        self.assertEqual(response.status_code, 400)
123 54c30633 Markos Gogoulos
124 e646ebe5 Dimitris Moraitis
    def test_create_server(self):
125 883de713 Giorgos Verigakis
        """Test if the create server call returns the expected response
126 883de713 Giorgos Verigakis
           if a valid request has been speficied."""
127 aa197ee4 Vangelis Koukis
128 7de0c985 Dimitris Moraitis
        request = {
129 285a1fa8 Dimitris Moraitis
                    "server": {
130 e646ebe5 Dimitris Moraitis
                        "name": "new-server-test",
131 40777cc8 Giorgos Verigakis
                        "owner": 1,
132 e646ebe5 Dimitris Moraitis
                        "imageRef": 1,
133 e646ebe5 Dimitris Moraitis
                        "flavorRef": 1,
134 e646ebe5 Dimitris Moraitis
                        "metadata": {
135 285a1fa8 Dimitris Moraitis
                            "My Server Name": "Apache1"
136 285a1fa8 Dimitris Moraitis
                        },
137 e646ebe5 Dimitris Moraitis
                        "personality": []
138 285a1fa8 Dimitris Moraitis
                    }
139 7de0c985 Dimitris Moraitis
        }
140 883de713 Giorgos Verigakis
        response = self.client.post('/api/v1.1/servers', json.dumps(request),
141 685ab2b6 Markos Gogoulos
                                    content_type='application/json')
142 285a1fa8 Dimitris Moraitis
        self.assertEqual(response.status_code, 202)
143 e646ebe5 Dimitris Moraitis
        #TODO: check response.content
144 e646ebe5 Dimitris Moraitis
        #TODO: check create server with wrong options (eg non existing flavor)
145 668c1361 Markos Gogoulos
146 e646ebe5 Dimitris Moraitis
    def test_server_polling(self):
147 883de713 Giorgos Verigakis
        """Test if the server polling works as expected."""
148 aa197ee4 Vangelis Koukis
149 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail')
150 883de713 Giorgos Verigakis
        vms_from_api_initial = json.loads(response.content)['servers']['values']
151 8b01f7f3 Giorgos Verigakis
        ts = mktime(parsedate(response['Date']))
152 8b01f7f3 Giorgos Verigakis
        since = datetime.datetime.fromtimestamp(ts).isoformat() + 'Z'
153 8b01f7f3 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail?changes-since=%s' % since)
154 34244492 Markos Gogoulos
        self.assertEqual(len(response.content), 0)
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 aa197ee4 Vangelis Koukis
169 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers'
170 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
171 34244492 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
172 34244492 Markos Gogoulos
173 8b01f7f3 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail?changes-since=%s' % since)
174 7f63ff66 Giorgos Verigakis
        self.assertEqual(response.status_code, 200)
175 009d3bf2 Giorgos Verigakis
        vms_from_api_after = json.loads(response.content)['servers']['values']
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 883de713 Giorgos Verigakis
        """Test if the specified server is rebooted."""
181 883de713 Giorgos Verigakis
        request = {'reboot': {'type': 'HARD'}}
182 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
183 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
184 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
185 685ab2b6 Markos Gogoulos
        #server id that does not exist
186 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
187 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
188 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
189 668c1361 Markos Gogoulos
190 e646ebe5 Dimitris Moraitis
    def test_shutdown_server(self):
191 883de713 Giorgos Verigakis
        """Test if the specified server is shutdown."""
192 aa197ee4 Vangelis Koukis
193 883de713 Giorgos Verigakis
        request = {'shutdown': {}}
194 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
195 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
196 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
197 685ab2b6 Markos Gogoulos
        #server id that does not exist
198 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
199 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
200 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
201 668c1361 Markos Gogoulos
202 e646ebe5 Dimitris Moraitis
    def test_start_server(self):
203 883de713 Giorgos Verigakis
        """Test if the specified server is started."""
204 aa197ee4 Vangelis Koukis
205 883de713 Giorgos Verigakis
        request = {'start': {}}
206 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
207 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
208 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
209 685ab2b6 Markos Gogoulos
        #server id that does not exist
210 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
211 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
212 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
213 668c1361 Markos Gogoulos
214 e646ebe5 Dimitris Moraitis
    def test_delete_server(self):
215 883de713 Giorgos Verigakis
        """Test if the specified server is deleted."""
216 883de713 Giorgos Verigakis
        response = self.client.delete('/api/v1.1/servers/%d' % self.test_server_id)
217 883de713 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
218 e646ebe5 Dimitris Moraitis
        #server id that does not exist
219 883de713 Giorgos Verigakis
        response = self.client.delete('/api/v1.1/servers/%d' % self.test_wrong_server_id)
220 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
221 668c1361 Markos Gogoulos
222 e646ebe5 Dimitris Moraitis
    def test_flavor_list(self):
223 883de713 Giorgos Verigakis
        """Test if the expected list of flavors is returned by."""
224 aa197ee4 Vangelis Koukis
225 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors')
226 883de713 Giorgos Verigakis
        flavors_from_api = json.loads(response.content)['flavors']['values']
227 668c1361 Markos Gogoulos
        flavors_from_db = Flavor.objects.all()
228 668c1361 Markos Gogoulos
        self.assertEqual(len(flavors_from_api), len(flavors_from_db))
229 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
230 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
231 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
232 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
233 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
234 668c1361 Markos Gogoulos
235 e646ebe5 Dimitris Moraitis
    def test_flavors_details(self):
236 883de713 Giorgos Verigakis
        """Test if the flavors details are returned."""
237 aa197ee4 Vangelis Koukis
238 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/detail')
239 f3af8b40 Dimitris Moraitis
        flavors_from_db = Flavor.objects.all()
240 883de713 Giorgos Verigakis
        flavors_from_api = json.loads(response.content)['flavors']['values']
241 e646ebe5 Dimitris Moraitis
242 f3af8b40 Dimitris Moraitis
        # Assert that all flavors in the db appear inthe API call result
243 f3af8b40 Dimitris Moraitis
        for i in range(0, len(flavors_from_db)):
244 f3af8b40 Dimitris Moraitis
            flavor_from_api = flavors_from_api[i]
245 f3af8b40 Dimitris Moraitis
            flavor_from_db = Flavor.objects.get(id=flavors_from_db[i].id)
246 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
247 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
248 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
249 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
250 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
251 f3af8b40 Dimitris Moraitis
252 e646ebe5 Dimitris Moraitis
        # Assert that all flavors returned by the API also exist in the db
253 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
254 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
255 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
256 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
257 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
258 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
259 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
260 7de0c985 Dimitris Moraitis
261 e646ebe5 Dimitris Moraitis
        # Check if we have the right status_code
262 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
263 7de0c985 Dimitris Moraitis
264 e646ebe5 Dimitris Moraitis
    def test_flavor_details(self):
265 883de713 Giorgos Verigakis
        """Test if the expected flavor is returned."""
266 aa197ee4 Vangelis Koukis
267 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/%d' % self.test_flavor_id)
268 668c1361 Markos Gogoulos
        flavor_from_api = json.loads(response.content)['flavor']
269 d2e5f1d1 Markos Gogoulos
        flavor_from_db = Flavor.objects.get(id=self.test_flavor_id)
270 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
271 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
272 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
273 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
274 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
275 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
276 668c1361 Markos Gogoulos
277 e646ebe5 Dimitris Moraitis
    def test_wrong_flavor(self):
278 883de713 Giorgos Verigakis
        """Test 404 result when requesting a flavor that does not exist."""
279 aa197ee4 Vangelis Koukis
280 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/%d' % self.test_wrong_flavor_id)
281 ffffd5fe Markos Gogoulos
        self.assertTrue(response.status_code in [404, 503])
282 668c1361 Markos Gogoulos
283 e646ebe5 Dimitris Moraitis
    def test_image_list(self):
284 883de713 Giorgos Verigakis
        """Test if the expected list of images is returned by the API."""
285 aa197ee4 Vangelis Koukis
286 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images')
287 883de713 Giorgos Verigakis
        images_from_api = json.loads(response.content)['images']['values']
288 668c1361 Markos Gogoulos
        images_from_db = Image.objects.all()
289 668c1361 Markos Gogoulos
        self.assertEqual(len(images_from_api), len(images_from_db))
290 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
291 54c30633 Markos Gogoulos
        for image_from_api in images_from_api:
292 54c30633 Markos Gogoulos
            image_from_db = Image.objects.get(id=image_from_api['id'])
293 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
294 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
295 668c1361 Markos Gogoulos
296 e646ebe5 Dimitris Moraitis
    def test_wrong_image(self):
297 883de713 Giorgos Verigakis
        """Test 404 result if a non existent image is requested."""
298 aa197ee4 Vangelis Koukis
299 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images/%d' % self.test_wrong_image_id)
300 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
301 73469364 Markos Gogoulos
302 e646ebe5 Dimitris Moraitis
    def test_server_metadata(self):
303 883de713 Giorgos Verigakis
        """Test server's metadata (add, edit)."""
304 aa197ee4 Vangelis Koukis
305 883de713 Giorgos Verigakis
        key = 'name'
306 883de713 Giorgos Verigakis
        request = {'meta': {key: 'a fancy name'}}
307 aa197ee4 Vangelis Koukis
308 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (self.test_server_id, key)
309 883de713 Giorgos Verigakis
        response = self.client.put(path, json.dumps(request), content_type='application/json')
310 883de713 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
311 a8acbbac Markos Gogoulos
312 a8acbbac Markos Gogoulos
313 968b3e04 Giorgos Verigakis
def create_users(n=1):
314 968b3e04 Giorgos Verigakis
    for i in range(n):
315 968b3e04 Giorgos Verigakis
        SynnefoUser.objects.create(
316 968b3e04 Giorgos Verigakis
            name='User %d' % i,
317 968b3e04 Giorgos Verigakis
            credit=0)
318 968b3e04 Giorgos Verigakis
319 968b3e04 Giorgos Verigakis
def create_flavors(n=1):
320 968b3e04 Giorgos Verigakis
    for i in range(n):
321 968b3e04 Giorgos Verigakis
        Flavor.objects.create(
322 968b3e04 Giorgos Verigakis
            cpu=randint(1, 4),
323 80da6543 Giorgos Verigakis
            ram=randint(1, 8) * 512,
324 80da6543 Giorgos Verigakis
            disk=randint(1, 40))
325 968b3e04 Giorgos Verigakis
326 968b3e04 Giorgos Verigakis
def create_images(n=1):
327 968b3e04 Giorgos Verigakis
    users = SynnefoUser.objects.all()
328 968b3e04 Giorgos Verigakis
    for i in range(n):
329 968b3e04 Giorgos Verigakis
        Image.objects.create(
330 968b3e04 Giorgos Verigakis
            name='Image %d' % (i + 1),
331 968b3e04 Giorgos Verigakis
            state='ACTIVE',
332 968b3e04 Giorgos Verigakis
            owner=choice(users))
333 968b3e04 Giorgos Verigakis
334 53b1eea6 Giorgos Verigakis
def create_image_metadata(n=1):
335 53b1eea6 Giorgos Verigakis
    images = Image.objects.all()
336 53b1eea6 Giorgos Verigakis
    for i in range(n):
337 53b1eea6 Giorgos Verigakis
        ImageMetadata.objects.create(
338 53b1eea6 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
339 53b1eea6 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
340 53b1eea6 Giorgos Verigakis
            image = choice(images))
341 53b1eea6 Giorgos Verigakis
342 968b3e04 Giorgos Verigakis
def create_servers(n=1):
343 968b3e04 Giorgos Verigakis
    users = SynnefoUser.objects.all()
344 968b3e04 Giorgos Verigakis
    flavors = Flavor.objects.all()
345 968b3e04 Giorgos Verigakis
    images = Image.objects.all()
346 968b3e04 Giorgos Verigakis
    for i in range(n):
347 968b3e04 Giorgos Verigakis
        VirtualMachine.objects.create(
348 968b3e04 Giorgos Verigakis
            name='Server %d' % (i + 1),
349 968b3e04 Giorgos Verigakis
            owner=choice(users),
350 968b3e04 Giorgos Verigakis
            sourceimage=choice(images),
351 968b3e04 Giorgos Verigakis
            hostid=str(i),
352 968b3e04 Giorgos Verigakis
            ipfour='0.0.0.0',
353 968b3e04 Giorgos Verigakis
            ipsix='::1',
354 968b3e04 Giorgos Verigakis
            flavor=choice(flavors))
355 968b3e04 Giorgos Verigakis
356 968b3e04 Giorgos Verigakis
def create_server_metadata(n=1):
357 968b3e04 Giorgos Verigakis
    servers = VirtualMachine.objects.all()
358 968b3e04 Giorgos Verigakis
    for i in range(n):
359 968b3e04 Giorgos Verigakis
        VirtualMachineMetadata.objects.create(
360 968b3e04 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
361 968b3e04 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
362 968b3e04 Giorgos Verigakis
            vm = choice(servers))
363 968b3e04 Giorgos Verigakis
364 13b954b0 Giorgos Verigakis
def create_networks(n):
365 13b954b0 Giorgos Verigakis
    users = SynnefoUser.objects.all()
366 13b954b0 Giorgos Verigakis
    for i in range(n):
367 13b954b0 Giorgos Verigakis
        Network.objects.create(
368 13b954b0 Giorgos Verigakis
            name='Network%d' % (i + 1),
369 13b954b0 Giorgos Verigakis
            owner=choice(users))
370 13b954b0 Giorgos Verigakis
371 968b3e04 Giorgos Verigakis
372 53b1eea6 Giorgos Verigakis
class AssertInvariant(object):
373 53b1eea6 Giorgos Verigakis
    def __init__(self, callable, *args, **kwargs):
374 53b1eea6 Giorgos Verigakis
        self.callable = callable
375 53b1eea6 Giorgos Verigakis
        self.args = args
376 53b1eea6 Giorgos Verigakis
        self.kwargs = kwargs
377 aa197ee4 Vangelis Koukis
378 53b1eea6 Giorgos Verigakis
    def __enter__(self):
379 53b1eea6 Giorgos Verigakis
        self.value = self.callable(*self.args, **self.kwargs)
380 53b1eea6 Giorgos Verigakis
        return self.value
381 aa197ee4 Vangelis Koukis
382 53b1eea6 Giorgos Verigakis
    def __exit__(self, type, value, tb):
383 53b1eea6 Giorgos Verigakis
        assert self.value == self.callable(*self.args, **self.kwargs)
384 53b1eea6 Giorgos Verigakis
385 53b1eea6 Giorgos Verigakis
386 968b3e04 Giorgos Verigakis
class BaseTestCase(TestCase):
387 40777cc8 Giorgos Verigakis
    USERS = 0
388 968b3e04 Giorgos Verigakis
    FLAVORS = 1
389 968b3e04 Giorgos Verigakis
    IMAGES = 1
390 968b3e04 Giorgos Verigakis
    SERVERS = 1
391 968b3e04 Giorgos Verigakis
    SERVER_METADATA = 0
392 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 0
393 13b954b0 Giorgos Verigakis
    NETWORKS = 0
394 aa197ee4 Vangelis Koukis
395 883de713 Giorgos Verigakis
    def setUp(self):
396 40777cc8 Giorgos Verigakis
        self.client = AaiClient()
397 968b3e04 Giorgos Verigakis
        create_users(self.USERS)
398 968b3e04 Giorgos Verigakis
        create_flavors(self.FLAVORS)
399 968b3e04 Giorgos Verigakis
        create_images(self.IMAGES)
400 53b1eea6 Giorgos Verigakis
        create_image_metadata(self.IMAGE_METADATA)
401 968b3e04 Giorgos Verigakis
        create_servers(self.SERVERS)
402 968b3e04 Giorgos Verigakis
        create_server_metadata(self.SERVER_METADATA)
403 13b954b0 Giorgos Verigakis
        create_networks(self.NETWORKS)
404 aa197ee4 Vangelis Koukis
405 968b3e04 Giorgos Verigakis
    def assertFault(self, response, status_code, name):
406 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, status_code)
407 968b3e04 Giorgos Verigakis
        fault = json.loads(response.content)
408 968b3e04 Giorgos Verigakis
        self.assertEqual(fault.keys(), [name])
409 aa197ee4 Vangelis Koukis
410 968b3e04 Giorgos Verigakis
    def assertBadRequest(self, response):
411 968b3e04 Giorgos Verigakis
        self.assertFault(response, 400, 'badRequest')
412 968b3e04 Giorgos Verigakis
413 968b3e04 Giorgos Verigakis
    def assertItemNotFound(self, response):
414 968b3e04 Giorgos Verigakis
        self.assertFault(response, 404, 'itemNotFound')
415 aa197ee4 Vangelis Koukis
416 aa197ee4 Vangelis Koukis
417 111f6d5b Giorgos Verigakis
    def list_images(self, detail=False):
418 111f6d5b Giorgos Verigakis
        path = '/api/v1.1/images'
419 111f6d5b Giorgos Verigakis
        if detail:
420 111f6d5b Giorgos Verigakis
            path += '/detail'
421 111f6d5b Giorgos Verigakis
        response = self.client.get(path)
422 111f6d5b Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
423 111f6d5b Giorgos Verigakis
        reply = json.loads(response.content)
424 111f6d5b Giorgos Verigakis
        self.assertEqual(reply.keys(), ['images'])
425 111f6d5b Giorgos Verigakis
        self.assertEqual(reply['images'].keys(), ['values'])
426 111f6d5b Giorgos Verigakis
        return reply['images']['values']
427 aa197ee4 Vangelis Koukis
428 53b1eea6 Giorgos Verigakis
    def list_metadata(self, path):
429 53b1eea6 Giorgos Verigakis
        response = self.client.get(path)
430 968b3e04 Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
431 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
432 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
433 968b3e04 Giorgos Verigakis
        self.assertEqual(reply['metadata'].keys(), ['values'])
434 968b3e04 Giorgos Verigakis
        return reply['metadata']['values']
435 aa197ee4 Vangelis Koukis
436 53b1eea6 Giorgos Verigakis
    def list_server_metadata(self, server_id):
437 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
438 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
439 aa197ee4 Vangelis Koukis
440 53b1eea6 Giorgos Verigakis
    def list_image_metadata(self, image_id):
441 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
442 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
443 aa197ee4 Vangelis Koukis
444 53b1eea6 Giorgos Verigakis
    def update_metadata(self, path, metadata):
445 ba6ded2a Giorgos Verigakis
        data = json.dumps({'metadata': metadata})
446 ba6ded2a Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
447 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
448 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
449 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
450 968b3e04 Giorgos Verigakis
        return reply['metadata']
451 aa197ee4 Vangelis Koukis
452 53b1eea6 Giorgos Verigakis
    def update_server_metadata(self, server_id, metadata):
453 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
454 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
455 aa197ee4 Vangelis Koukis
456 53b1eea6 Giorgos Verigakis
    def update_image_metadata(self, image_id, metadata):
457 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
458 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
459 aa197ee4 Vangelis Koukis
460 53b1eea6 Giorgos Verigakis
    def create_server_meta(self, server_id, meta):
461 53b1eea6 Giorgos Verigakis
        key = meta.keys()[0]
462 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
463 53b1eea6 Giorgos Verigakis
        data = json.dumps({'meta': meta})
464 53b1eea6 Giorgos Verigakis
        response = self.client.put(path, data, content_type='application/json')
465 53b1eea6 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
466 53b1eea6 Giorgos Verigakis
        reply = json.loads(response.content)
467 53b1eea6 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['meta'])
468 53b1eea6 Giorgos Verigakis
        response_meta = reply['meta']
469 53b1eea6 Giorgos Verigakis
        self.assertEqual(response_meta, meta)
470 aa197ee4 Vangelis Koukis
471 53b1eea6 Giorgos Verigakis
    def get_all_server_metadata(self):
472 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
473 53b1eea6 Giorgos Verigakis
        for m in VirtualMachineMetadata.objects.all():
474 53b1eea6 Giorgos Verigakis
            metadata[m.vm.id][m.meta_key] = m.meta_value
475 53b1eea6 Giorgos Verigakis
        return metadata
476 aa197ee4 Vangelis Koukis
477 53b1eea6 Giorgos Verigakis
    def get_all_image_metadata(self):
478 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
479 53b1eea6 Giorgos Verigakis
        for m in ImageMetadata.objects.all():
480 53b1eea6 Giorgos Verigakis
            metadata[m.image.id][m.meta_key] = m.meta_value
481 53b1eea6 Giorgos Verigakis
        return metadata
482 aa197ee4 Vangelis Koukis
483 13b954b0 Giorgos Verigakis
    def list_networks(self, detail=False):
484 13b954b0 Giorgos Verigakis
        path = '/api/v1.1/networks'
485 13b954b0 Giorgos Verigakis
        if detail:
486 13b954b0 Giorgos Verigakis
            path += '/detail'
487 13b954b0 Giorgos Verigakis
        response = self.client.get(path)
488 13b954b0 Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
489 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
490 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['networks'])
491 13b954b0 Giorgos Verigakis
        self.assertEqual(reply['networks'].keys(), ['values'])
492 13b954b0 Giorgos Verigakis
        return reply['networks']['values']
493 aa197ee4 Vangelis Koukis
494 13b954b0 Giorgos Verigakis
    def create_network(self, name):
495 13b954b0 Giorgos Verigakis
        path = '/api/v1.1/networks'
496 13b954b0 Giorgos Verigakis
        data = json.dumps({'network': {'name': name}})
497 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
498 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
499 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
500 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['network'])
501 13b954b0 Giorgos Verigakis
        return reply
502 aa197ee4 Vangelis Koukis
503 b19653d1 Giorgos Verigakis
    def get_network_details(self, network_id):
504 b19653d1 Giorgos Verigakis
        path = '/api/v1.1/networks/%d' % network_id
505 13b954b0 Giorgos Verigakis
        response = self.client.get(path)
506 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 200)
507 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
508 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['network'])
509 13b954b0 Giorgos Verigakis
        return reply['network']
510 aa197ee4 Vangelis Koukis
511 b19653d1 Giorgos Verigakis
    def update_network_name(self, network_id, new_name):
512 b19653d1 Giorgos Verigakis
        path = '/api/v1.1/networks/%d' % network_id
513 13b954b0 Giorgos Verigakis
        data = json.dumps({'network': {'name': new_name}})
514 13b954b0 Giorgos Verigakis
        response = self.client.put(path, data, content_type='application/json')
515 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
516 aa197ee4 Vangelis Koukis
517 b19653d1 Giorgos Verigakis
    def delete_network(self, network_id):
518 b19653d1 Giorgos Verigakis
        path = '/api/v1.1/networks/%d' % network_id
519 13b954b0 Giorgos Verigakis
        response = self.client.delete(path)
520 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
521 aa197ee4 Vangelis Koukis
522 b19653d1 Giorgos Verigakis
    def add_to_network(self, network_id, server_id):
523 b19653d1 Giorgos Verigakis
        path = '/api/v1.1/networks/%d/action' % network_id
524 13b954b0 Giorgos Verigakis
        data = json.dumps({'add': {'serverRef': server_id}})
525 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
526 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
527 aa197ee4 Vangelis Koukis
528 b19653d1 Giorgos Verigakis
    def remove_from_network(self, network_id, server_id):
529 b19653d1 Giorgos Verigakis
        path = '/api/v1.1/networks/%d/action' % network_id
530 13b954b0 Giorgos Verigakis
        data = json.dumps({'remove': {'serverRef': server_id}})
531 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
532 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
533 13b954b0 Giorgos Verigakis
534 13b954b0 Giorgos Verigakis
535 13b954b0 Giorgos Verigakis
def popdict(l, **kwargs):
536 13b954b0 Giorgos Verigakis
    """Pops a dict from list `l` based on the predicates given as `kwargs`."""
537 aa197ee4 Vangelis Koukis
538 13b954b0 Giorgos Verigakis
    for i in range(len(l)):
539 13b954b0 Giorgos Verigakis
        item = l[i]
540 13b954b0 Giorgos Verigakis
        match = True
541 13b954b0 Giorgos Verigakis
        for key, val in kwargs.items():
542 13b954b0 Giorgos Verigakis
            if item[key] != val:
543 13b954b0 Giorgos Verigakis
                match = False
544 13b954b0 Giorgos Verigakis
                break
545 13b954b0 Giorgos Verigakis
        if match:
546 13b954b0 Giorgos Verigakis
            del l[i]
547 13b954b0 Giorgos Verigakis
            return item
548 13b954b0 Giorgos Verigakis
    return None
549 53b1eea6 Giorgos Verigakis
550 53b1eea6 Giorgos Verigakis
551 111f6d5b Giorgos Verigakis
class ListImages(BaseTestCase):
552 111f6d5b Giorgos Verigakis
    IMAGES = 10
553 aa197ee4 Vangelis Koukis
554 111f6d5b Giorgos Verigakis
    def test_list_images(self):
555 111f6d5b Giorgos Verigakis
        images = self.list_images()
556 111f6d5b Giorgos Verigakis
        keys = set(['id', 'name'])
557 111f6d5b Giorgos Verigakis
        for img in Image.objects.all():
558 13b954b0 Giorgos Verigakis
            image = popdict(images, id=img.id)
559 111f6d5b Giorgos Verigakis
            self.assertTrue(image is not None)
560 111f6d5b Giorgos Verigakis
            self.assertEqual(set(image.keys()), keys)
561 111f6d5b Giorgos Verigakis
            self.assertEqual(image['id'], img.id)
562 111f6d5b Giorgos Verigakis
            self.assertEqual(image['name'], img.name)
563 111f6d5b Giorgos Verigakis
        self.assertEqual(images, [])
564 aa197ee4 Vangelis Koukis
565 111f6d5b Giorgos Verigakis
    def test_list_images_detail(self):
566 111f6d5b Giorgos Verigakis
        images = self.list_images(detail=True)
567 111f6d5b Giorgos Verigakis
        keys = set(['id', 'name', 'updated', 'created', 'status', 'progress'])
568 111f6d5b Giorgos Verigakis
        for img in Image.objects.all():
569 13b954b0 Giorgos Verigakis
            image = popdict(images, id=img.id)
570 111f6d5b Giorgos Verigakis
            self.assertTrue(image is not None)
571 111f6d5b Giorgos Verigakis
            self.assertEqual(set(image.keys()), keys)
572 111f6d5b Giorgos Verigakis
            self.assertEqual(image['id'], img.id)
573 111f6d5b Giorgos Verigakis
            self.assertEqual(image['name'], img.name)
574 111f6d5b Giorgos Verigakis
            self.assertEqual(image['status'], img.state)
575 111f6d5b Giorgos Verigakis
            self.assertEqual(image['progress'], 100 if img.state == 'ACTIVE' else 0)
576 111f6d5b Giorgos Verigakis
        self.assertEqual(images, [])
577 111f6d5b Giorgos Verigakis
578 111f6d5b Giorgos Verigakis
579 53b1eea6 Giorgos Verigakis
class ListServerMetadata(BaseTestCase):
580 53b1eea6 Giorgos Verigakis
    SERVERS = 5
581 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
582 aa197ee4 Vangelis Koukis
583 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
584 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
585 53b1eea6 Giorgos Verigakis
            for vm in VirtualMachine.objects.all():
586 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_server_metadata(vm.id)
587 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[vm.id])
588 aa197ee4 Vangelis Koukis
589 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
590 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
591 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta')
592 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
593 53b1eea6 Giorgos Verigakis
594 53b1eea6 Giorgos Verigakis
595 53b1eea6 Giorgos Verigakis
class UpdateServerMetadata(BaseTestCase):
596 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 10
597 aa197ee4 Vangelis Koukis
598 968b3e04 Giorgos Verigakis
    def test_update_metadata(self):
599 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
600 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
601 ba6ded2a Giorgos Verigakis
        new_metadata = {}
602 53b1eea6 Giorgos Verigakis
        for key in sample(metadata[server_id].keys(), 3):
603 ba6ded2a Giorgos Verigakis
            new_metadata[key] = 'New %s value' % key
604 53b1eea6 Giorgos Verigakis
        response_metadata = self.update_server_metadata(server_id, new_metadata)
605 ba6ded2a Giorgos Verigakis
        self.assertEqual(response_metadata, new_metadata)
606 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(new_metadata)
607 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
608 aa197ee4 Vangelis Koukis
609 ba6ded2a Giorgos Verigakis
    def test_does_not_create(self):
610 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
611 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
612 53b1eea6 Giorgos Verigakis
            new_metadata = {'Foo': 'Bar'}
613 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_server_metadata(server_id, new_metadata)
614 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
615 aa197ee4 Vangelis Koukis
616 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
617 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
618 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
619 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta' % server_id
620 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
621 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
622 aa197ee4 Vangelis Koukis
623 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
624 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
625 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta'
626 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
627 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
628 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
629 968b3e04 Giorgos Verigakis
630 968b3e04 Giorgos Verigakis
631 968b3e04 Giorgos Verigakis
class GetServerMetadataItem(BaseTestCase):
632 53b1eea6 Giorgos Verigakis
    SERVERS = 5
633 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
634 aa197ee4 Vangelis Koukis
635 968b3e04 Giorgos Verigakis
    def test_get_metadata_item(self):
636 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
637 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
638 53b1eea6 Giorgos Verigakis
            key = choice(metadata[server_id].keys())
639 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
640 53b1eea6 Giorgos Verigakis
            response = self.client.get(path)
641 53b1eea6 Giorgos Verigakis
            self.assertTrue(response.status_code in (200, 203))
642 53b1eea6 Giorgos Verigakis
            reply = json.loads(response.content)
643 53b1eea6 Giorgos Verigakis
            self.assertEqual(reply['meta'], {key: metadata[server_id][key]})
644 aa197ee4 Vangelis Koukis
645 ba6ded2a Giorgos Verigakis
    def test_invalid_key(self):
646 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
647 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
648 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/%d/meta/foo' % server_id)
649 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
650 aa197ee4 Vangelis Koukis
651 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
652 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
653 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta/foo')
654 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
655 968b3e04 Giorgos Verigakis
656 968b3e04 Giorgos Verigakis
657 968b3e04 Giorgos Verigakis
class CreateServerMetadataItem(BaseTestCase):
658 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
659 aa197ee4 Vangelis Koukis
660 968b3e04 Giorgos Verigakis
    def test_create_metadata(self):
661 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
662 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
663 ba6ded2a Giorgos Verigakis
        meta = {'Foo': 'Bar'}
664 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
665 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
666 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
667 aa197ee4 Vangelis Koukis
668 ba6ded2a Giorgos Verigakis
    def test_update_metadata(self):
669 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
670 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
671 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
672 ba6ded2a Giorgos Verigakis
        meta = {key: 'New Value'}
673 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
674 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
675 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
676 aa197ee4 Vangelis Koukis
677 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
678 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
679 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta/foo'
680 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
681 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
682 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
683 aa197ee4 Vangelis Koukis
684 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
685 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
686 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
687 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/baz' % server_id
688 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
689 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
690 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
691 aa197ee4 Vangelis Koukis
692 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
693 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
694 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
695 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
696 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, 'meta', content_type='application/json')
697 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
698 968b3e04 Giorgos Verigakis
699 968b3e04 Giorgos Verigakis
700 968b3e04 Giorgos Verigakis
class DeleteServerMetadataItem(BaseTestCase):
701 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
702 aa197ee4 Vangelis Koukis
703 968b3e04 Giorgos Verigakis
    def test_delete_metadata(self):
704 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
705 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
706 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
707 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
708 ba6ded2a Giorgos Verigakis
        response = self.client.delete(path)
709 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
710 53b1eea6 Giorgos Verigakis
        metadata[server_id].pop(key)
711 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
712 aa197ee4 Vangelis Koukis
713 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
714 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
715 53b1eea6 Giorgos Verigakis
            response = self.client.delete('/api/v1.1/servers/9/meta/Key1')
716 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
717 aa197ee4 Vangelis Koukis
718 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
719 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
720 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
721 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
722 53b1eea6 Giorgos Verigakis
            response = self.client.delete(path)
723 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
724 53b1eea6 Giorgos Verigakis
725 53b1eea6 Giorgos Verigakis
726 53b1eea6 Giorgos Verigakis
class ListImageMetadata(BaseTestCase):
727 53b1eea6 Giorgos Verigakis
    IMAGES = 5
728 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 100
729 53b1eea6 Giorgos Verigakis
730 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
731 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
732 53b1eea6 Giorgos Verigakis
            for image in Image.objects.all():
733 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_image_metadata(image.id)
734 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[image.id])
735 53b1eea6 Giorgos Verigakis
736 53b1eea6 Giorgos Verigakis
    def test_invalid_image(self):
737 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
738 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/images/0/meta')
739 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
740 53b1eea6 Giorgos Verigakis
741 53b1eea6 Giorgos Verigakis
class UpdateImageMetadata(BaseTestCase):
742 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 10
743 53b1eea6 Giorgos Verigakis
744 53b1eea6 Giorgos Verigakis
    def test_update_metadata(self):
745 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_image_metadata()
746 53b1eea6 Giorgos Verigakis
        image_id = choice(metadata.keys())
747 53b1eea6 Giorgos Verigakis
        new_metadata = {}
748 53b1eea6 Giorgos Verigakis
        for key in sample(metadata[image_id].keys(), 3):
749 53b1eea6 Giorgos Verigakis
            new_metadata[key] = 'New %s value' % key
750 53b1eea6 Giorgos Verigakis
        response_metadata = self.update_image_metadata(image_id, new_metadata)
751 53b1eea6 Giorgos Verigakis
        self.assertEqual(response_metadata, new_metadata)
752 53b1eea6 Giorgos Verigakis
        metadata[image_id].update(new_metadata)
753 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_image_metadata())
754 53b1eea6 Giorgos Verigakis
755 53b1eea6 Giorgos Verigakis
    def test_does_not_create(self):
756 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
757 53b1eea6 Giorgos Verigakis
            image_id = choice(metadata.keys())
758 53b1eea6 Giorgos Verigakis
            new_metadata = {'Foo': 'Bar'}
759 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_image_metadata(image_id, new_metadata)
760 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
761 53b1eea6 Giorgos Verigakis
762 53b1eea6 Giorgos Verigakis
    def test_invalid_data(self):
763 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
764 53b1eea6 Giorgos Verigakis
            image_id = choice(metadata.keys())
765 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/%d/meta' % image_id
766 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
767 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
768 53b1eea6 Giorgos Verigakis
769 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
770 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
771 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/0/meta'
772 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
773 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
774 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
775 4cf8adf8 Vangelis Koukis
776 4cf8adf8 Vangelis Koukis
777 4cf8adf8 Vangelis Koukis
class ServerVNCConsole(BaseTestCase):
778 4cf8adf8 Vangelis Koukis
    SERVERS = 1
779 4cf8adf8 Vangelis Koukis
780 4cf8adf8 Vangelis Koukis
    def test_not_active_server(self):
781 4cf8adf8 Vangelis Koukis
        """Test console req for server not in ACTIVE state returns badRequest"""
782 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
783 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
784 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
785 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
786 4cf8adf8 Vangelis Koukis
        self.assertBadRequest(response)
787 4cf8adf8 Vangelis Koukis
788 4cf8adf8 Vangelis Koukis
    def test_active_server(self):
789 4cf8adf8 Vangelis Koukis
        """Test console req for ACTIVE server"""
790 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
791 4cf8adf8 Vangelis Koukis
        # FIXME: Start the server properly, instead of tampering with the DB
792 4cf8adf8 Vangelis Koukis
        vm = choice(VirtualMachine.objects.all())
793 4cf8adf8 Vangelis Koukis
        vm.operstate = 'STARTED'
794 4cf8adf8 Vangelis Koukis
        vm.save()
795 4cf8adf8 Vangelis Koukis
        server_id = vm.id
796 4cf8adf8 Vangelis Koukis
        
797 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
798 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
799 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
800 4cf8adf8 Vangelis Koukis
        self.assertEqual(response.status_code, 200)
801 4cf8adf8 Vangelis Koukis
        reply = json.loads(response.content)
802 529178b1 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['console'])
803 529178b1 Giorgos Verigakis
        console = reply['console']
804 529178b1 Giorgos Verigakis
        self.assertEqual(console['type'], 'vnc')
805 529178b1 Giorgos Verigakis
        self.assertEqual(set(console.keys()), set(['type', 'host', 'port', 'password']))
806 1428a464 Georgios Gousios
807 13b954b0 Giorgos Verigakis
808 1428a464 Georgios Gousios
class AaiTestCase(TestCase):
809 1428a464 Georgios Gousios
    fixtures = ['api_test_data', 'auth_test_data']
810 1428a464 Georgios Gousios
    apibase = '/api/v1.1'
811 1428a464 Georgios Gousios
812 aa519091 Georgios Gousios
    def setUp(self):
813 aa519091 Georgios Gousios
        self.client = Client()
814 1428a464 Georgios Gousios
815 1428a464 Georgios Gousios
    def test_auth_cookie(self):
816 1428a464 Georgios Gousios
        user = SynnefoUser.objects.get(uniq = "test@synnefo.gr")
817 1428a464 Georgios Gousios
        self.client.cookies['X-Auth-Token'] = user.auth_token
818 1428a464 Georgios Gousios
        response = self.client.get('/index.html', {},
819 1428a464 Georgios Gousios
                                   **{'X-Auth-Token': user.auth_token,
820 1428a464 Georgios Gousios
                                      'TEST-AAI' : 'true'})
821 1428a464 Georgios Gousios
        self.assertTrue(response.status_code, 200)
822 1428a464 Georgios Gousios
        self.assertTrue('Vary' in response)
823 1428a464 Georgios Gousios
        self.assertTrue('X-Auth-Token' in response['Vary'])
824 1428a464 Georgios Gousios
825 1428a464 Georgios Gousios
    def test_fail_oapi_auth(self):
826 1428a464 Georgios Gousios
        """ test authentication from not registered user using OpenAPI
827 1428a464 Georgios Gousios
        """
828 1428a464 Georgios Gousios
        response = self.client.get(self.apibase + '/servers', {},
829 1428a464 Georgios Gousios
                                   **{'X-Auth-User': 'notme',
830 1428a464 Georgios Gousios
                                      'X-Auth-Key': '0xdeadbabe',
831 1428a464 Georgios Gousios
                                      'TEST-AAI' : 'true'})
832 1428a464 Georgios Gousios
        self.assertEquals(response.status_code, 401)
833 1428a464 Georgios Gousios
834 1428a464 Georgios Gousios
    def test_oapi_auth(self):
835 1428a464 Georgios Gousios
        """authentication with user registration
836 1428a464 Georgios Gousios
        """
837 1428a464 Georgios Gousios
        response = self.client.get(self.apibase + '/index.html', {},
838 1428a464 Georgios Gousios
                                   **{'X-Auth-User': 'testdbuser',
839 1428a464 Georgios Gousios
                                      'X-Auth-Key': 'test@synnefo.gr',
840 1428a464 Georgios Gousios
                                      'TEST-AAI' : 'true'})
841 1428a464 Georgios Gousios
        self.assertEquals(response.status_code, 204)
842 1428a464 Georgios Gousios
        self.assertNotEqual(response['X-Auth-Token'], None)
843 1428a464 Georgios Gousios
        self.assertEquals(response['X-Server-Management-Url'], '')
844 1428a464 Georgios Gousios
        self.assertEquals(response['X-Storage-Url'], '')
845 1428a464 Georgios Gousios
        self.assertEquals(response['X-CDN-Management-Url'], '')
846 aa519091 Georgios Gousios
847 aa519091 Georgios Gousios
    def test_unauthorized_call(self):
848 aa519091 Georgios Gousios
        request = {'reboot': {'type': 'HARD'}}
849 aa519091 Georgios Gousios
        path = '/api/v1.1/servers/%d/action' % 1
850 aa519091 Georgios Gousios
        response = self.client.post(path, json.dumps(request), content_type='application/json')
851 865fd434 Vangelis Koukis
        self.assertEquals(response.status_code, 401)
852 865fd434 Vangelis Koukis
853 865fd434 Vangelis Koukis
854 13b954b0 Giorgos Verigakis
class ListNetworks(BaseTestCase):
855 13b954b0 Giorgos Verigakis
    SERVERS = 5
856 13b954b0 Giorgos Verigakis
    NETWORKS = 5
857 aa197ee4 Vangelis Koukis
858 13b954b0 Giorgos Verigakis
    def setUp(self):
859 13b954b0 Giorgos Verigakis
        BaseTestCase.setUp(self)
860 13b954b0 Giorgos Verigakis
        machines = VirtualMachine.objects.all()
861 13b954b0 Giorgos Verigakis
        for network in Network.objects.all():
862 13b954b0 Giorgos Verigakis
            n = randint(0, self.SERVERS)
863 13b954b0 Giorgos Verigakis
            network.machines.add(*sample(machines, n))
864 13b954b0 Giorgos Verigakis
            network.save()
865 aa197ee4 Vangelis Koukis
866 13b954b0 Giorgos Verigakis
    def test_list_networks(self):
867 13b954b0 Giorgos Verigakis
        networks = self.list_networks()
868 13b954b0 Giorgos Verigakis
        for net in Network.objects.all():
869 b19653d1 Giorgos Verigakis
            network = popdict(networks, id=net.id)
870 b19653d1 Giorgos Verigakis
            self.assertEqual(network['name'], net.name)
871 13b954b0 Giorgos Verigakis
        self.assertEqual(networks, [])
872 aa197ee4 Vangelis Koukis
873 13b954b0 Giorgos Verigakis
    def test_list_networks_detail(self):
874 13b954b0 Giorgos Verigakis
        networks = self.list_networks(detail=True)
875 13b954b0 Giorgos Verigakis
        for net in Network.objects.all():
876 b19653d1 Giorgos Verigakis
            network = popdict(networks, id=net.id)
877 b19653d1 Giorgos Verigakis
            self.assertEqual(network['name'], net.name)
878 13b954b0 Giorgos Verigakis
            machines = set(vm.id for vm in net.machines.all())
879 13b954b0 Giorgos Verigakis
            self.assertEqual(set(network['servers']['values']), machines)
880 13b954b0 Giorgos Verigakis
        self.assertEqual(networks, [])
881 13b954b0 Giorgos Verigakis
882 13b954b0 Giorgos Verigakis
883 13b954b0 Giorgos Verigakis
class CreateNetwork(BaseTestCase):
884 13b954b0 Giorgos Verigakis
    def test_create_network(self):
885 13b954b0 Giorgos Verigakis
        self.assertEqual(self.list_networks(), [])
886 13b954b0 Giorgos Verigakis
        self.create_network('net')
887 13b954b0 Giorgos Verigakis
        networks = self.list_networks()
888 13b954b0 Giorgos Verigakis
        self.assertEqual(len(networks), 1)
889 13b954b0 Giorgos Verigakis
        network = networks[0]
890 13b954b0 Giorgos Verigakis
        self.assertEqual(network['name'], 'net')
891 13b954b0 Giorgos Verigakis
892 13b954b0 Giorgos Verigakis
893 13b954b0 Giorgos Verigakis
class GetNetworkDetails(BaseTestCase):
894 13b954b0 Giorgos Verigakis
    SERVERS = 5
895 13b954b0 Giorgos Verigakis
    NETWORKS = 1
896 aa197ee4 Vangelis Koukis
897 13b954b0 Giorgos Verigakis
    def test_get_network_details(self):
898 13b954b0 Giorgos Verigakis
        servers = VirtualMachine.objects.all()
899 13b954b0 Giorgos Verigakis
        network = Network.objects.all()[0]
900 aa197ee4 Vangelis Koukis
901 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network.id)
902 b19653d1 Giorgos Verigakis
        self.assertEqual(net['name'], network.name)
903 13b954b0 Giorgos Verigakis
        self.assertEqual(net['servers']['values'], [])
904 aa197ee4 Vangelis Koukis
905 13b954b0 Giorgos Verigakis
        server_id = choice(servers).id
906 b19653d1 Giorgos Verigakis
        self.add_to_network(network.id, server_id)
907 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network.id)
908 b19653d1 Giorgos Verigakis
        self.assertEqual(net['name'], network.name)
909 13b954b0 Giorgos Verigakis
        self.assertEqual(net['servers']['values'], [server_id])
910 13b954b0 Giorgos Verigakis
911 13b954b0 Giorgos Verigakis
912 13b954b0 Giorgos Verigakis
class UpdateNetworkName(BaseTestCase):
913 13b954b0 Giorgos Verigakis
    NETWORKS = 5
914 aa197ee4 Vangelis Koukis
915 13b954b0 Giorgos Verigakis
    def test_update_network_name(self):
916 13b954b0 Giorgos Verigakis
        networks = self.list_networks(detail=True)
917 13b954b0 Giorgos Verigakis
        network = choice(networks)
918 b19653d1 Giorgos Verigakis
        network_id = network['id']
919 b19653d1 Giorgos Verigakis
        new_name = network['name'] + '_2'
920 b19653d1 Giorgos Verigakis
        self.update_network_name(network_id, new_name)
921 aa197ee4 Vangelis Koukis
922 13b954b0 Giorgos Verigakis
        network['name'] = new_name
923 b19653d1 Giorgos Verigakis
        self.assertEqual(self.get_network_details(network_id), network)
924 13b954b0 Giorgos Verigakis
925 13b954b0 Giorgos Verigakis
926 13b954b0 Giorgos Verigakis
class DeleteNetwork(BaseTestCase):
927 13b954b0 Giorgos Verigakis
    NETWORKS = 5
928 aa197ee4 Vangelis Koukis
929 13b954b0 Giorgos Verigakis
    def test_delete_network(self):
930 13b954b0 Giorgos Verigakis
        networks = self.list_networks()
931 13b954b0 Giorgos Verigakis
        network = choice(networks)
932 b19653d1 Giorgos Verigakis
        network_id = network['id']
933 b19653d1 Giorgos Verigakis
        self.delete_network(network_id)
934 aa197ee4 Vangelis Koukis
935 b19653d1 Giorgos Verigakis
        response = self.client.get('/api/v1.1/networks/%d' % network_id)
936 13b954b0 Giorgos Verigakis
        self.assertItemNotFound(response)
937 aa197ee4 Vangelis Koukis
938 13b954b0 Giorgos Verigakis
        networks.remove(network)
939 13b954b0 Giorgos Verigakis
        self.assertEqual(self.list_networks(), networks)
940 13b954b0 Giorgos Verigakis
941 13b954b0 Giorgos Verigakis
942 13b954b0 Giorgos Verigakis
class NetworkActions(BaseTestCase):
943 13b954b0 Giorgos Verigakis
    SERVERS = 20
944 13b954b0 Giorgos Verigakis
    NETWORKS = 1
945 aa197ee4 Vangelis Koukis
946 13b954b0 Giorgos Verigakis
    def test_add_remove_server(self):
947 13b954b0 Giorgos Verigakis
        server_ids = [vm.id for vm in VirtualMachine.objects.all()]
948 13b954b0 Giorgos Verigakis
        network = self.list_networks(detail=True)[0]
949 b19653d1 Giorgos Verigakis
        network_id = network['id']
950 aa197ee4 Vangelis Koukis
951 13b954b0 Giorgos Verigakis
        to_add = set(sample(server_ids, 10))
952 13b954b0 Giorgos Verigakis
        for server_id in to_add:
953 b19653d1 Giorgos Verigakis
            self.add_to_network(network_id, server_id)
954 b19653d1 Giorgos Verigakis
            net = self.get_network_details(network_id)
955 13b954b0 Giorgos Verigakis
            self.assertTrue(server_id in net['servers']['values'])
956 aa197ee4 Vangelis Koukis
957 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network_id)
958 13b954b0 Giorgos Verigakis
        self.assertEqual(set(net['servers']['values']), to_add)
959 aa197ee4 Vangelis Koukis
960 13b954b0 Giorgos Verigakis
        to_remove = set(sample(to_add, 5))
961 13b954b0 Giorgos Verigakis
        for server_id in to_remove:
962 b19653d1 Giorgos Verigakis
            self.remove_from_network(network_id, server_id)
963 b19653d1 Giorgos Verigakis
            net = self.get_network_details(network_id)
964 13b954b0 Giorgos Verigakis
            self.assertTrue(server_id not in net['servers']['values'])
965 aa197ee4 Vangelis Koukis
966 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network_id)
967 13b954b0 Giorgos Verigakis
        self.assertEqual(set(net['servers']['values']), to_add - to_remove)