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