Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / db / tests.py @ f6ff4b40

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 bb8fb9af Christos Stavrakakis
from synnefo.db.pools import IPPool, EmptyPool
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 bb8fb9af Christos Stavrakakis
        self.assertRaises(EmptyPool,
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