Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (13.7 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 0208770b Christos Stavrakakis
        with mocked_quotaholder():
93 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
94 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
95 0208770b Christos Stavrakakis
        self.assertTrue(vm1.deleted)
96 0208770b Christos Stavrakakis
97 0208770b Christos Stavrakakis
    def test_orphan_server(self, mrapi):
98 0208770b Christos Stavrakakis
        cmrapi = self.reconciler.client
99 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
100 0208770b Christos Stavrakakis
            [{"name": "%s22" % settings.BACKEND_PREFIX_ID,
101 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 1024,
102 0208770b Christos Stavrakakis
                          "minmem": 1024,
103 0208770b Christos Stavrakakis
                          "vcpus": 4},
104 0208770b Christos Stavrakakis
             "oper_state": True,
105 0208770b Christos Stavrakakis
             "mtime": time(),
106 0208770b Christos Stavrakakis
             "disk.sizes": [],
107 0208770b Christos Stavrakakis
             "nic.ips": [],
108 0208770b Christos Stavrakakis
             "nic.macs": [],
109 0208770b Christos Stavrakakis
             "nic.networks": [],
110 0208770b Christos Stavrakakis
             "tags": []}]
111 0208770b Christos Stavrakakis
        self.reconciler.reconcile()
112 0208770b Christos Stavrakakis
        cmrapi.DeleteInstance\
113 0208770b Christos Stavrakakis
              .assert_called_once_with("%s22" % settings.BACKEND_PREFIX_ID)
114 0208770b Christos Stavrakakis
115 0208770b Christos Stavrakakis
    def test_unsynced_operstate(self, mrapi):
116 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
117 0208770b Christos Stavrakakis
                                             deleted=False,
118 0208770b Christos Stavrakakis
                                             operstate="STOPPED")
119 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
120 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
121 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 1024,
122 0208770b Christos Stavrakakis
                          "minmem": 1024,
123 0208770b Christos Stavrakakis
                          "vcpus": 4},
124 0208770b Christos Stavrakakis
             "oper_state": True,
125 0208770b Christos Stavrakakis
             "mtime": time(),
126 0208770b Christos Stavrakakis
             "disk.sizes": [],
127 0208770b Christos Stavrakakis
             "nic.ips": [],
128 0208770b Christos Stavrakakis
             "nic.macs": [],
129 0208770b Christos Stavrakakis
             "nic.networks": [],
130 0208770b Christos Stavrakakis
             "tags": []}]
131 0208770b Christos Stavrakakis
        with mocked_quotaholder():
132 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
133 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
134 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
135 0208770b Christos Stavrakakis
136 0208770b Christos Stavrakakis
    def test_unsynced_flavor(self, mrapi):
137 0208770b Christos Stavrakakis
        flavor1 = mfactory.FlavorFactory(cpu=2, ram=1024, disk=1,
138 0208770b Christos Stavrakakis
                                         disk_template="drbd")
139 0208770b Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(cpu=4, ram=2048, disk=1,
140 0208770b Christos Stavrakakis
                                         disk_template="drbd")
141 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
142 0208770b Christos Stavrakakis
                                             deleted=False,
143 0208770b Christos Stavrakakis
                                             flavor=flavor1,
144 0208770b Christos Stavrakakis
                                             operstate="STARTED")
145 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
146 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
147 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 2048,
148 0208770b Christos Stavrakakis
                          "minmem": 2048,
149 0208770b Christos Stavrakakis
                          "vcpus": 4},
150 0208770b Christos Stavrakakis
             "oper_state": True,
151 0208770b Christos Stavrakakis
             "mtime": time(),
152 0208770b Christos Stavrakakis
             "disk.sizes": [],
153 0208770b Christos Stavrakakis
             "nic.ips": [],
154 0208770b Christos Stavrakakis
             "nic.macs": [],
155 0208770b Christos Stavrakakis
             "nic.networks": [],
156 0208770b Christos Stavrakakis
             "tags": []}]
157 0208770b Christos Stavrakakis
        with mocked_quotaholder():
158 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
159 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
160 0208770b Christos Stavrakakis
        self.assertEqual(vm1.flavor, flavor2)
161 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
162 0208770b Christos Stavrakakis
163 0208770b Christos Stavrakakis
    def test_unsynced_nics(self, mrapi):
164 0208770b Christos Stavrakakis
        network1 = mfactory.NetworkFactory(subnet="10.0.0.0/24")
165 0208770b Christos Stavrakakis
        network2 = mfactory.NetworkFactory(subnet="192.168.2.0/24")
166 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
167 0208770b Christos Stavrakakis
                                             deleted=False,
168 0208770b Christos Stavrakakis
                                             operstate="STOPPED")
169 0208770b Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm1, network=network1,
170 0208770b Christos Stavrakakis
                                         ipv4="10.0.0.0")
171 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
172 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
173 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 2048,
174 0208770b Christos Stavrakakis
                          "minmem": 2048,
175 0208770b Christos Stavrakakis
                          "vcpus": 4},
176 0208770b Christos Stavrakakis
             "oper_state": True,
177 0208770b Christos Stavrakakis
             "mtime": time(),
178 0208770b Christos Stavrakakis
             "disk.sizes": [],
179 0208770b Christos Stavrakakis
             "nic.ips": ["192.168.2.1"],
180 0208770b Christos Stavrakakis
             "nic.macs": ["aa:00:bb:cc:dd:ee"],
181 0208770b Christos Stavrakakis
             "nic.networks": [network2.backend_id],
182 0208770b Christos Stavrakakis
             "tags": []}]
183 0208770b Christos Stavrakakis
        with mocked_quotaholder():
184 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
185 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
186 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
187 0208770b Christos Stavrakakis
        nic = vm1.nics.all()[0]
188 0208770b Christos Stavrakakis
        self.assertEqual(nic.network, network2)
189 0208770b Christos Stavrakakis
        self.assertEqual(nic.ipv4, "192.168.2.1")
190 0208770b Christos Stavrakakis
        self.assertEqual(nic.mac, "aa:00:bb:cc:dd:ee")
191 be4d8469 Christos Stavrakakis
192 be4d8469 Christos Stavrakakis
193 be4d8469 Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
194 be4d8469 Christos Stavrakakis
class NetworkReconciliationTest(TestCase):
195 be4d8469 Christos Stavrakakis
    def setUp(self):
196 be4d8469 Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
197 be4d8469 Christos Stavrakakis
        log = logging.getLogger()
198 be4d8469 Christos Stavrakakis
        self.reconciler = reconciliation.NetworkReconciler(
199 be4d8469 Christos Stavrakakis
            logger=log,
200 be4d8469 Christos Stavrakakis
            fix=True)
201 be4d8469 Christos Stavrakakis
202 be4d8469 Christos Stavrakakis
    def test_parted_network(self, mrapi):
203 be4d8469 Christos Stavrakakis
        net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False)
204 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
205 be4d8469 Christos Stavrakakis
        # Test nothing if Ganeti returns nothing
206 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
207 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
208 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
209 be4d8469 Christos Stavrakakis
210 be4d8469 Christos Stavrakakis
        # Test creation if exists in Ganeti
211 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
212 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net1.backend_id,
213 be4d8469 Christos Stavrakakis
                                             "group_list": ["default"],
214 be4d8469 Christos Stavrakakis
                                             "network": net1.subnet,
215 be4d8469 Christos Stavrakakis
                                             "map": "....",
216 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
217 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
218 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.backend_networks
219 be4d8469 Christos Stavrakakis
                            .filter(backend=self.backend).exists())
220 be4d8469 Christos Stavrakakis
        # ..but not if it is destroying
221 be4d8469 Christos Stavrakakis
        net1.backend_networks.all().delete()
222 be4d8469 Christos Stavrakakis
        net1.action = "DESTROY"
223 be4d8469 Christos Stavrakakis
        net1.save()
224 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
225 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.backend_networks
226 be4d8469 Christos Stavrakakis
                             .filter(backend=self.backend).exists())
227 be4d8469 Christos Stavrakakis
        # or network is public!
228 be4d8469 Christos Stavrakakis
        net1.action = "CREATE"
229 be4d8469 Christos Stavrakakis
        net1.public = True
230 be4d8469 Christos Stavrakakis
        net1.save()
231 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
232 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.backend_networks
233 be4d8469 Christos Stavrakakis
                             .filter(backend=self.backend).exists())
234 be4d8469 Christos Stavrakakis
        # Test creation if network is a floating IP pool
235 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30",
236 be4d8469 Christos Stavrakakis
                                       floating_ip_pool=True)
237 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
238 be4d8469 Christos Stavrakakis
        self.assertEqual(net2.backend_networks.count(), 0)
239 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
240 be4d8469 Christos Stavrakakis
        self.assertTrue(net2.backend_networks
241 be4d8469 Christos Stavrakakis
                            .filter(backend=self.backend).exists())
242 be4d8469 Christos Stavrakakis
243 be4d8469 Christos Stavrakakis
    def test_stale_network(self, mrapi):
244 be4d8469 Christos Stavrakakis
        # Test that stale network will be deleted from DB, if network action is
245 be4d8469 Christos Stavrakakis
        # destroy
246 be4d8469 Christos Stavrakakis
        net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
247 be4d8469 Christos Stavrakakis
                                       flavor="IP_LESS_ROUTED",
248 be4d8469 Christos Stavrakakis
                                       action="DESTROY", deleted=False)
249 be4d8469 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net1,
250 be4d8469 Christos Stavrakakis
                                             backend=self.backend,
251 be4d8469 Christos Stavrakakis
                                             operstate="ACTIVE")
252 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
253 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.deleted)
254 be4d8469 Christos Stavrakakis
        with mocked_quotaholder():
255 be4d8469 Christos Stavrakakis
            self.reconciler.reconcile_networks()
256 be4d8469 Christos Stavrakakis
        bn1 = BackendNetwork.objects.get(id=bn1.id)
257 be4d8469 Christos Stavrakakis
        net1 = Network.objects.get(id=net1.id)
258 be4d8469 Christos Stavrakakis
        self.assertEqual(bn1.operstate, "DELETED")
259 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.deleted)
260 be4d8469 Christos Stavrakakis
        # But not if action is not DESTROY
261 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
262 be4d8469 Christos Stavrakakis
                                       action="CREATE")
263 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
264 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
265 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
266 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
267 be4d8469 Christos Stavrakakis
268 be4d8469 Christos Stavrakakis
    def test_missing_network(self, mrapi):
269 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
270 be4d8469 Christos Stavrakakis
                                       action="CREATE")
271 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
272 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
273 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
274 be4d8469 Christos Stavrakakis
        self.assertEqual(len(mrapi().CreateNetwork.mock_calls), 1)
275 be4d8469 Christos Stavrakakis
276 be4d8469 Christos Stavrakakis
    #def test_hanging_networks(self, mrapi):
277 be4d8469 Christos Stavrakakis
    #    pass
278 be4d8469 Christos Stavrakakis
279 be4d8469 Christos Stavrakakis
    def test_unsynced_networks(self, mrapi):
280 be4d8469 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
281 be4d8469 Christos Stavrakakis
                                      state="PENDING",
282 be4d8469 Christos Stavrakakis
                                      action="CREATE", deleted=False)
283 be4d8469 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=net, backend=self.backend,
284 be4d8469 Christos Stavrakakis
                                            operstate="PENDING")
285 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
286 be4d8469 Christos Stavrakakis
                                             "group_list": [],
287 be4d8469 Christos Stavrakakis
                                             "network": net.subnet,
288 be4d8469 Christos Stavrakakis
                                             "map": "....",
289 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
290 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "PENDING")
291 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
292 be4d8469 Christos Stavrakakis
        bn = BackendNetwork.objects.get(id=bn.id)
293 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "ACTIVE")
294 be4d8469 Christos Stavrakakis
295 be4d8469 Christos Stavrakakis
    def test_orphan_networks(self, mrapi):
296 be4d8469 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
297 be4d8469 Christos Stavrakakis
                                      action="CREATE", deleted=True)
298 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
299 be4d8469 Christos Stavrakakis
                                             "group_list": [],
300 be4d8469 Christos Stavrakakis
                                             "network": net.subnet,
301 be4d8469 Christos Stavrakakis
                                             "map": "....",
302 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
303 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
304 be4d8469 Christos Stavrakakis
        mrapi().DeleteNetwork.assert_called_once_with(net.backend_id, [])