Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (14.8 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 0208770b Christos Stavrakakis
        network1 = mfactory.NetworkFactory(subnet="10.0.0.0/24")
185 0208770b Christos Stavrakakis
        network2 = mfactory.NetworkFactory(subnet="192.168.2.0/24")
186 0208770b Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
187 0208770b Christos Stavrakakis
                                             deleted=False,
188 0208770b Christos Stavrakakis
                                             operstate="STOPPED")
189 a1baa42b Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm1, network=network1,
190 a1baa42b Christos Stavrakakis
                                               ipv4="10.0.0.0")
191 0208770b Christos Stavrakakis
        mrapi().GetInstances.return_value =\
192 0208770b Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
193 0208770b Christos Stavrakakis
             "beparams": {"maxmem": 2048,
194 0208770b Christos Stavrakakis
                          "minmem": 2048,
195 0208770b Christos Stavrakakis
                          "vcpus": 4},
196 0208770b Christos Stavrakakis
             "oper_state": True,
197 0208770b Christos Stavrakakis
             "mtime": time(),
198 0208770b Christos Stavrakakis
             "disk.sizes": [],
199 a1baa42b Christos Stavrakakis
             "nic.names": [nic.backend_uuid],
200 0208770b Christos Stavrakakis
             "nic.ips": ["192.168.2.1"],
201 0208770b Christos Stavrakakis
             "nic.macs": ["aa:00:bb:cc:dd:ee"],
202 a1baa42b Christos Stavrakakis
             "nic.networks.names": [network2.backend_id],
203 0208770b Christos Stavrakakis
             "tags": []}]
204 0208770b Christos Stavrakakis
        with mocked_quotaholder():
205 0208770b Christos Stavrakakis
            self.reconciler.reconcile()
206 0208770b Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
207 0208770b Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
208 0208770b Christos Stavrakakis
        nic = vm1.nics.all()[0]
209 0208770b Christos Stavrakakis
        self.assertEqual(nic.network, network2)
210 0208770b Christos Stavrakakis
        self.assertEqual(nic.ipv4, "192.168.2.1")
211 0208770b Christos Stavrakakis
        self.assertEqual(nic.mac, "aa:00:bb:cc:dd:ee")
212 be4d8469 Christos Stavrakakis
213 be4d8469 Christos Stavrakakis
214 be4d8469 Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
215 be4d8469 Christos Stavrakakis
class NetworkReconciliationTest(TestCase):
216 be4d8469 Christos Stavrakakis
    def setUp(self):
217 be4d8469 Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
218 be4d8469 Christos Stavrakakis
        log = logging.getLogger()
219 be4d8469 Christos Stavrakakis
        self.reconciler = reconciliation.NetworkReconciler(
220 be4d8469 Christos Stavrakakis
            logger=log,
221 be4d8469 Christos Stavrakakis
            fix=True)
222 be4d8469 Christos Stavrakakis
223 be4d8469 Christos Stavrakakis
    def test_parted_network(self, mrapi):
224 be4d8469 Christos Stavrakakis
        net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False)
225 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
226 be4d8469 Christos Stavrakakis
        # Test nothing if Ganeti returns nothing
227 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
228 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
229 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
230 be4d8469 Christos Stavrakakis
231 be4d8469 Christos Stavrakakis
        # Test creation if exists in Ganeti
232 be4d8469 Christos Stavrakakis
        self.assertEqual(net1.backend_networks.count(), 0)
233 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net1.backend_id,
234 a1baa42b Christos Stavrakakis
                                             "group_list": [["default",
235 a1baa42b Christos Stavrakakis
                                                             "bridged",
236 a1baa42b Christos Stavrakakis
                                                             "prv0"]],
237 be4d8469 Christos Stavrakakis
                                             "network": net1.subnet,
238 be4d8469 Christos Stavrakakis
                                             "map": "....",
239 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
240 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
241 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.backend_networks
242 be4d8469 Christos Stavrakakis
                            .filter(backend=self.backend).exists())
243 be4d8469 Christos Stavrakakis
        # ..but not if it is destroying
244 be4d8469 Christos Stavrakakis
        net1.backend_networks.all().delete()
245 be4d8469 Christos Stavrakakis
        net1.action = "DESTROY"
246 be4d8469 Christos Stavrakakis
        net1.save()
247 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
248 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.backend_networks
249 be4d8469 Christos Stavrakakis
                             .filter(backend=self.backend).exists())
250 be4d8469 Christos Stavrakakis
        # or network is public!
251 be4d8469 Christos Stavrakakis
        net1.action = "CREATE"
252 be4d8469 Christos Stavrakakis
        net1.public = True
253 be4d8469 Christos Stavrakakis
        net1.save()
254 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
255 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.backend_networks
256 be4d8469 Christos Stavrakakis
                             .filter(backend=self.backend).exists())
257 be4d8469 Christos Stavrakakis
        # Test creation if network is a floating IP pool
258 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30",
259 be4d8469 Christos Stavrakakis
                                       floating_ip_pool=True)
260 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
261 be4d8469 Christos Stavrakakis
        self.assertEqual(net2.backend_networks.count(), 0)
262 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
263 be4d8469 Christos Stavrakakis
        self.assertTrue(net2.backend_networks
264 be4d8469 Christos Stavrakakis
                            .filter(backend=self.backend).exists())
265 be4d8469 Christos Stavrakakis
266 be4d8469 Christos Stavrakakis
    def test_stale_network(self, mrapi):
267 be4d8469 Christos Stavrakakis
        # Test that stale network will be deleted from DB, if network action is
268 be4d8469 Christos Stavrakakis
        # destroy
269 be4d8469 Christos Stavrakakis
        net1 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
270 be4d8469 Christos Stavrakakis
                                       flavor="IP_LESS_ROUTED",
271 be4d8469 Christos Stavrakakis
                                       action="DESTROY", deleted=False)
272 be4d8469 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net1,
273 be4d8469 Christos Stavrakakis
                                             backend=self.backend,
274 be4d8469 Christos Stavrakakis
                                             operstate="ACTIVE")
275 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
276 be4d8469 Christos Stavrakakis
        self.assertFalse(net1.deleted)
277 be4d8469 Christos Stavrakakis
        with mocked_quotaholder():
278 be4d8469 Christos Stavrakakis
            self.reconciler.reconcile_networks()
279 be4d8469 Christos Stavrakakis
        bn1 = BackendNetwork.objects.get(id=bn1.id)
280 be4d8469 Christos Stavrakakis
        net1 = Network.objects.get(id=net1.id)
281 be4d8469 Christos Stavrakakis
        self.assertEqual(bn1.operstate, "DELETED")
282 be4d8469 Christos Stavrakakis
        self.assertTrue(net1.deleted)
283 be4d8469 Christos Stavrakakis
        # But not if action is not DESTROY
284 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
285 be4d8469 Christos Stavrakakis
                                       action="CREATE")
286 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
287 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
288 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
289 be4d8469 Christos Stavrakakis
        self.assertFalse(net2.deleted)
290 be4d8469 Christos Stavrakakis
291 be4d8469 Christos Stavrakakis
    def test_missing_network(self, mrapi):
292 be4d8469 Christos Stavrakakis
        net2 = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
293 be4d8469 Christos Stavrakakis
                                       action="CREATE")
294 be4d8469 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net2, backend=self.backend)
295 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = []
296 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
297 be4d8469 Christos Stavrakakis
        self.assertEqual(len(mrapi().CreateNetwork.mock_calls), 1)
298 be4d8469 Christos Stavrakakis
299 be4d8469 Christos Stavrakakis
    #def test_hanging_networks(self, mrapi):
300 be4d8469 Christos Stavrakakis
    #    pass
301 be4d8469 Christos Stavrakakis
302 be4d8469 Christos Stavrakakis
    def test_unsynced_networks(self, mrapi):
303 be4d8469 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
304 be4d8469 Christos Stavrakakis
                                      state="PENDING",
305 be4d8469 Christos Stavrakakis
                                      action="CREATE", deleted=False)
306 be4d8469 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=net, backend=self.backend,
307 be4d8469 Christos Stavrakakis
                                            operstate="PENDING")
308 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
309 be4d8469 Christos Stavrakakis
                                             "group_list": [],
310 be4d8469 Christos Stavrakakis
                                             "network": net.subnet,
311 be4d8469 Christos Stavrakakis
                                             "map": "....",
312 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
313 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "PENDING")
314 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
315 be4d8469 Christos Stavrakakis
        bn = BackendNetwork.objects.get(id=bn.id)
316 be4d8469 Christos Stavrakakis
        self.assertEqual(bn.operstate, "ACTIVE")
317 be4d8469 Christos Stavrakakis
318 be4d8469 Christos Stavrakakis
    def test_orphan_networks(self, mrapi):
319 be4d8469 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet="192.168.0.0/30", public=False,
320 be4d8469 Christos Stavrakakis
                                      action="CREATE", deleted=True)
321 be4d8469 Christos Stavrakakis
        mrapi().GetNetworks.return_value = [{"name": net.backend_id,
322 be4d8469 Christos Stavrakakis
                                             "group_list": [],
323 be4d8469 Christos Stavrakakis
                                             "network": net.subnet,
324 be4d8469 Christos Stavrakakis
                                             "map": "....",
325 be4d8469 Christos Stavrakakis
                                             "external_reservations": ""}]
326 be4d8469 Christos Stavrakakis
        self.reconciler.reconcile_networks()
327 be4d8469 Christos Stavrakakis
        mrapi().DeleteNetwork.assert_called_once_with(net.backend_id, [])