Statistics
| Branch: | Tag: | Revision:

root / api / tests.py @ 4cf8adf8

History | View | Annotate | Download (30.3 kB)

1 894f6b7e Dimitris Moraitis
#
2 883de713 Giorgos Verigakis
# Copyright (c) 2010 Greek Research and Technology Network
3 894f6b7e Dimitris Moraitis
#
4 894f6b7e Dimitris Moraitis
5 53b1eea6 Giorgos Verigakis
from __future__ import with_statement
6 53b1eea6 Giorgos Verigakis
7 53b1eea6 Giorgos Verigakis
from collections import defaultdict
8 8b01f7f3 Giorgos Verigakis
from email.utils import parsedate
9 ba6ded2a Giorgos Verigakis
from random import choice, randint, sample
10 8b01f7f3 Giorgos Verigakis
from time import mktime
11 8b01f7f3 Giorgos Verigakis
12 34244492 Markos Gogoulos
import datetime
13 883de713 Giorgos Verigakis
14 a237869d Faidon Liambotis
from django.utils import simplejson as json
15 894f6b7e Dimitris Moraitis
from django.test import TestCase
16 894f6b7e Dimitris Moraitis
from django.test.client import Client
17 883de713 Giorgos Verigakis
18 883de713 Giorgos Verigakis
#from synnefo.api.tests_auth import AuthTestCase
19 968b3e04 Giorgos Verigakis
from synnefo.db.models import *
20 5fb55fba Georgios Gousios
from synnefo.logic import utils
21 894f6b7e Dimitris Moraitis
22 883de713 Giorgos Verigakis
23 894f6b7e Dimitris Moraitis
class APITestCase(TestCase):
24 883de713 Giorgos Verigakis
    fixtures = ['api_test_data']
25 d2e5f1d1 Markos Gogoulos
    test_server_id = 1001
26 d2e5f1d1 Markos Gogoulos
    test_image_id = 1
27 d2e5f1d1 Markos Gogoulos
    test_flavor_id = 1
28 a8acbbac Markos Gogoulos
    test_group_id = 1
29 d2e5f1d1 Markos Gogoulos
    test_wrong_server_id = 99999999
30 d2e5f1d1 Markos Gogoulos
    test_wrong_image_id = 99999999
31 d2e5f1d1 Markos Gogoulos
    test_wrong_flavor_id = 99999999
32 a8acbbac Markos Gogoulos
    test_wrong_group_id = 99999999
33 d2e5f1d1 Markos Gogoulos
    #make the testing with these id's
34 d2e5f1d1 Markos Gogoulos
35 894f6b7e Dimitris Moraitis
    def setUp(self):
36 7de0c985 Dimitris Moraitis
        self.client = Client()
37 894f6b7e Dimitris Moraitis
38 e646ebe5 Dimitris Moraitis
    def test_api_version(self):
39 883de713 Giorgos Verigakis
        """Check API version."""
40 883de713 Giorgos Verigakis
        
41 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/')
42 894f6b7e Dimitris Moraitis
        self.assertEqual(response.status_code, 200)
43 54c30633 Markos Gogoulos
        api_version = json.loads(response.content)['version']
44 883de713 Giorgos Verigakis
        self.assertEqual(api_version['id'], 'v1.1')
45 54c30633 Markos Gogoulos
        self.assertEqual(api_version['status'], 'CURRENT')
46 54c30633 Markos Gogoulos
47 e646ebe5 Dimitris Moraitis
    def test_server_list(self):
48 883de713 Giorgos Verigakis
        """Test if the expected list of servers is returned."""
49 883de713 Giorgos Verigakis
        
50 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers')
51 883de713 Giorgos Verigakis
        vms_from_api = json.loads(response.content)['servers']['values']
52 668c1361 Markos Gogoulos
        vms_from_db = VirtualMachine.objects.filter(deleted=False)
53 6781c0d0 Dimitris Moraitis
        self.assertEqual(len(vms_from_api), len(vms_from_db))
54 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
55 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
56 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
57 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
58 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
59 54c30633 Markos Gogoulos
60 e646ebe5 Dimitris Moraitis
    def test_server_details(self):
61 883de713 Giorgos Verigakis
        """Test if the expected server is returned."""
62 883de713 Giorgos Verigakis
        
63 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/%d' % self.test_server_id)
64 668c1361 Markos Gogoulos
        vm_from_api = json.loads(response.content)['server']
65 d2e5f1d1 Markos Gogoulos
        vm_from_db = VirtualMachine.objects.get(id=self.test_server_id)
66 b335768e Markos Gogoulos
        self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
67 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
68 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['id'], vm_from_db.id)
69 b335768e Markos Gogoulos
        self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
70 668c1361 Markos Gogoulos
        self.assertEqual(vm_from_api['name'], vm_from_db.name)
71 dbccf323 Vassilios Karakoidas
        self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
72 883de713 Giorgos Verigakis
        self.assertTrue(response.status_code in [200, 203])
73 668c1361 Markos Gogoulos
74 e646ebe5 Dimitris Moraitis
    def test_servers_details(self):
75 883de713 Giorgos Verigakis
        """Test if the servers details are returned."""
76 883de713 Giorgos Verigakis
        
77 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail')
78 ba15eb15 Vangelis Koukis
79 ba15eb15 Vangelis Koukis
        # Make sure both DB and API responses are sorted by id,
80 ba15eb15 Vangelis Koukis
        # to allow for 1-1 comparisons
81 ba15eb15 Vangelis Koukis
        vms_from_db = VirtualMachine.objects.filter(deleted=False).order_by('id')
82 ba15eb15 Vangelis Koukis
        vms_from_api = json.loads(response.content)['servers']['values']
83 ba15eb15 Vangelis Koukis
        vms_from_api = sorted(vms_from_api, key=lambda vm: vm['id'])
84 ba15eb15 Vangelis Koukis
        self.assertEqual(len(vms_from_db), len(vms_from_api))
85 ba15eb15 Vangelis Koukis
86 54c30633 Markos Gogoulos
        id_list = [vm.id for vm in vms_from_db]
87 685ab2b6 Markos Gogoulos
        number = 0
88 685ab2b6 Markos Gogoulos
        for vm_id in id_list:
89 ba15eb15 Vangelis Koukis
            vm_from_api = vms_from_api[number]
90 685ab2b6 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_id)
91 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
92 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
93 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['id'], vm_from_db.id)
94 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['imageRef'], vm_from_db.flavor.id)
95 685ab2b6 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
96 dbccf323 Vassilios Karakoidas
            self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
97 685ab2b6 Markos Gogoulos
            number += 1
98 54c30633 Markos Gogoulos
        for vm_from_api in vms_from_api:
99 54c30633 Markos Gogoulos
            vm_from_db = VirtualMachine.objects.get(id=vm_from_api['id'])
100 b335768e Markos Gogoulos
            self.assertEqual(vm_from_api['flavorRef'], vm_from_db.flavor.id)
101 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['hostId'], vm_from_db.hostid)
102 54c30633 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 54c30633 Markos Gogoulos
            self.assertEqual(vm_from_api['name'], vm_from_db.name)
105 dbccf323 Vassilios Karakoidas
            self.assertEqual(vm_from_api['status'], utils.get_rsapi_state(vm_from_db))
106 685ab2b6 Markos Gogoulos
        self.assertTrue(response.status_code in [200,203])
107 685ab2b6 Markos Gogoulos
108 e646ebe5 Dimitris Moraitis
    def test_wrong_server(self):
109 883de713 Giorgos Verigakis
        """Test 404 response if server does not exist."""
110 883de713 Giorgos Verigakis
        
111 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/%d' % self.test_wrong_server_id)
112 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
113 685ab2b6 Markos Gogoulos
114 e646ebe5 Dimitris Moraitis
    def test_create_server_empty(self):
115 883de713 Giorgos Verigakis
        """Test if the create server call returns a 400 badRequest if
116 883de713 Giorgos Verigakis
           no attributes are specified."""
117 883de713 Giorgos Verigakis
        
118 883de713 Giorgos Verigakis
        response = self.client.post('/api/v1.1/servers', {})
119 7de0c985 Dimitris Moraitis
        self.assertEqual(response.status_code, 400)
120 54c30633 Markos Gogoulos
121 e646ebe5 Dimitris Moraitis
    def test_create_server(self):
122 883de713 Giorgos Verigakis
        """Test if the create server call returns the expected response
123 883de713 Giorgos Verigakis
           if a valid request has been speficied."""
124 883de713 Giorgos Verigakis
        
125 7de0c985 Dimitris Moraitis
        request = {
126 285a1fa8 Dimitris Moraitis
                    "server": {
127 e646ebe5 Dimitris Moraitis
                        "name": "new-server-test",
128 e646ebe5 Dimitris Moraitis
                        "imageRef": 1,
129 e646ebe5 Dimitris Moraitis
                        "flavorRef": 1,
130 e646ebe5 Dimitris Moraitis
                        "metadata": {
131 285a1fa8 Dimitris Moraitis
                            "My Server Name": "Apache1"
132 285a1fa8 Dimitris Moraitis
                        },
133 e646ebe5 Dimitris Moraitis
                        "personality": []
134 285a1fa8 Dimitris Moraitis
                    }
135 7de0c985 Dimitris Moraitis
        }
136 883de713 Giorgos Verigakis
        response = self.client.post('/api/v1.1/servers', json.dumps(request),
137 685ab2b6 Markos Gogoulos
                                    content_type='application/json')
138 285a1fa8 Dimitris Moraitis
        self.assertEqual(response.status_code, 202)
139 e646ebe5 Dimitris Moraitis
        #TODO: check response.content
140 e646ebe5 Dimitris Moraitis
        #TODO: check create server with wrong options (eg non existing flavor)
141 668c1361 Markos Gogoulos
142 e646ebe5 Dimitris Moraitis
    def test_server_polling(self):
143 883de713 Giorgos Verigakis
        """Test if the server polling works as expected."""
144 883de713 Giorgos Verigakis
        
145 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail')
146 883de713 Giorgos Verigakis
        vms_from_api_initial = json.loads(response.content)['servers']['values']
147 8b01f7f3 Giorgos Verigakis
        ts = mktime(parsedate(response['Date']))
148 8b01f7f3 Giorgos Verigakis
        since = datetime.datetime.fromtimestamp(ts).isoformat() + 'Z'
149 8b01f7f3 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail?changes-since=%s' % since)
150 34244492 Markos Gogoulos
        self.assertEqual(len(response.content), 0)
151 34244492 Markos Gogoulos
152 34244492 Markos Gogoulos
        #now create a machine. Then check if it is on the list
153 34244492 Markos Gogoulos
        request = {
154 34244492 Markos Gogoulos
                    "server": {
155 e646ebe5 Dimitris Moraitis
                        "name": "new-server-test",
156 e646ebe5 Dimitris Moraitis
                        "imageRef": 1,
157 e646ebe5 Dimitris Moraitis
                        "flavorRef": 1,
158 e646ebe5 Dimitris Moraitis
                        "metadata": {
159 34244492 Markos Gogoulos
                            "My Server Name": "Apache1"
160 34244492 Markos Gogoulos
                        },
161 e646ebe5 Dimitris Moraitis
                        "personality": []
162 34244492 Markos Gogoulos
                    }
163 34244492 Markos Gogoulos
        }
164 883de713 Giorgos Verigakis
        
165 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers'
166 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
167 34244492 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
168 34244492 Markos Gogoulos
169 8b01f7f3 Giorgos Verigakis
        response = self.client.get('/api/v1.1/servers/detail?changes-since=%s' % since)
170 7f63ff66 Giorgos Verigakis
        self.assertEqual(response.status_code, 200)
171 009d3bf2 Giorgos Verigakis
        vms_from_api_after = json.loads(response.content)['servers']['values']
172 e646ebe5 Dimitris Moraitis
        #make sure the newly created server is included on the updated list
173 34244492 Markos Gogoulos
        self.assertEqual(len(vms_from_api_after), 1)
174 34244492 Markos Gogoulos
175 e646ebe5 Dimitris Moraitis
    def test_reboot_server(self):
176 883de713 Giorgos Verigakis
        """Test if the specified server is rebooted."""
177 883de713 Giorgos Verigakis
        
178 883de713 Giorgos Verigakis
        request = {'reboot': {'type': 'HARD'}}
179 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
180 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
181 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
182 685ab2b6 Markos Gogoulos
        #server id that does not exist
183 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
184 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
185 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
186 668c1361 Markos Gogoulos
187 e646ebe5 Dimitris Moraitis
    def test_shutdown_server(self):
188 883de713 Giorgos Verigakis
        """Test if the specified server is shutdown."""
189 883de713 Giorgos Verigakis
        
190 883de713 Giorgos Verigakis
        request = {'shutdown': {}}
191 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
192 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
193 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
194 685ab2b6 Markos Gogoulos
        #server id that does not exist
195 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
196 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
197 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
198 668c1361 Markos Gogoulos
199 e646ebe5 Dimitris Moraitis
    def test_start_server(self):
200 883de713 Giorgos Verigakis
        """Test if the specified server is started."""
201 883de713 Giorgos Verigakis
        
202 883de713 Giorgos Verigakis
        request = {'start': {}}
203 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_server_id
204 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
205 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 202)
206 685ab2b6 Markos Gogoulos
        #server id that does not exist
207 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/action' % self.test_wrong_server_id
208 883de713 Giorgos Verigakis
        response = self.client.post(path, json.dumps(request), content_type='application/json')
209 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
210 668c1361 Markos Gogoulos
211 e646ebe5 Dimitris Moraitis
    def test_delete_server(self):
212 883de713 Giorgos Verigakis
        """Test if the specified server is deleted."""
213 883de713 Giorgos Verigakis
        response = self.client.delete('/api/v1.1/servers/%d' % self.test_server_id)
214 883de713 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
215 e646ebe5 Dimitris Moraitis
        #server id that does not exist
216 883de713 Giorgos Verigakis
        response = self.client.delete('/api/v1.1/servers/%d' % self.test_wrong_server_id)
217 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
218 668c1361 Markos Gogoulos
219 e646ebe5 Dimitris Moraitis
    def test_flavor_list(self):
220 883de713 Giorgos Verigakis
        """Test if the expected list of flavors is returned by."""
221 883de713 Giorgos Verigakis
        
222 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors')
223 883de713 Giorgos Verigakis
        flavors_from_api = json.loads(response.content)['flavors']['values']
224 668c1361 Markos Gogoulos
        flavors_from_db = Flavor.objects.all()
225 668c1361 Markos Gogoulos
        self.assertEqual(len(flavors_from_api), len(flavors_from_db))
226 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
227 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
228 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
229 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
230 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
231 668c1361 Markos Gogoulos
232 e646ebe5 Dimitris Moraitis
    def test_flavors_details(self):
233 883de713 Giorgos Verigakis
        """Test if the flavors details are returned."""
234 883de713 Giorgos Verigakis
        
235 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/detail')
236 f3af8b40 Dimitris Moraitis
        flavors_from_db = Flavor.objects.all()
237 883de713 Giorgos Verigakis
        flavors_from_api = json.loads(response.content)['flavors']['values']
238 e646ebe5 Dimitris Moraitis
239 f3af8b40 Dimitris Moraitis
        # Assert that all flavors in the db appear inthe API call result
240 f3af8b40 Dimitris Moraitis
        for i in range(0, len(flavors_from_db)):
241 f3af8b40 Dimitris Moraitis
            flavor_from_api = flavors_from_api[i]
242 f3af8b40 Dimitris Moraitis
            flavor_from_db = Flavor.objects.get(id=flavors_from_db[i].id)
243 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
244 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
245 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
246 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
247 685ab2b6 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
248 f3af8b40 Dimitris Moraitis
249 e646ebe5 Dimitris Moraitis
        # Assert that all flavors returned by the API also exist in the db
250 54c30633 Markos Gogoulos
        for flavor_from_api in flavors_from_api:
251 54c30633 Markos Gogoulos
            flavor_from_db = Flavor.objects.get(id=flavor_from_api['id'])
252 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
253 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
254 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
255 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
256 54c30633 Markos Gogoulos
            self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
257 7de0c985 Dimitris Moraitis
258 e646ebe5 Dimitris Moraitis
        # Check if we have the right status_code
259 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
260 7de0c985 Dimitris Moraitis
261 e646ebe5 Dimitris Moraitis
    def test_flavor_details(self):
262 883de713 Giorgos Verigakis
        """Test if the expected flavor is returned."""
263 883de713 Giorgos Verigakis
        
264 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/%d' % self.test_flavor_id)
265 668c1361 Markos Gogoulos
        flavor_from_api = json.loads(response.content)['flavor']
266 d2e5f1d1 Markos Gogoulos
        flavor_from_db = Flavor.objects.get(id=self.test_flavor_id)
267 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['cpu'], flavor_from_db.cpu)
268 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['id'], flavor_from_db.id)
269 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['disk'], flavor_from_db.disk)
270 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['name'], flavor_from_db.name)
271 668c1361 Markos Gogoulos
        self.assertEqual(flavor_from_api['ram'], flavor_from_db.ram)
272 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
273 668c1361 Markos Gogoulos
274 e646ebe5 Dimitris Moraitis
    def test_wrong_flavor(self):
275 883de713 Giorgos Verigakis
        """Test 404 result when requesting a flavor that does not exist."""
276 883de713 Giorgos Verigakis
        
277 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/flavors/%d' % self.test_wrong_flavor_id)
278 ffffd5fe Markos Gogoulos
        self.assertTrue(response.status_code in [404, 503])
279 668c1361 Markos Gogoulos
280 e646ebe5 Dimitris Moraitis
    def test_image_list(self):
281 883de713 Giorgos Verigakis
        """Test if the expected list of images is returned by the API."""
282 883de713 Giorgos Verigakis
        
283 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images')
284 883de713 Giorgos Verigakis
        images_from_api = json.loads(response.content)['images']['values']
285 668c1361 Markos Gogoulos
        images_from_db = Image.objects.all()
286 668c1361 Markos Gogoulos
        self.assertEqual(len(images_from_api), len(images_from_db))
287 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
288 54c30633 Markos Gogoulos
        for image_from_api in images_from_api:
289 54c30633 Markos Gogoulos
            image_from_db = Image.objects.get(id=image_from_api['id'])
290 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
291 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
292 668c1361 Markos Gogoulos
293 e646ebe5 Dimitris Moraitis
    def test_image_details(self):
294 883de713 Giorgos Verigakis
        """Test if the expected image is returned."""
295 883de713 Giorgos Verigakis
        
296 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images/%d' % self.test_image_id)
297 668c1361 Markos Gogoulos
        image_from_api = json.loads(response.content)['image']
298 d2e5f1d1 Markos Gogoulos
        image_from_db = Image.objects.get(id=self.test_image_id)
299 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['name'], image_from_db.name)
300 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['id'], image_from_db.id)
301 883de713 Giorgos Verigakis
        self.assertEqual(image_from_api.get('serverRef', ''),
302 883de713 Giorgos Verigakis
                        image_from_db.sourcevm and image_from_db.sourcevm.id or '')
303 668c1361 Markos Gogoulos
        self.assertEqual(image_from_api['status'], image_from_db.state)
304 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
305 668c1361 Markos Gogoulos
306 e646ebe5 Dimitris Moraitis
    def test_images_details(self):
307 883de713 Giorgos Verigakis
        """Test if the images details are returned."""
308 883de713 Giorgos Verigakis
        
309 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images/detail')
310 883de713 Giorgos Verigakis
        images_from_api = json.loads(response.content)['images']['values']
311 f3af8b40 Dimitris Moraitis
        images_from_db = Image.objects.all()
312 f3af8b40 Dimitris Moraitis
        for i in range(0, len(images_from_db)):
313 f3af8b40 Dimitris Moraitis
            image_from_db = Image.objects.get(id=images_from_db[i].id)
314 f3af8b40 Dimitris Moraitis
            image_from_api = images_from_api[i]
315 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['name'], image_from_db.name)
316 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
317 883de713 Giorgos Verigakis
            self.assertEqual(image_from_api.get('serverRef', ''),
318 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm and
319 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm.id or "")
320 685ab2b6 Markos Gogoulos
            self.assertEqual(image_from_api['status'], image_from_db.state)
321 f3af8b40 Dimitris Moraitis
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['name'], image_from_db.name)
325 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['id'], image_from_db.id)
326 883de713 Giorgos Verigakis
            self.assertEqual(image_from_api.get('serverRef', ''),
327 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm and
328 e646ebe5 Dimitris Moraitis
                             image_from_db.sourcevm.id or "")
329 54c30633 Markos Gogoulos
            self.assertEqual(image_from_api['status'], image_from_db.state)
330 685ab2b6 Markos Gogoulos
331 e646ebe5 Dimitris Moraitis
        self.assertTrue(response.status_code in [200, 203])
332 668c1361 Markos Gogoulos
333 e646ebe5 Dimitris Moraitis
    def test_wrong_image(self):
334 883de713 Giorgos Verigakis
        """Test 404 result if a non existent image is requested."""
335 883de713 Giorgos Verigakis
        
336 883de713 Giorgos Verigakis
        response = self.client.get('/api/v1.1/images/%d' % self.test_wrong_image_id)
337 685ab2b6 Markos Gogoulos
        self.assertEqual(response.status_code, 404)
338 73469364 Markos Gogoulos
339 e646ebe5 Dimitris Moraitis
    def test_server_metadata(self):
340 883de713 Giorgos Verigakis
        """Test server's metadata (add, edit)."""
341 883de713 Giorgos Verigakis
        
342 883de713 Giorgos Verigakis
        key = 'name'
343 883de713 Giorgos Verigakis
        request = {'meta': {key: 'a fancy name'}}
344 883de713 Giorgos Verigakis
        
345 883de713 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (self.test_server_id, key)
346 883de713 Giorgos Verigakis
        response = self.client.put(path, json.dumps(request), content_type='application/json')
347 883de713 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
348 a8acbbac Markos Gogoulos
349 a8acbbac Markos Gogoulos
350 968b3e04 Giorgos Verigakis
def create_users(n=1):
351 968b3e04 Giorgos Verigakis
    for i in range(n):
352 968b3e04 Giorgos Verigakis
        SynnefoUser.objects.create(
353 968b3e04 Giorgos Verigakis
            name='User %d' % i,
354 968b3e04 Giorgos Verigakis
            credit=0)
355 968b3e04 Giorgos Verigakis
356 968b3e04 Giorgos Verigakis
def create_flavors(n=1):
357 968b3e04 Giorgos Verigakis
    for i in range(n):
358 968b3e04 Giorgos Verigakis
        Flavor.objects.create(
359 968b3e04 Giorgos Verigakis
            cpu=randint(1, 4),
360 80da6543 Giorgos Verigakis
            ram=randint(1, 8) * 512,
361 80da6543 Giorgos Verigakis
            disk=randint(1, 40))
362 968b3e04 Giorgos Verigakis
363 968b3e04 Giorgos Verigakis
def create_images(n=1):
364 968b3e04 Giorgos Verigakis
    users = SynnefoUser.objects.all()
365 968b3e04 Giorgos Verigakis
    for i in range(n):
366 968b3e04 Giorgos Verigakis
        Image.objects.create(
367 968b3e04 Giorgos Verigakis
            name='Image %d' % (i + 1),
368 968b3e04 Giorgos Verigakis
            state='ACTIVE',
369 968b3e04 Giorgos Verigakis
            owner=choice(users))
370 968b3e04 Giorgos Verigakis
371 53b1eea6 Giorgos Verigakis
def create_image_metadata(n=1):
372 53b1eea6 Giorgos Verigakis
    images = Image.objects.all()
373 53b1eea6 Giorgos Verigakis
    for i in range(n):
374 53b1eea6 Giorgos Verigakis
        ImageMetadata.objects.create(
375 53b1eea6 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
376 53b1eea6 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
377 53b1eea6 Giorgos Verigakis
            image = choice(images))
378 53b1eea6 Giorgos Verigakis
379 968b3e04 Giorgos Verigakis
def create_servers(n=1):
380 968b3e04 Giorgos Verigakis
    users = SynnefoUser.objects.all()
381 968b3e04 Giorgos Verigakis
    flavors = Flavor.objects.all()
382 968b3e04 Giorgos Verigakis
    images = Image.objects.all()
383 968b3e04 Giorgos Verigakis
    for i in range(n):
384 968b3e04 Giorgos Verigakis
        VirtualMachine.objects.create(
385 968b3e04 Giorgos Verigakis
            name='Server %d' % (i + 1),
386 968b3e04 Giorgos Verigakis
            owner=choice(users),
387 968b3e04 Giorgos Verigakis
            sourceimage=choice(images),
388 968b3e04 Giorgos Verigakis
            hostid=str(i),
389 968b3e04 Giorgos Verigakis
            ipfour='0.0.0.0',
390 968b3e04 Giorgos Verigakis
            ipsix='::1',
391 968b3e04 Giorgos Verigakis
            flavor=choice(flavors))
392 968b3e04 Giorgos Verigakis
393 968b3e04 Giorgos Verigakis
def create_server_metadata(n=1):
394 968b3e04 Giorgos Verigakis
    servers = VirtualMachine.objects.all()
395 968b3e04 Giorgos Verigakis
    for i in range(n):
396 968b3e04 Giorgos Verigakis
        VirtualMachineMetadata.objects.create(
397 968b3e04 Giorgos Verigakis
            meta_key='Key%d' % (i + 1),
398 968b3e04 Giorgos Verigakis
            meta_value='Value %d' % (i + 1),
399 968b3e04 Giorgos Verigakis
            vm = choice(servers))
400 968b3e04 Giorgos Verigakis
401 968b3e04 Giorgos Verigakis
402 53b1eea6 Giorgos Verigakis
class AssertInvariant(object):
403 53b1eea6 Giorgos Verigakis
    def __init__(self, callable, *args, **kwargs):
404 53b1eea6 Giorgos Verigakis
        self.callable = callable
405 53b1eea6 Giorgos Verigakis
        self.args = args
406 53b1eea6 Giorgos Verigakis
        self.kwargs = kwargs
407 53b1eea6 Giorgos Verigakis
    
408 53b1eea6 Giorgos Verigakis
    def __enter__(self):
409 53b1eea6 Giorgos Verigakis
        self.value = self.callable(*self.args, **self.kwargs)
410 53b1eea6 Giorgos Verigakis
        return self.value
411 53b1eea6 Giorgos Verigakis
    
412 53b1eea6 Giorgos Verigakis
    def __exit__(self, type, value, tb):
413 53b1eea6 Giorgos Verigakis
        assert self.value == self.callable(*self.args, **self.kwargs)
414 53b1eea6 Giorgos Verigakis
415 53b1eea6 Giorgos Verigakis
416 968b3e04 Giorgos Verigakis
class BaseTestCase(TestCase):
417 968b3e04 Giorgos Verigakis
    USERS = 1
418 968b3e04 Giorgos Verigakis
    FLAVORS = 1
419 968b3e04 Giorgos Verigakis
    IMAGES = 1
420 968b3e04 Giorgos Verigakis
    SERVERS = 1
421 968b3e04 Giorgos Verigakis
    SERVER_METADATA = 0
422 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 0
423 883de713 Giorgos Verigakis
    
424 883de713 Giorgos Verigakis
    def setUp(self):
425 883de713 Giorgos Verigakis
        self.client = Client()
426 968b3e04 Giorgos Verigakis
        create_users(self.USERS)
427 968b3e04 Giorgos Verigakis
        create_flavors(self.FLAVORS)
428 968b3e04 Giorgos Verigakis
        create_images(self.IMAGES)
429 53b1eea6 Giorgos Verigakis
        create_image_metadata(self.IMAGE_METADATA)
430 968b3e04 Giorgos Verigakis
        create_servers(self.SERVERS)
431 968b3e04 Giorgos Verigakis
        create_server_metadata(self.SERVER_METADATA)
432 968b3e04 Giorgos Verigakis
    
433 968b3e04 Giorgos Verigakis
    def assertFault(self, response, status_code, name):
434 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, status_code)
435 968b3e04 Giorgos Verigakis
        fault = json.loads(response.content)
436 968b3e04 Giorgos Verigakis
        self.assertEqual(fault.keys(), [name])
437 968b3e04 Giorgos Verigakis
    
438 968b3e04 Giorgos Verigakis
    def assertBadRequest(self, response):
439 968b3e04 Giorgos Verigakis
        self.assertFault(response, 400, 'badRequest')
440 968b3e04 Giorgos Verigakis
441 968b3e04 Giorgos Verigakis
    def assertItemNotFound(self, response):
442 968b3e04 Giorgos Verigakis
        self.assertFault(response, 404, 'itemNotFound')
443 ba6ded2a Giorgos Verigakis
    
444 ba6ded2a Giorgos Verigakis
    
445 53b1eea6 Giorgos Verigakis
    def list_metadata(self, path):
446 53b1eea6 Giorgos Verigakis
        response = self.client.get(path)
447 968b3e04 Giorgos Verigakis
        self.assertTrue(response.status_code in (200, 203))
448 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
449 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
450 968b3e04 Giorgos Verigakis
        self.assertEqual(reply['metadata'].keys(), ['values'])
451 968b3e04 Giorgos Verigakis
        return reply['metadata']['values']
452 968b3e04 Giorgos Verigakis
    
453 53b1eea6 Giorgos Verigakis
    def list_server_metadata(self, server_id):
454 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
455 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
456 968b3e04 Giorgos Verigakis
    
457 53b1eea6 Giorgos Verigakis
    def list_image_metadata(self, image_id):
458 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
459 53b1eea6 Giorgos Verigakis
        return self.list_metadata(path)
460 ba6ded2a Giorgos Verigakis
    
461 53b1eea6 Giorgos Verigakis
    def update_metadata(self, path, metadata):
462 ba6ded2a Giorgos Verigakis
        data = json.dumps({'metadata': metadata})
463 ba6ded2a Giorgos Verigakis
        response = self.client.post(path, data, content_type='application/json')
464 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
465 968b3e04 Giorgos Verigakis
        reply = json.loads(response.content)
466 968b3e04 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['metadata'])
467 968b3e04 Giorgos Verigakis
        return reply['metadata']
468 968b3e04 Giorgos Verigakis
    
469 53b1eea6 Giorgos Verigakis
    def update_server_metadata(self, server_id, metadata):
470 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta' % server_id
471 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
472 53b1eea6 Giorgos Verigakis
    
473 53b1eea6 Giorgos Verigakis
    def update_image_metadata(self, image_id, metadata):
474 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/images/%d/meta' % image_id
475 53b1eea6 Giorgos Verigakis
        return self.update_metadata(path, metadata)
476 53b1eea6 Giorgos Verigakis
    
477 53b1eea6 Giorgos Verigakis
    def create_server_meta(self, server_id, meta):
478 53b1eea6 Giorgos Verigakis
        key = meta.keys()[0]
479 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
480 53b1eea6 Giorgos Verigakis
        data = json.dumps({'meta': meta})
481 53b1eea6 Giorgos Verigakis
        response = self.client.put(path, data, content_type='application/json')
482 53b1eea6 Giorgos Verigakis
        self.assertEqual(response.status_code, 201)
483 53b1eea6 Giorgos Verigakis
        reply = json.loads(response.content)
484 53b1eea6 Giorgos Verigakis
        self.assertEqual(reply.keys(), ['meta'])
485 53b1eea6 Giorgos Verigakis
        response_meta = reply['meta']
486 53b1eea6 Giorgos Verigakis
        self.assertEqual(response_meta, meta)
487 53b1eea6 Giorgos Verigakis
    
488 53b1eea6 Giorgos Verigakis
    def get_all_server_metadata(self):
489 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
490 53b1eea6 Giorgos Verigakis
        for m in VirtualMachineMetadata.objects.all():
491 53b1eea6 Giorgos Verigakis
            metadata[m.vm.id][m.meta_key] = m.meta_value
492 53b1eea6 Giorgos Verigakis
        return metadata
493 53b1eea6 Giorgos Verigakis
    
494 53b1eea6 Giorgos Verigakis
    def get_all_image_metadata(self):
495 53b1eea6 Giorgos Verigakis
        metadata = defaultdict(dict)
496 53b1eea6 Giorgos Verigakis
        for m in ImageMetadata.objects.all():
497 53b1eea6 Giorgos Verigakis
            metadata[m.image.id][m.meta_key] = m.meta_value
498 53b1eea6 Giorgos Verigakis
        return metadata
499 53b1eea6 Giorgos Verigakis
500 53b1eea6 Giorgos Verigakis
501 53b1eea6 Giorgos Verigakis
class ListServerMetadata(BaseTestCase):
502 53b1eea6 Giorgos Verigakis
    SERVERS = 5
503 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
504 53b1eea6 Giorgos Verigakis
    
505 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
506 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
507 53b1eea6 Giorgos Verigakis
            for vm in VirtualMachine.objects.all():
508 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_server_metadata(vm.id)
509 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[vm.id])
510 53b1eea6 Giorgos Verigakis
    
511 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
512 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
513 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta')
514 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
515 53b1eea6 Giorgos Verigakis
516 53b1eea6 Giorgos Verigakis
517 53b1eea6 Giorgos Verigakis
class UpdateServerMetadata(BaseTestCase):
518 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 10
519 53b1eea6 Giorgos Verigakis
    
520 968b3e04 Giorgos Verigakis
    def test_update_metadata(self):
521 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
522 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
523 ba6ded2a Giorgos Verigakis
        new_metadata = {}
524 53b1eea6 Giorgos Verigakis
        for key in sample(metadata[server_id].keys(), 3):
525 ba6ded2a Giorgos Verigakis
            new_metadata[key] = 'New %s value' % key
526 53b1eea6 Giorgos Verigakis
        response_metadata = self.update_server_metadata(server_id, new_metadata)
527 ba6ded2a Giorgos Verigakis
        self.assertEqual(response_metadata, new_metadata)
528 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(new_metadata)
529 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
530 ba6ded2a Giorgos Verigakis
    
531 ba6ded2a Giorgos Verigakis
    def test_does_not_create(self):
532 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
533 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
534 53b1eea6 Giorgos Verigakis
            new_metadata = {'Foo': 'Bar'}
535 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_server_metadata(server_id, new_metadata)
536 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
537 ba6ded2a Giorgos Verigakis
    
538 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
539 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
540 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
541 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta' % server_id
542 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
543 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
544 ba6ded2a Giorgos Verigakis
    
545 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
546 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
547 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta'
548 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
549 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
550 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
551 968b3e04 Giorgos Verigakis
552 968b3e04 Giorgos Verigakis
553 968b3e04 Giorgos Verigakis
class GetServerMetadataItem(BaseTestCase):
554 53b1eea6 Giorgos Verigakis
    SERVERS = 5
555 53b1eea6 Giorgos Verigakis
    SERVER_METADATA = 100
556 ba6ded2a Giorgos Verigakis
    
557 968b3e04 Giorgos Verigakis
    def test_get_metadata_item(self):
558 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
559 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
560 53b1eea6 Giorgos Verigakis
            key = choice(metadata[server_id].keys())
561 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
562 53b1eea6 Giorgos Verigakis
            response = self.client.get(path)
563 53b1eea6 Giorgos Verigakis
            self.assertTrue(response.status_code in (200, 203))
564 53b1eea6 Giorgos Verigakis
            reply = json.loads(response.content)
565 53b1eea6 Giorgos Verigakis
            self.assertEqual(reply['meta'], {key: metadata[server_id][key]})
566 ba6ded2a Giorgos Verigakis
    
567 ba6ded2a Giorgos Verigakis
    def test_invalid_key(self):
568 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
569 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
570 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/%d/meta/foo' % server_id)
571 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
572 ba6ded2a Giorgos Verigakis
    
573 ba6ded2a Giorgos Verigakis
    def test_invalid_server(self):
574 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
575 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/servers/0/meta/foo')
576 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
577 968b3e04 Giorgos Verigakis
578 968b3e04 Giorgos Verigakis
579 968b3e04 Giorgos Verigakis
class CreateServerMetadataItem(BaseTestCase):
580 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
581 968b3e04 Giorgos Verigakis
    
582 968b3e04 Giorgos Verigakis
    def test_create_metadata(self):
583 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
584 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
585 ba6ded2a Giorgos Verigakis
        meta = {'Foo': 'Bar'}
586 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
587 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
588 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
589 ba6ded2a Giorgos Verigakis
    
590 ba6ded2a Giorgos Verigakis
    def test_update_metadata(self):
591 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
592 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
593 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
594 ba6ded2a Giorgos Verigakis
        meta = {key: 'New Value'}
595 53b1eea6 Giorgos Verigakis
        self.create_server_meta(server_id, meta)
596 53b1eea6 Giorgos Verigakis
        metadata[server_id].update(meta)
597 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
598 968b3e04 Giorgos Verigakis
    
599 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
600 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
601 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/0/meta/foo'
602 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
603 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
604 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
605 968b3e04 Giorgos Verigakis
    
606 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
607 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
608 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
609 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/baz' % server_id
610 53b1eea6 Giorgos Verigakis
            data = json.dumps({'meta': {'foo': 'bar'}})
611 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, data, content_type='application/json')
612 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
613 968b3e04 Giorgos Verigakis
    
614 968b3e04 Giorgos Verigakis
    def test_invalid_data(self):
615 7317d130 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
616 7317d130 Giorgos Verigakis
            server_id = choice(metadata.keys())
617 7317d130 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
618 53b1eea6 Giorgos Verigakis
            response = self.client.put(path, 'meta', content_type='application/json')
619 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
620 968b3e04 Giorgos Verigakis
621 968b3e04 Giorgos Verigakis
622 968b3e04 Giorgos Verigakis
class DeleteServerMetadataItem(BaseTestCase):
623 ba6ded2a Giorgos Verigakis
    SERVER_METADATA = 10
624 968b3e04 Giorgos Verigakis
    
625 968b3e04 Giorgos Verigakis
    def test_delete_metadata(self):
626 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_server_metadata()
627 53b1eea6 Giorgos Verigakis
        server_id = choice(metadata.keys())
628 53b1eea6 Giorgos Verigakis
        key = choice(metadata[server_id].keys())
629 53b1eea6 Giorgos Verigakis
        path = '/api/v1.1/servers/%d/meta/%s' % (server_id, key)
630 ba6ded2a Giorgos Verigakis
        response = self.client.delete(path)
631 968b3e04 Giorgos Verigakis
        self.assertEqual(response.status_code, 204)
632 53b1eea6 Giorgos Verigakis
        metadata[server_id].pop(key)
633 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_server_metadata())
634 968b3e04 Giorgos Verigakis
    
635 968b3e04 Giorgos Verigakis
    def test_invalid_server(self):
636 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata):
637 53b1eea6 Giorgos Verigakis
            response = self.client.delete('/api/v1.1/servers/9/meta/Key1')
638 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
639 968b3e04 Giorgos Verigakis
    
640 968b3e04 Giorgos Verigakis
    def test_invalid_key(self):
641 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_server_metadata) as metadata:
642 53b1eea6 Giorgos Verigakis
            server_id = choice(metadata.keys())
643 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/servers/%d/meta/foo' % server_id
644 53b1eea6 Giorgos Verigakis
            response = self.client.delete(path)
645 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
646 53b1eea6 Giorgos Verigakis
647 53b1eea6 Giorgos Verigakis
648 53b1eea6 Giorgos Verigakis
class ListImageMetadata(BaseTestCase):
649 53b1eea6 Giorgos Verigakis
    IMAGES = 5
650 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 100
651 53b1eea6 Giorgos Verigakis
652 53b1eea6 Giorgos Verigakis
    def test_list_metadata(self):
653 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
654 53b1eea6 Giorgos Verigakis
            for image in Image.objects.all():
655 53b1eea6 Giorgos Verigakis
                response_metadata = self.list_image_metadata(image.id)
656 53b1eea6 Giorgos Verigakis
                self.assertEqual(response_metadata, metadata[image.id])
657 53b1eea6 Giorgos Verigakis
658 53b1eea6 Giorgos Verigakis
    def test_invalid_image(self):
659 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
660 53b1eea6 Giorgos Verigakis
            response = self.client.get('/api/v1.1/images/0/meta')
661 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
662 53b1eea6 Giorgos Verigakis
663 53b1eea6 Giorgos Verigakis
class UpdateImageMetadata(BaseTestCase):
664 53b1eea6 Giorgos Verigakis
    IMAGE_METADATA = 10
665 53b1eea6 Giorgos Verigakis
666 53b1eea6 Giorgos Verigakis
    def test_update_metadata(self):
667 53b1eea6 Giorgos Verigakis
        metadata = self.get_all_image_metadata()
668 53b1eea6 Giorgos Verigakis
        image_id = choice(metadata.keys())
669 53b1eea6 Giorgos Verigakis
        new_metadata = {}
670 53b1eea6 Giorgos Verigakis
        for key in sample(metadata[image_id].keys(), 3):
671 53b1eea6 Giorgos Verigakis
            new_metadata[key] = 'New %s value' % key
672 53b1eea6 Giorgos Verigakis
        response_metadata = self.update_image_metadata(image_id, new_metadata)
673 53b1eea6 Giorgos Verigakis
        self.assertEqual(response_metadata, new_metadata)
674 53b1eea6 Giorgos Verigakis
        metadata[image_id].update(new_metadata)
675 53b1eea6 Giorgos Verigakis
        self.assertEqual(metadata, self.get_all_image_metadata())
676 53b1eea6 Giorgos Verigakis
677 53b1eea6 Giorgos Verigakis
    def test_does_not_create(self):
678 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
679 53b1eea6 Giorgos Verigakis
            image_id = choice(metadata.keys())
680 53b1eea6 Giorgos Verigakis
            new_metadata = {'Foo': 'Bar'}
681 53b1eea6 Giorgos Verigakis
            response_metadata = self.update_image_metadata(image_id, new_metadata)
682 53b1eea6 Giorgos Verigakis
            self.assertEqual(response_metadata, {})
683 53b1eea6 Giorgos Verigakis
684 53b1eea6 Giorgos Verigakis
    def test_invalid_data(self):
685 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata) as metadata:
686 53b1eea6 Giorgos Verigakis
            image_id = choice(metadata.keys())
687 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/%d/meta' % image_id
688 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, 'metadata', content_type='application/json')
689 53b1eea6 Giorgos Verigakis
            self.assertBadRequest(response)
690 53b1eea6 Giorgos Verigakis
691 53b1eea6 Giorgos Verigakis
    def test_invalid_server(self):
692 53b1eea6 Giorgos Verigakis
        with AssertInvariant(self.get_all_image_metadata):
693 53b1eea6 Giorgos Verigakis
            path = '/api/v1.1/images/0/meta'
694 53b1eea6 Giorgos Verigakis
            data = json.dumps({'metadata': {'Key1': 'A Value'}})
695 53b1eea6 Giorgos Verigakis
            response = self.client.post(path, data, content_type='application/json')
696 53b1eea6 Giorgos Verigakis
            self.assertItemNotFound(response)
697 4cf8adf8 Vangelis Koukis
698 4cf8adf8 Vangelis Koukis
699 4cf8adf8 Vangelis Koukis
class ServerVNCConsole(BaseTestCase):
700 4cf8adf8 Vangelis Koukis
    SERVERS = 1
701 4cf8adf8 Vangelis Koukis
702 4cf8adf8 Vangelis Koukis
    def test_not_active_server(self):
703 4cf8adf8 Vangelis Koukis
        """Test console req for server not in ACTIVE state returns badRequest"""
704 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
705 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
706 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
707 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
708 4cf8adf8 Vangelis Koukis
        self.assertBadRequest(response)
709 4cf8adf8 Vangelis Koukis
710 4cf8adf8 Vangelis Koukis
    def test_active_server(self):
711 4cf8adf8 Vangelis Koukis
        """Test console req for ACTIVE server"""
712 4cf8adf8 Vangelis Koukis
        server_id = choice(VirtualMachine.objects.all()).id
713 4cf8adf8 Vangelis Koukis
        # FIXME: Start the server properly, instead of tampering with the DB
714 4cf8adf8 Vangelis Koukis
        vm = choice(VirtualMachine.objects.all())
715 4cf8adf8 Vangelis Koukis
        vm.operstate = 'STARTED'
716 4cf8adf8 Vangelis Koukis
        vm.save()
717 4cf8adf8 Vangelis Koukis
        server_id = vm.id
718 4cf8adf8 Vangelis Koukis
        
719 4cf8adf8 Vangelis Koukis
        path = '/api/v1.1/servers/%d/action' % server_id
720 4cf8adf8 Vangelis Koukis
        data = json.dumps({'console': {'type': 'vnc'}})
721 4cf8adf8 Vangelis Koukis
        response = self.client.post(path, data, content_type='application/json')
722 4cf8adf8 Vangelis Koukis
        self.assertEqual(response.status_code, 200)
723 4cf8adf8 Vangelis Koukis
        reply = json.loads(response.content)
724 4cf8adf8 Vangelis Koukis
        self.assertEqual(reply.keys(), ['vnc'])
725 4cf8adf8 Vangelis Koukis
        self.assertEqual(set(reply['vnc'].keys()), set(['host', 'port', 'password']))