Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ 53481544

History | View | Annotate | Download (38.7 kB)

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