Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / tests / reconciliation.py @ ddffd973

History | View | Annotate | Download (13.9 kB)

1 0208770b Christos Stavrakakis
# vim: set fileencoding=utf-8 :
2 0208770b Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
3 0208770b Christos Stavrakakis
#
4 0208770b Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
5 0208770b Christos Stavrakakis
# modification, are permitted provided that the following conditions
6 0208770b Christos Stavrakakis
# are met:
7 0208770b Christos Stavrakakis
#
8 0208770b Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
9 0208770b Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
10 0208770b Christos Stavrakakis
#
11 0208770b Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
12 0208770b Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
13 0208770b Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
14 0208770b Christos Stavrakakis
#
15 0208770b Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 0208770b Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 0208770b Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 0208770b Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 0208770b Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 0208770b Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 0208770b Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 0208770b Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 0208770b Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 0208770b Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 0208770b Christos Stavrakakis
# SUCH DAMAGE.
26 0208770b Christos Stavrakakis
#
27 0208770b Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
28 0208770b Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
29 0208770b Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
30 0208770b Christos Stavrakakis
import logging
31 0208770b Christos Stavrakakis
from django.test import TestCase
32 0208770b Christos Stavrakakis
33 be4d8469 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network, BackendNetwork
34 0208770b Christos Stavrakakis
from synnefo.db import models_factory as mfactory
35 0208770b Christos Stavrakakis
from synnefo.logic import reconciliation
36 0208770b Christos Stavrakakis
from mock import patch
37 0208770b Christos Stavrakakis
from snf_django.utils.testing import mocked_quotaholder
38 0208770b Christos Stavrakakis
from time import time
39 0208770b Christos Stavrakakis
from synnefo import settings
40 0208770b Christos Stavrakakis
41 0208770b Christos Stavrakakis
42 0208770b Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
43 be4d8469 Christos Stavrakakis
class ServerReconciliationTest(TestCase):
44 0208770b Christos Stavrakakis
    @patch("synnefo.logic.rapi_pool.GanetiRapiClient")
45 0208770b Christos Stavrakakis
    def setUp(self, mrapi):
46 0208770b Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
47 0208770b Christos Stavrakakis
        log = logging.getLogger()
48 0208770b Christos Stavrakakis
        options = {"fix_unsynced": True,
49 0208770b Christos Stavrakakis
                   "fix_stale": True,
50 0208770b Christos Stavrakakis
                   "fix_orphans": True,
51 0208770b Christos Stavrakakis
                   "fix_unsynced_nics": True,
52 0208770b Christos Stavrakakis
                   "fix_unsynced_flavors": True}
53 0208770b Christos Stavrakakis
        self.reconciler = reconciliation.BackendReconciler(self.backend,
54 0208770b Christos Stavrakakis
                                                           options=options,
55 0208770b Christos Stavrakakis
                                                           logger=log)
56 0208770b Christos Stavrakakis
57 0208770b Christos Stavrakakis
    def test_building_vm(self, mrapi):
58 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
59 0208770b Christos Stavrakakis
                                             backendjobid=1,
60 0208770b Christos Stavrakakis
                                             operstate="BUILD")
61 0208770b Christos Stavrakakis
        for status in ["queued", "waiting", "running"]:
62 63f9eb8e Christos Stavrakakis
            mrapi().GetJobs.return_value = [{"id": "1", "status": status}]
63 0208770b Christos Stavrakakis
            with mocked_quotaholder():
64 0208770b Christos Stavrakakis
                self.reconciler.reconcile()
65 0208770b Christos Stavrakakis
            vm1 = VirtualMachine.objects.get(id=vm1.id)
66 0208770b Christos Stavrakakis
            self.assertFalse(vm1.deleted)
67 0208770b Christos Stavrakakis
            self.assertEqual(vm1.operstate, "BUILD")
68 0208770b Christos Stavrakakis
69 63f9eb8e Christos Stavrakakis
        mrapi().GetJobs.return_value = [{"id": "1", "status": "error"}]
70 0208770b Christos Stavrakakis
        with mocked_quotaholder():
71 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
72 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
73 0208770b Christos Stavrakakis
        self.assertFalse(vm1.deleted)
74 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "ERROR")
75 0208770b Christos Stavrakakis
76 63f9eb8e Christos Stavrakakis
        for status in ["success", "canceled"]:
77 63f9eb8e Christos Stavrakakis
            vm1.operstate = "BUILD"
78 0208770b Christos Stavrakakis
            vm1.deleted = False
79 0208770b Christos Stavrakakis
            vm1.save()
80 63f9eb8e Christos Stavrakakis
            mrapi().GetJobs.return_value = [{"id": "1", "status": status}]
81 0208770b Christos Stavrakakis
            with mocked_quotaholder():
82 0208770b Christos Stavrakakis
                self.reconciler.reconcile()
83 0208770b Christos Stavrakakis
            vm1 = VirtualMachine.objects.get(id=vm1.id)
84 63f9eb8e Christos Stavrakakis
            self.assertFalse(vm1.deleted)
85 63f9eb8e Christos Stavrakakis
            self.assertEqual(vm1.operstate, "ERROR")
86 0208770b Christos Stavrakakis
87 0208770b Christos Stavrakakis
    def test_stale_server(self, mrapi):
88 0208770b Christos Stavrakakis
        mrapi.GetInstances = []
89 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
90 0208770b Christos Stavrakakis
                                             deleted=False,
91 0208770b Christos Stavrakakis
                                             operstate="ERROR")
92 1464a17b Christos Stavrakakis
93 0208770b Christos Stavrakakis
        with mocked_quotaholder():
94 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
95 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
96 1464a17b Christos Stavrakakis
        self.assertFalse(vm1.deleted)
97 1464a17b Christos Stavrakakis
        vm2 = mfactory.VirtualMachineFactory(backend=self.backend,
98 1464a17b Christos Stavrakakis
                                             deleted=False,
99 1464a17b Christos Stavrakakis
                                             action="DESTROY",
100 1464a17b Christos Stavrakakis
                                             operstate="ERROR")
101 1464a17b Christos Stavrakakis
        with mocked_quotaholder():
102 1464a17b Christos Stavrakakis
            self.reconciler.reconcile()
103 1464a17b Christos Stavrakakis
        vm2 = VirtualMachine.objects.get(id=vm2.id)
104 1464a17b Christos Stavrakakis
        self.assertTrue(vm2.deleted)
105 1464a17b Christos Stavrakakis
        vm3 = mfactory.VirtualMachineFactory(backend=self.backend,
106 1464a17b Christos Stavrakakis
                                             deleted=False,
107 1464a17b Christos Stavrakakis
                                             action="DESTROY",
108 1464a17b Christos Stavrakakis
                                             operstate="ACTIVE")
109 1464a17b Christos Stavrakakis
        with mocked_quotaholder():
110 1464a17b Christos Stavrakakis
            self.reconciler.reconcile()
111 1464a17b Christos Stavrakakis
        vm3 = VirtualMachine.objects.get(id=vm3.id)
112 1464a17b Christos Stavrakakis
        self.assertTrue(vm3.deleted)
113 0208770b Christos Stavrakakis
114 0208770b Christos Stavrakakis
    def test_orphan_server(self, mrapi):
115 0208770b Christos Stavrakakis
        cmrapi = self.reconciler.client
116 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
117 0208770b Christos Stavrakakis
            [{"name": "%s22" % settings.BACKEND_PREFIX_ID,
118 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 1024,
119 0208770b Christos Stavrakakis
                          "minmem": 1024,
120 0208770b Christos Stavrakakis
                          "vcpus": 4},
121 0208770b Christos Stavrakakis
             "oper_state": True,
122 0208770b Christos Stavrakakis
             "mtime": time(),
123 0208770b Christos Stavrakakis
             "disk.sizes": [],
124 0208770b Christos Stavrakakis
             "nic.ips": [],
125 a1baa42b Christos Stavrakakis
             "nic.names": [],
126 0208770b Christos Stavrakakis
             "nic.macs": [],
127 a1baa42b Christos Stavrakakis
             "nic.networks.names": [],
128 0208770b Christos Stavrakakis
             "tags": []}]
129 0208770b Christos Stavrakakis
        self.reconciler.reconcile()
130 0208770b Christos Stavrakakis
        cmrapi.DeleteInstance\
131 0208770b Christos Stavrakakis
              .assert_called_once_with("%s22" % settings.BACKEND_PREFIX_ID)
132 0208770b Christos Stavrakakis
133 0208770b Christos Stavrakakis
    def test_unsynced_operstate(self, mrapi):
134 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
135 0208770b Christos Stavrakakis
                                             deleted=False,
136 0208770b Christos Stavrakakis
                                             operstate="STOPPED")
137 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
138 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
139 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 1024,
140 0208770b Christos Stavrakakis
                          "minmem": 1024,
141 0208770b Christos Stavrakakis
                          "vcpus": 4},
142 0208770b Christos Stavrakakis
             "oper_state": True,
143 0208770b Christos Stavrakakis
             "mtime": time(),
144 0208770b Christos Stavrakakis
             "disk.sizes": [],
145 0208770b Christos Stavrakakis
             "nic.ips": [],
146 a1baa42b Christos Stavrakakis
             "nic.names": [],
147 0208770b Christos Stavrakakis
             "nic.macs": [],
148 a1baa42b Christos Stavrakakis
             "nic.networks.names": [],
149 0208770b Christos Stavrakakis
             "tags": []}]
150 0208770b Christos Stavrakakis
        with mocked_quotaholder():
151 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
152 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
153 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
154 0208770b Christos Stavrakakis
155 0208770b Christos Stavrakakis
    def test_unsynced_flavor(self, mrapi):
156 0208770b Christos Stavrakakis
        flavor1 = mfactory.FlavorFactory(cpu=2, ram=1024, disk=1,
157 0208770b Christos Stavrakakis
                                         disk_template="drbd")
158 0208770b Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(cpu=4, ram=2048, disk=1,
159 0208770b Christos Stavrakakis
                                         disk_template="drbd")
160 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
161 0208770b Christos Stavrakakis
                                             deleted=False,
162 0208770b Christos Stavrakakis
                                             flavor=flavor1,
163 0208770b Christos Stavrakakis
                                             operstate="STARTED")
164 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
165 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
166 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 2048,
167 0208770b Christos Stavrakakis
                          "minmem": 2048,
168 0208770b Christos Stavrakakis
                          "vcpus": 4},
169 0208770b Christos Stavrakakis
             "oper_state": True,
170 0208770b Christos Stavrakakis
             "mtime": time(),
171 0208770b Christos Stavrakakis
             "disk.sizes": [],
172 0208770b Christos Stavrakakis
             "nic.ips": [],
173 a1baa42b Christos Stavrakakis
             "nic.names": [],
174 0208770b Christos Stavrakakis
             "nic.macs": [],
175 a1baa42b Christos Stavrakakis
             "nic.networks.names": [],
176 0208770b Christos Stavrakakis
             "tags": []}]
177 0208770b Christos Stavrakakis
        with mocked_quotaholder():
178 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
179 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
180 0208770b Christos Stavrakakis
        self.assertEqual(vm1.flavor, flavor2)
181 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
182 0208770b Christos Stavrakakis
183 0208770b Christos Stavrakakis
    def test_unsynced_nics(self, mrapi):
184 8764d304 Christos Stavrakakis
        network1 = mfactory.NetworkWithSubnetFactory(
185 8764d304 Christos Stavrakakis
            subnet__cidr="10.0.0.0/24", subnet__gateway="10.0.0.2")
186 8764d304 Christos Stavrakakis
        network2 = mfactory.NetworkWithSubnetFactory(
187 8764d304 Christos Stavrakakis
            subnet__cidr="192.168.2.0/24", subnet__gateway="192.168.2.2")
188 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
189 0208770b Christos Stavrakakis
                                             deleted=False,
190 0208770b Christos Stavrakakis
                                             operstate="STOPPED")
191 8764d304 Christos Stavrakakis
        subnet = network1.subnets.get(ipversion=4)
192 8764d304 Christos Stavrakakis
        ip = mfactory.IPv4AddressFactory(nic__machine=vm1, network=network1,
193 8764d304 Christos Stavrakakis
                                         subnet=subnet,
194 8764d304 Christos Stavrakakis
                                         address="10.0.0.3")
195 8764d304 Christos Stavrakakis
        nic = ip.nic
196 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
197 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
198 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 2048,
199 0208770b Christos Stavrakakis
                          "minmem": 2048,
200 0208770b Christos Stavrakakis
                          "vcpus": 4},
201 0208770b Christos Stavrakakis
             "oper_state": True,
202 0208770b Christos Stavrakakis
             "mtime": time(),
203 0208770b Christos Stavrakakis
             "disk.sizes": [],
204 a1baa42b Christos Stavrakakis
             "nic.names": [nic.backend_uuid],
205 3b2984dc Christos Stavrakakis
             "nic.ips": ["192.168.2.5"],
206 0208770b Christos Stavrakakis
             "nic.macs": ["aa:00:bb:cc:dd:ee"],
207 a1baa42b Christos Stavrakakis
             "nic.networks.names": [network2.backend_id],
208 0208770b Christos Stavrakakis
             "tags": []}]
209 0208770b Christos Stavrakakis
        with mocked_quotaholder():
210 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
211 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
212 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
213 0208770b Christos Stavrakakis
        nic = vm1.nics.all()[0]
214 0208770b Christos Stavrakakis
        self.assertEqual(nic.network, network2)
215 3b2984dc Christos Stavrakakis
        self.assertEqual(nic.ipv4_address, "192.168.2.5")
216 0208770b Christos Stavrakakis
        self.assertEqual(nic.mac, "aa:00:bb:cc:dd:ee")
217 be4d8469 Christos Stavrakakis
218 be4d8469 Christos Stavrakakis
219 be4d8469 Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
220 be4d8469 Christos Stavrakakis
class NetworkReconciliationTest(TestCase):
221 be4d8469 Christos Stavrakakis
    def setUp(self):
222 be4d8469 Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
223 be4d8469 Christos Stavrakakis
        log = logging.getLogger()
224 be4d8469 Christos Stavrakakis
        self.reconciler = reconciliation.NetworkReconciler(
225 be4d8469 Christos Stavrakakis
            logger=log,
226 be4d8469 Christos Stavrakakis
            fix=True)
227 be4d8469 Christos Stavrakakis
228 be4d8469 Christos Stavrakakis
    def test_parted_network(self, mrapi):
229 8764d304 Christos Stavrakakis
        net1 = mfactory.NetworkWithSubnetFactory(public=False)
230 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
231 be4d8469 Christos Stavrakakis
        # Test nothing if Ganeti returns nothing
232 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
233 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
234 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
235 be4d8469 Christos Stavrakakis
236 be4d8469 Christos Stavrakakis
        # Test creation if exists in Ganeti
237 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
238 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net1.backend_id,
239 a1baa42b Christos Stavrakakis
                                             "group_list": [["default",
240 a1baa42b Christos Stavrakakis
                                                             "bridged",
241 a1baa42b Christos Stavrakakis
                                                             "prv0"]],
242 bfb3f9c2 Christos Stavrakakis
                                             "network": net1.subnet4.cidr,
243 be4d8469 Christos Stavrakakis
                                             "map": "....",
244 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
245 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
246 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.backend_networks
247 ddffd973 Christos Stavrakakis
                        .filter(backend=self.backend).exists())
248 be4d8469 Christos Stavrakakis
249 be4d8469 Christos Stavrakakis
    def test_stale_network(self, mrapi):
250 be4d8469 Christos Stavrakakis
        # Test that stale network will be deleted from DB, if network action is
251 be4d8469 Christos Stavrakakis
        # destroy
252 8764d304 Christos Stavrakakis
        net1 = mfactory.NetworkWithSubnetFactory(public=False,
253 8764d304 Christos Stavrakakis
                                                 flavor="IP_LESS_ROUTED",
254 8764d304 Christos Stavrakakis
                                                 action="DESTROY",
255 8764d304 Christos Stavrakakis
                                                 deleted=False)
256 be4d8469 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net1,
257 be4d8469 Christos Stavrakakis
                                             backend=self.backend,
258 be4d8469 Christos Stavrakakis
                                             operstate="ACTIVE")
259 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
260 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.deleted)
261 be4d8469 Christos Stavrakakis
        with mocked_quotaholder():
262 be4d8469 Christos Stavrakakis
            self.reconciler.reconcile_networks()
263 be4d8469 Christos Stavrakakis
        net1 = Network.objects.get(id=net1.id)
264 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.deleted)
265 e8234183 Christos Stavrakakis
        self.assertFalse(net1.backend_networks.filter(id=bn1.id).exists())
266 be4d8469 Christos Stavrakakis
        # But not if action is not DESTROY
267 8764d304 Christos Stavrakakis
        net2 = mfactory.NetworkWithSubnetFactory(public=False, action="CREATE")
268 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
269 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
270 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
271 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
272 be4d8469 Christos Stavrakakis
273 be4d8469 Christos Stavrakakis
    def test_missing_network(self, mrapi):
274 8764d304 Christos Stavrakakis
        net2 = mfactory.NetworkWithSubnetFactory(public=False, action="CREATE")
275 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
276 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
277 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
278 be4d8469 Christos Stavrakakis
        self.assertEqual(len(mrapi().CreateNetwork.mock_calls), 1)
279 be4d8469 Christos Stavrakakis
280 be4d8469 Christos Stavrakakis
    #def test_hanging_networks(self, mrapi):
281 be4d8469 Christos Stavrakakis
    #    pass
282 be4d8469 Christos Stavrakakis
283 be4d8469 Christos Stavrakakis
    def test_unsynced_networks(self, mrapi):
284 8764d304 Christos Stavrakakis
        net = mfactory.NetworkWithSubnetFactory(public=False, state="PENDING",
285 8764d304 Christos Stavrakakis
                                                action="CREATE", deleted=False)
286 be4d8469 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=net, backend=self.backend,
287 be4d8469 Christos Stavrakakis
                                            operstate="PENDING")
288 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
289 be4d8469 Christos Stavrakakis
                                             "group_list": [],
290 bfb3f9c2 Christos Stavrakakis
                                             "network": net.subnet4.cidr,
291 be4d8469 Christos Stavrakakis
                                             "map": "....",
292 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
293 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "PENDING")
294 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
295 be4d8469 Christos Stavrakakis
        bn = BackendNetwork.objects.get(id=bn.id)
296 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "ACTIVE")
297 be4d8469 Christos Stavrakakis
298 be4d8469 Christos Stavrakakis
    def test_orphan_networks(self, mrapi):
299 8764d304 Christos Stavrakakis
        net = mfactory.NetworkWithSubnetFactory(public=False, action="CREATE",
300 8764d304 Christos Stavrakakis
                                                deleted=True)
301 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
302 be4d8469 Christos Stavrakakis
                                             "group_list": [],
303 bfb3f9c2 Christos Stavrakakis
                                             "network": net.subnet4.cidr,
304 be4d8469 Christos Stavrakakis
                                             "map": "....",
305 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
306 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
307 be4d8469 Christos Stavrakakis
        mrapi().DeleteNetwork.assert_called_once_with(net.backend_id, [])