Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / tests.py @ 2cd55da6

History | View | Annotate | Download (36.2 kB)

1 b8033991 Georgios Gousios
# vim: set fileencoding=utf-8 :
2 47eeffa9 Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
3 09c936a7 Vassilios Karakoidas
#
4 48130e66 Georgios Gousios
# Redistribution and use in source and binary forms, with or without
5 48130e66 Georgios Gousios
# modification, are permitted provided that the following conditions
6 48130e66 Georgios Gousios
# are met:
7 09c936a7 Vassilios Karakoidas
#
8 48130e66 Georgios Gousios
#   1. Redistributions of source code must retain the above copyright
9 48130e66 Georgios Gousios
#      notice, this list of conditions and the following disclaimer.
10 48130e66 Georgios Gousios
#
11 48130e66 Georgios Gousios
#  2. Redistributions in binary form must reproduce the above copyright
12 48130e66 Georgios Gousios
#     notice, this list of conditions and the following disclaimer in the
13 48130e66 Georgios Gousios
#     documentation and/or other materials provided with the distribution.
14 09c936a7 Vassilios Karakoidas
#
15 48130e66 Georgios Gousios
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 48130e66 Georgios Gousios
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 48130e66 Georgios Gousios
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 48130e66 Georgios Gousios
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 48130e66 Georgios Gousios
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 48130e66 Georgios Gousios
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 48130e66 Georgios Gousios
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 48130e66 Georgios Gousios
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 48130e66 Georgios Gousios
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 48130e66 Georgios Gousios
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 48130e66 Georgios Gousios
# SUCH DAMAGE.
26 09c936a7 Vassilios Karakoidas
#
27 48130e66 Georgios Gousios
# The views and conclusions contained in the software and documentation are
28 48130e66 Georgios Gousios
# those of the authors and should not be interpreted as representing official
29 48130e66 Georgios Gousios
# policies, either expressed or implied, of GRNET S.A.
30 48130e66 Georgios Gousios
31 48130e66 Georgios Gousios
# Provides automated tests for logic module
32 92c53da1 Vassilios Karakoidas
33 c25cc9ec Vangelis Koukis
from random import randint
34 c25cc9ec Vangelis Koukis
35 c25cc9ec Vangelis Koukis
from django.test import TestCase
36 c25cc9ec Vangelis Koukis
37 41a7fae7 Christos Stavrakakis
from snf_django.lib.api import faults
38 420f2c20 Georgios Gousios
from synnefo.db.models import *
39 47eeffa9 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
40 41a7fae7 Christos Stavrakakis
from synnefo.logic import reconciliation, servers
41 47eeffa9 Christos Stavrakakis
from synnefo.lib.utils import split_time
42 47eeffa9 Christos Stavrakakis
from datetime import datetime
43 47eeffa9 Christos Stavrakakis
from mock import patch
44 47eeffa9 Christos Stavrakakis
from synnefo.api.util import allocate_resource
45 fd95834e Christos Stavrakakis
from synnefo.logic.callbacks import (update_db, update_network,
46 cc92b70f Christos Stavrakakis
                                     update_build_progress)
47 184a2a8c Christos Stavrakakis
from snf_django.utils.testing import mocked_quotaholder
48 47eeffa9 Christos Stavrakakis
49 47eeffa9 Christos Stavrakakis
now = datetime.now
50 47eeffa9 Christos Stavrakakis
from time import time
51 47eeffa9 Christos Stavrakakis
import json
52 47eeffa9 Christos Stavrakakis
53 41a7fae7 Christos Stavrakakis
54 41a7fae7 Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
55 41a7fae7 Christos Stavrakakis
class ServerCommandTest(TestCase):
56 41a7fae7 Christos Stavrakakis
    def test_pending_task(self, mrapi):
57 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1)
58 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
59 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1)
60 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BuildInProgress, servers.start, vm)
61 41a7fae7 Christos Stavrakakis
        # Assert always succeeds
62 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1)
63 41a7fae7 Christos Stavrakakis
        mrapi().DeleteInstance.return_value = 1
64 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
65 41a7fae7 Christos Stavrakakis
            servers.destroy(vm)
66 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1)
67 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
68 41a7fae7 Christos Stavrakakis
            servers.destroy(vm)
69 41a7fae7 Christos Stavrakakis
70 41a7fae7 Christos Stavrakakis
    def test_deleted_vm(self, mrapi):
71 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(deleted=True)
72 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
73 41a7fae7 Christos Stavrakakis
74 41a7fae7 Christos Stavrakakis
    def test_invalid_operstate_for_action(self, mrapi):
75 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STARTED")
76 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.start, vm)
77 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
78 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.stop, vm)
79 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STARTED")
80 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.resize, vm)
81 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
82 41a7fae7 Christos Stavrakakis
        self.assertRaises(faults.BadRequest, servers.stop, vm)
83 41a7fae7 Christos Stavrakakis
        #test valid
84 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
85 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
86 41a7fae7 Christos Stavrakakis
            servers.start(vm)
87 41a7fae7 Christos Stavrakakis
        vm.task = None
88 41a7fae7 Christos Stavrakakis
        vm.task_job_id = None
89 41a7fae7 Christos Stavrakakis
        vm.save()
90 41a7fae7 Christos Stavrakakis
        mrapi().RebootInstance.return_value = 1
91 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
92 41a7fae7 Christos Stavrakakis
            servers.reboot(vm, "HARD")
93 41a7fae7 Christos Stavrakakis
94 41a7fae7 Christos Stavrakakis
    def test_commission(self, mrapi):
95 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate="STOPPED")
96 41a7fae7 Christos Stavrakakis
        # Still pending
97 41a7fae7 Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=200,
98 41a7fae7 Christos Stavrakakis
                                                      resolved=False,
99 41a7fae7 Christos Stavrakakis
                                                      pending=True)
100 41a7fae7 Christos Stavrakakis
        serial = vm.serial
101 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
102 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
103 41a7fae7 Christos Stavrakakis
            servers.start(vm)
104 41a7fae7 Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [],
105 41a7fae7 Christos Stavrakakis
                                                          [serial.serial])
106 41a7fae7 Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
107 41a7fae7 Christos Stavrakakis
        # Not pending, rejct
108 41a7fae7 Christos Stavrakakis
        vm.task = None
109 41a7fae7 Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=400,
110 41a7fae7 Christos Stavrakakis
                                                      resolved=False,
111 41a7fae7 Christos Stavrakakis
                                                      pending=False,
112 41a7fae7 Christos Stavrakakis
                                                      accept=False)
113 41a7fae7 Christos Stavrakakis
        serial = vm.serial
114 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
115 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
116 41a7fae7 Christos Stavrakakis
            servers.start(vm)
117 41a7fae7 Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [],
118 41a7fae7 Christos Stavrakakis
                                                          [serial.serial])
119 41a7fae7 Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
120 41a7fae7 Christos Stavrakakis
        # Not pending, accept
121 41a7fae7 Christos Stavrakakis
        vm.task = None
122 41a7fae7 Christos Stavrakakis
        vm.serial = mfactory.QuotaHolderSerialFactory(serial=600,
123 41a7fae7 Christos Stavrakakis
                                                      resolved=False,
124 41a7fae7 Christos Stavrakakis
                                                      pending=False,
125 41a7fae7 Christos Stavrakakis
                                                      accept=True)
126 41a7fae7 Christos Stavrakakis
        serial = vm.serial
127 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
128 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
129 41a7fae7 Christos Stavrakakis
            servers.start(vm)
130 41a7fae7 Christos Stavrakakis
            m.resolve_commissions.assert_called_once_with('', [serial.serial],
131 41a7fae7 Christos Stavrakakis
                                                          [])
132 41a7fae7 Christos Stavrakakis
            self.assertTrue(m.issue_one_commission.called)
133 41a7fae7 Christos Stavrakakis
134 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.side_effect = ValueError
135 41a7fae7 Christos Stavrakakis
        vm.task = None
136 41a7fae7 Christos Stavrakakis
        vm.serial = None
137 41a7fae7 Christos Stavrakakis
        # Test reject if Ganeti erro
138 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
139 41a7fae7 Christos Stavrakakis
            try:
140 41a7fae7 Christos Stavrakakis
                servers.start(vm)
141 41a7fae7 Christos Stavrakakis
            except:
142 41a7fae7 Christos Stavrakakis
                m.resolve_commissions.assert_called_once_with('', [],
143 41a7fae7 Christos Stavrakakis
                                                            [vm.serial.serial])
144 41a7fae7 Christos Stavrakakis
145 41a7fae7 Christos Stavrakakis
    def test_task_after(self, mrapi):
146 41a7fae7 Christos Stavrakakis
        return
147 41a7fae7 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
148 41a7fae7 Christos Stavrakakis
        mrapi().StartupInstance.return_value = 1
149 41a7fae7 Christos Stavrakakis
        mrapi().ShutdownInstance.return_value = 2
150 41a7fae7 Christos Stavrakakis
        mrapi().RebootInstance.return_value = 2
151 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
152 41a7fae7 Christos Stavrakakis
            vm.task = None
153 41a7fae7 Christos Stavrakakis
            vm.operstate = "STOPPED"
154 41a7fae7 Christos Stavrakakis
            servers.start(vm)
155 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task, "START")
156 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 1)
157 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
158 41a7fae7 Christos Stavrakakis
            vm.task = None
159 41a7fae7 Christos Stavrakakis
            vm.operstate = "STARTED"
160 41a7fae7 Christos Stavrakakis
            servers.stop(vm)
161 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task, "STOP")
162 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 2)
163 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder() as m:
164 41a7fae7 Christos Stavrakakis
            vm.task = None
165 41a7fae7 Christos Stavrakakis
            servers.reboot(vm)
166 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task, "REBOOT")
167 41a7fae7 Christos Stavrakakis
            self.assertEqual(vm.task_job_id, 3)
168 41a7fae7 Christos Stavrakakis
169 41a7fae7 Christos Stavrakakis
170 41a7fae7 Christos Stavrakakis
171 47eeffa9 Christos Stavrakakis
## Test Callbacks
172 47eeffa9 Christos Stavrakakis
173 47eeffa9 Christos Stavrakakis
174 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
175 47eeffa9 Christos Stavrakakis
class UpdateDBTest(TestCase):
176 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
177 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-eventd message"""
178 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
179 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-op-status'
180 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
181 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
182 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
183 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
184 47eeffa9 Christos Stavrakakis
            msg[key] = val
185 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
186 47eeffa9 Christos Stavrakakis
        return message
187 47eeffa9 Christos Stavrakakis
188 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
189 47eeffa9 Christos Stavrakakis
        update_db(client, json.dumps({'body': {}}))
190 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_reject.called)
191 47eeffa9 Christos Stavrakakis
192 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
193 47eeffa9 Christos Stavrakakis
        update_db(client, {})
194 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
195 47eeffa9 Christos Stavrakakis
196 47eeffa9 Christos Stavrakakis
    def test_missing_instance(self, client):
197 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
198 47eeffa9 Christos Stavrakakis
                              instance='foo')
199 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
200 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
201 47eeffa9 Christos Stavrakakis
202 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
203 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
204 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
205 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_nack.called)
206 47eeffa9 Christos Stavrakakis
207 b66e4833 Christos Stavrakakis
    def test_old_msg(self, client):
208 b66e4833 Christos Stavrakakis
        from time import sleep
209 b66e4833 Christos Stavrakakis
        from datetime import datetime
210 b66e4833 Christos Stavrakakis
        old_time = time()
211 b66e4833 Christos Stavrakakis
        sleep(0.01)
212 b66e4833 Christos Stavrakakis
        new_time = datetime.fromtimestamp(time())
213 b66e4833 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(backendtime=new_time)
214 b66e4833 Christos Stavrakakis
        vm.operstate = 'STOPPED'
215 b66e4833 Christos Stavrakakis
        vm.save()
216 b66e4833 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
217 b66e4833 Christos Stavrakakis
                              event_time=split_time(old_time),
218 b66e4833 Christos Stavrakakis
                              instance=vm.backend_vm_id)
219 b66e4833 Christos Stavrakakis
        update_db(client, msg)
220 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
221 b66e4833 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
222 b66e4833 Christos Stavrakakis
        self.assertEquals(db_vm.operstate, "STOPPED")
223 b66e4833 Christos Stavrakakis
        self.assertEquals(db_vm.backendtime, new_time)
224 b66e4833 Christos Stavrakakis
225 47eeffa9 Christos Stavrakakis
    def test_start(self, client):
226 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
227 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
228 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
229 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
230 41a7fae7 Christos Stavrakakis
            update_db(client, msg)
231 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
232 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
233 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
234 47eeffa9 Christos Stavrakakis
235 47eeffa9 Christos Stavrakakis
    def test_stop(self, client):
236 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
237 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_SHUTDOWN',
238 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
239 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
240 41a7fae7 Christos Stavrakakis
            update_db(client, msg)
241 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
242 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
243 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STOPPED')
244 47eeffa9 Christos Stavrakakis
245 47eeffa9 Christos Stavrakakis
    def test_reboot(self, client):
246 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
247 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REBOOT',
248 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
249 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
250 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
251 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
252 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
253 47eeffa9 Christos Stavrakakis
254 47eeffa9 Christos Stavrakakis
    def test_remove(self, client):
255 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
256 47eeffa9 Christos Stavrakakis
        # Also create a NIC
257 72dea98f Christos Stavrakakis
        nic = mfactory.NetworkInterfaceFactory(machine=vm)
258 72dea98f Christos Stavrakakis
        nic.network.get_pool().reserve(nic.ipv4)
259 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
260 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
261 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
262 184a2a8c Christos Stavrakakis
            update_db(client, msg)
263 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
264 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
265 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'DESTROYED')
266 47eeffa9 Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
267 47eeffa9 Christos Stavrakakis
        # Check that nics are deleted
268 47eeffa9 Christos Stavrakakis
        self.assertFalse(db_vm.nics.all())
269 72dea98f Christos Stavrakakis
        self.assertTrue(nic.network.get_pool().is_available(nic.ipv4))
270 72dea98f Christos Stavrakakis
        vm2 = mfactory.VirtualMachineFactory()
271 72dea98f Christos Stavrakakis
        network = mfactory.NetworkFactory()
272 72dea98f Christos Stavrakakis
        fp1 = mfactory.FloatingIPFactory(machine=vm2, network=network)
273 72dea98f Christos Stavrakakis
        fp2 = mfactory.FloatingIPFactory(machine=vm2, network=network)
274 72dea98f Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm2, network=network,
275 72dea98f Christos Stavrakakis
                ipv4=fp1.ipv4)
276 72dea98f Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm2, network=network,
277 72dea98f Christos Stavrakakis
                ipv4=fp2.ipv4)
278 72dea98f Christos Stavrakakis
        pool = network.get_pool()
279 72dea98f Christos Stavrakakis
        pool.reserve(fp1.ipv4)
280 72dea98f Christos Stavrakakis
        pool.reserve(fp2.ipv4)
281 72dea98f Christos Stavrakakis
        pool.save()
282 72dea98f Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
283 72dea98f Christos Stavrakakis
                              instance=vm2.backend_vm_id)
284 72dea98f Christos Stavrakakis
        with mocked_quotaholder():
285 72dea98f Christos Stavrakakis
            update_db(client, msg)
286 72dea98f Christos Stavrakakis
        client.basic_ack.assert_called_once()
287 72dea98f Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
288 72dea98f Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'DESTROYED')
289 72dea98f Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
290 72dea98f Christos Stavrakakis
        self.assertEqual(FloatingIP.objects.get(id=fp1.id).machine, None)
291 72dea98f Christos Stavrakakis
        self.assertEqual(FloatingIP.objects.get(id=fp2.id).machine, None)
292 72dea98f Christos Stavrakakis
        pool = network.get_pool()
293 72dea98f Christos Stavrakakis
        # Test that floating ips are not released
294 72dea98f Christos Stavrakakis
        self.assertFalse(pool.is_available(fp1.ipv4))
295 72dea98f Christos Stavrakakis
        self.assertFalse(pool.is_available(fp2.ipv4))
296 47eeffa9 Christos Stavrakakis
297 47eeffa9 Christos Stavrakakis
    def test_create(self, client):
298 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
299 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_CREATE',
300 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
301 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
302 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
303 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
304 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
305 47eeffa9 Christos Stavrakakis
306 47eeffa9 Christos Stavrakakis
    def test_create_error(self, client):
307 47eeffa9 Christos Stavrakakis
        """Test that error create sets vm to ERROR state"""
308 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
309 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_CREATE',
310 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id,
311 47eeffa9 Christos Stavrakakis
                              status='error')
312 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
313 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
314 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
315 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'ERROR')
316 47eeffa9 Christos Stavrakakis
317 47eeffa9 Christos Stavrakakis
    def test_remove_from_error(self, client):
318 47eeffa9 Christos Stavrakakis
        """Test that error removes delete error builds"""
319 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
320 47eeffa9 Christos Stavrakakis
        # Also create a NIC
321 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
322 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
323 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
324 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
325 184a2a8c Christos Stavrakakis
            update_db(client, msg)
326 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
327 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
328 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'DESTROYED')
329 47eeffa9 Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
330 47eeffa9 Christos Stavrakakis
        # Check that nics are deleted
331 47eeffa9 Christos Stavrakakis
        self.assertFalse(db_vm.nics.all())
332 47eeffa9 Christos Stavrakakis
333 47eeffa9 Christos Stavrakakis
    def test_other_error(self, client):
334 47eeffa9 Christos Stavrakakis
        """Test that other error messages do no affect the VM"""
335 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
336 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
337 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id,
338 47eeffa9 Christos Stavrakakis
                              status='error')
339 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
340 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
341 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
342 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, vm.operstate)
343 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.backendtime, vm.backendtime)
344 47eeffa9 Christos Stavrakakis
345 ca4d59e3 Christos Stavrakakis
    def test_resize_msg(self, client):
346 ca4d59e3 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
347 ca4d59e3 Christos Stavrakakis
        # Test empty beparams
348 ca4d59e3 Christos Stavrakakis
        for status in ["success", "error"]:
349 ca4d59e3 Christos Stavrakakis
            msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS',
350 ca4d59e3 Christos Stavrakakis
                                  instance=vm.backend_vm_id,
351 ca4d59e3 Christos Stavrakakis
                                  beparams={},
352 ca4d59e3 Christos Stavrakakis
                                  status=status)
353 ca4d59e3 Christos Stavrakakis
            client.reset_mock()
354 41a7fae7 Christos Stavrakakis
            with mocked_quotaholder():
355 41a7fae7 Christos Stavrakakis
                update_db(client, msg)
356 ca4d59e3 Christos Stavrakakis
            self.assertTrue(client.basic_ack.called)
357 ca4d59e3 Christos Stavrakakis
            db_vm = VirtualMachine.objects.get(id=vm.id)
358 ca4d59e3 Christos Stavrakakis
            self.assertEqual(db_vm.operstate, vm.operstate)
359 ca4d59e3 Christos Stavrakakis
        # Test intermediate states
360 2cd55da6 Christos Stavrakakis
        vm.operstate = "STOPPED"
361 2cd55da6 Christos Stavrakakis
        vm.save()
362 ca4d59e3 Christos Stavrakakis
        for status in ["queued", "waiting", "running"]:
363 ca4d59e3 Christos Stavrakakis
            msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS',
364 ca4d59e3 Christos Stavrakakis
                                  instance=vm.backend_vm_id,
365 ca4d59e3 Christos Stavrakakis
                                  beparams={"vcpus": 4, "minmem": 2048,
366 ca4d59e3 Christos Stavrakakis
                                            "maxmem": 2048},
367 ca4d59e3 Christos Stavrakakis
                                  status=status)
368 ca4d59e3 Christos Stavrakakis
            client.reset_mock()
369 ca4d59e3 Christos Stavrakakis
            update_db(client, msg)
370 ca4d59e3 Christos Stavrakakis
            self.assertTrue(client.basic_ack.called)
371 ca4d59e3 Christos Stavrakakis
            db_vm = VirtualMachine.objects.get(id=vm.id)
372 41a7fae7 Christos Stavrakakis
            self.assertEqual(db_vm.operstate, "STOPPED")
373 ca4d59e3 Christos Stavrakakis
        # Test operstate after error
374 ca4d59e3 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS',
375 ca4d59e3 Christos Stavrakakis
                              instance=vm.backend_vm_id,
376 ca4d59e3 Christos Stavrakakis
                              beparams={"vcpus": 4},
377 ca4d59e3 Christos Stavrakakis
                              status="error")
378 ca4d59e3 Christos Stavrakakis
        client.reset_mock()
379 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
380 41a7fae7 Christos Stavrakakis
            update_db(client, msg)
381 ca4d59e3 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
382 ca4d59e3 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
383 ca4d59e3 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, "STOPPED")
384 ca4d59e3 Christos Stavrakakis
        # Test success
385 ca4d59e3 Christos Stavrakakis
        f1 = mfactory.FlavorFactory(cpu=4, ram=1024, disk_template="drbd",
386 ca4d59e3 Christos Stavrakakis
                                    disk=1024)
387 ca4d59e3 Christos Stavrakakis
        vm.flavor = f1
388 ca4d59e3 Christos Stavrakakis
        vm.save()
389 ca4d59e3 Christos Stavrakakis
        f2 = mfactory.FlavorFactory(cpu=8, ram=2048, disk_template="drbd",
390 ca4d59e3 Christos Stavrakakis
                                    disk=1024)
391 ca4d59e3 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS',
392 ca4d59e3 Christos Stavrakakis
                              instance=vm.backend_vm_id,
393 ca4d59e3 Christos Stavrakakis
                              beparams={"vcpus": 8, "minmem": 2048,
394 ca4d59e3 Christos Stavrakakis
                                        "maxmem": 2048},
395 ca4d59e3 Christos Stavrakakis
                              status="success")
396 ca4d59e3 Christos Stavrakakis
        client.reset_mock()
397 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
398 41a7fae7 Christos Stavrakakis
            update_db(client, msg)
399 ca4d59e3 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
400 ca4d59e3 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
401 ca4d59e3 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, "STOPPED")
402 ca4d59e3 Christos Stavrakakis
        self.assertEqual(db_vm.flavor, f2)
403 ca4d59e3 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS',
404 ca4d59e3 Christos Stavrakakis
                              instance=vm.backend_vm_id,
405 ca4d59e3 Christos Stavrakakis
                              beparams={"vcpus": 100, "minmem": 2048,
406 ca4d59e3 Christos Stavrakakis
                                        "maxmem": 2048},
407 ca4d59e3 Christos Stavrakakis
                              status="success")
408 ca4d59e3 Christos Stavrakakis
        client.reset_mock()
409 41a7fae7 Christos Stavrakakis
        with mocked_quotaholder():
410 41a7fae7 Christos Stavrakakis
            update_db(client, msg)
411 ca4d59e3 Christos Stavrakakis
        self.assertTrue(client.basic_reject.called)
412 ca4d59e3 Christos Stavrakakis
413 47eeffa9 Christos Stavrakakis
414 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
415 47eeffa9 Christos Stavrakakis
class UpdateNetTest(TestCase):
416 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
417 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-hook message"""
418 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
419 fd95834e Christos Stavrakakis
        msg['type'] = 'ganeti-op-status'
420 fd95834e Christos Stavrakakis
        msg['operation'] = 'OP_INSTANCE_SET_PARAMS'
421 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
422 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
423 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
424 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
425 47eeffa9 Christos Stavrakakis
            msg[key] = val
426 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
427 47eeffa9 Christos Stavrakakis
        return message
428 47eeffa9 Christos Stavrakakis
429 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
430 fd95834e Christos Stavrakakis
        update_db(client, json.dumps({'body': {}}))
431 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_reject.called)
432 47eeffa9 Christos Stavrakakis
433 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
434 fd95834e Christos Stavrakakis
        update_db(client, {})
435 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
436 47eeffa9 Christos Stavrakakis
437 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
438 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
439 fd95834e Christos Stavrakakis
        update_db(client, msg)
440 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_nack.called)
441 47eeffa9 Christos Stavrakakis
442 47eeffa9 Christos Stavrakakis
    def test_missing_instance(self, client):
443 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
444 47eeffa9 Christos Stavrakakis
                              instance='foo')
445 fd95834e Christos Stavrakakis
        update_db(client, msg)
446 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
447 47eeffa9 Christos Stavrakakis
448 47eeffa9 Christos Stavrakakis
    def test_no_nics(self, client):
449 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
450 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
451 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
452 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
453 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(vm.nics.all()), 3)
454 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(nics=[],
455 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
456 fd95834e Christos Stavrakakis
        update_db(client, msg)
457 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
458 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
459 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(db_vm.nics.all()), 0)
460 47eeffa9 Christos Stavrakakis
461 47eeffa9 Christos Stavrakakis
    def test_empty_nic(self, client):
462 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
463 47eeffa9 Christos Stavrakakis
        for public in [True, False]:
464 47eeffa9 Christos Stavrakakis
            net = mfactory.NetworkFactory(public=public)
465 cc92b70f Christos Stavrakakis
            msg = self.create_msg(nics=[{'network': net.backend_id}],
466 47eeffa9 Christos Stavrakakis
                                  instance=vm.backend_vm_id)
467 fd95834e Christos Stavrakakis
            update_db(client, msg)
468 10d9cd27 Christos Stavrakakis
            self.assertTrue(client.basic_ack.called)
469 47eeffa9 Christos Stavrakakis
            db_vm = VirtualMachine.objects.get(id=vm.id)
470 47eeffa9 Christos Stavrakakis
            nics = db_vm.nics.all()
471 47eeffa9 Christos Stavrakakis
            self.assertEqual(len(nics), 1)
472 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].index, 0)
473 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv4, '')
474 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv6, '')
475 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].mac, '')
476 47eeffa9 Christos Stavrakakis
            if public:
477 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile,
478 47eeffa9 Christos Stavrakakis
                                 settings.DEFAULT_FIREWALL_PROFILE)
479 47eeffa9 Christos Stavrakakis
            else:
480 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile, '')
481 47eeffa9 Christos Stavrakakis
482 47eeffa9 Christos Stavrakakis
    def test_full_nic(self, client):
483 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
484 47eeffa9 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet='10.0.0.0/24')
485 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
486 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_available('10.0.0.22'))
487 47eeffa9 Christos Stavrakakis
        pool.save()
488 cc92b70f Christos Stavrakakis
        msg = self.create_msg(nics=[{'network': net.backend_id,
489 47eeffa9 Christos Stavrakakis
                                     'ip': '10.0.0.22',
490 47eeffa9 Christos Stavrakakis
                                     'mac': 'aa:bb:cc:00:11:22'}],
491 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
492 fd95834e Christos Stavrakakis
        update_db(client, msg)
493 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
494 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
495 47eeffa9 Christos Stavrakakis
        nics = db_vm.nics.all()
496 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(nics), 1)
497 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].index, 0)
498 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv4, '10.0.0.22')
499 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv6, '')
500 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].mac, 'aa:bb:cc:00:11:22')
501 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
502 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_available('10.0.0.22'))
503 47eeffa9 Christos Stavrakakis
        pool.save()
504 47eeffa9 Christos Stavrakakis
505 47eeffa9 Christos Stavrakakis
506 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
507 47eeffa9 Christos Stavrakakis
class UpdateNetworkTest(TestCase):
508 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
509 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-eventd message"""
510 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
511 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-network-status'
512 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
513 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
514 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
515 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
516 47eeffa9 Christos Stavrakakis
            msg[key] = val
517 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
518 47eeffa9 Christos Stavrakakis
        return message
519 47eeffa9 Christos Stavrakakis
520 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
521 47eeffa9 Christos Stavrakakis
        update_network(client, json.dumps({'body': {}}))
522 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_reject.called)
523 47eeffa9 Christos Stavrakakis
524 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
525 47eeffa9 Christos Stavrakakis
        update_network(client, {})
526 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
527 47eeffa9 Christos Stavrakakis
528 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
529 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
530 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
531 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_nack.called)
532 47eeffa9 Christos Stavrakakis
533 47eeffa9 Christos Stavrakakis
    def test_missing_network(self, client):
534 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CREATE',
535 47eeffa9 Christos Stavrakakis
                              network='foo')
536 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
537 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
538 47eeffa9 Christos Stavrakakis
539 47eeffa9 Christos Stavrakakis
    def test_create(self, client):
540 47eeffa9 Christos Stavrakakis
        back_network = mfactory.BackendNetworkFactory(operstate='PENDING')
541 47eeffa9 Christos Stavrakakis
        net = back_network.network
542 1d04ef8b Christos Stavrakakis
        net.state = 'ACTIVE'
543 1d04ef8b Christos Stavrakakis
        net.save()
544 47eeffa9 Christos Stavrakakis
        back1 = back_network.backend
545 47eeffa9 Christos Stavrakakis
546 47eeffa9 Christos Stavrakakis
        back_network2 = mfactory.BackendNetworkFactory(operstate='PENDING',
547 47eeffa9 Christos Stavrakakis
                                                       network=net)
548 47eeffa9 Christos Stavrakakis
        back2 = back_network2.backend
549 47eeffa9 Christos Stavrakakis
        # Message from first backend network
550 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
551 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
552 47eeffa9 Christos Stavrakakis
                              cluster=back1.clustername)
553 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
554 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
555 47eeffa9 Christos Stavrakakis
556 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
557 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
558 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
559 1d04ef8b Christos Stavrakakis
        self.assertEqual(db_net.state, 'ACTIVE')
560 47eeffa9 Christos Stavrakakis
        # msg from second backend network
561 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
562 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
563 47eeffa9 Christos Stavrakakis
                              cluster=back2.clustername)
564 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
565 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
566 47eeffa9 Christos Stavrakakis
567 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
568 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_net.state, 'ACTIVE')
569 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
570 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
571 47eeffa9 Christos Stavrakakis
572 039e3e61 Christos Stavrakakis
    def test_create_offline_backend(self, client):
573 039e3e61 Christos Stavrakakis
        """Test network creation when a backend is offline"""
574 1d04ef8b Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE')
575 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
576 039e3e61 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(network=net,
577 039e3e61 Christos Stavrakakis
                                             backend__offline=True)
578 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
579 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
580 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
581 039e3e61 Christos Stavrakakis
        update_network(client, msg)
582 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
583 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
584 039e3e61 Christos Stavrakakis
        self.assertEqual(new_net.state, 'ACTIVE')
585 039e3e61 Christos Stavrakakis
586 47eeffa9 Christos Stavrakakis
    def test_disconnect(self, client):
587 47eeffa9 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(operstate='ACTIVE')
588 47eeffa9 Christos Stavrakakis
        net1 = bn1.network
589 1d04ef8b Christos Stavrakakis
        net1.state = "ACTIVE"
590 1d04ef8b Christos Stavrakakis
        net1.state = 'ACTIVE'
591 47eeffa9 Christos Stavrakakis
        net1.save()
592 47eeffa9 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(operstate='ACTIVE',
593 47eeffa9 Christos Stavrakakis
                                             network=net1)
594 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_DISCONNECT',
595 47eeffa9 Christos Stavrakakis
                              network=net1.backend_id,
596 47eeffa9 Christos Stavrakakis
                              cluster=bn2.backend.clustername)
597 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
598 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
599 1d04ef8b Christos Stavrakakis
        self.assertEqual(Network.objects.get(id=net1.id).state, 'ACTIVE')
600 47eeffa9 Christos Stavrakakis
        self.assertEqual(BackendNetwork.objects.get(id=bn2.id).operstate,
601 cc92b70f Christos Stavrakakis
                         'PENDING')
602 47eeffa9 Christos Stavrakakis
603 47eeffa9 Christos Stavrakakis
    def test_remove(self, client):
604 47eeffa9 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
605 47eeffa9 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
606 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(operstate='ACTIVE')
607 47eeffa9 Christos Stavrakakis
        for old_state in ['success', 'canceled', 'error']:
608 47eeffa9 Christos Stavrakakis
            for flavor in Network.FLAVORS.keys():
609 47eeffa9 Christos Stavrakakis
                bn.operstate = old_state
610 47eeffa9 Christos Stavrakakis
                bn.save()
611 47eeffa9 Christos Stavrakakis
                net = bn.network
612 47eeffa9 Christos Stavrakakis
                net.state = 'ACTIVE'
613 47eeffa9 Christos Stavrakakis
                net.flavor = flavor
614 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
615 47eeffa9 Christos Stavrakakis
                    net.link = allocate_resource('bridge')
616 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
617 47eeffa9 Christos Stavrakakis
                    net.mac_prefix = allocate_resource('mac_prefix')
618 47eeffa9 Christos Stavrakakis
                net.save()
619 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation='OP_NETWORK_REMOVE',
620 47eeffa9 Christos Stavrakakis
                                      network=net.backend_id,
621 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
622 184a2a8c Christos Stavrakakis
                with mocked_quotaholder():
623 184a2a8c Christos Stavrakakis
                    update_network(client, msg)
624 10d9cd27 Christos Stavrakakis
                self.assertTrue(client.basic_ack.called)
625 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
626 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_bnet.operstate,
627 cc92b70f Christos Stavrakakis
                                 'DELETED')
628 47eeffa9 Christos Stavrakakis
                db_net = Network.objects.get(id=net.id)
629 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_net.state, 'DELETED', flavor)
630 47eeffa9 Christos Stavrakakis
                self.assertTrue(db_net.deleted)
631 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
632 47eeffa9 Christos Stavrakakis
                    pool = BridgePoolTable.get_pool()
633 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.link))
634 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
635 47eeffa9 Christos Stavrakakis
                    pool = MacPrefixPoolTable.get_pool()
636 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.mac_prefix))
637 47eeffa9 Christos Stavrakakis
638 039e3e61 Christos Stavrakakis
    def test_remove_offline_backend(self, client):
639 039e3e61 Christos Stavrakakis
        """Test network removing when a backend is offline"""
640 3f77e63d Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
641 3f77e63d Christos Stavrakakis
        net = mfactory.NetworkFactory(flavor='PHYSICAL_VLAN',
642 3f77e63d Christos Stavrakakis
                                      state='ACTIVE',
643 3f77e63d Christos Stavrakakis
                                      link='prv12')
644 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
645 039e3e61 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net,
646 c6c889f7 Christos Stavrakakis
                                       operstate="ACTIVE",
647 3f77e63d Christos Stavrakakis
                                       backend__offline=True)
648 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_REMOVE',
649 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
650 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
651 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
652 184a2a8c Christos Stavrakakis
            update_network(client, msg)
653 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
654 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
655 1d04ef8b Christos Stavrakakis
        self.assertEqual(new_net.state, 'ACTIVE')
656 1d04ef8b Christos Stavrakakis
        self.assertFalse(new_net.deleted)
657 039e3e61 Christos Stavrakakis
658 47eeffa9 Christos Stavrakakis
    def test_error_opcode(self, client):
659 c6c889f7 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
660 c6c889f7 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
661 47eeffa9 Christos Stavrakakis
        for state, _ in Network.OPER_STATES:
662 c6c889f7 Christos Stavrakakis
            bn = mfactory.BackendNetworkFactory(operstate="ACTIVE")
663 47eeffa9 Christos Stavrakakis
            bn.operstate = state
664 47eeffa9 Christos Stavrakakis
            bn.save()
665 47eeffa9 Christos Stavrakakis
            network = bn.network
666 47eeffa9 Christos Stavrakakis
            network.state = state
667 47eeffa9 Christos Stavrakakis
            network.save()
668 47eeffa9 Christos Stavrakakis
            for opcode, _ in BackendNetwork.BACKEND_OPCODES:
669 47eeffa9 Christos Stavrakakis
                if opcode in ['OP_NETWORK_REMOVE', 'OP_NETWORK_ADD']:
670 47eeffa9 Christos Stavrakakis
                    continue
671 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation=opcode,
672 47eeffa9 Christos Stavrakakis
                                      network=bn.network.backend_id,
673 47eeffa9 Christos Stavrakakis
                                      status='error',
674 c6c889f7 Christos Stavrakakis
                                      add_reserved_ips=[],
675 c6c889f7 Christos Stavrakakis
                                      remove_reserved_ips=[],
676 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
677 c6c889f7 Christos Stavrakakis
                with mocked_quotaholder():
678 c6c889f7 Christos Stavrakakis
                    update_network(client, msg)
679 10d9cd27 Christos Stavrakakis
                self.assertTrue(client.basic_ack.called)
680 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
681 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.operstate, db_bnet.operstate)
682 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.network.state, db_bnet.network.state)
683 47eeffa9 Christos Stavrakakis
684 47eeffa9 Christos Stavrakakis
    def test_ips(self, client):
685 47eeffa9 Christos Stavrakakis
        network = mfactory.NetworkFactory(subnet='10.0.0.0/24')
686 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=network)
687 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
688 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
689 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
690 47eeffa9 Christos Stavrakakis
                              status='success',
691 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=['10.0.0.10', '10.0.0.20'],
692 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=[])
693 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
694 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
695 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
696 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.10'))
697 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.20'))
698 47eeffa9 Christos Stavrakakis
        pool.save()
699 47eeffa9 Christos Stavrakakis
        # Release them
700 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
701 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
702 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
703 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=[],
704 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=['10.0.0.10', '10.0.0.20'])
705 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
706 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
707 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
708 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.10'))
709 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.20'))
710 95aee02c Vangelis Koukis
711 92c53da1 Vassilios Karakoidas
712 c8908e51 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
713 c8908e51 Christos Stavrakakis
class UpdateBuildProgressTest(TestCase):
714 c8908e51 Christos Stavrakakis
    def setUp(self):
715 c8908e51 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
716 95aee02c Vangelis Koukis
717 c8908e51 Christos Stavrakakis
    def get_db_vm(self):
718 c8908e51 Christos Stavrakakis
        return VirtualMachine.objects.get(id=self.vm.id)
719 95aee02c Vangelis Koukis
720 c8908e51 Christos Stavrakakis
    def create_msg(self, **kwargs):
721 c8908e51 Christos Stavrakakis
        """Create snf-progress-monitor message"""
722 c8908e51 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
723 c8908e51 Christos Stavrakakis
        msg['type'] = 'image-copy-progress'
724 c8908e51 Christos Stavrakakis
        msg['progress'] = 0
725 c8908e51 Christos Stavrakakis
        for key, val in kwargs.items():
726 c8908e51 Christos Stavrakakis
            msg[key] = val
727 c8908e51 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
728 c8908e51 Christos Stavrakakis
        return message
729 95aee02c Vangelis Koukis
730 c8908e51 Christos Stavrakakis
    def test_missing_attribute(self, client):
731 c8908e51 Christos Stavrakakis
        update_build_progress(client, json.dumps({'body': {}}))
732 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_reject.called)
733 95aee02c Vangelis Koukis
734 c8908e51 Christos Stavrakakis
    def test_unhandled_exception(self, client):
735 c8908e51 Christos Stavrakakis
        update_build_progress(client, {})
736 c8908e51 Christos Stavrakakis
        client.basic_reject.assert_called_once()
737 c25cc9ec Vangelis Koukis
738 c8908e51 Christos Stavrakakis
    def test_missing_instance(self, client):
739 c8908e51 Christos Stavrakakis
        msg = self.create_msg(instance='foo')
740 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
741 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
742 9068cd85 Georgios Gousios
743 c8908e51 Christos Stavrakakis
    def test_wrong_type(self, client):
744 c8908e51 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
745 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
746 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_nack.called)
747 9068cd85 Georgios Gousios
748 c8908e51 Christos Stavrakakis
    def test_progress_update(self, client):
749 c25cc9ec Vangelis Koukis
        rprogress = randint(10, 100)
750 c8908e51 Christos Stavrakakis
        msg = self.create_msg(progress=rprogress,
751 c8908e51 Christos Stavrakakis
                              instance=self.vm.backend_vm_id)
752 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
753 10d9cd27 Christos Stavrakakis
        self.assertTrue(client.basic_ack.called)
754 c8908e51 Christos Stavrakakis
        vm = self.get_db_vm()
755 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.buildpercentage, rprogress)
756 c8908e51 Christos Stavrakakis
757 c8908e51 Christos Stavrakakis
    def test_invalid_value(self, client):
758 c8908e51 Christos Stavrakakis
        old = self.vm.buildpercentage
759 c8908e51 Christos Stavrakakis
        for rprogress in [0, -1, 'a']:
760 c8908e51 Christos Stavrakakis
            msg = self.create_msg(progress=rprogress,
761 c8908e51 Christos Stavrakakis
                                  instance=self.vm.backend_vm_id)
762 c8908e51 Christos Stavrakakis
            update_build_progress(client, msg)
763 10d9cd27 Christos Stavrakakis
            self.assertTrue(client.basic_ack.called)
764 c8908e51 Christos Stavrakakis
            vm = self.get_db_vm()
765 c8908e51 Christos Stavrakakis
            self.assertEqual(vm.buildpercentage, old)
766 9068cd85 Georgios Gousios
767 9fea53cc Vangelis Koukis
768 7ab30015 Christos Stavrakakis
from synnefo.logic.reconciliation import VMState
769 c8908e51 Christos Stavrakakis
class ReconciliationTest(TestCase):
770 7ab30015 Christos Stavrakakis
    def get_vm(self, operstate, deleted=False):
771 7ab30015 Christos Stavrakakis
        flavor = mfactory.FlavorFactory(cpu=2, ram=1024)
772 7ab30015 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(deleted=deleted, flavor=flavor)
773 7ab30015 Christos Stavrakakis
        vm.operstate = operstate
774 7ab30015 Christos Stavrakakis
        vm.save()
775 7ab30015 Christos Stavrakakis
        return vm
776 9fea53cc Vangelis Koukis
777 9fea53cc Vangelis Koukis
    def test_get_servers_from_db(self):
778 9fea53cc Vangelis Koukis
        """Test getting a dictionary from each server to its operstate"""
779 2cd55da6 Christos Stavrakakis
        backends = Backend.objects.all()
780 7ab30015 Christos Stavrakakis
        vm1 = self.get_vm('STARTED')
781 7ab30015 Christos Stavrakakis
        vm2 = self.get_vm('DESTROYED', deleted=True)
782 7ab30015 Christos Stavrakakis
        vm3 = self.get_vm('STOPPED')
783 2cd55da6 Christos Stavrakakis
        self.assertEquals(reconciliation.get_servers_from_db(backends),
784 7ab30015 Christos Stavrakakis
                    {vm1.id: VMState(state='STARTED', cpu=2, ram=1024, nics=[]),
785 7ab30015 Christos Stavrakakis
                     vm3.id: VMState(state='STOPPED', cpu=2, ram=1024, nics=[])}
786 7ab30015 Christos Stavrakakis
                    )
787 9fea53cc Vangelis Koukis
788 9fea53cc Vangelis Koukis
    def test_stale_servers_in_db(self):
789 9fea53cc Vangelis Koukis
        """Test discovery of stale entries in DB"""
790 9fea53cc Vangelis Koukis
791 7ab30015 Christos Stavrakakis
        D = {1: None, 2: 'None', 3: None, 30000: 'BUILD',
792 7ab30015 Christos Stavrakakis
             30002: 'None'}
793 47eeffa9 Christos Stavrakakis
        G = {1: True, 3: True, 30000: True}
794 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.stale_servers_in_db(D, G),
795 47eeffa9 Christos Stavrakakis
                          set([2, 30002]))
796 9fea53cc Vangelis Koukis
797 c8908e51 Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
798 c8908e51 Christos Stavrakakis
    def test_stale_building_vm(self, client):
799 c8908e51 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
800 c8908e51 Christos Stavrakakis
        vm.state = 'BUILD'
801 c8908e51 Christos Stavrakakis
        vm.backendjobid = 42
802 c8908e51 Christos Stavrakakis
        vm.save()
803 c8908e51 Christos Stavrakakis
        D = {vm.id: 'BUILD'}
804 c8908e51 Christos Stavrakakis
        G = {}
805 c8908e51 Christos Stavrakakis
        for status in ['queued', 'waiting', 'running']:
806 c8908e51 Christos Stavrakakis
            client.return_value.GetJobStatus.return_value = {'status': status}
807 c8908e51 Christos Stavrakakis
            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
808 cc92b70f Christos Stavrakakis
            client.return_value.GetJobStatus\
809 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backendjobid)
810 c8908e51 Christos Stavrakakis
            client.reset_mock()
811 c8908e51 Christos Stavrakakis
        for status in ['success', 'error', 'canceled']:
812 c8908e51 Christos Stavrakakis
            client.return_value.GetJobStatus.return_value = {'status': status}
813 c8908e51 Christos Stavrakakis
            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
814 cc92b70f Christos Stavrakakis
            client.return_value.GetInstance\
815 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backend_vm_id)
816 cc92b70f Christos Stavrakakis
            client.return_value.GetJobStatus\
817 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backendjobid)
818 c8908e51 Christos Stavrakakis
            client.reset_mock()
819 c8908e51 Christos Stavrakakis
        from synnefo.logic.rapi import GanetiApiError
820 c8908e51 Christos Stavrakakis
        client.return_value.GetJobStatus.side_effect = GanetiApiError('Foo')
821 cc92b70f Christos Stavrakakis
        self.assertEqual(reconciliation.stale_servers_in_db(D, G),
822 cc92b70f Christos Stavrakakis
                         set([vm.id]))
823 c8908e51 Christos Stavrakakis
824 9fea53cc Vangelis Koukis
    def test_orphan_instances_in_ganeti(self):
825 9fea53cc Vangelis Koukis
        """Test discovery of orphan instances in Ganeti, without a DB entry"""
826 9fea53cc Vangelis Koukis
827 9fea53cc Vangelis Koukis
        G = {1: True, 2: False, 3: False, 4: True, 50: True}
828 9fea53cc Vangelis Koukis
        D = {1: True, 3: False}
829 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.orphan_instances_in_ganeti(D, G),
830 46704e06 Vangelis Koukis
                          set([2, 4, 50]))
831 9fea53cc Vangelis Koukis
832 9fea53cc Vangelis Koukis
    def test_unsynced_operstate(self):
833 9fea53cc Vangelis Koukis
        """Test discovery of unsynced operstate between the DB and Ganeti"""
834 7ab30015 Christos Stavrakakis
        mkstate = lambda state: VMState(state=state, cpu=1, ram=1024, nics=[])
835 7ab30015 Christos Stavrakakis
        vm1 = self.get_vm("STARTED")
836 7ab30015 Christos Stavrakakis
        vm2 = self.get_vm("STARTED")
837 7ab30015 Christos Stavrakakis
        vm3= self.get_vm("BUILD")
838 7ab30015 Christos Stavrakakis
        vm4 = self.get_vm("STARTED")
839 7ab30015 Christos Stavrakakis
        vm5 = self.get_vm("BUILD")
840 7ab30015 Christos Stavrakakis
841 7ab30015 Christos Stavrakakis
        D = {1: mkstate("STARTED"), 2: mkstate("STARTED"), 3: mkstate("BUILD"),
842 7ab30015 Christos Stavrakakis
             4: mkstate("STARTED"), 50: mkstate("BUILD")}
843 7ab30015 Christos Stavrakakis
        G = {vm1.id: mkstate(True), vm2.id: mkstate(False),
844 7ab30015 Christos Stavrakakis
             vm4.id: mkstate(True), vm4.id: mkstate(False),
845 7ab30015 Christos Stavrakakis
             vm5.id: mkstate(False)}
846 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.unsynced_operstate(D, G),
847 7ab30015 Christos Stavrakakis
                          set([(vm2.id, "STARTED", False),
848 7ab30015 Christos Stavrakakis
                               (vm4.id, "STARTED", False)]))
849 b66e4833 Christos Stavrakakis
850 b66e4833 Christos Stavrakakis
from synnefo.logic.test.rapi_pool_tests import *
851 b66e4833 Christos Stavrakakis
from synnefo.logic.test.utils_tests import *