Revision cb66110b snf-cyclades-app/synnefo/api/test/servers.py
b/snf-cyclades-app/synnefo/api/test/servers.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
import json |
35 |
from copy import deepcopy |
|
35 | 36 |
|
36 | 37 |
from snf_django.utils.testing import (BaseAPITest, mocked_quotaholder, |
37 | 38 |
override_settings) |
... | ... | |
43 | 44 |
from synnefo.lib import join_urls |
44 | 45 |
from synnefo import settings |
45 | 46 |
|
46 |
from mock import patch |
|
47 |
from mock import patch, Mock, call
|
|
47 | 48 |
|
48 | 49 |
|
49 | 50 |
class ComputeAPITest(BaseAPITest): |
... | ... | |
234 | 235 |
self.assertMethodNotAllowed(response) |
235 | 236 |
|
236 | 237 |
|
237 |
@patch('synnefo.api.util.get_image') |
|
238 |
fixed_image = Mock() |
|
239 |
fixed_image.return_value = {'location': 'pithos://foo', |
|
240 |
'checksum': '1234', |
|
241 |
"id": 1, |
|
242 |
"name": "test_image", |
|
243 |
'disk_format': 'diskdump'} |
|
244 |
|
|
245 |
|
|
246 |
@patch('synnefo.api.util.get_image', fixed_image) |
|
238 | 247 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
239 | 248 |
class ServerCreateAPITest(ComputeAPITest): |
240 |
def test_create_server(self, mrapi, mimage): |
|
241 |
"""Test if the create server call returns the expected response |
|
242 |
if a valid request has been speficied.""" |
|
243 |
mimage.return_value = {'location': 'pithos://foo', |
|
244 |
'checksum': '1234', |
|
245 |
"id": 1, |
|
246 |
"name": "test_image", |
|
247 |
'disk_format': 'diskdump'} |
|
248 |
mrapi().CreateInstance.return_value = 12 |
|
249 |
flavor = mfactory.FlavorFactory() |
|
249 |
def setUp(self): |
|
250 |
self.flavor = mfactory.FlavorFactory() |
|
250 | 251 |
# Create public network and backend |
251 |
network = mfactory.NetworkFactory(public=True) |
|
252 |
backend = mfactory.BackendFactory() |
|
253 |
mfactory.BackendNetworkFactory(network=network, backend=backend) |
|
254 |
|
|
255 |
request = { |
|
252 |
self.network = mfactory.NetworkFactory(public=True) |
|
253 |
self.backend = mfactory.BackendFactory() |
|
254 |
mfactory.BackendNetworkFactory(network=self.network, |
|
255 |
backend=self.backend, |
|
256 |
operstate="ACTIVE") |
|
257 |
self.request = { |
|
256 | 258 |
"server": { |
257 | 259 |
"name": "new-server-test", |
258 | 260 |
"userid": "test_user", |
259 | 261 |
"imageRef": 1, |
260 |
"flavorRef": flavor.id, |
|
262 |
"flavorRef": self.flavor.id,
|
|
261 | 263 |
"metadata": { |
262 | 264 |
"My Server Name": "Apache1" |
263 | 265 |
}, |
264 | 266 |
"personality": [] |
265 | 267 |
} |
266 | 268 |
} |
267 |
with mocked_quotaholder(): |
|
268 |
response = self.mypost('servers', 'test_user', |
|
269 |
json.dumps(request), 'json') |
|
269 |
|
|
270 |
def test_create_server(self, mrapi): |
|
271 |
"""Test if the create server call returns the expected response |
|
272 |
if a valid request has been speficied.""" |
|
273 |
|
|
274 |
mrapi().CreateInstance.return_value = 12 |
|
275 |
with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=[]): |
|
276 |
with mocked_quotaholder(): |
|
277 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
278 |
json.dumps(self.request), 'json') |
|
270 | 279 |
self.assertEqual(response.status_code, 202) |
271 | 280 |
mrapi().CreateInstance.assert_called_once() |
272 | 281 |
|
... | ... | |
282 | 291 |
self.assertEqual(api_server['status'], db_vm.operstate) |
283 | 292 |
|
284 | 293 |
# Test drained flag in Network: |
285 |
network.drained = True |
|
286 |
network.save() |
|
294 |
self.network.drained = True
|
|
295 |
self.network.save()
|
|
287 | 296 |
with mocked_quotaholder(): |
288 | 297 |
response = self.mypost('servers', 'test_user', |
289 |
json.dumps(request), 'json') |
|
298 |
json.dumps(self.request), 'json')
|
|
290 | 299 |
self.assertEqual(response.status_code, 503, "serviceUnavailable") |
291 | 300 |
|
292 |
def test_create_server_no_flavor(self, mrapi, mimage): |
|
293 |
request = { |
|
294 |
"server": { |
|
295 |
"name": "new-server-test", |
|
296 |
"userid": "test_user", |
|
297 |
"imageRef": 1, |
|
298 |
"flavorRef": 42, |
|
299 |
"metadata": { |
|
300 |
"My Server Name": "Apache1" |
|
301 |
}, |
|
302 |
"personality": [] |
|
303 |
} |
|
304 |
} |
|
305 |
response = self.mypost('servers', 'test_user', |
|
306 |
json.dumps(request), 'json') |
|
301 |
def test_create_network_settings(self, mrapi): |
|
302 |
mrapi().CreateInstance.return_value = 12 |
|
303 |
bnet1 = mfactory.BackendNetworkFactory(operstate="ACTIVE", |
|
304 |
backend=self.backend) |
|
305 |
bnet2 = mfactory.BackendNetworkFactory(operstate="ACTIVE", |
|
306 |
backend=self.backend) |
|
307 |
bnet3 = mfactory.BackendNetworkFactory(network__userid="test_user", |
|
308 |
operstate="ACTIVE", |
|
309 |
backend=self.backend) |
|
310 |
bnet4 = mfactory.BackendNetworkFactory(network__userid="test_user", |
|
311 |
operstate="ACTIVE", |
|
312 |
backend=self.backend) |
|
313 |
# User requested private networks |
|
314 |
request = deepcopy(self.request) |
|
315 |
request["server"]["networks"] = [bnet3.network.id, bnet4.network.id] |
|
316 |
with override_settings(settings, |
|
317 |
DEFAULT_INSTANCE_NETWORKS=["public", bnet1.network.id, |
|
318 |
bnet2.network.id]): |
|
319 |
with mocked_quotaholder(): |
|
320 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
321 |
json.dumps(request), 'json') |
|
322 |
self.assertEqual(response.status_code, 202) |
|
323 |
name, args, kwargs = mrapi().CreateInstance.mock_calls[0] |
|
324 |
self.assertEqual(len(kwargs["nics"]), 5) |
|
325 |
self.assertEqual(kwargs["nics"][0]["network"], |
|
326 |
self.network.backend_id) |
|
327 |
self.assertEqual(kwargs["nics"][1]["network"], |
|
328 |
bnet1.network.backend_id) |
|
329 |
self.assertEqual(kwargs["nics"][2]["network"], |
|
330 |
bnet2.network.backend_id) |
|
331 |
self.assertEqual(kwargs["nics"][3]["network"], |
|
332 |
bnet3.network.backend_id) |
|
333 |
self.assertEqual(kwargs["nics"][4]["network"], |
|
334 |
bnet4.network.backend_id) |
|
335 |
|
|
336 |
with override_settings(settings, |
|
337 |
DEFAULT_INSTANCE_NETWORKS=[bnet2.network.id]): |
|
338 |
with mocked_quotaholder(): |
|
339 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
340 |
json.dumps(request), 'json') |
|
341 |
self.assertEqual(response.status_code, 202) |
|
342 |
name, args, kwargs = mrapi().CreateInstance.mock_calls[1] |
|
343 |
self.assertEqual(len(kwargs["nics"]), 3) |
|
344 |
self.assertEqual(kwargs["nics"][0]["network"], |
|
345 |
bnet2.network.backend_id) |
|
346 |
self.assertEqual(kwargs["nics"][1]["network"], |
|
347 |
bnet3.network.backend_id) |
|
348 |
self.assertEqual(kwargs["nics"][2]["network"], |
|
349 |
bnet4.network.backend_id) |
|
350 |
|
|
351 |
# test invalid network in DEFAULT_INSTANCE_NETWORKS |
|
352 |
with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=[42]): |
|
353 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
354 |
json.dumps(request), 'json') |
|
355 |
self.assertFault(response, 500, "internalServerError") |
|
356 |
|
|
357 |
# test connect to public netwok |
|
358 |
request = deepcopy(self.request) |
|
359 |
request["server"]["networks"] = [self.network.id] |
|
360 |
with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=["public"]): |
|
361 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
362 |
json.dumps(request), 'json') |
|
363 |
self.assertFault(response, 403, "forbidden") |
|
364 |
# test wrong user |
|
365 |
request = deepcopy(self.request) |
|
366 |
request["server"]["networks"] = [bnet3.network.id] |
|
367 |
with override_settings(settings, DEFAULT_INSTANCE_NETWORKS=["public"]): |
|
368 |
with mocked_quotaholder(): |
|
369 |
response = self.mypost('/api/v1.1/servers', 'dummy_user', |
|
370 |
json.dumps(request), 'json') |
|
371 |
self.assertItemNotFound(response) |
|
372 |
|
|
373 |
def test_create_server_no_flavor(self, mrapi): |
|
374 |
request = deepcopy(self.request) |
|
375 |
request["server"]["flavorRef"] = 42 |
|
376 |
with mocked_quotaholder(): |
|
377 |
response = self.mypost('/api/v1.1/servers', 'test_user', |
|
378 |
json.dumps(request), 'json') |
|
307 | 379 |
self.assertItemNotFound(response) |
308 | 380 |
|
309 | 381 |
|
Also available in: Unified diff