root / snf-cyclades-app / synnefo / db / tests.py @ dccd42eb
History | View | Annotate | Download (9.3 kB)
1 | c8908e51 | Christos Stavrakakis | # Copyright 2012 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 7bd50624 | Vassilios Karakoidas | #
|
3 | ace4bd5d | Georgios Gousios | # Redistribution and use in source and binary forms, with or without
|
4 | ace4bd5d | Georgios Gousios | # modification, are permitted provided that the following conditions
|
5 | ace4bd5d | Georgios Gousios | # are met:
|
6 | 7bd50624 | Vassilios Karakoidas | #
|
7 | ace4bd5d | Georgios Gousios | # 1. Redistributions of source code must retain the above copyright
|
8 | ace4bd5d | Georgios Gousios | # notice, this list of conditions and the following disclaimer.
|
9 | 7bd50624 | Vassilios Karakoidas | #
|
10 | ace4bd5d | Georgios Gousios | # 2. Redistributions in binary form must reproduce the above copyright
|
11 | ace4bd5d | Georgios Gousios | # notice, this list of conditions and the following disclaimer in the
|
12 | ace4bd5d | Georgios Gousios | # documentation and/or other materials provided with the distribution.
|
13 | d8e682ed | Vassilios Karakoidas | #
|
14 | ace4bd5d | Georgios Gousios | # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
15 | ace4bd5d | Georgios Gousios | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16 | ace4bd5d | Georgios Gousios | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17 | ace4bd5d | Georgios Gousios | # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
18 | ace4bd5d | Georgios Gousios | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
19 | ace4bd5d | Georgios Gousios | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
20 | ace4bd5d | Georgios Gousios | # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
21 | ace4bd5d | Georgios Gousios | # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
22 | ace4bd5d | Georgios Gousios | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
23 | ace4bd5d | Georgios Gousios | # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
24 | ace4bd5d | Georgios Gousios | # SUCH DAMAGE.
|
25 | ace4bd5d | Georgios Gousios | #
|
26 | ace4bd5d | Georgios Gousios | # The views and conclusions contained in the software and documentation are
|
27 | ace4bd5d | Georgios Gousios | # those of the authors and should not be interpreted as representing official
|
28 | ace4bd5d | Georgios Gousios | # policies, either expressed or implied, of GRNET S.A.
|
29 | ace4bd5d | Georgios Gousios | |
30 | ace4bd5d | Georgios Gousios | # Unit Tests for db
|
31 | ace4bd5d | Georgios Gousios | #
|
32 | ace4bd5d | Georgios Gousios | # Provides automated tests for db module
|
33 | d8e682ed | Vassilios Karakoidas | |
34 | d39ea372 | Vassilios Karakoidas | from django.test import TestCase |
35 | d8e682ed | Vassilios Karakoidas | |
36 | 35e2f2d4 | Christos Stavrakakis | # Import pool tests
|
37 | 35e2f2d4 | Christos Stavrakakis | from synnefo.db.pools.tests import * |
38 | 35e2f2d4 | Christos Stavrakakis | |
39 | c8908e51 | Christos Stavrakakis | from synnefo.db.models import * |
40 | c8908e51 | Christos Stavrakakis | from synnefo.db import models_factory as mfact |
41 | c8908e51 | Christos Stavrakakis | from synnefo.db.pools import IPPool |
42 | c8908e51 | Christos Stavrakakis | |
43 | c8908e51 | Christos Stavrakakis | from django.db import IntegrityError |
44 | c8908e51 | Christos Stavrakakis | from django.core.exceptions import MultipleObjectsReturned |
45 | c8908e51 | Christos Stavrakakis | from mock import patch |
46 | c8908e51 | Christos Stavrakakis | |
47 | c8908e51 | Christos Stavrakakis | |
48 | c8908e51 | Christos Stavrakakis | class FlavorTest(TestCase): |
49 | c8908e51 | Christos Stavrakakis | def test_flavor_name(self): |
50 | c8908e51 | Christos Stavrakakis | """Test a flavor object name method."""
|
51 | b65a3b04 | Christos Stavrakakis | flavor = mfact.FlavorFactory(cpu=1, ram=1024, disk=40, |
52 | b65a3b04 | Christos Stavrakakis | disk_template="temp")
|
53 | b65a3b04 | Christos Stavrakakis | self.assertEqual(flavor.name, "C1R1024D40temp", "flavor.name is not" |
54 | b65a3b04 | Christos Stavrakakis | " generated correctly. Name is %s instead of C1R1024D40temp" %
|
55 | c8908e51 | Christos Stavrakakis | flavor.name) |
56 | c8908e51 | Christos Stavrakakis | |
57 | c8908e51 | Christos Stavrakakis | |
58 | c8908e51 | Christos Stavrakakis | class BackendTest(TestCase): |
59 | c8908e51 | Christos Stavrakakis | def setUp(self): |
60 | c8908e51 | Christos Stavrakakis | self.backend = mfact.BackendFactory()
|
61 | c8908e51 | Christos Stavrakakis | |
62 | c8908e51 | Christos Stavrakakis | @patch("synnefo.db.models.get_rapi_client") |
63 | c8908e51 | Christos Stavrakakis | def test_get_client(self, client): |
64 | c8908e51 | Christos Stavrakakis | id_ = self.backend.id
|
65 | c8908e51 | Christos Stavrakakis | hash_ = self.backend.hash
|
66 | c8908e51 | Christos Stavrakakis | name = self.backend.clustername
|
67 | c8908e51 | Christos Stavrakakis | passwd = self.backend.password
|
68 | c8908e51 | Christos Stavrakakis | user = self.backend.username
|
69 | c8908e51 | Christos Stavrakakis | port = self.backend.port
|
70 | c8908e51 | Christos Stavrakakis | self.backend.get_client()
|
71 | c8908e51 | Christos Stavrakakis | client.assert_called_once_with(id_, hash_, name, port, user, passwd) |
72 | c8908e51 | Christos Stavrakakis | |
73 | c8908e51 | Christos Stavrakakis | def test_save_hash(self): |
74 | c8908e51 | Christos Stavrakakis | """Test that backend hash is generated on credential change"""
|
75 | c8908e51 | Christos Stavrakakis | old_hash = self.backend.hash
|
76 | c8908e51 | Christos Stavrakakis | for field in ['clustername', 'username', 'password', 'port']: |
77 | c8908e51 | Christos Stavrakakis | value = 5181 if field == 'port' else 'foo' |
78 | c8908e51 | Christos Stavrakakis | self.backend.__setattr__(field, value)
|
79 | c8908e51 | Christos Stavrakakis | self.backend.save()
|
80 | c8908e51 | Christos Stavrakakis | self.assertNotEqual(old_hash, self.backend.hash) |
81 | c8908e51 | Christos Stavrakakis | old_hash = self.backend.hash
|
82 | c8908e51 | Christos Stavrakakis | |
83 | c8908e51 | Christos Stavrakakis | def test_unique_index(self): |
84 | c8908e51 | Christos Stavrakakis | """Test that each backend gets a unique index"""
|
85 | c8908e51 | Christos Stavrakakis | backends = [self.backend]
|
86 | c8908e51 | Christos Stavrakakis | for i in xrange(0, 14): |
87 | c8908e51 | Christos Stavrakakis | backends.append(mfact.BackendFactory()) |
88 | c8908e51 | Christos Stavrakakis | indexes = map(lambda x: x.index, backends) |
89 | c8908e51 | Christos Stavrakakis | self.assertEqual(len(indexes), len(set(indexes))) |
90 | c8908e51 | Christos Stavrakakis | |
91 | c8908e51 | Christos Stavrakakis | def test_backend_number(self): |
92 | c8908e51 | Christos Stavrakakis | """Test that no more than 16 backends are created"""
|
93 | c8908e51 | Christos Stavrakakis | for i in xrange(0, 14): |
94 | c8908e51 | Christos Stavrakakis | mfact.BackendFactory() |
95 | c8908e51 | Christos Stavrakakis | self.assertRaises(Exception, mfact.BackendFactory, ()) |
96 | c8908e51 | Christos Stavrakakis | |
97 | c8908e51 | Christos Stavrakakis | def test_delete_backend(self): |
98 | c8908e51 | Christos Stavrakakis | vm = mfact.VirtualMachineFactory(backend=self.backend, deleted=True) |
99 | c8908e51 | Christos Stavrakakis | bnet = mfact.BackendNetworkFactory(backend=self.backend)
|
100 | c8908e51 | Christos Stavrakakis | self.backend.delete()
|
101 | c8908e51 | Christos Stavrakakis | self.assertRaises(Backend.DoesNotExist, Backend.objects.get,
|
102 | c8908e51 | Christos Stavrakakis | id=self.backend.id)
|
103 | c8908e51 | Christos Stavrakakis | # Test that VM is not deleted
|
104 | c8908e51 | Christos Stavrakakis | vm2 = VirtualMachine.objects.get(id=vm.id) |
105 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm2.backend, None) |
106 | c8908e51 | Christos Stavrakakis | # Test tha backend networks are deleted, but not the network
|
107 | c8908e51 | Christos Stavrakakis | self.assertRaises(BackendNetwork.DoesNotExist,
|
108 | c8908e51 | Christos Stavrakakis | BackendNetwork.objects.get, id=bnet.id) |
109 | c8908e51 | Christos Stavrakakis | Network.objects.get(id=bnet.network.id) |
110 | c8908e51 | Christos Stavrakakis | |
111 | c8908e51 | Christos Stavrakakis | def test_delete_active_backend(self): |
112 | c8908e51 | Christos Stavrakakis | """Test that a backend with non-deleted VMS is not deleted"""
|
113 | c8908e51 | Christos Stavrakakis | mfact.VirtualMachineFactory(backend=self.backend)
|
114 | c8908e51 | Christos Stavrakakis | self.assertRaises(IntegrityError, self.backend.delete, ()) |
115 | c8908e51 | Christos Stavrakakis | |
116 | c8908e51 | Christos Stavrakakis | def test_password_encryption(self): |
117 | c8908e51 | Christos Stavrakakis | password_hash = self.backend.password
|
118 | c8908e51 | Christos Stavrakakis | self.backend.password = '123' |
119 | c8908e51 | Christos Stavrakakis | self.assertNotEqual(self.backend.password_hash, '123') |
120 | c8908e51 | Christos Stavrakakis | self.assertNotEqual(self.backend.password_hash, password_hash) |
121 | c8908e51 | Christos Stavrakakis | self.assertEqual(self.backend.password, '123') |
122 | c8908e51 | Christos Stavrakakis | |
123 | c8908e51 | Christos Stavrakakis | |
124 | c8908e51 | Christos Stavrakakis | class VirtualMachineTest(TestCase): |
125 | c8908e51 | Christos Stavrakakis | def setUp(self): |
126 | c8908e51 | Christos Stavrakakis | self.vm = mfact.VirtualMachineFactory()
|
127 | c8908e51 | Christos Stavrakakis | |
128 | c8908e51 | Christos Stavrakakis | @patch("synnefo.db.models.get_rapi_client") |
129 | c8908e51 | Christos Stavrakakis | def test_get_client(self, client): |
130 | c8908e51 | Christos Stavrakakis | backend = self.vm.backend
|
131 | c8908e51 | Christos Stavrakakis | id_ = backend.id |
132 | c8908e51 | Christos Stavrakakis | hash_ = backend.hash |
133 | c8908e51 | Christos Stavrakakis | name = backend.clustername |
134 | c8908e51 | Christos Stavrakakis | passwd = backend.password |
135 | c8908e51 | Christos Stavrakakis | user = backend.username |
136 | c8908e51 | Christos Stavrakakis | port = backend.port |
137 | c8908e51 | Christos Stavrakakis | self.vm.get_client()
|
138 | c8908e51 | Christos Stavrakakis | client.assert_called_once_with(id_, hash_, name, port, user, passwd) |
139 | c8908e51 | Christos Stavrakakis | |
140 | c8908e51 | Christos Stavrakakis | def test_create(self): |
141 | c8908e51 | Christos Stavrakakis | vm = mfact.VirtualMachineFactory() |
142 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.action, None) |
143 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.backendjobid, None) |
144 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.backendjobstatus, None) |
145 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.backendopcode, None) |
146 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.backendlogmsg, None) |
147 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.operstate, 'BUILD') |
148 | c8908e51 | Christos Stavrakakis | |
149 | c8908e51 | Christos Stavrakakis | |
150 | c8908e51 | Christos Stavrakakis | class NetworkTest(TestCase): |
151 | c8908e51 | Christos Stavrakakis | def setUp(self): |
152 | c8908e51 | Christos Stavrakakis | self.net = mfact.NetworkFactory()
|
153 | c8908e51 | Christos Stavrakakis | |
154 | c8908e51 | Christos Stavrakakis | def test_tags(self): |
155 | c8908e51 | Christos Stavrakakis | net1 = mfact.NetworkFactory(flavor='IP_LESS_ROUTED')
|
156 | c8908e51 | Christos Stavrakakis | self.assertEqual(net1.backend_tag, ['ip-less-routed']) |
157 | c8908e51 | Christos Stavrakakis | net1 = mfact.NetworkFactory(flavor='CUSTOM')
|
158 | c8908e51 | Christos Stavrakakis | self.assertEqual(net1.backend_tag, [])
|
159 | c8908e51 | Christos Stavrakakis | |
160 | c8908e51 | Christos Stavrakakis | def test_create_backend_network(self): |
161 | c8908e51 | Christos Stavrakakis | len_backends = len(Backend.objects.all())
|
162 | c8908e51 | Christos Stavrakakis | back = mfact.BackendFactory() |
163 | c8908e51 | Christos Stavrakakis | self.net.create_backend_network(backend=back)
|
164 | c8908e51 | Christos Stavrakakis | BackendNetwork.objects.get(network=self.net, backend=back)
|
165 | c8908e51 | Christos Stavrakakis | back1 = mfact.BackendFactory() |
166 | c8908e51 | Christos Stavrakakis | back2 = mfact.BackendFactory() |
167 | c8908e51 | Christos Stavrakakis | self.net.create_backend_network()
|
168 | c8908e51 | Christos Stavrakakis | BackendNetwork.objects.get(network=self.net, backend=back1)
|
169 | c8908e51 | Christos Stavrakakis | BackendNetwork.objects.get(network=self.net, backend=back2)
|
170 | c8908e51 | Christos Stavrakakis | self.assertEqual(len(BackendNetwork.objects.filter(network=self.net)), |
171 | c8908e51 | Christos Stavrakakis | len_backends + 3)
|
172 | c8908e51 | Christos Stavrakakis | |
173 | c8908e51 | Christos Stavrakakis | def test_pool(self): |
174 | c8908e51 | Christos Stavrakakis | pool = self.net.get_pool()
|
175 | c8908e51 | Christos Stavrakakis | pool.network = self.net
|
176 | c8908e51 | Christos Stavrakakis | self.assertTrue(isinstance(pool, IPPool)) |
177 | c8908e51 | Christos Stavrakakis | |
178 | c8908e51 | Christos Stavrakakis | def test_reserve_ip(self): |
179 | c8908e51 | Christos Stavrakakis | net1 = mfact.NetworkFactory(subnet='192.168.2.0/24')
|
180 | c8908e51 | Christos Stavrakakis | net1.reserve_address('192.168.2.12')
|
181 | c8908e51 | Christos Stavrakakis | pool = net1.get_pool() |
182 | c8908e51 | Christos Stavrakakis | self.assertFalse(pool.is_available('192.168.2.12')) |
183 | c8908e51 | Christos Stavrakakis | net1.release_address('192.168.2.12')
|
184 | c8908e51 | Christos Stavrakakis | pool = net1.get_pool() |
185 | c8908e51 | Christos Stavrakakis | self.assertTrue(pool.is_available('192.168.2.12')) |
186 | c8908e51 | Christos Stavrakakis | |
187 | c8908e51 | Christos Stavrakakis | |
188 | c8908e51 | Christos Stavrakakis | class BackendNetworkTest(TestCase): |
189 | c8908e51 | Christos Stavrakakis | def test_mac_prefix(self): |
190 | c8908e51 | Christos Stavrakakis | network = mfact.NetworkFactory(mac_prefix='aa:bb:c')
|
191 | c8908e51 | Christos Stavrakakis | backend = mfact.BackendFactory() |
192 | c8908e51 | Christos Stavrakakis | bnet = mfact.BackendNetworkFactory(network=network, backend=backend) |
193 | c8908e51 | Christos Stavrakakis | self.assertTrue(backend.index < 10) |
194 | c8908e51 | Christos Stavrakakis | self.assertEqual(bnet.mac_prefix, 'aa:bb:c%s' % backend.index) |
195 | c8908e51 | Christos Stavrakakis | |
196 | b66e4833 | Christos Stavrakakis | def test_invalid_mac(self): |
197 | b66e4833 | Christos Stavrakakis | network = mfact.NetworkFactory(mac_prefix='zz:bb:c')
|
198 | b66e4833 | Christos Stavrakakis | backend = mfact.BackendFactory() |
199 | b66e4833 | Christos Stavrakakis | self.assertRaises(utils.InvalidMacAddress,
|
200 | b66e4833 | Christos Stavrakakis | mfact.BackendNetworkFactory, network=network, backend=backend) |
201 | b66e4833 | Christos Stavrakakis | |
202 | c8908e51 | Christos Stavrakakis | |
203 | c8908e51 | Christos Stavrakakis | class BridgePoolTest(TestCase): |
204 | c8908e51 | Christos Stavrakakis | def test_no_pool(self): |
205 | c8908e51 | Christos Stavrakakis | self.assertRaises(BridgePoolTable.DoesNotExist,
|
206 | c8908e51 | Christos Stavrakakis | BridgePoolTable.get_pool) |
207 | c8908e51 | Christos Stavrakakis | |
208 | c8908e51 | Christos Stavrakakis | def test_two_pools(self): |
209 | c8908e51 | Christos Stavrakakis | mfact.BridgePoolTableFactory() |
210 | c8908e51 | Christos Stavrakakis | mfact.BridgePoolTableFactory() |
211 | c8908e51 | Christos Stavrakakis | self.assertRaises(MultipleObjectsReturned, BridgePoolTable.get_pool)
|
212 | e8fa4283 | Vassilios Karakoidas | |
213 | 452d2391 | Vassilios Karakoidas | |
214 | c8908e51 | Christos Stavrakakis | class AESTest(TestCase): |
215 | c8908e51 | Christos Stavrakakis | def test_encrypt_decrtypt(self): |
216 | c8908e51 | Christos Stavrakakis | from synnefo.db import aes_encrypt as aes |
217 | c8908e51 | Christos Stavrakakis | old = 'bar'
|
218 | c8908e51 | Christos Stavrakakis | new = aes.decrypt_db_charfield(aes.encrypt_db_charfield(old)) |
219 | c8908e51 | Christos Stavrakakis | self.assertEqual(old, new)
|
220 | 8bda0440 | Vassilios Karakoidas | |
221 | c8908e51 | Christos Stavrakakis | def test_password_change(self): |
222 | c8908e51 | Christos Stavrakakis | from synnefo.db import aes_encrypt as aes |
223 | c8908e51 | Christos Stavrakakis | old_pass = aes.SECRET_ENCRYPTION_KEY |
224 | c8908e51 | Christos Stavrakakis | old = 'bar'
|
225 | c8908e51 | Christos Stavrakakis | encrypted = aes.encrypt_db_charfield(old) |
226 | c8908e51 | Christos Stavrakakis | aes.SECRET_ENCRYPTION_KEY = 'foo2'
|
227 | c8908e51 | Christos Stavrakakis | self.assertRaises(aes.CorruptedPassword, aes.decrypt_db_charfield,
|
228 | c8908e51 | Christos Stavrakakis | encrypted) |
229 | c8908e51 | Christos Stavrakakis | aes.SECRET_ENCRYPTION_KEY = old_pass |
230 | c8908e51 | Christos Stavrakakis | new = aes.decrypt_db_charfield(encrypted) |
231 | c8908e51 | Christos Stavrakakis | self.assertEqual(old, new)
|
232 | 8bda0440 | Vassilios Karakoidas | |
233 | c8908e51 | Christos Stavrakakis | def test_big_secret(self): |
234 | c8908e51 | Christos Stavrakakis | from synnefo.db import aes_encrypt as aes |
235 | c8908e51 | Christos Stavrakakis | old = aes.SECRET_ENCRYPTION_KEY |
236 | c8908e51 | Christos Stavrakakis | aes.SECRET_ENCRYPTION_KEY = \ |
237 | c8908e51 | Christos Stavrakakis | '91490231234814234812348913289481294812398421893489'
|
238 | c8908e51 | Christos Stavrakakis | self.assertRaises(ValueError, aes.encrypt_db_charfield, 'la') |
239 | c8908e51 | Christos Stavrakakis | aes.SECRET_ENCRYPTION_KEY = old |