Statistics
| Branch: | Tag: | Revision:

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

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