Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / volume / tests / volumes.py @ fad9d098

History | View | Annotate | Download (6.2 kB)

1 178eabbf Christos Stavrakakis
from snf_django.utils.testing import BaseAPITest
2 178eabbf Christos Stavrakakis
#from synnefo.db.models import Volume
3 178eabbf Christos Stavrakakis
from synnefo.db import models_factory as mf
4 178eabbf Christos Stavrakakis
from synnefo.volume import volumes
5 178eabbf Christos Stavrakakis
from snf_django.lib.api import faults
6 178eabbf Christos Stavrakakis
from mock import patch
7 178eabbf Christos Stavrakakis
from copy import deepcopy
8 178eabbf Christos Stavrakakis
9 178eabbf Christos Stavrakakis
10 178eabbf Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
11 178eabbf Christos Stavrakakis
class VolumesTest(BaseAPITest):
12 178eabbf Christos Stavrakakis
    def setUp(self):
13 178eabbf Christos Stavrakakis
        self.userid = "test_user"
14 178eabbf Christos Stavrakakis
        self.size = 1
15 fad9d098 Christos Stavrakakis
        self.vm = mf.VirtualMachineFactory(
16 fad9d098 Christos Stavrakakis
            userid=self.userid,
17 fad9d098 Christos Stavrakakis
            flavor__disk_template="ext_archipelago")
18 178eabbf Christos Stavrakakis
        self.kwargs = {"user_id": self.userid,
19 178eabbf Christos Stavrakakis
                       "size": self.size,
20 178eabbf Christos Stavrakakis
                       "server_id": self.vm.id}
21 178eabbf Christos Stavrakakis
22 178eabbf Christos Stavrakakis
    def test_create(self, mrapi):
23 178eabbf Christos Stavrakakis
        # No server id
24 178eabbf Christos Stavrakakis
        kwargs = deepcopy(self.kwargs)
25 178eabbf Christos Stavrakakis
        kwargs["server_id"] = None
26 178eabbf Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
27 178eabbf Christos Stavrakakis
                          volumes.create,
28 178eabbf Christos Stavrakakis
                          **kwargs)
29 178eabbf Christos Stavrakakis
30 178eabbf Christos Stavrakakis
        # Invalid server
31 178eabbf Christos Stavrakakis
        vm = mf.VirtualMachineFactory(userid="other_user")
32 178eabbf Christos Stavrakakis
        kwargs["server_id"] = vm.id
33 178eabbf Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
34 178eabbf Christos Stavrakakis
                          volumes.create,
35 178eabbf Christos Stavrakakis
                          **kwargs)
36 178eabbf Christos Stavrakakis
37 178eabbf Christos Stavrakakis
        # Create server without source!
38 178eabbf Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
39 178eabbf Christos Stavrakakis
        vol = volumes.create(**self.kwargs)
40 178eabbf Christos Stavrakakis
41 178eabbf Christos Stavrakakis
        self.assertEqual(vol.size, self.size)
42 178eabbf Christos Stavrakakis
        self.assertEqual(vol.userid, self.userid)
43 178eabbf Christos Stavrakakis
        self.assertEqual(vol.name, None)
44 178eabbf Christos Stavrakakis
        self.assertEqual(vol.description, None)
45 178eabbf Christos Stavrakakis
        self.assertEqual(vol.source_snapshot_id, None)
46 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.source, None)
47 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.origin, None)
48 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.source_volume_id, None)
49 178eabbf Christos Stavrakakis
        self.assertEqual(vol.source_image_id, None)
50 178eabbf Christos Stavrakakis
        self.assertEqual(vol.machine, self.vm)
51 178eabbf Christos Stavrakakis
52 178eabbf Christos Stavrakakis
        name, args, kwargs = mrapi().ModifyInstance.mock_calls[0]
53 178eabbf Christos Stavrakakis
        self.assertEqual(kwargs["instance"], self.vm.backend_vm_id)
54 178eabbf Christos Stavrakakis
        disk_info = kwargs["disks"][0][2]
55 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["size"], self.size)
56 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["name"], vol.backend_volume_uuid)
57 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["volume_name"], vol.backend_volume_uuid)
58 178eabbf Christos Stavrakakis
        self.assertFalse("origin" in disk_info)
59 178eabbf Christos Stavrakakis
60 178eabbf Christos Stavrakakis
    def test_create_from_volume(self, mrapi):
61 fad9d098 Christos Stavrakakis
        # Check permissions
62 178eabbf Christos Stavrakakis
        svol = mf.VolumeFactory(userid="other_user")
63 178eabbf Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
64 178eabbf Christos Stavrakakis
                          volumes.create,
65 178eabbf Christos Stavrakakis
                          source_volume_id=svol.id,
66 178eabbf Christos Stavrakakis
                          **self.kwargs)
67 fad9d098 Christos Stavrakakis
        # Invalid volume status
68 fad9d098 Christos Stavrakakis
        svol = mf.VolumeFactory(userid=self.userid, status="CREATING")
69 fad9d098 Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
70 fad9d098 Christos Stavrakakis
                          volumes.create,
71 fad9d098 Christos Stavrakakis
                          source_volume_id=svol.id,
72 fad9d098 Christos Stavrakakis
                          **self.kwargs)
73 178eabbf Christos Stavrakakis
74 fad9d098 Christos Stavrakakis
        svol.status = "AVAILABLE"
75 fad9d098 Christos Stavrakakis
        svol.save()
76 178eabbf Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
77 178eabbf Christos Stavrakakis
        vol = volumes.create(source_volume_id=svol.id, **self.kwargs)
78 178eabbf Christos Stavrakakis
79 178eabbf Christos Stavrakakis
        self.assertEqual(vol.size, self.size)
80 178eabbf Christos Stavrakakis
        self.assertEqual(vol.userid, self.userid)
81 178eabbf Christos Stavrakakis
        self.assertEqual(vol.name, None)
82 178eabbf Christos Stavrakakis
        self.assertEqual(vol.description, None)
83 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.source, "volume:%s" % svol.id)
84 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.origin, svol.backend_volume_uuid)
85 178eabbf Christos Stavrakakis
86 178eabbf Christos Stavrakakis
        name, args, kwargs = mrapi().ModifyInstance.mock_calls[0]
87 178eabbf Christos Stavrakakis
        self.assertEqual(kwargs["instance"], self.vm.backend_vm_id)
88 178eabbf Christos Stavrakakis
        disk_info = kwargs["disks"][0][2]
89 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["size"], self.size)
90 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["name"], vol.backend_volume_uuid)
91 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["volume_name"], vol.backend_volume_uuid)
92 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["origin"], svol.backend_volume_uuid)
93 178eabbf Christos Stavrakakis
94 fad9d098 Christos Stavrakakis
    @patch("synnefo.plankton.backend.ImageBackend")
95 fad9d098 Christos Stavrakakis
    def test_create_from_snapshot(self, mimage, mrapi):
96 178eabbf Christos Stavrakakis
        # Wrong source
97 fad9d098 Christos Stavrakakis
        mimage().get_snapshot.side_effect = faults.ItemNotFound
98 178eabbf Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
99 178eabbf Christos Stavrakakis
                          volumes.create,
100 178eabbf Christos Stavrakakis
                          source_snapshot_id=421,
101 178eabbf Christos Stavrakakis
                          **self.kwargs)
102 178eabbf Christos Stavrakakis
103 fad9d098 Christos Stavrakakis
        mimage().get_snapshot.side_effect = None
104 fad9d098 Christos Stavrakakis
        mimage().get_snapshot.return_value = {
105 fad9d098 Christos Stavrakakis
            'location': 'pithos://foo',
106 fad9d098 Christos Stavrakakis
            'checksum': 'snf-snapshot-43',
107 fad9d098 Christos Stavrakakis
            'id': 12,
108 fad9d098 Christos Stavrakakis
            'name': "test_image",
109 fad9d098 Christos Stavrakakis
            'size': 1242,
110 fad9d098 Christos Stavrakakis
            'disk_format': 'diskdump',
111 fad9d098 Christos Stavrakakis
            'properties': {'source_volume': 42}}
112 178eabbf Christos Stavrakakis
113 178eabbf Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
114 178eabbf Christos Stavrakakis
        vol = volumes.create(source_snapshot_id=12, **self.kwargs)
115 178eabbf Christos Stavrakakis
116 178eabbf Christos Stavrakakis
        self.assertEqual(vol.size, self.size)
117 178eabbf Christos Stavrakakis
        self.assertEqual(vol.userid, self.userid)
118 178eabbf Christos Stavrakakis
        self.assertEqual(vol.name, None)
119 178eabbf Christos Stavrakakis
        self.assertEqual(vol.description, None)
120 fad9d098 Christos Stavrakakis
        self.assertEqual(int(vol.source_snapshot_id), 12)
121 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.source_volume_id, None)
122 178eabbf Christos Stavrakakis
        self.assertEqual(vol.source_image_id, None)
123 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.origin, "snf-snapshot-43")
124 178eabbf Christos Stavrakakis
125 178eabbf Christos Stavrakakis
        name, args, kwargs = mrapi().ModifyInstance.mock_calls[0]
126 178eabbf Christos Stavrakakis
        self.assertEqual(kwargs["instance"], self.vm.backend_vm_id)
127 178eabbf Christos Stavrakakis
        disk_info = kwargs["disks"][0][2]
128 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["size"], self.size)
129 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["name"], vol.backend_volume_uuid)
130 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["volume_name"], vol.backend_volume_uuid)
131 178eabbf Christos Stavrakakis
        self.assertEqual(disk_info["origin"], "snf-snapshot-43")
132 178eabbf Christos Stavrakakis
133 178eabbf Christos Stavrakakis
    def test_delete(self, mrapi):
134 fad9d098 Christos Stavrakakis
        # We can not deleted detached volumes
135 fad9d098 Christos Stavrakakis
        vol = mf.VolumeFactory(machine=None)
136 fad9d098 Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
137 fad9d098 Christos Stavrakakis
                          volumes.delete,
138 fad9d098 Christos Stavrakakis
                          vol)
139 fad9d098 Christos Stavrakakis
140 178eabbf Christos Stavrakakis
        vm = mf.VirtualMachineFactory()
141 fad9d098 Christos Stavrakakis
        # Also we cannot delete root volume
142 fad9d098 Christos Stavrakakis
        vol.index = 0
143 178eabbf Christos Stavrakakis
        vol.machine = vm
144 178eabbf Christos Stavrakakis
        self.assertRaises(faults.BadRequest,
145 178eabbf Christos Stavrakakis
                          volumes.delete,
146 178eabbf Christos Stavrakakis
                          vol)
147 178eabbf Christos Stavrakakis
148 fad9d098 Christos Stavrakakis
        # We can delete everything else
149 fad9d098 Christos Stavrakakis
        vol.index = 1
150 fad9d098 Christos Stavrakakis
        mrapi().ModifyInstance.return_value = 42
151 178eabbf Christos Stavrakakis
        volumes.delete(vol)
152 fad9d098 Christos Stavrakakis
        self.assertEqual(vol.backendjobid, 42)
153 fad9d098 Christos Stavrakakis
        args, kwargs = mrapi().ModifyInstance.call_args
154 fad9d098 Christos Stavrakakis
        self.assertEqual(kwargs["instance"], vm.backend_vm_id)
155 fad9d098 Christos Stavrakakis
        self.assertEqual(kwargs["disks"][0], ("remove",
156 fad9d098 Christos Stavrakakis
                                              vol.backend_volume_uuid, {}))