Statistics
| Branch: | Tag: | Revision:

root / logic / tests.py @ 95aee02c

History | View | Annotate | Download (12.5 kB)

1 b8033991 Georgios Gousios
# vim: set fileencoding=utf-8 :
2 48130e66 Georgios Gousios
# Copyright 2011 GRNET S.A. All rights reserved.
3 09c936a7 Vassilios Karakoidas
#
4 48130e66 Georgios Gousios
# Redistribution and use in source and binary forms, with or without
5 48130e66 Georgios Gousios
# modification, are permitted provided that the following conditions
6 48130e66 Georgios Gousios
# are met:
7 09c936a7 Vassilios Karakoidas
#
8 48130e66 Georgios Gousios
#   1. Redistributions of source code must retain the above copyright
9 48130e66 Georgios Gousios
#      notice, this list of conditions and the following disclaimer.
10 48130e66 Georgios Gousios
#
11 48130e66 Georgios Gousios
#  2. Redistributions in binary form must reproduce the above copyright
12 48130e66 Georgios Gousios
#     notice, this list of conditions and the following disclaimer in the
13 48130e66 Georgios Gousios
#     documentation and/or other materials provided with the distribution.
14 09c936a7 Vassilios Karakoidas
#
15 48130e66 Georgios Gousios
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 48130e66 Georgios Gousios
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 48130e66 Georgios Gousios
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 48130e66 Georgios Gousios
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 48130e66 Georgios Gousios
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 48130e66 Georgios Gousios
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 48130e66 Georgios Gousios
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 48130e66 Georgios Gousios
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 48130e66 Georgios Gousios
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 48130e66 Georgios Gousios
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 48130e66 Georgios Gousios
# SUCH DAMAGE.
26 09c936a7 Vassilios Karakoidas
#
27 48130e66 Georgios Gousios
# The views and conclusions contained in the software and documentation are
28 48130e66 Georgios Gousios
# those of the authors and should not be interpreted as representing official
29 48130e66 Georgios Gousios
# policies, either expressed or implied, of GRNET S.A.
30 48130e66 Georgios Gousios
31 48130e66 Georgios Gousios
# Provides automated tests for logic module
32 92c53da1 Vassilios Karakoidas
33 420f2c20 Georgios Gousios
from synnefo.db.models import *
34 03805fc8 Vangelis Koukis
from synnefo.logic import backend
35 420f2c20 Georgios Gousios
from synnefo.logic import credits
36 420f2c20 Georgios Gousios
from synnefo.logic import users
37 95aee02c Vangelis Koukis
from synnefo.logic.utils import get_rsapi_state
38 95aee02c Vangelis Koukis
39 92c53da1 Vassilios Karakoidas
from django.test import TestCase
40 95aee02c Vangelis Koukis
from django.conf import settings
41 44193110 Georgios Gousios
42 95aee02c Vangelis Koukis
import time
43 44193110 Georgios Gousios
import hashlib
44 92c53da1 Vassilios Karakoidas
45 8d97deff Vassilios Karakoidas
class CostsTestCase(TestCase):
46 8d97deff Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
47 8d97deff Vassilios Karakoidas
48 8d97deff Vassilios Karakoidas
    def test_get_costs(self):
49 8d97deff Vassilios Karakoidas
        """Test the Flavor cost-related methods method"""
50 8d97deff Vassilios Karakoidas
        # first an easy test, a Flavor with only one FlavorCost entry
51 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30001)
52 8d97deff Vassilios Karakoidas
53 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=1, day=1)
54 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2010, month=1, day=2)
55 8d97deff Vassilios Karakoidas
56 8d97deff Vassilios Karakoidas
        # we now that the cost should be 5*24 (inactive) and 10*24 (active)
57 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
58 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
59 8d97deff Vassilios Karakoidas
60 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 1, 'get_cost_active() should have returned 1 entry (%d)' %(len(r_active),))
61 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 1, 'get_cost_inactive() should have returned 1 entry (%d)'% (len(r_inactive),))
62 8d97deff Vassilios Karakoidas
63 8d97deff Vassilios Karakoidas
        self.assertEqual(10*24, r_active[0][1], 'get_cost_active() is not working properly (%d!=%d)' % (r_active[0][1], 10*24))
64 8d97deff Vassilios Karakoidas
        self.assertEqual(5*24, r_inactive[0][1], 'get_cost_inactive() is not working properly (%d!=%d)' % (r_inactive[0][1], 5*24))
65 8d97deff Vassilios Karakoidas
66 8d97deff Vassilios Karakoidas
        # The second test, will involve a more complex cost example
67 8d97deff Vassilios Karakoidas
        # The overall cost will be calculated by two FlavorCost entries
68 8d97deff Vassilios Karakoidas
69 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30000)
70 8d97deff Vassilios Karakoidas
71 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=12, day=31)
72 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2011, month=01, day=2)
73 8d97deff Vassilios Karakoidas
74 8d97deff Vassilios Karakoidas
        # this is more complicated, active costs are 5*24 + 10*24 = 360
75 8d97deff Vassilios Karakoidas
        # and inactive costs are 2*24 + 5*24 = 168
76 8d97deff Vassilios Karakoidas
77 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
78 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
79 8d97deff Vassilios Karakoidas
80 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 2, 'get_cost_active() should have returned 2 entries (%d)' %(len(r_active),))
81 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 2, 'get_cost_inactive() should have returned 2 entries (%d)'% (len(r_inactive),))
82 8d97deff Vassilios Karakoidas
83 8d97deff Vassilios Karakoidas
        ta_cost = sum([x[1] for x in r_active])
84 8d97deff Vassilios Karakoidas
        tia_cost = sum([x[1] for x in r_inactive])
85 8d97deff Vassilios Karakoidas
86 8d97deff Vassilios Karakoidas
        self.assertEqual(360, ta_cost, 'get_cost_active() is not working properly (%d!=%d)' % (ta_cost, 360))
87 8d97deff Vassilios Karakoidas
        self.assertEqual(168, tia_cost, 'get_cost_inactive() is not working properly (%d!=%d)' % (tia_cost, 168))
88 92c53da1 Vassilios Karakoidas
89 8d97deff Vassilios Karakoidas
        
90 92c53da1 Vassilios Karakoidas
class ChargeTestCase(TestCase):
91 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
92 92c53da1 Vassilios Karakoidas
93 92c53da1 Vassilios Karakoidas
    def test_charge_method(self):
94 92c53da1 Vassilios Karakoidas
        """Test VirtualMachine.charge() method"""
95 92c53da1 Vassilios Karakoidas
96 92c53da1 Vassilios Karakoidas
        # Since we have tested the costs, with this test
97 92c53da1 Vassilios Karakoidas
        # we must ensure the following:
98 92c53da1 Vassilios Karakoidas
        # 1. The vm.charged is updated
99 92c53da1 Vassilios Karakoidas
        # 2. Users credits are decreased
100 92c53da1 Vassilios Karakoidas
101 92c53da1 Vassilios Karakoidas
        vm_started = VirtualMachine.objects.get(pk=30000)
102 92c53da1 Vassilios Karakoidas
103 92c53da1 Vassilios Karakoidas
        initial_date = vm_started.charged
104 92c53da1 Vassilios Karakoidas
        initial_credits = vm_started.owner.credit
105 92c53da1 Vassilios Karakoidas
106 92c53da1 Vassilios Karakoidas
        credits.charge(vm_started)
107 92c53da1 Vassilios Karakoidas
108 92c53da1 Vassilios Karakoidas
        self.assertTrue(vm_started.charged > initial_date, 'Initial charged date should not be greater')
109 92c53da1 Vassilios Karakoidas
        self.assertTrue(initial_credits > vm_started.owner.credit, 'The user should have less credits now! (%d>%d)' % (initial_credits, vm_started.owner.credit))
110 92c53da1 Vassilios Karakoidas
111 92c53da1 Vassilios Karakoidas
112 8d97deff Vassilios Karakoidas
class DebitAccountTestCase(TestCase):
113 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
114 92c53da1 Vassilios Karakoidas
115 8d97deff Vassilios Karakoidas
    def test_debit_account(self):
116 92c53da1 Vassilios Karakoidas
        """Test a SynnefoUser object"""
117 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
118 92c53da1 Vassilios Karakoidas
        v_machine = VirtualMachine.objects.get(pk=30000)
119 92c53da1 Vassilios Karakoidas
120 92c53da1 Vassilios Karakoidas
        # charge the user
121 92c53da1 Vassilios Karakoidas
        credits.debit_account(s_user, 10, v_machine, "This should be a structured debit message!")
122 92c53da1 Vassilios Karakoidas
123 92c53da1 Vassilios Karakoidas
        # should have only one debit object
124 92c53da1 Vassilios Karakoidas
        d_list = Debit.objects.all()
125 92c53da1 Vassilios Karakoidas
126 8d97deff Vassilios Karakoidas
        self.assertEqual(len(d_list), 1, 'debit_account() writes more than one or zero (%d) debit entries!' % ( len(d_list), ))
127 92c53da1 Vassilios Karakoidas
128 92c53da1 Vassilios Karakoidas
        # retrieve the user, now he/she should have zero credits
129 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
130 92c53da1 Vassilios Karakoidas
131 92c53da1 Vassilios Karakoidas
        self.assertEqual(0, s_user.credit, 'SynnefoUser (pk=30000) should have zero credits (%d)' % ( s_user.credit, ))
132 420f2c20 Georgios Gousios
133 95aee02c Vangelis Koukis
134 420f2c20 Georgios Gousios
class AuthTestCase(TestCase):
135 420f2c20 Georgios Gousios
    fixtures = [ 'db_test_data' ]
136 44193110 Georgios Gousios
137 44193110 Georgios Gousios
    def _register_user(self):
138 420f2c20 Georgios Gousios
        users.register_student ("Jimmy Page", "jpage", "jpage@zoso.com")
139 938e89ab Georgios Gousios
        self.user = SynnefoUser.objects.get(name = "jpage")
140 44193110 Georgios Gousios
141 44193110 Georgios Gousios
    def test_register(self):
142 44193110 Georgios Gousios
        """ test user registration
143 44193110 Georgios Gousios
        """
144 938e89ab Georgios Gousios
        self._register_user()
145 938e89ab Georgios Gousios
        self.assertNotEquals(self.user, None)
146 dd53338a Georgios Gousios
147 44193110 Georgios Gousios
        #Check hash generation
148 44193110 Georgios Gousios
        md5 = hashlib.md5()
149 938e89ab Georgios Gousios
        md5.update(self.user.uniq)
150 938e89ab Georgios Gousios
        md5.update(self.user.name)
151 8af3b61f Georgios Gousios
        md5.update(time.asctime())
152 44193110 Georgios Gousios
153 8af3b61f Georgios Gousios
        self.assertEquals(self.user.auth_token, md5.hexdigest())
154 44193110 Georgios Gousios
155 44193110 Georgios Gousios
    def test_del_user(self):
156 44193110 Georgios Gousios
        """ test user deletion
157 44193110 Georgios Gousios
        """
158 8af3b61f Georgios Gousios
        self._register_user()
159 8af3b61f Georgios Gousios
        self.assertNotEquals(self.user, None)
160 8af3b61f Georgios Gousios
        
161 8af3b61f Georgios Gousios
        users.delete_user(self.user)
162 44193110 Georgios Gousios
163 95aee02c Vangelis Koukis
        self.assertRaises(SynnefoUser.DoesNotExist, SynnefoUser.objects.get,
164 95aee02c Vangelis Koukis
                          name = "jpage")
165 95aee02c Vangelis Koukis
166 95aee02c Vangelis Koukis
167 95aee02c Vangelis Koukis
class ProcessOpStatusTestCase(TestCase):
168 95aee02c Vangelis Koukis
    fixtures = ['db_test_data']
169 95aee02c Vangelis Koukis
    msg_op = {
170 95aee02c Vangelis Koukis
        'instance': 'instance-name',
171 95aee02c Vangelis Koukis
        'type': 'ganeti-op-status',
172 95aee02c Vangelis Koukis
        'operation': 'OP_INSTANCE_STARTUP',
173 95aee02c Vangelis Koukis
        'jobId': 0,
174 95aee02c Vangelis Koukis
        'status': 'success',
175 95aee02c Vangelis Koukis
        'logmsg': 'unittest - simulated message'
176 95aee02c Vangelis Koukis
    }
177 95aee02c Vangelis Koukis
178 95aee02c Vangelis Koukis
    def test_op_startup_success(self):
179 95aee02c Vangelis Koukis
        """Test notification for successful OP_INSTANCE_START"""
180 95aee02c Vangelis Koukis
        msg = self.msg_op
181 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_STARTUP'
182 95aee02c Vangelis Koukis
        msg['status'] = 'success'
183 95aee02c Vangelis Koukis
184 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
185 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
186 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
187 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
188 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'ACTIVE')
189 95aee02c Vangelis Koukis
190 95aee02c Vangelis Koukis
    def test_op_shutdown_success(self):
191 95aee02c Vangelis Koukis
        """Test notification for successful OP_INSTANCE_SHUTDOWN"""
192 95aee02c Vangelis Koukis
        msg = self.msg_op
193 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_SHUTDOWN'
194 95aee02c Vangelis Koukis
        msg['status'] = 'success'
195 95aee02c Vangelis Koukis
196 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
197 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
198 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
199 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
200 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'STOPPED')
201 95aee02c Vangelis Koukis
202 95aee02c Vangelis Koukis
    def test_op_reboot_success(self):
203 95aee02c Vangelis Koukis
        """Test notification for successful OP_INSTANCE_REBOOT"""
204 95aee02c Vangelis Koukis
        msg = self.msg_op
205 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_REBOOT'
206 95aee02c Vangelis Koukis
        msg['status'] = 'success'
207 95aee02c Vangelis Koukis
208 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
209 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
210 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
211 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
212 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'ACTIVE')
213 95aee02c Vangelis Koukis
214 95aee02c Vangelis Koukis
    def test_op_create_success(self):
215 95aee02c Vangelis Koukis
        """Test notification for successful OP_INSTANCE_CREATE"""
216 95aee02c Vangelis Koukis
        msg = self.msg_op
217 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_CREATE'
218 95aee02c Vangelis Koukis
        msg['status'] = 'success'
219 95aee02c Vangelis Koukis
220 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
221 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
222 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
223 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
224 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'ACTIVE')
225 95aee02c Vangelis Koukis
226 95aee02c Vangelis Koukis
    def test_op_remove_success(self):
227 95aee02c Vangelis Koukis
        """Test notification for successful OP_INSTANCE_REMOVE"""
228 95aee02c Vangelis Koukis
        msg = self.msg_op
229 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_REMOVE'
230 95aee02c Vangelis Koukis
        msg['status'] = 'success'
231 95aee02c Vangelis Koukis
232 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
233 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
234 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
235 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
236 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'DELETED')
237 95aee02c Vangelis Koukis
        self.assertTrue(vm.deleted)
238 95aee02c Vangelis Koukis
239 95aee02c Vangelis Koukis
    def test_unknown_op(self):
240 95aee02c Vangelis Koukis
        """Test notification for unknown Ganeti op raises exception"""
241 95aee02c Vangelis Koukis
        msg = self.msg_op
242 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_SOMETHING_ELSE'
243 95aee02c Vangelis Koukis
        msg['status'] = 'success'
244 95aee02c Vangelis Koukis
245 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
246 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
247 95aee02c Vangelis Koukis
        self.assertRaises(VirtualMachine.InvalidBackendMsgError,
248 95aee02c Vangelis Koukis
                          backend.process_op_status,
249 95aee02c Vangelis Koukis
                          vm, msg["jobId"], msg["operation"],
250 95aee02c Vangelis Koukis
                          msg["status"], msg["logmsg"])
251 95aee02c Vangelis Koukis
252 95aee02c Vangelis Koukis
    def test_op_create_error(self):
253 95aee02c Vangelis Koukis
        """Test notification for failed OP_INSTANCE_CREATE"""
254 95aee02c Vangelis Koukis
        msg = self.msg_op
255 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_CREATE'
256 95aee02c Vangelis Koukis
        msg['status'] = 'error'
257 95aee02c Vangelis Koukis
258 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
259 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
260 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
261 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
262 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'ERROR')
263 95aee02c Vangelis Koukis
        self.assertFalse(vm.deleted)
264 95aee02c Vangelis Koukis
265 95aee02c Vangelis Koukis
    def test_remove_machine_in_error(self):
266 95aee02c Vangelis Koukis
        """Test notification for failed OP_INSTANCE_REMOVE, server in ERROR"""
267 95aee02c Vangelis Koukis
        msg = self.msg_op
268 95aee02c Vangelis Koukis
        msg['operation'] = 'OP_INSTANCE_REMOVE'
269 95aee02c Vangelis Koukis
        msg['status'] = 'error'
270 95aee02c Vangelis Koukis
271 95aee02c Vangelis Koukis
        # This machine is initially in BUILD
272 95aee02c Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30002)
273 95aee02c Vangelis Koukis
        backend.process_op_status(vm, 0, "OP_INSTANCE_CREATE", "error", "test")
274 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'ERROR')
275 95aee02c Vangelis Koukis
276 95aee02c Vangelis Koukis
        backend.process_op_status(vm, msg["jobId"], msg["operation"],
277 95aee02c Vangelis Koukis
                                  msg["status"], msg["logmsg"])
278 95aee02c Vangelis Koukis
        self.assertEquals(get_rsapi_state(vm), 'DELETED')
279 95aee02c Vangelis Koukis
        self.assertTrue(vm.deleted)
280 03805fc8 Vangelis Koukis
281 03805fc8 Vangelis Koukis
282 03805fc8 Vangelis Koukis
class ProcessNetStatusTestCase(TestCase):
283 03805fc8 Vangelis Koukis
    fixtures = ['db_test_data']
284 03805fc8 Vangelis Koukis
    def test_set_ipv4(self):
285 03805fc8 Vangelis Koukis
        """Test reception of a net status notification"""
286 03805fc8 Vangelis Koukis
        msg = {'instance': 'instance-name',
287 03805fc8 Vangelis Koukis
               'type':     'ganeti-net-status',
288 03805fc8 Vangelis Koukis
               'nics': [
289 03805fc8 Vangelis Koukis
                   {'ip': '192.168.33.1', 'mac': 'aa:00:00:58:1e:b9'}
290 03805fc8 Vangelis Koukis
               ]
291 03805fc8 Vangelis Koukis
        }
292 03805fc8 Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30000)
293 03805fc8 Vangelis Koukis
        backend.process_net_status(vm, msg['nics'])
294 f533f224 Vangelis Koukis
        self.assertEquals(vm.nics.all()[0].ipv4, '192.168.33.1')
295 03805fc8 Vangelis Koukis
296 03805fc8 Vangelis Koukis
    def test_set_empty_ipv4(self):
297 03805fc8 Vangelis Koukis
        """Test reception of a net status notification with no IPv4 assigned"""
298 03805fc8 Vangelis Koukis
        msg = {'instance': 'instance-name',
299 03805fc8 Vangelis Koukis
               'type':     'ganeti-net-status',
300 03805fc8 Vangelis Koukis
               'nics': [
301 03805fc8 Vangelis Koukis
                   {'ip': '', 'mac': 'aa:00:00:58:1e:b9'}
302 03805fc8 Vangelis Koukis
               ]
303 03805fc8 Vangelis Koukis
        }
304 03805fc8 Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30000)
305 03805fc8 Vangelis Koukis
        backend.process_net_status(vm, msg['nics'])
306 f533f224 Vangelis Koukis
        self.assertEquals(vm.nics.all()[0].ipv4, '')
307 ec63ae8a Georgios Gousios
308 ec63ae8a Georgios Gousios
309 b8033991 Georgios Gousios
class UsersTestCase(TestCase):
310 b8033991 Georgios Gousios
311 b8033991 Georgios Gousios
    def test_create_uname(self):
312 b8033991 Georgios Gousios
        username = users.create_uname("Donald Knuth")
313 b8033991 Georgios Gousios
        self.assertEquals(username, "knuthd")
314 b8033991 Georgios Gousios
315 b8033991 Georgios Gousios
        username = users.create_uname("Nemichandra Siddhanta Chakravati")
316 b8033991 Georgios Gousios
        self.assertEquals(username, "chakravn")
317 b8033991 Georgios Gousios
318 b8033991 Georgios Gousios
        username = users.create_uname(u'Γεώργιος Παπαγεωργίου')
319 b8033991 Georgios Gousios
        self.assertEquals(username, u'παπαγεωγ')