Revision 5d805533 snf-cyclades-app/synnefo/api/tests/servers.py
b/snf-cyclades-app/synnefo/api/tests/servers.py | ||
---|---|---|
37 | 37 |
from snf_django.utils.testing import (BaseAPITest, mocked_quotaholder, |
38 | 38 |
override_settings) |
39 | 39 |
from synnefo.db.models import (VirtualMachine, VirtualMachineMetadata, |
40 |
IPAddress, NetworkInterface) |
|
40 |
IPAddress, NetworkInterface, Volume)
|
|
41 | 41 |
from synnefo.db import models_factory as mfactory |
42 | 42 |
from synnefo.logic.utils import get_rsapi_state |
43 | 43 |
from synnefo.cyclades_settings import cyclades_services |
... | ... | |
320 | 320 |
'checksum': '1234', |
321 | 321 |
"id": 1, |
322 | 322 |
"name": "test_image", |
323 |
"size": "41242", |
|
323 |
"size": 1024, |
|
324 |
"is_snapshot": False, |
|
324 | 325 |
'disk_format': 'diskdump'} |
325 | 326 |
|
326 | 327 |
|
327 | 328 |
@patch('synnefo.api.util.get_image', fixed_image) |
329 |
@patch('synnefo.volume.util.get_snapshot', fixed_image) |
|
328 | 330 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
329 | 331 |
class ServerCreateAPITest(ComputeAPITest): |
330 | 332 |
def setUp(self): |
... | ... | |
585 | 587 |
json.dumps(request), 'json') |
586 | 588 |
self.assertEqual(response.status_code, 404) |
587 | 589 |
|
590 |
def test_create_server_with_volumes(self, mrapi): |
|
591 |
user = "test_user" |
|
592 |
mrapi().CreateInstance.return_value = 42 |
|
593 |
# Test creation without any volumes. Server will use flavor+image |
|
594 |
request = deepcopy(self.request) |
|
595 |
request["server"]["block_device_mapping_v2"] = [] |
|
596 |
with mocked_quotaholder(): |
|
597 |
response = self.mypost("servers", user, |
|
598 |
json.dumps(request), 'json') |
|
599 |
self.assertEqual(response.status_code, 202, msg=response.content) |
|
600 |
vm_id = json.loads(response.content)["server"]["id"] |
|
601 |
volume = Volume.objects.get(machine_id=vm_id) |
|
602 |
self.assertEqual(volume.disk_template, self.flavor.disk_template) |
|
603 |
self.assertEqual(volume.size, self.flavor.disk) |
|
604 |
self.assertEqual(volume.source, "image:%s" % fixed_image()["id"]) |
|
605 |
self.assertEqual(volume.delete_on_termination, True) |
|
606 |
self.assertEqual(volume.userid, user) |
|
607 |
|
|
608 |
# Test using an image |
|
609 |
request["server"]["block_device_mapping_v2"] = [ |
|
610 |
{"source_type": "image", |
|
611 |
"uuid": fixed_image()["id"], |
|
612 |
"volume_size": 10, |
|
613 |
"delete_on_termination": False} |
|
614 |
] |
|
615 |
with mocked_quotaholder(): |
|
616 |
response = self.mypost("servers", user, |
|
617 |
json.dumps(request), 'json') |
|
618 |
self.assertEqual(response.status_code, 202, msg=response.content) |
|
619 |
vm_id = json.loads(response.content)["server"]["id"] |
|
620 |
volume = Volume.objects.get(machine_id=vm_id) |
|
621 |
self.assertEqual(volume.disk_template, self.flavor.disk_template) |
|
622 |
self.assertEqual(volume.size, 10) |
|
623 |
self.assertEqual(volume.source, "image:%s" % fixed_image()["id"]) |
|
624 |
self.assertEqual(volume.delete_on_termination, False) |
|
625 |
self.assertEqual(volume.userid, user) |
|
626 |
self.assertEqual(volume.origin, "pithos:" + fixed_image()["checksum"]) |
|
627 |
|
|
628 |
# Test using a snapshot |
|
629 |
request["server"]["block_device_mapping_v2"] = [ |
|
630 |
{"source_type": "snapshot", |
|
631 |
"uuid": fixed_image()["id"], |
|
632 |
"volume_size": 10, |
|
633 |
"delete_on_termination": False} |
|
634 |
] |
|
635 |
with mocked_quotaholder(): |
|
636 |
response = self.mypost("servers", user, |
|
637 |
json.dumps(request), 'json') |
|
638 |
self.assertEqual(response.status_code, 202, msg=response.content) |
|
639 |
vm_id = json.loads(response.content)["server"]["id"] |
|
640 |
volume = Volume.objects.get(machine_id=vm_id) |
|
641 |
self.assertEqual(volume.disk_template, self.flavor.disk_template) |
|
642 |
self.assertEqual(volume.size, 10) |
|
643 |
self.assertEqual(volume.source, "snapshot:%s" % fixed_image()["id"]) |
|
644 |
self.assertEqual(volume.origin, fixed_image()["checksum"]) |
|
645 |
self.assertEqual(volume.delete_on_termination, False) |
|
646 |
self.assertEqual(volume.userid, user) |
|
647 |
|
|
648 |
source_volume = volume |
|
649 |
# Test using source volume |
|
650 |
request["server"]["block_device_mapping_v2"] = [ |
|
651 |
{"source_type": "volume", |
|
652 |
"uuid": source_volume.id, |
|
653 |
"volume_size": source_volume.size, |
|
654 |
"delete_on_termination": False} |
|
655 |
] |
|
656 |
with mocked_quotaholder(): |
|
657 |
response = self.mypost("servers", user, |
|
658 |
json.dumps(request), 'json') |
|
659 |
# This will fail because the volume is not AVAILABLE. |
|
660 |
self.assertBadRequest(response) |
|
661 |
|
|
662 |
# Test using a blank volume |
|
663 |
request["server"]["block_device_mapping_v2"] = [ |
|
664 |
{"source_type": "blank", |
|
665 |
"volume_size": 10, |
|
666 |
"delete_on_termination": True} |
|
667 |
] |
|
668 |
with mocked_quotaholder(): |
|
669 |
response = self.mypost("servers", user, |
|
670 |
json.dumps(request), 'json') |
|
671 |
self.assertBadRequest(response) |
|
672 |
|
|
588 | 673 |
|
589 | 674 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
590 | 675 |
class ServerDestroyAPITest(ComputeAPITest): |
Also available in: Unified diff