Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ 96b635d9

History | View | Annotate | Download (39.3 kB)

1 adee02b8 Giorgos Verigakis
# Copyright 2011 GRNET S.A. All rights reserved.
2 adee02b8 Giorgos Verigakis
# 
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 adee02b8 Giorgos Verigakis
# 
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 adee02b8 Giorgos Verigakis
# 
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 adee02b8 Giorgos Verigakis
# 
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 adee02b8 Giorgos Verigakis
# 
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 883de713 Giorgos Verigakis
    fixtures = ['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 ccd0d474 Giorgos Verigakis
    
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 685ab2b6 Markos Gogoulos
        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 968b3e04 Giorgos Verigakis
def create_flavors(n=1):
351 968b3e04 Giorgos Verigakis
    for i in range(n):
352 968b3e04 Giorgos Verigakis
        Flavor.objects.create(
353 968b3e04 Giorgos Verigakis
            cpu=randint(1, 4),
354 80da6543 Giorgos Verigakis
            ram=randint(1, 8) * 512,
355 80da6543 Giorgos Verigakis
            disk=randint(1, 40))
356 968b3e04 Giorgos Verigakis
357 968b3e04 Giorgos Verigakis
def create_images(n=1):
358 23f2683f Giorgos Verigakis
    owner = SynnefoUser.objects.all()[0]
359 968b3e04 Giorgos Verigakis
    for i in range(n):
360 968b3e04 Giorgos Verigakis
        Image.objects.create(
361 968b3e04 Giorgos Verigakis
            name='Image %d' % (i + 1),
362 968b3e04 Giorgos Verigakis
            state='ACTIVE',
363 23f2683f Giorgos Verigakis
            owner=owner)
364 968b3e04 Giorgos Verigakis
365 53b1eea6 Giorgos Verigakis
def create_image_metadata(n=1):
366 53b1eea6 Giorgos Verigakis
    images = Image.objects.all()
367 53b1eea6 Giorgos Verigakis
    for i in range(n):
368 53b1eea6 Giorgos Verigakis
        ImageMetadata.objects.create(
369 53b1eea6 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
370 53b1eea6 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
371 53b1eea6 Giorgos Verigakis
            image = choice(images))
372 53b1eea6 Giorgos Verigakis
373 968b3e04 Giorgos Verigakis
def create_servers(n=1):
374 23f2683f Giorgos Verigakis
    owner = SynnefoUser.objects.all()[0]
375 968b3e04 Giorgos Verigakis
    flavors = Flavor.objects.all()
376 968b3e04 Giorgos Verigakis
    images = Image.objects.all()
377 968b3e04 Giorgos Verigakis
    for i in range(n):
378 968b3e04 Giorgos Verigakis
        VirtualMachine.objects.create(
379 968b3e04 Giorgos Verigakis
            name='Server %d' % (i + 1),
380 23f2683f Giorgos Verigakis
            owner=owner,
381 968b3e04 Giorgos Verigakis
            sourceimage=choice(images),
382 968b3e04 Giorgos Verigakis
            hostid=str(i),
383 968b3e04 Giorgos Verigakis
            flavor=choice(flavors))
384 968b3e04 Giorgos Verigakis
385 968b3e04 Giorgos Verigakis
def create_server_metadata(n=1):
386 968b3e04 Giorgos Verigakis
    servers = VirtualMachine.objects.all()
387 968b3e04 Giorgos Verigakis
    for i in range(n):
388 968b3e04 Giorgos Verigakis
        VirtualMachineMetadata.objects.create(
389 968b3e04 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
390 968b3e04 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
391 968b3e04 Giorgos Verigakis
            vm = choice(servers))
392 968b3e04 Giorgos Verigakis
393 968b3e04 Giorgos Verigakis
394 53b1eea6 Giorgos Verigakis
class AssertInvariant(object):
395 53b1eea6 Giorgos Verigakis
    def __init__(self, callable, *args, **kwargs):
396 53b1eea6 Giorgos Verigakis
        self.callable = callable
397 53b1eea6 Giorgos Verigakis
        self.args = args
398 53b1eea6 Giorgos Verigakis
        self.kwargs = kwargs
399 aa197ee4 Vangelis Koukis
400 53b1eea6 Giorgos Verigakis
    def __enter__(self):
401 53b1eea6 Giorgos Verigakis
        self.value = self.callable(*self.args, **self.kwargs)
402 53b1eea6 Giorgos Verigakis
        return self.value
403 aa197ee4 Vangelis Koukis
404 53b1eea6 Giorgos Verigakis
    def __exit__(self, type, value, tb):
405 53b1eea6 Giorgos Verigakis
        assert self.value == self.callable(*self.args, **self.kwargs)
406 53b1eea6 Giorgos Verigakis
407 53b1eea6 Giorgos Verigakis
408 968b3e04 Giorgos Verigakis
class BaseTestCase(TestCase):
409 40777cc8 Giorgos Verigakis
    USERS = 0
410 968b3e04 Giorgos Verigakis
    FLAVORS = 1
411 968b3e04 Giorgos Verigakis
    IMAGES = 1
412 968b3e04 Giorgos Verigakis
    SERVERS = 1
413 968b3e04 Giorgos Verigakis
    SERVER_METADATA = 0
414 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 0
415 aa197ee4 Vangelis Koukis
416 883de713 Giorgos Verigakis
    def setUp(self):
417 40777cc8 Giorgos Verigakis
        self.client = AaiClient()
418 968b3e04 Giorgos Verigakis
        create_users(self.USERS)
419 968b3e04 Giorgos Verigakis
        create_flavors(self.FLAVORS)
420 968b3e04 Giorgos Verigakis
        create_images(self.IMAGES)
421 53b1eea6 Giorgos Verigakis
        create_image_metadata(self.IMAGE_METADATA)
422 968b3e04 Giorgos Verigakis
        create_servers(self.SERVERS)
423 968b3e04 Giorgos Verigakis
        create_server_metadata(self.SERVER_METADATA)
424 aa197ee4 Vangelis Koukis
425 968b3e04 Giorgos Verigakis
    def assertFault(self, response, status_code, name):
426 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, status_code)
427 968b3e04 Giorgos Verigakis
        fault = json.loads(response.content)
428 968b3e04 Giorgos Verigakis
        self.assertEqual(fault.keys(), [name])
429 aa197ee4 Vangelis Koukis
430 968b3e04 Giorgos Verigakis
    def assertBadRequest(self, response):
431 968b3e04 Giorgos Verigakis
        self.assertFault(response, 400, 'badRequest')
432 968b3e04 Giorgos Verigakis
433 968b3e04 Giorgos Verigakis
    def assertItemNotFound(self, response):
434 968b3e04 Giorgos Verigakis
        self.assertFault(response, 404, 'itemNotFound')
435 aa197ee4 Vangelis Koukis
436 aa197ee4 Vangelis Koukis
437 111f6d5b Giorgos Verigakis
    def list_images(self, detail=False):
438 111f6d5b Giorgos Verigakis
        path = '/api/v1.1/images'
439 111f6d5b Giorgos Verigakis
        if detail:
440 111f6d5b Giorgos Verigakis
            path += '/detail'
441 111f6d5b Giorgos Verigakis
        response = self.client.get(path)
442 111f6d5b Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
443 111f6d5b Giorgos Verigakis
        reply = json.loads(response.content)
444 111f6d5b Giorgos Verigakis
        self.assertEqual(reply.keys(), ['images'])
445 111f6d5b Giorgos Verigakis
        self.assertEqual(reply['images'].keys(), ['values'])
446 111f6d5b Giorgos Verigakis
        return reply['images']['values']
447 aa197ee4 Vangelis Koukis
448 53b1eea6 Giorgos Verigakis
    def list_metadata(self, path):
449 53b1eea6 Giorgos Verigakis
        response = self.client.get(path)
450 968b3e04 Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
451 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
452 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
453 968b3e04 Giorgos Verigakis
        self.assertEqual(reply['metadata'].keys(), ['values'])
454 968b3e04 Giorgos Verigakis
        return reply['metadata']['values']
455 aa197ee4 Vangelis Koukis
456 53b1eea6 Giorgos Verigakis
    def list_server_metadata(self, server_id):
457 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
458 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
459 aa197ee4 Vangelis Koukis
460 53b1eea6 Giorgos Verigakis
    def list_image_metadata(self, image_id):
461 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
462 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
463 aa197ee4 Vangelis Koukis
464 53b1eea6 Giorgos Verigakis
    def update_metadata(self, path, metadata):
465 ba6ded2a Giorgos Verigakis
        data = json.dumps({'metadata': metadata})
466 ba6ded2a Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
467 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
468 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
469 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
470 968b3e04 Giorgos Verigakis
        return reply['metadata']
471 aa197ee4 Vangelis Koukis
472 53b1eea6 Giorgos Verigakis
    def update_server_metadata(self, server_id, metadata):
473 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
474 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
475 aa197ee4 Vangelis Koukis
476 53b1eea6 Giorgos Verigakis
    def update_image_metadata(self, image_id, metadata):
477 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
478 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
479 aa197ee4 Vangelis Koukis
480 53b1eea6 Giorgos Verigakis
    def create_server_meta(self, server_id, meta):
481 53b1eea6 Giorgos Verigakis
        key = meta.keys()[0]
482 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
483 53b1eea6 Giorgos Verigakis
        data = json.dumps({'meta': meta})
484 53b1eea6 Giorgos Verigakis
        response = self.client.put(path, data, content_type='application/json')
485 53b1eea6 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
486 53b1eea6 Giorgos Verigakis
        reply = json.loads(response.content)
487 53b1eea6 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['meta'])
488 53b1eea6 Giorgos Verigakis
        response_meta = reply['meta']
489 53b1eea6 Giorgos Verigakis
        self.assertEqual(response_meta, meta)
490 aa197ee4 Vangelis Koukis
491 53b1eea6 Giorgos Verigakis
    def get_all_server_metadata(self):
492 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
493 53b1eea6 Giorgos Verigakis
        for m in VirtualMachineMetadata.objects.all():
494 53b1eea6 Giorgos Verigakis
            metadata[m.vm.id][m.meta_key] = m.meta_value
495 53b1eea6 Giorgos Verigakis
        return metadata
496 aa197ee4 Vangelis Koukis
497 53b1eea6 Giorgos Verigakis
    def get_all_image_metadata(self):
498 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
499 53b1eea6 Giorgos Verigakis
        for m in ImageMetadata.objects.all():
500 53b1eea6 Giorgos Verigakis
            metadata[m.image.id][m.meta_key] = m.meta_value
501 53b1eea6 Giorgos Verigakis
        return metadata
502 aa197ee4 Vangelis Koukis
503 13b954b0 Giorgos Verigakis
    def list_networks(self, detail=False):
504 13b954b0 Giorgos Verigakis
        path = '/api/v1.1/networks'
505 13b954b0 Giorgos Verigakis
        if detail:
506 13b954b0 Giorgos Verigakis
            path += '/detail'
507 13b954b0 Giorgos Verigakis
        response = self.client.get(path)
508 13b954b0 Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
509 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
510 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['networks'])
511 13b954b0 Giorgos Verigakis
        self.assertEqual(reply['networks'].keys(), ['values'])
512 13b954b0 Giorgos Verigakis
        return reply['networks']['values']
513 aa197ee4 Vangelis Koukis
514 13b954b0 Giorgos Verigakis
    def create_network(self, name):
515 13b954b0 Giorgos Verigakis
        path = '/api/v1.1/networks'
516 13b954b0 Giorgos Verigakis
        data = json.dumps({'network': {'name': name}})
517 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
518 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
519 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
520 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['network'])
521 13b954b0 Giorgos Verigakis
        return reply
522 aa197ee4 Vangelis Koukis
523 b19653d1 Giorgos Verigakis
    def get_network_details(self, network_id):
524 207b70d5 Giorgos Verigakis
        path = '/api/v1.1/networks/%s' % network_id
525 13b954b0 Giorgos Verigakis
        response = self.client.get(path)
526 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 200)
527 13b954b0 Giorgos Verigakis
        reply = json.loads(response.content)
528 13b954b0 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['network'])
529 13b954b0 Giorgos Verigakis
        return reply['network']
530 aa197ee4 Vangelis Koukis
531 b19653d1 Giorgos Verigakis
    def update_network_name(self, network_id, new_name):
532 207b70d5 Giorgos Verigakis
        path = '/api/v1.1/networks/%s' % network_id
533 13b954b0 Giorgos Verigakis
        data = json.dumps({'network': {'name': new_name}})
534 13b954b0 Giorgos Verigakis
        response = self.client.put(path, data, content_type='application/json')
535 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
536 aa197ee4 Vangelis Koukis
537 b19653d1 Giorgos Verigakis
    def delete_network(self, network_id):
538 207b70d5 Giorgos Verigakis
        path = '/api/v1.1/networks/%s' % network_id
539 13b954b0 Giorgos Verigakis
        response = self.client.delete(path)
540 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
541 aa197ee4 Vangelis Koukis
542 b19653d1 Giorgos Verigakis
    def add_to_network(self, network_id, server_id):
543 207b70d5 Giorgos Verigakis
        path = '/api/v1.1/networks/%s/action' % network_id
544 13b954b0 Giorgos Verigakis
        data = json.dumps({'add': {'serverRef': server_id}})
545 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
546 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
547 aa197ee4 Vangelis Koukis
548 b19653d1 Giorgos Verigakis
    def remove_from_network(self, network_id, server_id):
549 207b70d5 Giorgos Verigakis
        path = '/api/v1.1/networks/%s/action' % network_id
550 13b954b0 Giorgos Verigakis
        data = json.dumps({'remove': {'serverRef': server_id}})
551 13b954b0 Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
552 13b954b0 Giorgos Verigakis
        self.assertEqual(response.status_code, 202)
553 13b954b0 Giorgos Verigakis
554 13b954b0 Giorgos Verigakis
555 13b954b0 Giorgos Verigakis
def popdict(l, **kwargs):
556 13b954b0 Giorgos Verigakis
    """Pops a dict from list `l` based on the predicates given as `kwargs`."""
557 aa197ee4 Vangelis Koukis
558 13b954b0 Giorgos Verigakis
    for i in range(len(l)):
559 13b954b0 Giorgos Verigakis
        item = l[i]
560 13b954b0 Giorgos Verigakis
        match = True
561 13b954b0 Giorgos Verigakis
        for key, val in kwargs.items():
562 13b954b0 Giorgos Verigakis
            if item[key] != val:
563 13b954b0 Giorgos Verigakis
                match = False
564 13b954b0 Giorgos Verigakis
                break
565 13b954b0 Giorgos Verigakis
        if match:
566 13b954b0 Giorgos Verigakis
            del l[i]
567 13b954b0 Giorgos Verigakis
            return item
568 13b954b0 Giorgos Verigakis
    return None
569 53b1eea6 Giorgos Verigakis
570 53b1eea6 Giorgos Verigakis
571 111f6d5b Giorgos Verigakis
class ListImages(BaseTestCase):
572 111f6d5b Giorgos Verigakis
    IMAGES = 10
573 aa197ee4 Vangelis Koukis
574 111f6d5b Giorgos Verigakis
    def test_list_images(self):
575 111f6d5b Giorgos Verigakis
        images = self.list_images()
576 111f6d5b Giorgos Verigakis
        keys = set(['id', 'name'])
577 111f6d5b Giorgos Verigakis
        for img in Image.objects.all():
578 13b954b0 Giorgos Verigakis
            image = popdict(images, id=img.id)
579 111f6d5b Giorgos Verigakis
            self.assertTrue(image is not None)
580 111f6d5b Giorgos Verigakis
            self.assertEqual(set(image.keys()), keys)
581 111f6d5b Giorgos Verigakis
            self.assertEqual(image['id'], img.id)
582 111f6d5b Giorgos Verigakis
            self.assertEqual(image['name'], img.name)
583 111f6d5b Giorgos Verigakis
        self.assertEqual(images, [])
584 aa197ee4 Vangelis Koukis
585 111f6d5b Giorgos Verigakis
    def test_list_images_detail(self):
586 111f6d5b Giorgos Verigakis
        images = self.list_images(detail=True)
587 111f6d5b Giorgos Verigakis
        keys = set(['id', 'name', 'updated', 'created', 'status', 'progress'])
588 111f6d5b Giorgos Verigakis
        for img in Image.objects.all():
589 13b954b0 Giorgos Verigakis
            image = popdict(images, id=img.id)
590 111f6d5b Giorgos Verigakis
            self.assertTrue(image is not None)
591 111f6d5b Giorgos Verigakis
            self.assertEqual(set(image.keys()), keys)
592 111f6d5b Giorgos Verigakis
            self.assertEqual(image['id'], img.id)
593 111f6d5b Giorgos Verigakis
            self.assertEqual(image['name'], img.name)
594 111f6d5b Giorgos Verigakis
            self.assertEqual(image['status'], img.state)
595 111f6d5b Giorgos Verigakis
            self.assertEqual(image['progress'], 100 if img.state == 'ACTIVE' else 0)
596 111f6d5b Giorgos Verigakis
        self.assertEqual(images, [])
597 111f6d5b Giorgos Verigakis
598 111f6d5b Giorgos Verigakis
599 53b1eea6 Giorgos Verigakis
class ListServerMetadata(BaseTestCase):
600 53b1eea6 Giorgos Verigakis
    SERVERS = 5
601 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
602 aa197ee4 Vangelis Koukis
603 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
604 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
605 53b1eea6 Giorgos Verigakis
            for vm in VirtualMachine.objects.all():
606 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_server_metadata(vm.id)
607 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[vm.id])
608 aa197ee4 Vangelis Koukis
609 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
610 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
611 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta')
612 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
613 53b1eea6 Giorgos Verigakis
614 53b1eea6 Giorgos Verigakis
615 53b1eea6 Giorgos Verigakis
class UpdateServerMetadata(BaseTestCase):
616 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 10
617 aa197ee4 Vangelis Koukis
618 968b3e04 Giorgos Verigakis
    def test_update_metadata(self):
619 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
620 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
621 ba6ded2a Giorgos Verigakis
        new_metadata = {}
622 53b1eea6 Giorgos Verigakis
        for key in sample(metadata[server_id].keys(), 3):
623 ba6ded2a Giorgos Verigakis
            new_metadata[key] = 'New %s value' % key
624 53b1eea6 Giorgos Verigakis
        response_metadata = self.update_server_metadata(server_id, new_metadata)
625 ba6ded2a Giorgos Verigakis
        self.assertEqual(response_metadata, new_metadata)
626 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(new_metadata)
627 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
628 aa197ee4 Vangelis Koukis
629 ba6ded2a Giorgos Verigakis
    def test_does_not_create(self):
630 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
631 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
632 53b1eea6 Giorgos Verigakis
            new_metadata = {'Foo': 'Bar'}
633 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_server_metadata(server_id, new_metadata)
634 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
635 aa197ee4 Vangelis Koukis
636 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
637 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
638 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
639 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta' % server_id
640 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
641 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
642 aa197ee4 Vangelis Koukis
643 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
644 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
645 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta'
646 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
647 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
648 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
649 968b3e04 Giorgos Verigakis
650 968b3e04 Giorgos Verigakis
651 968b3e04 Giorgos Verigakis
class GetServerMetadataItem(BaseTestCase):
652 53b1eea6 Giorgos Verigakis
    SERVERS = 5
653 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
654 aa197ee4 Vangelis Koukis
655 968b3e04 Giorgos Verigakis
    def test_get_metadata_item(self):
656 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
657 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
658 53b1eea6 Giorgos Verigakis
            key = choice(metadata[server_id].keys())
659 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
660 53b1eea6 Giorgos Verigakis
            response = self.client.get(path)
661 53b1eea6 Giorgos Verigakis
            self.assertTrue(response.status_code in (200, 203))
662 53b1eea6 Giorgos Verigakis
            reply = json.loads(response.content)
663 53b1eea6 Giorgos Verigakis
            self.assertEqual(reply['meta'], {key: metadata[server_id][key]})
664 aa197ee4 Vangelis Koukis
665 ba6ded2a Giorgos Verigakis
    def test_invalid_key(self):
666 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
667 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
668 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/%d/meta/foo' % server_id)
669 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
670 aa197ee4 Vangelis Koukis
671 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
672 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
673 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta/foo')
674 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
675 968b3e04 Giorgos Verigakis
676 968b3e04 Giorgos Verigakis
677 968b3e04 Giorgos Verigakis
class CreateServerMetadataItem(BaseTestCase):
678 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
679 aa197ee4 Vangelis Koukis
680 968b3e04 Giorgos Verigakis
    def test_create_metadata(self):
681 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
682 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
683 ba6ded2a Giorgos Verigakis
        meta = {'Foo': 'Bar'}
684 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
685 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
686 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
687 aa197ee4 Vangelis Koukis
688 ba6ded2a Giorgos Verigakis
    def test_update_metadata(self):
689 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
690 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
691 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
692 ba6ded2a Giorgos Verigakis
        meta = {key: 'New Value'}
693 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
694 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
695 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
696 aa197ee4 Vangelis Koukis
697 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
698 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
699 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta/foo'
700 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
701 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
702 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
703 aa197ee4 Vangelis Koukis
704 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
705 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
706 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
707 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/baz' % server_id
708 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
709 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
710 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
711 aa197ee4 Vangelis Koukis
712 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
713 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
714 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
715 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
716 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, 'meta', content_type='application/json')
717 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
718 968b3e04 Giorgos Verigakis
719 968b3e04 Giorgos Verigakis
720 968b3e04 Giorgos Verigakis
class DeleteServerMetadataItem(BaseTestCase):
721 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
722 aa197ee4 Vangelis Koukis
723 968b3e04 Giorgos Verigakis
    def test_delete_metadata(self):
724 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
725 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
726 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
727 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
728 ba6ded2a Giorgos Verigakis
        response = self.client.delete(path)
729 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
730 53b1eea6 Giorgos Verigakis
        metadata[server_id].pop(key)
731 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
732 aa197ee4 Vangelis Koukis
733 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
734 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
735 53b1eea6 Giorgos Verigakis
            response = self.client.delete('/api/v1.1/servers/9/meta/Key1')
736 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
737 aa197ee4 Vangelis Koukis
738 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
739 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
740 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
741 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
742 53b1eea6 Giorgos Verigakis
            response = self.client.delete(path)
743 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
744 53b1eea6 Giorgos Verigakis
745 53b1eea6 Giorgos Verigakis
746 53b1eea6 Giorgos Verigakis
class ListImageMetadata(BaseTestCase):
747 53b1eea6 Giorgos Verigakis
    IMAGES = 5
748 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 100
749 53b1eea6 Giorgos Verigakis
750 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
751 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
752 53b1eea6 Giorgos Verigakis
            for image in Image.objects.all():
753 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_image_metadata(image.id)
754 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[image.id])
755 53b1eea6 Giorgos Verigakis
756 53b1eea6 Giorgos Verigakis
    def test_invalid_image(self):
757 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
758 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/images/0/meta')
759 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
760 53b1eea6 Giorgos Verigakis
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
        self.assertEqual(response_metadata, new_metadata)
772 53b1eea6 Giorgos Verigakis
        metadata[image_id].update(new_metadata)
773 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_image_metadata())
774 53b1eea6 Giorgos Verigakis
775 53b1eea6 Giorgos Verigakis
    def test_does_not_create(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
            new_metadata = {'Foo': 'Bar'}
779 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_image_metadata(image_id, new_metadata)
780 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
781 53b1eea6 Giorgos Verigakis
782 53b1eea6 Giorgos Verigakis
    def test_invalid_data(self):
783 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
784 53b1eea6 Giorgos Verigakis
            image_id = choice(metadata.keys())
785 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/%d/meta' % image_id
786 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
787 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
788 53b1eea6 Giorgos Verigakis
789 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
790 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
791 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/0/meta'
792 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
793 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
794 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
795 4cf8adf8 Vangelis Koukis
796 4cf8adf8 Vangelis Koukis
797 4cf8adf8 Vangelis Koukis
class ServerVNCConsole(BaseTestCase):
798 4cf8adf8 Vangelis Koukis
    SERVERS = 1
799 4cf8adf8 Vangelis Koukis
800 4cf8adf8 Vangelis Koukis
    def test_not_active_server(self):
801 4cf8adf8 Vangelis Koukis
        """Test console req for server not in ACTIVE state returns badRequest"""
802 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
803 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
804 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
805 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
806 4cf8adf8 Vangelis Koukis
        self.assertBadRequest(response)
807 4cf8adf8 Vangelis Koukis
808 4cf8adf8 Vangelis Koukis
    def test_active_server(self):
809 4cf8adf8 Vangelis Koukis
        """Test console req for ACTIVE server"""
810 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
811 4cf8adf8 Vangelis Koukis
        # FIXME: Start the server properly, instead of tampering with the DB
812 4cf8adf8 Vangelis Koukis
        vm = choice(VirtualMachine.objects.all())
813 4cf8adf8 Vangelis Koukis
        vm.operstate = 'STARTED'
814 4cf8adf8 Vangelis Koukis
        vm.save()
815 4cf8adf8 Vangelis Koukis
        server_id = vm.id
816 4cf8adf8 Vangelis Koukis
        
817 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
818 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
819 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
820 4cf8adf8 Vangelis Koukis
        self.assertEqual(response.status_code, 200)
821 4cf8adf8 Vangelis Koukis
        reply = json.loads(response.content)
822 529178b1 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['console'])
823 529178b1 Giorgos Verigakis
        console = reply['console']
824 529178b1 Giorgos Verigakis
        self.assertEqual(console['type'], 'vnc')
825 529178b1 Giorgos Verigakis
        self.assertEqual(set(console.keys()), set(['type', 'host', 'port', 'password']))
826 1428a464 Georgios Gousios
827 13b954b0 Giorgos Verigakis
828 1428a464 Georgios Gousios
class AaiTestCase(TestCase):
829 1428a464 Georgios Gousios
    fixtures = ['api_test_data', 'auth_test_data']
830 1428a464 Georgios Gousios
    apibase = '/api/v1.1'
831 1428a464 Georgios Gousios
832 aa519091 Georgios Gousios
    def setUp(self):
833 aa519091 Georgios Gousios
        self.client = Client()
834 1428a464 Georgios Gousios
835 1428a464 Georgios Gousios
    def test_fail_oapi_auth(self):
836 1428a464 Georgios Gousios
        """ test authentication from not registered user using OpenAPI
837 1428a464 Georgios Gousios
        """
838 1428a464 Georgios Gousios
        response = self.client.get(self.apibase + '/servers', {},
839 1428a464 Georgios Gousios
                                   **{'X-Auth-User': 'notme',
840 1428a464 Georgios Gousios
                                      'X-Auth-Key': '0xdeadbabe',
841 1428a464 Georgios Gousios
                                      'TEST-AAI' : 'true'})
842 1428a464 Georgios Gousios
        self.assertEquals(response.status_code, 401)
843 1428a464 Georgios Gousios
844 1428a464 Georgios Gousios
    def test_oapi_auth(self):
845 1428a464 Georgios Gousios
        """authentication with user registration
846 1428a464 Georgios Gousios
        """
847 1428a464 Georgios Gousios
        response = self.client.get(self.apibase + '/index.html', {},
848 1428a464 Georgios Gousios
                                   **{'X-Auth-User': 'testdbuser',
849 1428a464 Georgios Gousios
                                      'X-Auth-Key': 'test@synnefo.gr',
850 1428a464 Georgios Gousios
                                      'TEST-AAI' : 'true'})
851 1428a464 Georgios Gousios
        self.assertEquals(response.status_code, 204)
852 1428a464 Georgios Gousios
        self.assertNotEqual(response['X-Auth-Token'], None)
853 1428a464 Georgios Gousios
        self.assertEquals(response['X-Server-Management-Url'], '')
854 1428a464 Georgios Gousios
        self.assertEquals(response['X-Storage-Url'], '')
855 1428a464 Georgios Gousios
        self.assertEquals(response['X-CDN-Management-Url'], '')
856 aa519091 Georgios Gousios
857 aa519091 Georgios Gousios
    def test_unauthorized_call(self):
858 aa519091 Georgios Gousios
        request = {'reboot': {'type': 'HARD'}}
859 aa519091 Georgios Gousios
        path = '/api/v1.1/servers/%d/action' % 1
860 6a0e1a00 Georgios Gousios
        response = self.client.post(path, json.dumps(request),
861 6a0e1a00 Georgios Gousios
                                    content_type='application/json')
862 865fd434 Vangelis Koukis
        self.assertEquals(response.status_code, 401)
863 865fd434 Vangelis Koukis
864 865fd434 Vangelis Koukis
865 13b954b0 Giorgos Verigakis
class ListNetworks(BaseTestCase):
866 13b954b0 Giorgos Verigakis
    SERVERS = 5
867 aa197ee4 Vangelis Koukis
868 13b954b0 Giorgos Verigakis
    def setUp(self):
869 13b954b0 Giorgos Verigakis
        BaseTestCase.setUp(self)
870 a3992827 Giorgos Verigakis
        
871 a3992827 Giorgos Verigakis
        for i in range(5):
872 a3992827 Giorgos Verigakis
            self.create_network('net%d' % i)
873 a3992827 Giorgos Verigakis
        
874 13b954b0 Giorgos Verigakis
        machines = VirtualMachine.objects.all()
875 13b954b0 Giorgos Verigakis
        for network in Network.objects.all():
876 13b954b0 Giorgos Verigakis
            n = randint(0, self.SERVERS)
877 d44c236b Giorgos Verigakis
            for machine in sample(machines, n):
878 d44c236b Giorgos Verigakis
                machine.nics.create(network=network)
879 d44c236b Giorgos Verigakis
    
880 13b954b0 Giorgos Verigakis
    def test_list_networks(self):
881 13b954b0 Giorgos Verigakis
        networks = self.list_networks()
882 13b954b0 Giorgos Verigakis
        for net in Network.objects.all():
883 207b70d5 Giorgos Verigakis
            net_id = str(net.id) if not net.public else 'public'
884 207b70d5 Giorgos Verigakis
            network = popdict(networks, id=net_id)
885 b19653d1 Giorgos Verigakis
            self.assertEqual(network['name'], net.name)
886 13b954b0 Giorgos Verigakis
        self.assertEqual(networks, [])
887 aa197ee4 Vangelis Koukis
888 13b954b0 Giorgos Verigakis
    def test_list_networks_detail(self):
889 13b954b0 Giorgos Verigakis
        networks = self.list_networks(detail=True)
890 13b954b0 Giorgos Verigakis
        for net in Network.objects.all():
891 207b70d5 Giorgos Verigakis
            net_id = str(net.id) if not net.public else 'public'
892 207b70d5 Giorgos Verigakis
            network = popdict(networks, id=net_id)
893 b19653d1 Giorgos Verigakis
            self.assertEqual(network['name'], net.name)
894 13b954b0 Giorgos Verigakis
            machines = set(vm.id for vm in net.machines.all())
895 13b954b0 Giorgos Verigakis
            self.assertEqual(set(network['servers']['values']), machines)
896 13b954b0 Giorgos Verigakis
        self.assertEqual(networks, [])
897 13b954b0 Giorgos Verigakis
898 13b954b0 Giorgos Verigakis
899 13b954b0 Giorgos Verigakis
class CreateNetwork(BaseTestCase):
900 13b954b0 Giorgos Verigakis
    def test_create_network(self):
901 d44c236b Giorgos Verigakis
        before = self.list_networks()
902 13b954b0 Giorgos Verigakis
        self.create_network('net')
903 d44c236b Giorgos Verigakis
        after = self.list_networks()
904 d44c236b Giorgos Verigakis
        self.assertEqual(len(after) - len(before), 1)
905 d44c236b Giorgos Verigakis
        found = False
906 d44c236b Giorgos Verigakis
        for network in after:
907 d44c236b Giorgos Verigakis
            if network['name'] == 'net':
908 d44c236b Giorgos Verigakis
                found = True
909 d44c236b Giorgos Verigakis
                break
910 d44c236b Giorgos Verigakis
        self.assertTrue(found)
911 13b954b0 Giorgos Verigakis
912 13b954b0 Giorgos Verigakis
913 13b954b0 Giorgos Verigakis
class GetNetworkDetails(BaseTestCase):
914 13b954b0 Giorgos Verigakis
    SERVERS = 5
915 64938cb0 Giorgos Verigakis
    
916 13b954b0 Giorgos Verigakis
    def test_get_network_details(self):
917 64938cb0 Giorgos Verigakis
        name = 'net'
918 64938cb0 Giorgos Verigakis
        self.create_network(name)
919 64938cb0 Giorgos Verigakis
        
920 13b954b0 Giorgos Verigakis
        servers = VirtualMachine.objects.all()
921 64938cb0 Giorgos Verigakis
        network = Network.objects.all()[1]
922 aa197ee4 Vangelis Koukis
923 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network.id)
924 64938cb0 Giorgos Verigakis
        self.assertEqual(net['name'], name)
925 13b954b0 Giorgos Verigakis
        self.assertEqual(net['servers']['values'], [])
926 aa197ee4 Vangelis Koukis
927 13b954b0 Giorgos Verigakis
        server_id = choice(servers).id
928 b19653d1 Giorgos Verigakis
        self.add_to_network(network.id, server_id)
929 b19653d1 Giorgos Verigakis
        net = self.get_network_details(network.id)
930 b19653d1 Giorgos Verigakis
        self.assertEqual(net['name'], network.name)
931 13b954b0 Giorgos Verigakis
932 13b954b0 Giorgos Verigakis
933 13b954b0 Giorgos Verigakis
class UpdateNetworkName(BaseTestCase):
934 13b954b0 Giorgos Verigakis
    def test_update_network_name(self):
935 207b70d5 Giorgos Verigakis
        name = 'net'
936 207b70d5 Giorgos Verigakis
        self.create_network(name)
937 13b954b0 Giorgos Verigakis
        networks = self.list_networks(detail=True)
938 207b70d5 Giorgos Verigakis
        priv = [net for net in networks if net['id'] != 'public']
939 207b70d5 Giorgos Verigakis
        network = choice(priv)
940 b19653d1 Giorgos Verigakis
        network_id = network['id']
941 b19653d1 Giorgos Verigakis
        new_name = network['name'] + '_2'
942 b19653d1 Giorgos Verigakis
        self.update_network_name(network_id, new_name)
943 aa197ee4 Vangelis Koukis
944 13b954b0 Giorgos Verigakis
        network['name'] = new_name
945 197398e2 Giorgos Verigakis
        del network['updated']
946 197398e2 Giorgos Verigakis
        net = self.get_network_details(network_id)
947 197398e2 Giorgos Verigakis
        del net['updated']
948 197398e2 Giorgos Verigakis
        self.assertEqual(net, network)
949 13b954b0 Giorgos Verigakis
950 13b954b0 Giorgos Verigakis
951 13b954b0 Giorgos Verigakis
class DeleteNetwork(BaseTestCase):
952 13b954b0 Giorgos Verigakis
    def test_delete_network(self):
953 64938cb0 Giorgos Verigakis
        for i in range(5):
954 64938cb0 Giorgos Verigakis
            self.create_network('net%d' % i)
955 64938cb0 Giorgos Verigakis
        
956 13b954b0 Giorgos Verigakis
        networks = self.list_networks()
957 207b70d5 Giorgos Verigakis
        priv = [net for net in networks if net['id'] != 'public']
958 207b70d5 Giorgos Verigakis
        network = choice(priv)
959 b19653d1 Giorgos Verigakis
        network_id = network['id']
960 b19653d1 Giorgos Verigakis
        self.delete_network(network_id)
961 d44c236b Giorgos Verigakis
        
962 d44c236b Giorgos Verigakis
        net = self.get_network_details(network_id)
963 d44c236b Giorgos Verigakis
        self.assertEqual(net['status'], 'DELETED')
964 aa197ee4 Vangelis Koukis
965 207b70d5 Giorgos Verigakis
        priv.remove(network)
966 207b70d5 Giorgos Verigakis
        networks = self.list_networks()
967 207b70d5 Giorgos Verigakis
        new_priv = [net for net in networks if net['id'] != 'public']
968 207b70d5 Giorgos Verigakis
        self.assertEqual(priv, new_priv)
969 13b954b0 Giorgos Verigakis
970 13b954b0 Giorgos Verigakis
971 13b954b0 Giorgos Verigakis
class NetworkActions(BaseTestCase):
972 13b954b0 Giorgos Verigakis
    SERVERS = 20
973 aa197ee4 Vangelis Koukis
974 13b954b0 Giorgos Verigakis
    def test_add_remove_server(self):
975 64938cb0 Giorgos Verigakis
        self.create_network('net')
976 64938cb0 Giorgos Verigakis
        
977 13b954b0 Giorgos Verigakis
        server_ids = [vm.id for vm in VirtualMachine.objects.all()]
978 64938cb0 Giorgos Verigakis
        network = self.list_networks(detail=True)[1]
979 b19653d1 Giorgos Verigakis
        network_id = network['id']
980 aa197ee4 Vangelis Koukis
981 13b954b0 Giorgos Verigakis
        to_add = set(sample(server_ids, 10))
982 13b954b0 Giorgos Verigakis
        for server_id in to_add:
983 b19653d1 Giorgos Verigakis
            self.add_to_network(network_id, server_id)
984 64938cb0 Giorgos Verigakis
        
985 13b954b0 Giorgos Verigakis
        to_remove = set(sample(to_add, 5))
986 13b954b0 Giorgos Verigakis
        for server_id in to_remove:
987 b19653d1 Giorgos Verigakis
            self.remove_from_network(network_id, server_id)