Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (10.5 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 0c09b1c0 Christos Stavrakakis
from django.conf import settings
37 35e2f2d4 Christos Stavrakakis
# Import pool tests
38 35e2f2d4 Christos Stavrakakis
from synnefo.db.pools.tests import *
39 35e2f2d4 Christos Stavrakakis
40 c8908e51 Christos Stavrakakis
from synnefo.db.models import *
41 c8908e51 Christos Stavrakakis
from synnefo.db import models_factory as mfact
42 bb8fb9af Christos Stavrakakis
from synnefo.db.pools import IPPool, EmptyPool
43 c8908e51 Christos Stavrakakis
44 c8908e51 Christos Stavrakakis
from django.db import IntegrityError
45 c8908e51 Christos Stavrakakis
from django.core.exceptions import MultipleObjectsReturned
46 bd87213f Christos Stavrakakis
from snf_django.utils.testing import override_settings
47 c8908e51 Christos Stavrakakis
from mock import patch
48 c8908e51 Christos Stavrakakis
49 c8908e51 Christos Stavrakakis
50 c8908e51 Christos Stavrakakis
class FlavorTest(TestCase):
51 c8908e51 Christos Stavrakakis
    def test_flavor_name(self):
52 c8908e51 Christos Stavrakakis
        """Test a flavor object name method."""
53 b65a3b04 Christos Stavrakakis
        flavor = mfact.FlavorFactory(cpu=1, ram=1024, disk=40,
54 b65a3b04 Christos Stavrakakis
                                     disk_template="temp")
55 b65a3b04 Christos Stavrakakis
        self.assertEqual(flavor.name, "C1R1024D40temp", "flavor.name is not"
56 b65a3b04 Christos Stavrakakis
                " generated correctly. Name is %s instead of C1R1024D40temp" %
57 c8908e51 Christos Stavrakakis
                flavor.name)
58 c8908e51 Christos Stavrakakis
59 c8908e51 Christos Stavrakakis
60 c8908e51 Christos Stavrakakis
class BackendTest(TestCase):
61 c8908e51 Christos Stavrakakis
    def setUp(self):
62 c8908e51 Christos Stavrakakis
        self.backend = mfact.BackendFactory()
63 c8908e51 Christos Stavrakakis
64 c8908e51 Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
65 c8908e51 Christos Stavrakakis
    def test_get_client(self, client):
66 c8908e51 Christos Stavrakakis
        id_ = self.backend.id
67 c8908e51 Christos Stavrakakis
        hash_ = self.backend.hash
68 c8908e51 Christos Stavrakakis
        name = self.backend.clustername
69 c8908e51 Christos Stavrakakis
        passwd = self.backend.password
70 c8908e51 Christos Stavrakakis
        user = self.backend.username
71 c8908e51 Christos Stavrakakis
        port = self.backend.port
72 c8908e51 Christos Stavrakakis
        self.backend.get_client()
73 c8908e51 Christos Stavrakakis
        client.assert_called_once_with(id_, hash_, name, port, user, passwd)
74 c8908e51 Christos Stavrakakis
75 c8908e51 Christos Stavrakakis
    def test_save_hash(self):
76 c8908e51 Christos Stavrakakis
        """Test that backend hash is generated on credential change"""
77 c8908e51 Christos Stavrakakis
        old_hash = self.backend.hash
78 c8908e51 Christos Stavrakakis
        for field in ['clustername', 'username', 'password', 'port']:
79 c8908e51 Christos Stavrakakis
            value = 5181 if field == 'port' else 'foo'
80 c8908e51 Christos Stavrakakis
            self.backend.__setattr__(field, value)
81 c8908e51 Christos Stavrakakis
            self.backend.save()
82 c8908e51 Christos Stavrakakis
            self.assertNotEqual(old_hash, self.backend.hash)
83 c8908e51 Christos Stavrakakis
            old_hash = self.backend.hash
84 c8908e51 Christos Stavrakakis
85 c8908e51 Christos Stavrakakis
    def test_unique_index(self):
86 c8908e51 Christos Stavrakakis
        """Test that each backend gets a unique index"""
87 c8908e51 Christos Stavrakakis
        backends = [self.backend]
88 c8908e51 Christos Stavrakakis
        for i in xrange(0, 14):
89 c8908e51 Christos Stavrakakis
            backends.append(mfact.BackendFactory())
90 c8908e51 Christos Stavrakakis
        indexes = map(lambda x: x.index, backends)
91 c8908e51 Christos Stavrakakis
        self.assertEqual(len(indexes), len(set(indexes)))
92 c8908e51 Christos Stavrakakis
93 c8908e51 Christos Stavrakakis
    def test_backend_number(self):
94 c8908e51 Christos Stavrakakis
        """Test that no more than 16 backends are created"""
95 c8908e51 Christos Stavrakakis
        for i in xrange(0, 14):
96 c8908e51 Christos Stavrakakis
            mfact.BackendFactory()
97 c8908e51 Christos Stavrakakis
        self.assertRaises(Exception, mfact.BackendFactory, ())
98 c8908e51 Christos Stavrakakis
99 c8908e51 Christos Stavrakakis
    def test_delete_active_backend(self):
100 c8908e51 Christos Stavrakakis
        """Test that a backend with non-deleted VMS is not deleted"""
101 26515bc1 Christos Stavrakakis
        backend = mfact.BackendFactory()
102 26515bc1 Christos Stavrakakis
        vm = mfact.VirtualMachineFactory(backend=backend)
103 26515bc1 Christos Stavrakakis
        self.assertRaises(IntegrityError, backend.delete, ())
104 26515bc1 Christos Stavrakakis
        vm.backend = None
105 26515bc1 Christos Stavrakakis
        vm.save()
106 26515bc1 Christos Stavrakakis
        backend.delete()
107 c8908e51 Christos Stavrakakis
108 c8908e51 Christos Stavrakakis
    def test_password_encryption(self):
109 c8908e51 Christos Stavrakakis
        password_hash = self.backend.password
110 c8908e51 Christos Stavrakakis
        self.backend.password = '123'
111 c8908e51 Christos Stavrakakis
        self.assertNotEqual(self.backend.password_hash, '123')
112 c8908e51 Christos Stavrakakis
        self.assertNotEqual(self.backend.password_hash, password_hash)
113 c8908e51 Christos Stavrakakis
        self.assertEqual(self.backend.password, '123')
114 c8908e51 Christos Stavrakakis
115 bd87213f Christos Stavrakakis
    def test_hypervisor(self):
116 bd87213f Christos Stavrakakis
        from synnefo.db.models import snf_settings
117 bd87213f Christos Stavrakakis
        kvm_backend = mfact.BackendFactory(hypervisor="kvm")
118 bd87213f Christos Stavrakakis
        xen_pvm_backend = mfact.BackendFactory(hypervisor="xen-pvm")
119 bd87213f Christos Stavrakakis
        xen_hvm_backend = mfact.BackendFactory(hypervisor="xen-hvm")
120 bd87213f Christos Stavrakakis
        with override_settings(snf_settings, GANETI_USE_HOTPLUG=True):
121 bd87213f Christos Stavrakakis
            self.assertTrue(kvm_backend.use_hotplug())
122 bd87213f Christos Stavrakakis
            self.assertFalse(xen_pvm_backend.use_hotplug())
123 bd87213f Christos Stavrakakis
            self.assertFalse(xen_hvm_backend.use_hotplug())
124 bd87213f Christos Stavrakakis
        with override_settings(snf_settings, GANETI_USE_HOTPLUG=False):
125 bd87213f Christos Stavrakakis
            self.assertFalse(kvm_backend.use_hotplug())
126 bd87213f Christos Stavrakakis
            self.assertFalse(xen_pvm_backend.use_hotplug())
127 bd87213f Christos Stavrakakis
            self.assertFalse(xen_hvm_backend.use_hotplug())
128 bd87213f Christos Stavrakakis
        kwargs = {"os": "snf-image+default",
129 bd87213f Christos Stavrakakis
                  "hvparams": {"kvm": {"foo1": "mpaz1"},
130 bd87213f Christos Stavrakakis
                               "xen-pvm": {"foo2": "mpaz2"},
131 bd87213f Christos Stavrakakis
                               "xen-hvm": {"foo3": "mpaz3"}}}
132 bd87213f Christos Stavrakakis
        with override_settings(snf_settings,
133 bd87213f Christos Stavrakakis
                               GANETI_CREATEINSTANCE_KWARGS=kwargs):
134 bd87213f Christos Stavrakakis
            self.assertEqual(kvm_backend.get_create_params(),
135 bd87213f Christos Stavrakakis
                    {"os": "snf-image+default",
136 bd87213f Christos Stavrakakis
                     "hvparams": {"foo1": "mpaz1"}})
137 bd87213f Christos Stavrakakis
            self.assertEqual(xen_pvm_backend.get_create_params(),
138 bd87213f Christos Stavrakakis
                    {"os": "snf-image+default",
139 bd87213f Christos Stavrakakis
                     "hvparams": {"foo2": "mpaz2"}})
140 bd87213f Christos Stavrakakis
            self.assertEqual(xen_hvm_backend.get_create_params(),
141 bd87213f Christos Stavrakakis
                    {"os": "snf-image+default",
142 bd87213f Christos Stavrakakis
                     "hvparams": {"foo3": "mpaz3"}})
143 bd87213f Christos Stavrakakis
        with override_settings(snf_settings, GANETI_CREATEINSTANCE_KWARGS={}):
144 bd87213f Christos Stavrakakis
            self.assertEqual(kvm_backend.get_create_params(), {"hvparams": {}})
145 bd87213f Christos Stavrakakis
146 c8908e51 Christos Stavrakakis
147 c8908e51 Christos Stavrakakis
class VirtualMachineTest(TestCase):
148 c8908e51 Christos Stavrakakis
    def setUp(self):
149 c8908e51 Christos Stavrakakis
        self.vm = mfact.VirtualMachineFactory()
150 c8908e51 Christos Stavrakakis
151 c8908e51 Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
152 c8908e51 Christos Stavrakakis
    def test_get_client(self, client):
153 c8908e51 Christos Stavrakakis
        backend = self.vm.backend
154 c8908e51 Christos Stavrakakis
        id_ = backend.id
155 c8908e51 Christos Stavrakakis
        hash_ = backend.hash
156 c8908e51 Christos Stavrakakis
        name = backend.clustername
157 c8908e51 Christos Stavrakakis
        passwd = backend.password
158 c8908e51 Christos Stavrakakis
        user = backend.username
159 c8908e51 Christos Stavrakakis
        port = backend.port
160 c8908e51 Christos Stavrakakis
        self.vm.get_client()
161 c8908e51 Christos Stavrakakis
        client.assert_called_once_with(id_, hash_, name, port, user, passwd)
162 c8908e51 Christos Stavrakakis
163 c8908e51 Christos Stavrakakis
    def test_create(self):
164 1cfd5d4d Christos Stavrakakis
        vm = VirtualMachine()
165 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.action, None)
166 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.backendjobid, None)
167 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.backendjobstatus, None)
168 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.backendopcode, None)
169 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.backendlogmsg, None)
170 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.operstate, 'BUILD')
171 c8908e51 Christos Stavrakakis
172 c8908e51 Christos Stavrakakis
173 c8908e51 Christos Stavrakakis
class NetworkTest(TestCase):
174 c8908e51 Christos Stavrakakis
    def setUp(self):
175 c8908e51 Christos Stavrakakis
        self.net = mfact.NetworkFactory()
176 c8908e51 Christos Stavrakakis
177 c8908e51 Christos Stavrakakis
    def test_tags(self):
178 c8908e51 Christos Stavrakakis
        net1 = mfact.NetworkFactory(flavor='IP_LESS_ROUTED')
179 c8908e51 Christos Stavrakakis
        self.assertEqual(net1.backend_tag, ['ip-less-routed'])
180 c8908e51 Christos Stavrakakis
        net1 = mfact.NetworkFactory(flavor='CUSTOM')
181 c8908e51 Christos Stavrakakis
        self.assertEqual(net1.backend_tag, [])
182 c8908e51 Christos Stavrakakis
183 c8908e51 Christos Stavrakakis
    def test_create_backend_network(self):
184 c8908e51 Christos Stavrakakis
        len_backends = len(Backend.objects.all())
185 c8908e51 Christos Stavrakakis
        back = mfact.BackendFactory()
186 c8908e51 Christos Stavrakakis
        self.net.create_backend_network(backend=back)
187 c8908e51 Christos Stavrakakis
        BackendNetwork.objects.get(network=self.net, backend=back)
188 c8908e51 Christos Stavrakakis
        back1 = mfact.BackendFactory()
189 c8908e51 Christos Stavrakakis
        back2 = mfact.BackendFactory()
190 c8908e51 Christos Stavrakakis
        self.net.create_backend_network()
191 c8908e51 Christos Stavrakakis
        BackendNetwork.objects.get(network=self.net, backend=back1)
192 c8908e51 Christos Stavrakakis
        BackendNetwork.objects.get(network=self.net, backend=back2)
193 c8908e51 Christos Stavrakakis
        self.assertEqual(len(BackendNetwork.objects.filter(network=self.net)),
194 c8908e51 Christos Stavrakakis
                         len_backends + 3)
195 c8908e51 Christos Stavrakakis
196 c8908e51 Christos Stavrakakis
    def test_pool(self):
197 c8908e51 Christos Stavrakakis
        pool = self.net.get_pool()
198 c8908e51 Christos Stavrakakis
        pool.network = self.net
199 c8908e51 Christos Stavrakakis
        self.assertTrue(isinstance(pool, IPPool))
200 c8908e51 Christos Stavrakakis
201 c8908e51 Christos Stavrakakis
    def test_reserve_ip(self):
202 c8908e51 Christos Stavrakakis
        net1 = mfact.NetworkFactory(subnet='192.168.2.0/24')
203 c8908e51 Christos Stavrakakis
        net1.reserve_address('192.168.2.12')
204 c8908e51 Christos Stavrakakis
        pool = net1.get_pool()
205 c8908e51 Christos Stavrakakis
        self.assertFalse(pool.is_available('192.168.2.12'))
206 c8908e51 Christos Stavrakakis
        net1.release_address('192.168.2.12')
207 c8908e51 Christos Stavrakakis
        pool = net1.get_pool()
208 c8908e51 Christos Stavrakakis
        self.assertTrue(pool.is_available('192.168.2.12'))
209 c8908e51 Christos Stavrakakis
210 c8908e51 Christos Stavrakakis
211 c8908e51 Christos Stavrakakis
class BackendNetworkTest(TestCase):
212 c8908e51 Christos Stavrakakis
    def test_mac_prefix(self):
213 c8908e51 Christos Stavrakakis
        network = mfact.NetworkFactory(mac_prefix='aa:bb:c')
214 c8908e51 Christos Stavrakakis
        backend = mfact.BackendFactory()
215 c8908e51 Christos Stavrakakis
        bnet = mfact.BackendNetworkFactory(network=network, backend=backend)
216 c8908e51 Christos Stavrakakis
        self.assertTrue(backend.index < 10)
217 c8908e51 Christos Stavrakakis
        self.assertEqual(bnet.mac_prefix, 'aa:bb:c%s' % backend.index)
218 c8908e51 Christos Stavrakakis
219 b66e4833 Christos Stavrakakis
    def test_invalid_mac(self):
220 b66e4833 Christos Stavrakakis
        network = mfact.NetworkFactory(mac_prefix='zz:bb:c')
221 b66e4833 Christos Stavrakakis
        backend = mfact.BackendFactory()
222 b66e4833 Christos Stavrakakis
        self.assertRaises(utils.InvalidMacAddress,
223 b66e4833 Christos Stavrakakis
                mfact.BackendNetworkFactory, network=network, backend=backend)
224 b66e4833 Christos Stavrakakis
225 c8908e51 Christos Stavrakakis
226 c8908e51 Christos Stavrakakis
class BridgePoolTest(TestCase):
227 c8908e51 Christos Stavrakakis
    def test_no_pool(self):
228 bb8fb9af Christos Stavrakakis
        self.assertRaises(EmptyPool,
229 c8908e51 Christos Stavrakakis
                          BridgePoolTable.get_pool)
230 c8908e51 Christos Stavrakakis
231 c8908e51 Christos Stavrakakis
    def test_two_pools(self):
232 c8908e51 Christos Stavrakakis
        mfact.BridgePoolTableFactory()
233 c8908e51 Christos Stavrakakis
        mfact.BridgePoolTableFactory()
234 c8908e51 Christos Stavrakakis
        self.assertRaises(MultipleObjectsReturned, BridgePoolTable.get_pool)
235 e8fa4283 Vassilios Karakoidas
236 452d2391 Vassilios Karakoidas
237 c8908e51 Christos Stavrakakis
class AESTest(TestCase):
238 c8908e51 Christos Stavrakakis
    def test_encrypt_decrtypt(self):
239 c8908e51 Christos Stavrakakis
        from synnefo.db import aes_encrypt as aes
240 c8908e51 Christos Stavrakakis
        old = 'bar'
241 c8908e51 Christos Stavrakakis
        new = aes.decrypt_db_charfield(aes.encrypt_db_charfield(old))
242 c8908e51 Christos Stavrakakis
        self.assertEqual(old, new)
243 8bda0440 Vassilios Karakoidas
244 c8908e51 Christos Stavrakakis
    def test_password_change(self):
245 c8908e51 Christos Stavrakakis
        from synnefo.db import aes_encrypt as aes
246 c8908e51 Christos Stavrakakis
        old_pass = aes.SECRET_ENCRYPTION_KEY
247 c8908e51 Christos Stavrakakis
        old = 'bar'
248 c8908e51 Christos Stavrakakis
        encrypted = aes.encrypt_db_charfield(old)
249 c8908e51 Christos Stavrakakis
        aes.SECRET_ENCRYPTION_KEY = 'foo2'
250 c8908e51 Christos Stavrakakis
        self.assertRaises(aes.CorruptedPassword, aes.decrypt_db_charfield,
251 c8908e51 Christos Stavrakakis
                          encrypted)
252 c8908e51 Christos Stavrakakis
        aes.SECRET_ENCRYPTION_KEY = old_pass
253 c8908e51 Christos Stavrakakis
        new = aes.decrypt_db_charfield(encrypted)
254 c8908e51 Christos Stavrakakis
        self.assertEqual(old, new)
255 8bda0440 Vassilios Karakoidas
256 c8908e51 Christos Stavrakakis
    def test_big_secret(self):
257 c8908e51 Christos Stavrakakis
        from synnefo.db import aes_encrypt as aes
258 c8908e51 Christos Stavrakakis
        old = aes.SECRET_ENCRYPTION_KEY
259 c8908e51 Christos Stavrakakis
        aes.SECRET_ENCRYPTION_KEY = \
260 c8908e51 Christos Stavrakakis
            '91490231234814234812348913289481294812398421893489'
261 c8908e51 Christos Stavrakakis
        self.assertRaises(ValueError, aes.encrypt_db_charfield, 'la')
262 c8908e51 Christos Stavrakakis
        aes.SECRET_ENCRYPTION_KEY = old