Revision be4d8469 snf-cyclades-app/synnefo/logic/tests/reconciliation.py
b/snf-cyclades-app/synnefo/logic/tests/reconciliation.py | ||
---|---|---|
30 | 30 |
import logging |
31 | 31 |
from django.test import TestCase |
32 | 32 |
|
33 |
from synnefo.db.models import VirtualMachine |
|
33 |
from synnefo.db.models import VirtualMachine, Network, BackendNetwork
|
|
34 | 34 |
from synnefo.db import models_factory as mfactory |
35 | 35 |
from synnefo.logic import reconciliation |
36 | 36 |
from datetime import timedelta |
... | ... | |
41 | 41 |
|
42 | 42 |
|
43 | 43 |
@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
44 |
class ReconciliationTest(TestCase): |
|
44 |
class ServerReconciliationTest(TestCase):
|
|
45 | 45 |
@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
46 | 46 |
def setUp(self, mrapi): |
47 | 47 |
self.backend = mfactory.BackendFactory() |
... | ... | |
239 | 239 |
self.assertEqual(nic.network, network2) |
240 | 240 |
self.assertEqual(nic.ipv4, "192.168.2.1") |
241 | 241 |
self.assertEqual(nic.mac, "aa:00:bb:cc:dd:ee") |
242 |
|
|
243 |
|
|
244 |
@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
|
245 |
class NetworkReconciliationTest(TestCase): |
|
246 |
def setUp(self): |
|
247 |
self.backend = mfactory.BackendFactory() |
|
248 |
log = logging.getLogger() |
|
249 |
self.reconciler = reconciliation.NetworkReconciler( |
|
250 |
logger=log, |
|
251 |
fix=True) |
|
252 |
|
|
253 |
def test_parted_network(self, mrapi): |
|
254 |
net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False) |
|
255 |
mrapi().GetNetworks.return_value = [] |
|
256 |
# Test nothing if Ganeti returns nothing |
|
257 |
self.assertEqual(net1.backend_networks.count(), 0) |
|
258 |
self.reconciler.reconcile_networks() |
|
259 |
self.assertEqual(net1.backend_networks.count(), 0) |
|
260 |
|
|
261 |
# Test creation if exists in Ganeti |
|
262 |
self.assertEqual(net1.backend_networks.count(), 0) |
|
263 |
mrapi().GetNetworks.return_value = [{"name": net1.backend_id, |
|
264 |
"group_list": ["default"], |
|
265 |
"network": net1.subnet, |
|
266 |
"map": "....", |
|
267 |
"external_reservations": ""}] |
|
268 |
self.reconciler.reconcile_networks() |
|
269 |
self.assertTrue(net1.backend_networks |
|
270 |
.filter(backend=self.backend).exists()) |
|
271 |
# ..but not if it is destroying |
|
272 |
net1.backend_networks.all().delete() |
|
273 |
net1.action = "DESTROY" |
|
274 |
net1.save() |
|
275 |
self.reconciler.reconcile_networks() |
|
276 |
self.assertFalse(net1.backend_networks |
|
277 |
.filter(backend=self.backend).exists()) |
|
278 |
# or network is public! |
|
279 |
net1.action = "CREATE" |
|
280 |
net1.public = True |
|
281 |
net1.save() |
|
282 |
self.reconciler.reconcile_networks() |
|
283 |
self.assertFalse(net1.backend_networks |
|
284 |
.filter(backend=self.backend).exists()) |
|
285 |
# Test creation if network is a floating IP pool |
|
286 |
net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", |
|
287 |
floating_ip_pool=True) |
|
288 |
mrapi().GetNetworks.return_value = [] |
|
289 |
self.assertEqual(net2.backend_networks.count(), 0) |
|
290 |
self.reconciler.reconcile_networks() |
|
291 |
self.assertTrue(net2.backend_networks |
|
292 |
.filter(backend=self.backend).exists()) |
|
293 |
|
|
294 |
def test_stale_network(self, mrapi): |
|
295 |
# Test that stale network will be deleted from DB, if network action is |
|
296 |
# destroy |
|
297 |
net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False, |
|
298 |
flavor="IP_LESS_ROUTED", |
|
299 |
action="DESTROY", deleted=False) |
|
300 |
bn1 = mfactory.BackendNetworkFactory(network=net1, |
|
301 |
backend=self.backend, |
|
302 |
operstate="ACTIVE") |
|
303 |
mrapi().GetNetworks.return_value = [] |
|
304 |
self.assertFalse(net1.deleted) |
|
305 |
with mocked_quotaholder(): |
|
306 |
self.reconciler.reconcile_networks() |
|
307 |
bn1 = BackendNetwork.objects.get(id=bn1.id) |
|
308 |
net1 = Network.objects.get(id=net1.id) |
|
309 |
self.assertEqual(bn1.operstate, "DELETED") |
|
310 |
self.assertTrue(net1.deleted) |
|
311 |
# But not if action is not DESTROY |
|
312 |
net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False, |
|
313 |
action="CREATE") |
|
314 |
mfactory.BackendNetworkFactory(network=net2, backend=self.backend) |
|
315 |
self.assertFalse(net2.deleted) |
|
316 |
self.reconciler.reconcile_networks() |
|
317 |
self.assertFalse(net2.deleted) |
|
318 |
|
|
319 |
def test_missing_network(self, mrapi): |
|
320 |
net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False, |
|
321 |
action="CREATE") |
|
322 |
mfactory.BackendNetworkFactory(network=net2, backend=self.backend) |
|
323 |
mrapi().GetNetworks.return_value = [] |
|
324 |
self.reconciler.reconcile_networks() |
|
325 |
self.assertEqual(len(mrapi().CreateNetwork.mock_calls), 1) |
|
326 |
|
|
327 |
#def test_hanging_networks(self, mrapi): |
|
328 |
# pass |
|
329 |
|
|
330 |
def test_unsynced_networks(self, mrapi): |
|
331 |
net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False, |
|
332 |
state="PENDING", |
|
333 |
action="CREATE", deleted=False) |
|
334 |
bn = mfactory.BackendNetworkFactory(network=net, backend=self.backend, |
|
335 |
operstate="PENDING") |
|
336 |
mrapi().GetNetworks.return_value = [{"name": net.backend_id, |
|
337 |
"group_list": [], |
|
338 |
"network": net.subnet, |
|
339 |
"map": "....", |
|
340 |
"external_reservations": ""}] |
|
341 |
self.assertEqual(bn.operstate, "PENDING") |
|
342 |
self.reconciler.reconcile_networks() |
|
343 |
bn = BackendNetwork.objects.get(id=bn.id) |
|
344 |
self.assertEqual(bn.operstate, "ACTIVE") |
|
345 |
|
|
346 |
def test_orphan_networks(self, mrapi): |
|
347 |
net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False, |
|
348 |
action="CREATE", deleted=True) |
|
349 |
mrapi().GetNetworks.return_value = [{"name": net.backend_id, |
|
350 |
"group_list": [], |
|
351 |
"network": net.subnet, |
|
352 |
"map": "....", |
|
353 |
"external_reservations": ""}] |
|
354 |
self.reconciler.reconcile_networks() |
|
355 |
mrapi().DeleteNetwork.assert_called_once_with(net.backend_id, []) |
Also available in: Unified diff