root / snf-cyclades-app / synnefo / logic / tests.py @ 2cd55da6
History | View | Annotate | Download (36.2 kB)
1 | b8033991 | Georgios Gousios | # vim: set fileencoding=utf-8 :
|
---|---|---|---|
2 | 47eeffa9 | Christos Stavrakakis | # Copyright 2012 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 | c25cc9ec | Vangelis Koukis | from random import randint |
34 | c25cc9ec | Vangelis Koukis | |
35 | c25cc9ec | Vangelis Koukis | from django.test import TestCase |
36 | c25cc9ec | Vangelis Koukis | |
37 | 41a7fae7 | Christos Stavrakakis | from snf_django.lib.api import faults |
38 | 420f2c20 | Georgios Gousios | from synnefo.db.models import * |
39 | 47eeffa9 | Christos Stavrakakis | from synnefo.db import models_factory as mfactory |
40 | 41a7fae7 | Christos Stavrakakis | from synnefo.logic import reconciliation, servers |
41 | 47eeffa9 | Christos Stavrakakis | from synnefo.lib.utils import split_time |
42 | 47eeffa9 | Christos Stavrakakis | from datetime import datetime |
43 | 47eeffa9 | Christos Stavrakakis | from mock import patch |
44 | 47eeffa9 | Christos Stavrakakis | from synnefo.api.util import allocate_resource |
45 | fd95834e | Christos Stavrakakis | from synnefo.logic.callbacks import (update_db, update_network, |
46 | cc92b70f | Christos Stavrakakis | update_build_progress) |
47 | 184a2a8c | Christos Stavrakakis | from snf_django.utils.testing import mocked_quotaholder |
48 | 47eeffa9 | Christos Stavrakakis | |
49 | 47eeffa9 | Christos Stavrakakis | now = datetime.now |
50 | 47eeffa9 | Christos Stavrakakis | from time import time |
51 | 47eeffa9 | Christos Stavrakakis | import json |
52 | 47eeffa9 | Christos Stavrakakis | |
53 | 41a7fae7 | Christos Stavrakakis | |
54 | 41a7fae7 | Christos Stavrakakis | @patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
55 | 41a7fae7 | Christos Stavrakakis | class ServerCommandTest(TestCase): |
56 | 41a7fae7 | Christos Stavrakakis | def test_pending_task(self, mrapi): |
57 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1) |
58 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.start, vm)
|
59 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1) |
60 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BuildInProgress, servers.start, vm)
|
61 | 41a7fae7 | Christos Stavrakakis | # Assert always succeeds
|
62 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1) |
63 | 41a7fae7 | Christos Stavrakakis | mrapi().DeleteInstance.return_value = 1
|
64 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
65 | 41a7fae7 | Christos Stavrakakis | servers.destroy(vm) |
66 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1) |
67 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
68 | 41a7fae7 | Christos Stavrakakis | servers.destroy(vm) |
69 | 41a7fae7 | Christos Stavrakakis | |
70 | 41a7fae7 | Christos Stavrakakis | def test_deleted_vm(self, mrapi): |
71 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(deleted=True)
|
72 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.start, vm)
|
73 | 41a7fae7 | Christos Stavrakakis | |
74 | 41a7fae7 | Christos Stavrakakis | def test_invalid_operstate_for_action(self, mrapi): |
75 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate="STARTED")
|
76 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.start, vm)
|
77 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
|
78 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.stop, vm)
|
79 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate="STARTED")
|
80 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.resize, vm)
|
81 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
|
82 | 41a7fae7 | Christos Stavrakakis | self.assertRaises(faults.BadRequest, servers.stop, vm)
|
83 | 41a7fae7 | Christos Stavrakakis | #test valid
|
84 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.return_value = 1
|
85 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
86 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
87 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
88 | 41a7fae7 | Christos Stavrakakis | vm.task_job_id = None
|
89 | 41a7fae7 | Christos Stavrakakis | vm.save() |
90 | 41a7fae7 | Christos Stavrakakis | mrapi().RebootInstance.return_value = 1
|
91 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
92 | 41a7fae7 | Christos Stavrakakis | servers.reboot(vm, "HARD")
|
93 | 41a7fae7 | Christos Stavrakakis | |
94 | 41a7fae7 | Christos Stavrakakis | def test_commission(self, mrapi): |
95 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
|
96 | 41a7fae7 | Christos Stavrakakis | # Still pending
|
97 | 41a7fae7 | Christos Stavrakakis | vm.serial = mfactory.QuotaHolderSerialFactory(serial=200,
|
98 | 41a7fae7 | Christos Stavrakakis | resolved=False,
|
99 | 41a7fae7 | Christos Stavrakakis | pending=True)
|
100 | 41a7fae7 | Christos Stavrakakis | serial = vm.serial |
101 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.return_value = 1
|
102 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
103 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
104 | 41a7fae7 | Christos Stavrakakis | m.resolve_commissions.assert_called_once_with('', [],
|
105 | 41a7fae7 | Christos Stavrakakis | [serial.serial]) |
106 | 41a7fae7 | Christos Stavrakakis | self.assertTrue(m.issue_one_commission.called)
|
107 | 41a7fae7 | Christos Stavrakakis | # Not pending, rejct
|
108 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
109 | 41a7fae7 | Christos Stavrakakis | vm.serial = mfactory.QuotaHolderSerialFactory(serial=400,
|
110 | 41a7fae7 | Christos Stavrakakis | resolved=False,
|
111 | 41a7fae7 | Christos Stavrakakis | pending=False,
|
112 | 41a7fae7 | Christos Stavrakakis | accept=False)
|
113 | 41a7fae7 | Christos Stavrakakis | serial = vm.serial |
114 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.return_value = 1
|
115 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
116 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
117 | 41a7fae7 | Christos Stavrakakis | m.resolve_commissions.assert_called_once_with('', [],
|
118 | 41a7fae7 | Christos Stavrakakis | [serial.serial]) |
119 | 41a7fae7 | Christos Stavrakakis | self.assertTrue(m.issue_one_commission.called)
|
120 | 41a7fae7 | Christos Stavrakakis | # Not pending, accept
|
121 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
122 | 41a7fae7 | Christos Stavrakakis | vm.serial = mfactory.QuotaHolderSerialFactory(serial=600,
|
123 | 41a7fae7 | Christos Stavrakakis | resolved=False,
|
124 | 41a7fae7 | Christos Stavrakakis | pending=False,
|
125 | 41a7fae7 | Christos Stavrakakis | accept=True)
|
126 | 41a7fae7 | Christos Stavrakakis | serial = vm.serial |
127 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.return_value = 1
|
128 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
129 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
130 | 41a7fae7 | Christos Stavrakakis | m.resolve_commissions.assert_called_once_with('', [serial.serial],
|
131 | 41a7fae7 | Christos Stavrakakis | []) |
132 | 41a7fae7 | Christos Stavrakakis | self.assertTrue(m.issue_one_commission.called)
|
133 | 41a7fae7 | Christos Stavrakakis | |
134 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.side_effect = ValueError
|
135 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
136 | 41a7fae7 | Christos Stavrakakis | vm.serial = None
|
137 | 41a7fae7 | Christos Stavrakakis | # Test reject if Ganeti erro
|
138 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
139 | 41a7fae7 | Christos Stavrakakis | try:
|
140 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
141 | 41a7fae7 | Christos Stavrakakis | except:
|
142 | 41a7fae7 | Christos Stavrakakis | m.resolve_commissions.assert_called_once_with('', [],
|
143 | 41a7fae7 | Christos Stavrakakis | [vm.serial.serial]) |
144 | 41a7fae7 | Christos Stavrakakis | |
145 | 41a7fae7 | Christos Stavrakakis | def test_task_after(self, mrapi): |
146 | 41a7fae7 | Christos Stavrakakis | return
|
147 | 41a7fae7 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
148 | 41a7fae7 | Christos Stavrakakis | mrapi().StartupInstance.return_value = 1
|
149 | 41a7fae7 | Christos Stavrakakis | mrapi().ShutdownInstance.return_value = 2
|
150 | 41a7fae7 | Christos Stavrakakis | mrapi().RebootInstance.return_value = 2
|
151 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
152 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
153 | 41a7fae7 | Christos Stavrakakis | vm.operstate = "STOPPED"
|
154 | 41a7fae7 | Christos Stavrakakis | servers.start(vm) |
155 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task, "START") |
156 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task_job_id, 1) |
157 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
158 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
159 | 41a7fae7 | Christos Stavrakakis | vm.operstate = "STARTED"
|
160 | 41a7fae7 | Christos Stavrakakis | servers.stop(vm) |
161 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task, "STOP") |
162 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task_job_id, 2) |
163 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder() as m: |
164 | 41a7fae7 | Christos Stavrakakis | vm.task = None
|
165 | 41a7fae7 | Christos Stavrakakis | servers.reboot(vm) |
166 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task, "REBOOT") |
167 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(vm.task_job_id, 3) |
168 | 41a7fae7 | Christos Stavrakakis | |
169 | 41a7fae7 | Christos Stavrakakis | |
170 | 41a7fae7 | Christos Stavrakakis | |
171 | 47eeffa9 | Christos Stavrakakis | ## Test Callbacks
|
172 | 47eeffa9 | Christos Stavrakakis | |
173 | 47eeffa9 | Christos Stavrakakis | |
174 | 47eeffa9 | Christos Stavrakakis | @patch('synnefo.lib.amqp.AMQPClient') |
175 | 47eeffa9 | Christos Stavrakakis | class UpdateDBTest(TestCase): |
176 | 47eeffa9 | Christos Stavrakakis | def create_msg(self, **kwargs): |
177 | 47eeffa9 | Christos Stavrakakis | """Create snf-ganeti-eventd message"""
|
178 | 47eeffa9 | Christos Stavrakakis | msg = {'event_time': split_time(time())}
|
179 | 47eeffa9 | Christos Stavrakakis | msg['type'] = 'ganeti-op-status' |
180 | 47eeffa9 | Christos Stavrakakis | msg['status'] = 'success' |
181 | 47eeffa9 | Christos Stavrakakis | msg['jobId'] = 1 |
182 | 47eeffa9 | Christos Stavrakakis | msg['logmsg'] = 'Dummy Log' |
183 | 47eeffa9 | Christos Stavrakakis | for key, val in kwargs.items(): |
184 | 47eeffa9 | Christos Stavrakakis | msg[key] = val |
185 | 47eeffa9 | Christos Stavrakakis | message = {'body': json.dumps(msg)}
|
186 | 47eeffa9 | Christos Stavrakakis | return message
|
187 | 47eeffa9 | Christos Stavrakakis | |
188 | 47eeffa9 | Christos Stavrakakis | def test_missing_attribute(self, client): |
189 | 47eeffa9 | Christos Stavrakakis | update_db(client, json.dumps({'body': {}}))
|
190 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_reject.called)
|
191 | 47eeffa9 | Christos Stavrakakis | |
192 | 47eeffa9 | Christos Stavrakakis | def test_unhandled_exception(self, client): |
193 | 47eeffa9 | Christos Stavrakakis | update_db(client, {}) |
194 | 47eeffa9 | Christos Stavrakakis | client.basic_reject.assert_called_once() |
195 | 47eeffa9 | Christos Stavrakakis | |
196 | 47eeffa9 | Christos Stavrakakis | def test_missing_instance(self, client): |
197 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
198 | 47eeffa9 | Christos Stavrakakis | instance='foo')
|
199 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
200 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
201 | 47eeffa9 | Christos Stavrakakis | |
202 | 47eeffa9 | Christos Stavrakakis | def test_wrong_type(self, client): |
203 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(type="WRONG_TYPE") |
204 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
205 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_nack.called)
|
206 | 47eeffa9 | Christos Stavrakakis | |
207 | b66e4833 | Christos Stavrakakis | def test_old_msg(self, client): |
208 | b66e4833 | Christos Stavrakakis | from time import sleep |
209 | b66e4833 | Christos Stavrakakis | from datetime import datetime |
210 | b66e4833 | Christos Stavrakakis | old_time = time() |
211 | b66e4833 | Christos Stavrakakis | sleep(0.01)
|
212 | b66e4833 | Christos Stavrakakis | new_time = datetime.fromtimestamp(time()) |
213 | b66e4833 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(backendtime=new_time) |
214 | b66e4833 | Christos Stavrakakis | vm.operstate = 'STOPPED'
|
215 | b66e4833 | Christos Stavrakakis | vm.save() |
216 | b66e4833 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
217 | b66e4833 | Christos Stavrakakis | event_time=split_time(old_time), |
218 | b66e4833 | Christos Stavrakakis | instance=vm.backend_vm_id) |
219 | b66e4833 | Christos Stavrakakis | update_db(client, msg) |
220 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
221 | b66e4833 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
222 | b66e4833 | Christos Stavrakakis | self.assertEquals(db_vm.operstate, "STOPPED") |
223 | b66e4833 | Christos Stavrakakis | self.assertEquals(db_vm.backendtime, new_time)
|
224 | b66e4833 | Christos Stavrakakis | |
225 | 47eeffa9 | Christos Stavrakakis | def test_start(self, client): |
226 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
227 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
228 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
229 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
230 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
231 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
232 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
233 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'STARTED') |
234 | 47eeffa9 | Christos Stavrakakis | |
235 | 47eeffa9 | Christos Stavrakakis | def test_stop(self, client): |
236 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
237 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SHUTDOWN', |
238 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
239 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
240 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
241 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
242 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
243 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'STOPPED') |
244 | 47eeffa9 | Christos Stavrakakis | |
245 | 47eeffa9 | Christos Stavrakakis | def test_reboot(self, client): |
246 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
247 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_REBOOT', |
248 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
249 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
250 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
251 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
252 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'STARTED') |
253 | 47eeffa9 | Christos Stavrakakis | |
254 | 47eeffa9 | Christos Stavrakakis | def test_remove(self, client): |
255 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
256 | 47eeffa9 | Christos Stavrakakis | # Also create a NIC
|
257 | 72dea98f | Christos Stavrakakis | nic = mfactory.NetworkInterfaceFactory(machine=vm) |
258 | 72dea98f | Christos Stavrakakis | nic.network.get_pool().reserve(nic.ipv4) |
259 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_REMOVE', |
260 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
261 | 184a2a8c | Christos Stavrakakis | with mocked_quotaholder():
|
262 | 184a2a8c | Christos Stavrakakis | update_db(client, msg) |
263 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
264 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
265 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'DESTROYED') |
266 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(db_vm.deleted)
|
267 | 47eeffa9 | Christos Stavrakakis | # Check that nics are deleted
|
268 | 47eeffa9 | Christos Stavrakakis | self.assertFalse(db_vm.nics.all())
|
269 | 72dea98f | Christos Stavrakakis | self.assertTrue(nic.network.get_pool().is_available(nic.ipv4))
|
270 | 72dea98f | Christos Stavrakakis | vm2 = mfactory.VirtualMachineFactory() |
271 | 72dea98f | Christos Stavrakakis | network = mfactory.NetworkFactory() |
272 | 72dea98f | Christos Stavrakakis | fp1 = mfactory.FloatingIPFactory(machine=vm2, network=network) |
273 | 72dea98f | Christos Stavrakakis | fp2 = mfactory.FloatingIPFactory(machine=vm2, network=network) |
274 | 72dea98f | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm2, network=network, |
275 | 72dea98f | Christos Stavrakakis | ipv4=fp1.ipv4) |
276 | 72dea98f | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm2, network=network, |
277 | 72dea98f | Christos Stavrakakis | ipv4=fp2.ipv4) |
278 | 72dea98f | Christos Stavrakakis | pool = network.get_pool() |
279 | 72dea98f | Christos Stavrakakis | pool.reserve(fp1.ipv4) |
280 | 72dea98f | Christos Stavrakakis | pool.reserve(fp2.ipv4) |
281 | 72dea98f | Christos Stavrakakis | pool.save() |
282 | 72dea98f | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_REMOVE', |
283 | 72dea98f | Christos Stavrakakis | instance=vm2.backend_vm_id) |
284 | 72dea98f | Christos Stavrakakis | with mocked_quotaholder():
|
285 | 72dea98f | Christos Stavrakakis | update_db(client, msg) |
286 | 72dea98f | Christos Stavrakakis | client.basic_ack.assert_called_once() |
287 | 72dea98f | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
288 | 72dea98f | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'DESTROYED') |
289 | 72dea98f | Christos Stavrakakis | self.assertTrue(db_vm.deleted)
|
290 | 72dea98f | Christos Stavrakakis | self.assertEqual(FloatingIP.objects.get(id=fp1.id).machine, None) |
291 | 72dea98f | Christos Stavrakakis | self.assertEqual(FloatingIP.objects.get(id=fp2.id).machine, None) |
292 | 72dea98f | Christos Stavrakakis | pool = network.get_pool() |
293 | 72dea98f | Christos Stavrakakis | # Test that floating ips are not released
|
294 | 72dea98f | Christos Stavrakakis | self.assertFalse(pool.is_available(fp1.ipv4))
|
295 | 72dea98f | Christos Stavrakakis | self.assertFalse(pool.is_available(fp2.ipv4))
|
296 | 47eeffa9 | Christos Stavrakakis | |
297 | 47eeffa9 | Christos Stavrakakis | def test_create(self, client): |
298 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
299 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_CREATE', |
300 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
301 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
302 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
303 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
304 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'STARTED') |
305 | 47eeffa9 | Christos Stavrakakis | |
306 | 47eeffa9 | Christos Stavrakakis | def test_create_error(self, client): |
307 | 47eeffa9 | Christos Stavrakakis | """Test that error create sets vm to ERROR state"""
|
308 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
309 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_CREATE', |
310 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id, |
311 | 47eeffa9 | Christos Stavrakakis | status='error')
|
312 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
313 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
314 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
315 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'ERROR') |
316 | 47eeffa9 | Christos Stavrakakis | |
317 | 47eeffa9 | Christos Stavrakakis | def test_remove_from_error(self, client): |
318 | 47eeffa9 | Christos Stavrakakis | """Test that error removes delete error builds"""
|
319 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate='ERROR')
|
320 | 47eeffa9 | Christos Stavrakakis | # Also create a NIC
|
321 | 47eeffa9 | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm) |
322 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_REMOVE', |
323 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
324 | 184a2a8c | Christos Stavrakakis | with mocked_quotaholder():
|
325 | 184a2a8c | Christos Stavrakakis | update_db(client, msg) |
326 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
327 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
328 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, 'DESTROYED') |
329 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(db_vm.deleted)
|
330 | 47eeffa9 | Christos Stavrakakis | # Check that nics are deleted
|
331 | 47eeffa9 | Christos Stavrakakis | self.assertFalse(db_vm.nics.all())
|
332 | 47eeffa9 | Christos Stavrakakis | |
333 | 47eeffa9 | Christos Stavrakakis | def test_other_error(self, client): |
334 | 47eeffa9 | Christos Stavrakakis | """Test that other error messages do no affect the VM"""
|
335 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
336 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
337 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id, |
338 | 47eeffa9 | Christos Stavrakakis | status='error')
|
339 | 47eeffa9 | Christos Stavrakakis | update_db(client, msg) |
340 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
341 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
342 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, vm.operstate)
|
343 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_vm.backendtime, vm.backendtime)
|
344 | 47eeffa9 | Christos Stavrakakis | |
345 | ca4d59e3 | Christos Stavrakakis | def test_resize_msg(self, client): |
346 | ca4d59e3 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
347 | ca4d59e3 | Christos Stavrakakis | # Test empty beparams
|
348 | ca4d59e3 | Christos Stavrakakis | for status in ["success", "error"]: |
349 | ca4d59e3 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
350 | ca4d59e3 | Christos Stavrakakis | instance=vm.backend_vm_id, |
351 | ca4d59e3 | Christos Stavrakakis | beparams={}, |
352 | ca4d59e3 | Christos Stavrakakis | status=status) |
353 | ca4d59e3 | Christos Stavrakakis | client.reset_mock() |
354 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
355 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
356 | ca4d59e3 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
357 | ca4d59e3 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
358 | ca4d59e3 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, vm.operstate)
|
359 | ca4d59e3 | Christos Stavrakakis | # Test intermediate states
|
360 | 2cd55da6 | Christos Stavrakakis | vm.operstate = "STOPPED"
|
361 | 2cd55da6 | Christos Stavrakakis | vm.save() |
362 | ca4d59e3 | Christos Stavrakakis | for status in ["queued", "waiting", "running"]: |
363 | ca4d59e3 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
364 | ca4d59e3 | Christos Stavrakakis | instance=vm.backend_vm_id, |
365 | ca4d59e3 | Christos Stavrakakis | beparams={"vcpus": 4, "minmem": 2048, |
366 | ca4d59e3 | Christos Stavrakakis | "maxmem": 2048}, |
367 | ca4d59e3 | Christos Stavrakakis | status=status) |
368 | ca4d59e3 | Christos Stavrakakis | client.reset_mock() |
369 | ca4d59e3 | Christos Stavrakakis | update_db(client, msg) |
370 | ca4d59e3 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
371 | ca4d59e3 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
372 | 41a7fae7 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, "STOPPED") |
373 | ca4d59e3 | Christos Stavrakakis | # Test operstate after error
|
374 | ca4d59e3 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
375 | ca4d59e3 | Christos Stavrakakis | instance=vm.backend_vm_id, |
376 | ca4d59e3 | Christos Stavrakakis | beparams={"vcpus": 4}, |
377 | ca4d59e3 | Christos Stavrakakis | status="error")
|
378 | ca4d59e3 | Christos Stavrakakis | client.reset_mock() |
379 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
380 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
381 | ca4d59e3 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
382 | ca4d59e3 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
383 | ca4d59e3 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, "STOPPED") |
384 | ca4d59e3 | Christos Stavrakakis | # Test success
|
385 | ca4d59e3 | Christos Stavrakakis | f1 = mfactory.FlavorFactory(cpu=4, ram=1024, disk_template="drbd", |
386 | ca4d59e3 | Christos Stavrakakis | disk=1024)
|
387 | ca4d59e3 | Christos Stavrakakis | vm.flavor = f1 |
388 | ca4d59e3 | Christos Stavrakakis | vm.save() |
389 | ca4d59e3 | Christos Stavrakakis | f2 = mfactory.FlavorFactory(cpu=8, ram=2048, disk_template="drbd", |
390 | ca4d59e3 | Christos Stavrakakis | disk=1024)
|
391 | ca4d59e3 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
392 | ca4d59e3 | Christos Stavrakakis | instance=vm.backend_vm_id, |
393 | ca4d59e3 | Christos Stavrakakis | beparams={"vcpus": 8, "minmem": 2048, |
394 | ca4d59e3 | Christos Stavrakakis | "maxmem": 2048}, |
395 | ca4d59e3 | Christos Stavrakakis | status="success")
|
396 | ca4d59e3 | Christos Stavrakakis | client.reset_mock() |
397 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
398 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
399 | ca4d59e3 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
400 | ca4d59e3 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
401 | ca4d59e3 | Christos Stavrakakis | self.assertEqual(db_vm.operstate, "STOPPED") |
402 | ca4d59e3 | Christos Stavrakakis | self.assertEqual(db_vm.flavor, f2)
|
403 | ca4d59e3 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
404 | ca4d59e3 | Christos Stavrakakis | instance=vm.backend_vm_id, |
405 | ca4d59e3 | Christos Stavrakakis | beparams={"vcpus": 100, "minmem": 2048, |
406 | ca4d59e3 | Christos Stavrakakis | "maxmem": 2048}, |
407 | ca4d59e3 | Christos Stavrakakis | status="success")
|
408 | ca4d59e3 | Christos Stavrakakis | client.reset_mock() |
409 | 41a7fae7 | Christos Stavrakakis | with mocked_quotaholder():
|
410 | 41a7fae7 | Christos Stavrakakis | update_db(client, msg) |
411 | ca4d59e3 | Christos Stavrakakis | self.assertTrue(client.basic_reject.called)
|
412 | ca4d59e3 | Christos Stavrakakis | |
413 | 47eeffa9 | Christos Stavrakakis | |
414 | 47eeffa9 | Christos Stavrakakis | @patch('synnefo.lib.amqp.AMQPClient') |
415 | 47eeffa9 | Christos Stavrakakis | class UpdateNetTest(TestCase): |
416 | 47eeffa9 | Christos Stavrakakis | def create_msg(self, **kwargs): |
417 | 47eeffa9 | Christos Stavrakakis | """Create snf-ganeti-hook message"""
|
418 | 47eeffa9 | Christos Stavrakakis | msg = {'event_time': split_time(time())}
|
419 | fd95834e | Christos Stavrakakis | msg['type'] = 'ganeti-op-status' |
420 | fd95834e | Christos Stavrakakis | msg['operation'] = 'OP_INSTANCE_SET_PARAMS' |
421 | 47eeffa9 | Christos Stavrakakis | msg['status'] = 'success' |
422 | 47eeffa9 | Christos Stavrakakis | msg['jobId'] = 1 |
423 | 47eeffa9 | Christos Stavrakakis | msg['logmsg'] = 'Dummy Log' |
424 | 47eeffa9 | Christos Stavrakakis | for key, val in kwargs.items(): |
425 | 47eeffa9 | Christos Stavrakakis | msg[key] = val |
426 | 47eeffa9 | Christos Stavrakakis | message = {'body': json.dumps(msg)}
|
427 | 47eeffa9 | Christos Stavrakakis | return message
|
428 | 47eeffa9 | Christos Stavrakakis | |
429 | 47eeffa9 | Christos Stavrakakis | def test_missing_attribute(self, client): |
430 | fd95834e | Christos Stavrakakis | update_db(client, json.dumps({'body': {}}))
|
431 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_reject.called)
|
432 | 47eeffa9 | Christos Stavrakakis | |
433 | 47eeffa9 | Christos Stavrakakis | def test_unhandled_exception(self, client): |
434 | fd95834e | Christos Stavrakakis | update_db(client, {}) |
435 | 47eeffa9 | Christos Stavrakakis | client.basic_reject.assert_called_once() |
436 | 47eeffa9 | Christos Stavrakakis | |
437 | 47eeffa9 | Christos Stavrakakis | def test_wrong_type(self, client): |
438 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(type="WRONG_TYPE") |
439 | fd95834e | Christos Stavrakakis | update_db(client, msg) |
440 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_nack.called)
|
441 | 47eeffa9 | Christos Stavrakakis | |
442 | 47eeffa9 | Christos Stavrakakis | def test_missing_instance(self, client): |
443 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
444 | 47eeffa9 | Christos Stavrakakis | instance='foo')
|
445 | fd95834e | Christos Stavrakakis | update_db(client, msg) |
446 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
447 | 47eeffa9 | Christos Stavrakakis | |
448 | 47eeffa9 | Christos Stavrakakis | def test_no_nics(self, client): |
449 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate='ERROR')
|
450 | 47eeffa9 | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm) |
451 | 47eeffa9 | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm) |
452 | 47eeffa9 | Christos Stavrakakis | mfactory.NetworkInterfaceFactory(machine=vm) |
453 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(len(vm.nics.all()), 3) |
454 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(nics=[],
|
455 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
456 | fd95834e | Christos Stavrakakis | update_db(client, msg) |
457 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
458 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
459 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(len(db_vm.nics.all()), 0) |
460 | 47eeffa9 | Christos Stavrakakis | |
461 | 47eeffa9 | Christos Stavrakakis | def test_empty_nic(self, client): |
462 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate='ERROR')
|
463 | 47eeffa9 | Christos Stavrakakis | for public in [True, False]: |
464 | 47eeffa9 | Christos Stavrakakis | net = mfactory.NetworkFactory(public=public) |
465 | cc92b70f | Christos Stavrakakis | msg = self.create_msg(nics=[{'network': net.backend_id}], |
466 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
467 | fd95834e | Christos Stavrakakis | update_db(client, msg) |
468 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
469 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
470 | 47eeffa9 | Christos Stavrakakis | nics = db_vm.nics.all() |
471 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(len(nics), 1) |
472 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].index, 0) |
473 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].ipv4, '') |
474 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].ipv6, '') |
475 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].mac, '') |
476 | 47eeffa9 | Christos Stavrakakis | if public:
|
477 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].firewall_profile, |
478 | 47eeffa9 | Christos Stavrakakis | settings.DEFAULT_FIREWALL_PROFILE) |
479 | 47eeffa9 | Christos Stavrakakis | else:
|
480 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].firewall_profile, '') |
481 | 47eeffa9 | Christos Stavrakakis | |
482 | 47eeffa9 | Christos Stavrakakis | def test_full_nic(self, client): |
483 | 47eeffa9 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(operstate='ERROR')
|
484 | 47eeffa9 | Christos Stavrakakis | net = mfactory.NetworkFactory(subnet='10.0.0.0/24')
|
485 | 47eeffa9 | Christos Stavrakakis | pool = net.get_pool() |
486 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(pool.is_available('10.0.0.22')) |
487 | 47eeffa9 | Christos Stavrakakis | pool.save() |
488 | cc92b70f | Christos Stavrakakis | msg = self.create_msg(nics=[{'network': net.backend_id, |
489 | 47eeffa9 | Christos Stavrakakis | 'ip': '10.0.0.22', |
490 | 47eeffa9 | Christos Stavrakakis | 'mac': 'aa:bb:cc:00:11:22'}], |
491 | 47eeffa9 | Christos Stavrakakis | instance=vm.backend_vm_id) |
492 | fd95834e | Christos Stavrakakis | update_db(client, msg) |
493 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
494 | 47eeffa9 | Christos Stavrakakis | db_vm = VirtualMachine.objects.get(id=vm.id) |
495 | 47eeffa9 | Christos Stavrakakis | nics = db_vm.nics.all() |
496 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(len(nics), 1) |
497 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].index, 0) |
498 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].ipv4, '10.0.0.22') |
499 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].ipv6, '') |
500 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(nics[0].mac, 'aa:bb:cc:00:11:22') |
501 | 47eeffa9 | Christos Stavrakakis | pool = net.get_pool() |
502 | 47eeffa9 | Christos Stavrakakis | self.assertFalse(pool.is_available('10.0.0.22')) |
503 | 47eeffa9 | Christos Stavrakakis | pool.save() |
504 | 47eeffa9 | Christos Stavrakakis | |
505 | 47eeffa9 | Christos Stavrakakis | |
506 | 47eeffa9 | Christos Stavrakakis | @patch('synnefo.lib.amqp.AMQPClient') |
507 | 47eeffa9 | Christos Stavrakakis | class UpdateNetworkTest(TestCase): |
508 | 47eeffa9 | Christos Stavrakakis | def create_msg(self, **kwargs): |
509 | 47eeffa9 | Christos Stavrakakis | """Create snf-ganeti-eventd message"""
|
510 | 47eeffa9 | Christos Stavrakakis | msg = {'event_time': split_time(time())}
|
511 | 47eeffa9 | Christos Stavrakakis | msg['type'] = 'ganeti-network-status' |
512 | 47eeffa9 | Christos Stavrakakis | msg['status'] = 'success' |
513 | 47eeffa9 | Christos Stavrakakis | msg['jobId'] = 1 |
514 | 47eeffa9 | Christos Stavrakakis | msg['logmsg'] = 'Dummy Log' |
515 | 47eeffa9 | Christos Stavrakakis | for key, val in kwargs.items(): |
516 | 47eeffa9 | Christos Stavrakakis | msg[key] = val |
517 | 47eeffa9 | Christos Stavrakakis | message = {'body': json.dumps(msg)}
|
518 | 47eeffa9 | Christos Stavrakakis | return message
|
519 | 47eeffa9 | Christos Stavrakakis | |
520 | 47eeffa9 | Christos Stavrakakis | def test_missing_attribute(self, client): |
521 | 47eeffa9 | Christos Stavrakakis | update_network(client, json.dumps({'body': {}}))
|
522 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_reject.called)
|
523 | 47eeffa9 | Christos Stavrakakis | |
524 | 47eeffa9 | Christos Stavrakakis | def test_unhandled_exception(self, client): |
525 | 47eeffa9 | Christos Stavrakakis | update_network(client, {}) |
526 | 47eeffa9 | Christos Stavrakakis | client.basic_reject.assert_called_once() |
527 | 47eeffa9 | Christos Stavrakakis | |
528 | 47eeffa9 | Christos Stavrakakis | def test_wrong_type(self, client): |
529 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(type="WRONG_TYPE") |
530 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
531 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_nack.called)
|
532 | 47eeffa9 | Christos Stavrakakis | |
533 | 47eeffa9 | Christos Stavrakakis | def test_missing_network(self, client): |
534 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_CREATE', |
535 | 47eeffa9 | Christos Stavrakakis | network='foo')
|
536 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
537 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
538 | 47eeffa9 | Christos Stavrakakis | |
539 | 47eeffa9 | Christos Stavrakakis | def test_create(self, client): |
540 | 47eeffa9 | Christos Stavrakakis | back_network = mfactory.BackendNetworkFactory(operstate='PENDING')
|
541 | 47eeffa9 | Christos Stavrakakis | net = back_network.network |
542 | 1d04ef8b | Christos Stavrakakis | net.state = 'ACTIVE'
|
543 | 1d04ef8b | Christos Stavrakakis | net.save() |
544 | 47eeffa9 | Christos Stavrakakis | back1 = back_network.backend |
545 | 47eeffa9 | Christos Stavrakakis | |
546 | 47eeffa9 | Christos Stavrakakis | back_network2 = mfactory.BackendNetworkFactory(operstate='PENDING',
|
547 | 47eeffa9 | Christos Stavrakakis | network=net) |
548 | 47eeffa9 | Christos Stavrakakis | back2 = back_network2.backend |
549 | 47eeffa9 | Christos Stavrakakis | # Message from first backend network
|
550 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_CONNECT', |
551 | 47eeffa9 | Christos Stavrakakis | network=net.backend_id, |
552 | 47eeffa9 | Christos Stavrakakis | cluster=back1.clustername) |
553 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
554 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
555 | 47eeffa9 | Christos Stavrakakis | |
556 | 47eeffa9 | Christos Stavrakakis | back_net = BackendNetwork.objects.get(id=back_network.id) |
557 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(back_net.operstate, 'ACTIVE') |
558 | 47eeffa9 | Christos Stavrakakis | db_net = Network.objects.get(id=net.id) |
559 | 1d04ef8b | Christos Stavrakakis | self.assertEqual(db_net.state, 'ACTIVE') |
560 | 47eeffa9 | Christos Stavrakakis | # msg from second backend network
|
561 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_CONNECT', |
562 | 47eeffa9 | Christos Stavrakakis | network=net.backend_id, |
563 | 47eeffa9 | Christos Stavrakakis | cluster=back2.clustername) |
564 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
565 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
566 | 47eeffa9 | Christos Stavrakakis | |
567 | 47eeffa9 | Christos Stavrakakis | db_net = Network.objects.get(id=net.id) |
568 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_net.state, 'ACTIVE') |
569 | 47eeffa9 | Christos Stavrakakis | back_net = BackendNetwork.objects.get(id=back_network.id) |
570 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(back_net.operstate, 'ACTIVE') |
571 | 47eeffa9 | Christos Stavrakakis | |
572 | 039e3e61 | Christos Stavrakakis | def test_create_offline_backend(self, client): |
573 | 039e3e61 | Christos Stavrakakis | """Test network creation when a backend is offline"""
|
574 | 1d04ef8b | Christos Stavrakakis | net = mfactory.NetworkFactory(state='ACTIVE')
|
575 | 039e3e61 | Christos Stavrakakis | bn1 = mfactory.BackendNetworkFactory(network=net) |
576 | 039e3e61 | Christos Stavrakakis | bn2 = mfactory.BackendNetworkFactory(network=net, |
577 | 039e3e61 | Christos Stavrakakis | backend__offline=True)
|
578 | 039e3e61 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_CONNECT', |
579 | 039e3e61 | Christos Stavrakakis | network=net.backend_id, |
580 | 039e3e61 | Christos Stavrakakis | cluster=bn1.backend.clustername) |
581 | 039e3e61 | Christos Stavrakakis | update_network(client, msg) |
582 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
583 | 039e3e61 | Christos Stavrakakis | new_net = Network.objects.get(id=net.id) |
584 | 039e3e61 | Christos Stavrakakis | self.assertEqual(new_net.state, 'ACTIVE') |
585 | 039e3e61 | Christos Stavrakakis | |
586 | 47eeffa9 | Christos Stavrakakis | def test_disconnect(self, client): |
587 | 47eeffa9 | Christos Stavrakakis | bn1 = mfactory.BackendNetworkFactory(operstate='ACTIVE')
|
588 | 47eeffa9 | Christos Stavrakakis | net1 = bn1.network |
589 | 1d04ef8b | Christos Stavrakakis | net1.state = "ACTIVE"
|
590 | 1d04ef8b | Christos Stavrakakis | net1.state = 'ACTIVE'
|
591 | 47eeffa9 | Christos Stavrakakis | net1.save() |
592 | 47eeffa9 | Christos Stavrakakis | bn2 = mfactory.BackendNetworkFactory(operstate='ACTIVE',
|
593 | 47eeffa9 | Christos Stavrakakis | network=net1) |
594 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_DISCONNECT', |
595 | 47eeffa9 | Christos Stavrakakis | network=net1.backend_id, |
596 | 47eeffa9 | Christos Stavrakakis | cluster=bn2.backend.clustername) |
597 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
598 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
599 | 1d04ef8b | Christos Stavrakakis | self.assertEqual(Network.objects.get(id=net1.id).state, 'ACTIVE') |
600 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(BackendNetwork.objects.get(id=bn2.id).operstate,
|
601 | cc92b70f | Christos Stavrakakis | 'PENDING')
|
602 | 47eeffa9 | Christos Stavrakakis | |
603 | 47eeffa9 | Christos Stavrakakis | def test_remove(self, client): |
604 | 47eeffa9 | Christos Stavrakakis | mfactory.MacPrefixPoolTableFactory() |
605 | 47eeffa9 | Christos Stavrakakis | mfactory.BridgePoolTableFactory() |
606 | 47eeffa9 | Christos Stavrakakis | bn = mfactory.BackendNetworkFactory(operstate='ACTIVE')
|
607 | 47eeffa9 | Christos Stavrakakis | for old_state in ['success', 'canceled', 'error']: |
608 | 47eeffa9 | Christos Stavrakakis | for flavor in Network.FLAVORS.keys(): |
609 | 47eeffa9 | Christos Stavrakakis | bn.operstate = old_state |
610 | 47eeffa9 | Christos Stavrakakis | bn.save() |
611 | 47eeffa9 | Christos Stavrakakis | net = bn.network |
612 | 47eeffa9 | Christos Stavrakakis | net.state = 'ACTIVE'
|
613 | 47eeffa9 | Christos Stavrakakis | net.flavor = flavor |
614 | 47eeffa9 | Christos Stavrakakis | if flavor == 'PHYSICAL_VLAN': |
615 | 47eeffa9 | Christos Stavrakakis | net.link = allocate_resource('bridge')
|
616 | 47eeffa9 | Christos Stavrakakis | if flavor == 'MAC_FILTERED': |
617 | 47eeffa9 | Christos Stavrakakis | net.mac_prefix = allocate_resource('mac_prefix')
|
618 | 47eeffa9 | Christos Stavrakakis | net.save() |
619 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_REMOVE', |
620 | 47eeffa9 | Christos Stavrakakis | network=net.backend_id, |
621 | 47eeffa9 | Christos Stavrakakis | cluster=bn.backend.clustername) |
622 | 184a2a8c | Christos Stavrakakis | with mocked_quotaholder():
|
623 | 184a2a8c | Christos Stavrakakis | update_network(client, msg) |
624 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
625 | 47eeffa9 | Christos Stavrakakis | db_bnet = BackendNetwork.objects.get(id=bn.id) |
626 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_bnet.operstate,
|
627 | cc92b70f | Christos Stavrakakis | 'DELETED')
|
628 | 47eeffa9 | Christos Stavrakakis | db_net = Network.objects.get(id=net.id) |
629 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(db_net.state, 'DELETED', flavor) |
630 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(db_net.deleted)
|
631 | 47eeffa9 | Christos Stavrakakis | if flavor == 'PHYSICAL_VLAN': |
632 | 47eeffa9 | Christos Stavrakakis | pool = BridgePoolTable.get_pool() |
633 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(pool.is_available(net.link))
|
634 | 47eeffa9 | Christos Stavrakakis | if flavor == 'MAC_FILTERED': |
635 | 47eeffa9 | Christos Stavrakakis | pool = MacPrefixPoolTable.get_pool() |
636 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(pool.is_available(net.mac_prefix))
|
637 | 47eeffa9 | Christos Stavrakakis | |
638 | 039e3e61 | Christos Stavrakakis | def test_remove_offline_backend(self, client): |
639 | 039e3e61 | Christos Stavrakakis | """Test network removing when a backend is offline"""
|
640 | 3f77e63d | Christos Stavrakakis | mfactory.BridgePoolTableFactory() |
641 | 3f77e63d | Christos Stavrakakis | net = mfactory.NetworkFactory(flavor='PHYSICAL_VLAN',
|
642 | 3f77e63d | Christos Stavrakakis | state='ACTIVE',
|
643 | 3f77e63d | Christos Stavrakakis | link='prv12')
|
644 | 039e3e61 | Christos Stavrakakis | bn1 = mfactory.BackendNetworkFactory(network=net) |
645 | 039e3e61 | Christos Stavrakakis | mfactory.BackendNetworkFactory(network=net, |
646 | c6c889f7 | Christos Stavrakakis | operstate="ACTIVE",
|
647 | 3f77e63d | Christos Stavrakakis | backend__offline=True)
|
648 | 039e3e61 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_REMOVE', |
649 | 039e3e61 | Christos Stavrakakis | network=net.backend_id, |
650 | 039e3e61 | Christos Stavrakakis | cluster=bn1.backend.clustername) |
651 | 184a2a8c | Christos Stavrakakis | with mocked_quotaholder():
|
652 | 184a2a8c | Christos Stavrakakis | update_network(client, msg) |
653 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
654 | 039e3e61 | Christos Stavrakakis | new_net = Network.objects.get(id=net.id) |
655 | 1d04ef8b | Christos Stavrakakis | self.assertEqual(new_net.state, 'ACTIVE') |
656 | 1d04ef8b | Christos Stavrakakis | self.assertFalse(new_net.deleted)
|
657 | 039e3e61 | Christos Stavrakakis | |
658 | 47eeffa9 | Christos Stavrakakis | def test_error_opcode(self, client): |
659 | c6c889f7 | Christos Stavrakakis | mfactory.MacPrefixPoolTableFactory() |
660 | c6c889f7 | Christos Stavrakakis | mfactory.BridgePoolTableFactory() |
661 | 47eeffa9 | Christos Stavrakakis | for state, _ in Network.OPER_STATES: |
662 | c6c889f7 | Christos Stavrakakis | bn = mfactory.BackendNetworkFactory(operstate="ACTIVE")
|
663 | 47eeffa9 | Christos Stavrakakis | bn.operstate = state |
664 | 47eeffa9 | Christos Stavrakakis | bn.save() |
665 | 47eeffa9 | Christos Stavrakakis | network = bn.network |
666 | 47eeffa9 | Christos Stavrakakis | network.state = state |
667 | 47eeffa9 | Christos Stavrakakis | network.save() |
668 | 47eeffa9 | Christos Stavrakakis | for opcode, _ in BackendNetwork.BACKEND_OPCODES: |
669 | 47eeffa9 | Christos Stavrakakis | if opcode in ['OP_NETWORK_REMOVE', 'OP_NETWORK_ADD']: |
670 | 47eeffa9 | Christos Stavrakakis | continue
|
671 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation=opcode,
|
672 | 47eeffa9 | Christos Stavrakakis | network=bn.network.backend_id, |
673 | 47eeffa9 | Christos Stavrakakis | status='error',
|
674 | c6c889f7 | Christos Stavrakakis | add_reserved_ips=[], |
675 | c6c889f7 | Christos Stavrakakis | remove_reserved_ips=[], |
676 | 47eeffa9 | Christos Stavrakakis | cluster=bn.backend.clustername) |
677 | c6c889f7 | Christos Stavrakakis | with mocked_quotaholder():
|
678 | c6c889f7 | Christos Stavrakakis | update_network(client, msg) |
679 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
680 | 47eeffa9 | Christos Stavrakakis | db_bnet = BackendNetwork.objects.get(id=bn.id) |
681 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(bn.operstate, db_bnet.operstate)
|
682 | 47eeffa9 | Christos Stavrakakis | self.assertEqual(bn.network.state, db_bnet.network.state)
|
683 | 47eeffa9 | Christos Stavrakakis | |
684 | 47eeffa9 | Christos Stavrakakis | def test_ips(self, client): |
685 | 47eeffa9 | Christos Stavrakakis | network = mfactory.NetworkFactory(subnet='10.0.0.0/24')
|
686 | 47eeffa9 | Christos Stavrakakis | bn = mfactory.BackendNetworkFactory(network=network) |
687 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS', |
688 | 47eeffa9 | Christos Stavrakakis | network=network.backend_id, |
689 | 47eeffa9 | Christos Stavrakakis | cluster=bn.backend.clustername, |
690 | 47eeffa9 | Christos Stavrakakis | status='success',
|
691 | 47eeffa9 | Christos Stavrakakis | add_reserved_ips=['10.0.0.10', '10.0.0.20'], |
692 | 47eeffa9 | Christos Stavrakakis | remove_reserved_ips=[]) |
693 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
694 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
695 | 47eeffa9 | Christos Stavrakakis | pool = network.get_pool() |
696 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(pool.is_reserved('10.0.0.10')) |
697 | 47eeffa9 | Christos Stavrakakis | self.assertTrue(pool.is_reserved('10.0.0.20')) |
698 | 47eeffa9 | Christos Stavrakakis | pool.save() |
699 | 47eeffa9 | Christos Stavrakakis | # Release them
|
700 | 47eeffa9 | Christos Stavrakakis | msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS', |
701 | 47eeffa9 | Christos Stavrakakis | network=network.backend_id, |
702 | 47eeffa9 | Christos Stavrakakis | cluster=bn.backend.clustername, |
703 | 47eeffa9 | Christos Stavrakakis | add_reserved_ips=[], |
704 | 47eeffa9 | Christos Stavrakakis | remove_reserved_ips=['10.0.0.10', '10.0.0.20']) |
705 | 47eeffa9 | Christos Stavrakakis | update_network(client, msg) |
706 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
707 | 47eeffa9 | Christos Stavrakakis | pool = network.get_pool() |
708 | 47eeffa9 | Christos Stavrakakis | self.assertFalse(pool.is_reserved('10.0.0.10')) |
709 | 47eeffa9 | Christos Stavrakakis | self.assertFalse(pool.is_reserved('10.0.0.20')) |
710 | 95aee02c | Vangelis Koukis | |
711 | 92c53da1 | Vassilios Karakoidas | |
712 | c8908e51 | Christos Stavrakakis | @patch('synnefo.lib.amqp.AMQPClient') |
713 | c8908e51 | Christos Stavrakakis | class UpdateBuildProgressTest(TestCase): |
714 | c8908e51 | Christos Stavrakakis | def setUp(self): |
715 | c8908e51 | Christos Stavrakakis | self.vm = mfactory.VirtualMachineFactory()
|
716 | 95aee02c | Vangelis Koukis | |
717 | c8908e51 | Christos Stavrakakis | def get_db_vm(self): |
718 | c8908e51 | Christos Stavrakakis | return VirtualMachine.objects.get(id=self.vm.id) |
719 | 95aee02c | Vangelis Koukis | |
720 | c8908e51 | Christos Stavrakakis | def create_msg(self, **kwargs): |
721 | c8908e51 | Christos Stavrakakis | """Create snf-progress-monitor message"""
|
722 | c8908e51 | Christos Stavrakakis | msg = {'event_time': split_time(time())}
|
723 | c8908e51 | Christos Stavrakakis | msg['type'] = 'image-copy-progress' |
724 | c8908e51 | Christos Stavrakakis | msg['progress'] = 0 |
725 | c8908e51 | Christos Stavrakakis | for key, val in kwargs.items(): |
726 | c8908e51 | Christos Stavrakakis | msg[key] = val |
727 | c8908e51 | Christos Stavrakakis | message = {'body': json.dumps(msg)}
|
728 | c8908e51 | Christos Stavrakakis | return message
|
729 | 95aee02c | Vangelis Koukis | |
730 | c8908e51 | Christos Stavrakakis | def test_missing_attribute(self, client): |
731 | c8908e51 | Christos Stavrakakis | update_build_progress(client, json.dumps({'body': {}}))
|
732 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_reject.called)
|
733 | 95aee02c | Vangelis Koukis | |
734 | c8908e51 | Christos Stavrakakis | def test_unhandled_exception(self, client): |
735 | c8908e51 | Christos Stavrakakis | update_build_progress(client, {}) |
736 | c8908e51 | Christos Stavrakakis | client.basic_reject.assert_called_once() |
737 | c25cc9ec | Vangelis Koukis | |
738 | c8908e51 | Christos Stavrakakis | def test_missing_instance(self, client): |
739 | c8908e51 | Christos Stavrakakis | msg = self.create_msg(instance='foo') |
740 | c8908e51 | Christos Stavrakakis | update_build_progress(client, msg) |
741 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
742 | 9068cd85 | Georgios Gousios | |
743 | c8908e51 | Christos Stavrakakis | def test_wrong_type(self, client): |
744 | c8908e51 | Christos Stavrakakis | msg = self.create_msg(type="WRONG_TYPE") |
745 | c8908e51 | Christos Stavrakakis | update_build_progress(client, msg) |
746 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_nack.called)
|
747 | 9068cd85 | Georgios Gousios | |
748 | c8908e51 | Christos Stavrakakis | def test_progress_update(self, client): |
749 | c25cc9ec | Vangelis Koukis | rprogress = randint(10, 100) |
750 | c8908e51 | Christos Stavrakakis | msg = self.create_msg(progress=rprogress,
|
751 | c8908e51 | Christos Stavrakakis | instance=self.vm.backend_vm_id)
|
752 | c8908e51 | Christos Stavrakakis | update_build_progress(client, msg) |
753 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
754 | c8908e51 | Christos Stavrakakis | vm = self.get_db_vm()
|
755 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.buildpercentage, rprogress)
|
756 | c8908e51 | Christos Stavrakakis | |
757 | c8908e51 | Christos Stavrakakis | def test_invalid_value(self, client): |
758 | c8908e51 | Christos Stavrakakis | old = self.vm.buildpercentage
|
759 | c8908e51 | Christos Stavrakakis | for rprogress in [0, -1, 'a']: |
760 | c8908e51 | Christos Stavrakakis | msg = self.create_msg(progress=rprogress,
|
761 | c8908e51 | Christos Stavrakakis | instance=self.vm.backend_vm_id)
|
762 | c8908e51 | Christos Stavrakakis | update_build_progress(client, msg) |
763 | 10d9cd27 | Christos Stavrakakis | self.assertTrue(client.basic_ack.called)
|
764 | c8908e51 | Christos Stavrakakis | vm = self.get_db_vm()
|
765 | c8908e51 | Christos Stavrakakis | self.assertEqual(vm.buildpercentage, old)
|
766 | 9068cd85 | Georgios Gousios | |
767 | 9fea53cc | Vangelis Koukis | |
768 | 7ab30015 | Christos Stavrakakis | from synnefo.logic.reconciliation import VMState |
769 | c8908e51 | Christos Stavrakakis | class ReconciliationTest(TestCase): |
770 | 7ab30015 | Christos Stavrakakis | def get_vm(self, operstate, deleted=False): |
771 | 7ab30015 | Christos Stavrakakis | flavor = mfactory.FlavorFactory(cpu=2, ram=1024) |
772 | 7ab30015 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory(deleted=deleted, flavor=flavor) |
773 | 7ab30015 | Christos Stavrakakis | vm.operstate = operstate |
774 | 7ab30015 | Christos Stavrakakis | vm.save() |
775 | 7ab30015 | Christos Stavrakakis | return vm
|
776 | 9fea53cc | Vangelis Koukis | |
777 | 9fea53cc | Vangelis Koukis | def test_get_servers_from_db(self): |
778 | 9fea53cc | Vangelis Koukis | """Test getting a dictionary from each server to its operstate"""
|
779 | 2cd55da6 | Christos Stavrakakis | backends = Backend.objects.all() |
780 | 7ab30015 | Christos Stavrakakis | vm1 = self.get_vm('STARTED') |
781 | 7ab30015 | Christos Stavrakakis | vm2 = self.get_vm('DESTROYED', deleted=True) |
782 | 7ab30015 | Christos Stavrakakis | vm3 = self.get_vm('STOPPED') |
783 | 2cd55da6 | Christos Stavrakakis | self.assertEquals(reconciliation.get_servers_from_db(backends),
|
784 | 7ab30015 | Christos Stavrakakis | {vm1.id: VMState(state='STARTED', cpu=2, ram=1024, nics=[]), |
785 | 7ab30015 | Christos Stavrakakis | vm3.id: VMState(state='STOPPED', cpu=2, ram=1024, nics=[])} |
786 | 7ab30015 | Christos Stavrakakis | ) |
787 | 9fea53cc | Vangelis Koukis | |
788 | 9fea53cc | Vangelis Koukis | def test_stale_servers_in_db(self): |
789 | 9fea53cc | Vangelis Koukis | """Test discovery of stale entries in DB"""
|
790 | 9fea53cc | Vangelis Koukis | |
791 | 7ab30015 | Christos Stavrakakis | D = {1: None, 2: 'None', 3: None, 30000: 'BUILD', |
792 | 7ab30015 | Christos Stavrakakis | 30002: 'None'} |
793 | 47eeffa9 | Christos Stavrakakis | G = {1: True, 3: True, 30000: True} |
794 | 9fea53cc | Vangelis Koukis | self.assertEquals(reconciliation.stale_servers_in_db(D, G),
|
795 | 47eeffa9 | Christos Stavrakakis | set([2, 30002])) |
796 | 9fea53cc | Vangelis Koukis | |
797 | c8908e51 | Christos Stavrakakis | @patch("synnefo.db.models.get_rapi_client") |
798 | c8908e51 | Christos Stavrakakis | def test_stale_building_vm(self, client): |
799 | c8908e51 | Christos Stavrakakis | vm = mfactory.VirtualMachineFactory() |
800 | c8908e51 | Christos Stavrakakis | vm.state = 'BUILD'
|
801 | c8908e51 | Christos Stavrakakis | vm.backendjobid = 42
|
802 | c8908e51 | Christos Stavrakakis | vm.save() |
803 | c8908e51 | Christos Stavrakakis | D = {vm.id: 'BUILD'}
|
804 | c8908e51 | Christos Stavrakakis | G = {} |
805 | c8908e51 | Christos Stavrakakis | for status in ['queued', 'waiting', 'running']: |
806 | c8908e51 | Christos Stavrakakis | client.return_value.GetJobStatus.return_value = {'status': status}
|
807 | c8908e51 | Christos Stavrakakis | self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([])) |
808 | cc92b70f | Christos Stavrakakis | client.return_value.GetJobStatus\ |
809 | cc92b70f | Christos Stavrakakis | .assert_called_once_with(vm.backendjobid) |
810 | c8908e51 | Christos Stavrakakis | client.reset_mock() |
811 | c8908e51 | Christos Stavrakakis | for status in ['success', 'error', 'canceled']: |
812 | c8908e51 | Christos Stavrakakis | client.return_value.GetJobStatus.return_value = {'status': status}
|
813 | c8908e51 | Christos Stavrakakis | self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([])) |
814 | cc92b70f | Christos Stavrakakis | client.return_value.GetInstance\ |
815 | cc92b70f | Christos Stavrakakis | .assert_called_once_with(vm.backend_vm_id) |
816 | cc92b70f | Christos Stavrakakis | client.return_value.GetJobStatus\ |
817 | cc92b70f | Christos Stavrakakis | .assert_called_once_with(vm.backendjobid) |
818 | c8908e51 | Christos Stavrakakis | client.reset_mock() |
819 | c8908e51 | Christos Stavrakakis | from synnefo.logic.rapi import GanetiApiError |
820 | c8908e51 | Christos Stavrakakis | client.return_value.GetJobStatus.side_effect = GanetiApiError('Foo')
|
821 | cc92b70f | Christos Stavrakakis | self.assertEqual(reconciliation.stale_servers_in_db(D, G),
|
822 | cc92b70f | Christos Stavrakakis | set([vm.id]))
|
823 | c8908e51 | Christos Stavrakakis | |
824 | 9fea53cc | Vangelis Koukis | def test_orphan_instances_in_ganeti(self): |
825 | 9fea53cc | Vangelis Koukis | """Test discovery of orphan instances in Ganeti, without a DB entry"""
|
826 | 9fea53cc | Vangelis Koukis | |
827 | 9fea53cc | Vangelis Koukis | G = {1: True, 2: False, 3: False, 4: True, 50: True} |
828 | 9fea53cc | Vangelis Koukis | D = {1: True, 3: False} |
829 | 9fea53cc | Vangelis Koukis | self.assertEquals(reconciliation.orphan_instances_in_ganeti(D, G),
|
830 | 46704e06 | Vangelis Koukis | set([2, 4, 50])) |
831 | 9fea53cc | Vangelis Koukis | |
832 | 9fea53cc | Vangelis Koukis | def test_unsynced_operstate(self): |
833 | 9fea53cc | Vangelis Koukis | """Test discovery of unsynced operstate between the DB and Ganeti"""
|
834 | 7ab30015 | Christos Stavrakakis | mkstate = lambda state: VMState(state=state, cpu=1, ram=1024, nics=[]) |
835 | 7ab30015 | Christos Stavrakakis | vm1 = self.get_vm("STARTED") |
836 | 7ab30015 | Christos Stavrakakis | vm2 = self.get_vm("STARTED") |
837 | 7ab30015 | Christos Stavrakakis | vm3= self.get_vm("BUILD") |
838 | 7ab30015 | Christos Stavrakakis | vm4 = self.get_vm("STARTED") |
839 | 7ab30015 | Christos Stavrakakis | vm5 = self.get_vm("BUILD") |
840 | 7ab30015 | Christos Stavrakakis | |
841 | 7ab30015 | Christos Stavrakakis | D = {1: mkstate("STARTED"), 2: mkstate("STARTED"), 3: mkstate("BUILD"), |
842 | 7ab30015 | Christos Stavrakakis | 4: mkstate("STARTED"), 50: mkstate("BUILD")} |
843 | 7ab30015 | Christos Stavrakakis | G = {vm1.id: mkstate(True), vm2.id: mkstate(False), |
844 | 7ab30015 | Christos Stavrakakis | vm4.id: mkstate(True), vm4.id: mkstate(False), |
845 | 7ab30015 | Christos Stavrakakis | vm5.id: mkstate(False)}
|
846 | 9fea53cc | Vangelis Koukis | self.assertEquals(reconciliation.unsynced_operstate(D, G),
|
847 | 7ab30015 | Christos Stavrakakis | set([(vm2.id, "STARTED", False), |
848 | 7ab30015 | Christos Stavrakakis | (vm4.id, "STARTED", False)])) |
849 | b66e4833 | Christos Stavrakakis | |
850 | b66e4833 | Christos Stavrakakis | from synnefo.logic.test.rapi_pool_tests import * |
851 | b66e4833 | Christos Stavrakakis | from synnefo.logic.test.utils_tests import * |