Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / tests.py @ 595bc9b0

History | View | Annotate | Download (41 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 0c50c760 Christos Stavrakakis
        network = mfactory.NetworkFactory(floating_ip_pool=True)
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 595bc9b0 Christos Stavrakakis
import logging
769 595bc9b0 Christos Stavrakakis
from datetime import timedelta
770 595bc9b0 Christos Stavrakakis
771 595bc9b0 Christos Stavrakakis
772 595bc9b0 Christos Stavrakakis
@patch("synnefo.logic.rapi_pool.GanetiRapiClient")
773 c8908e51 Christos Stavrakakis
class ReconciliationTest(TestCase):
774 595bc9b0 Christos Stavrakakis
    @patch("synnefo.logic.rapi_pool.GanetiRapiClient")
775 595bc9b0 Christos Stavrakakis
    def setUp(self, mrapi):
776 595bc9b0 Christos Stavrakakis
        self.backend = mfactory.BackendFactory()
777 595bc9b0 Christos Stavrakakis
        log = logging.getLogger()
778 595bc9b0 Christos Stavrakakis
        options = {"fix_unsynced": True,
779 595bc9b0 Christos Stavrakakis
                   "fix_stale": True,
780 595bc9b0 Christos Stavrakakis
                   "fix_orphans": True,
781 595bc9b0 Christos Stavrakakis
                   "fix_unsynced_nics": True,
782 595bc9b0 Christos Stavrakakis
                   "fix_unsynced_flavors": True}
783 595bc9b0 Christos Stavrakakis
        self.reconciler = reconciliation.BackendReconciler(self.backend,
784 595bc9b0 Christos Stavrakakis
                                                           options=options,
785 595bc9b0 Christos Stavrakakis
                                                           logger=log)
786 595bc9b0 Christos Stavrakakis
787 595bc9b0 Christos Stavrakakis
    def test_building_vm(self, mrapi):
788 595bc9b0 Christos Stavrakakis
        mrapi = self.reconciler.client
789 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
790 595bc9b0 Christos Stavrakakis
                                             backendjobid=None,
791 595bc9b0 Christos Stavrakakis
                                             operstate="BUILD")
792 595bc9b0 Christos Stavrakakis
        self.reconciler.reconcile()
793 595bc9b0 Christos Stavrakakis
        # Assert not deleted
794 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
795 595bc9b0 Christos Stavrakakis
        self.assertFalse(vm1.deleted)
796 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "BUILD")
797 595bc9b0 Christos Stavrakakis
798 595bc9b0 Christos Stavrakakis
        vm1.created = vm1.created - timedelta(seconds=120)
799 595bc9b0 Christos Stavrakakis
        vm1.save()
800 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
801 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
802 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
803 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "ERROR")
804 595bc9b0 Christos Stavrakakis
805 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
806 595bc9b0 Christos Stavrakakis
                                             backendjobid=1,
807 595bc9b0 Christos Stavrakakis
                                             deleted=False,
808 595bc9b0 Christos Stavrakakis
                                             operstate="BUILD")
809 595bc9b0 Christos Stavrakakis
        vm1.backendtime = vm1.created - timedelta(seconds=120)
810 595bc9b0 Christos Stavrakakis
        vm1.backendjobid = 10
811 595bc9b0 Christos Stavrakakis
        vm1.save()
812 595bc9b0 Christos Stavrakakis
        for status in ["queued", "waiting", "running"]:
813 595bc9b0 Christos Stavrakakis
            mrapi.GetJobStatus.return_value = {"status": status}
814 595bc9b0 Christos Stavrakakis
            with mocked_quotaholder():
815 595bc9b0 Christos Stavrakakis
                self.reconciler.reconcile()
816 595bc9b0 Christos Stavrakakis
            vm1 = VirtualMachine.objects.get(id=vm1.id)
817 595bc9b0 Christos Stavrakakis
            self.assertFalse(vm1.deleted)
818 595bc9b0 Christos Stavrakakis
            self.assertEqual(vm1.operstate, "BUILD")
819 595bc9b0 Christos Stavrakakis
820 595bc9b0 Christos Stavrakakis
        mrapi.GetJobStatus.return_value = {"status": "error"}
821 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
822 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
823 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
824 595bc9b0 Christos Stavrakakis
        self.assertFalse(vm1.deleted)
825 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "ERROR")
826 595bc9b0 Christos Stavrakakis
827 595bc9b0 Christos Stavrakakis
        for status in ["success", "cancelled"]:
828 595bc9b0 Christos Stavrakakis
            vm1.deleted = False
829 595bc9b0 Christos Stavrakakis
            vm1.save()
830 595bc9b0 Christos Stavrakakis
            mrapi.GetJobStatus.return_value = {"status": status}
831 595bc9b0 Christos Stavrakakis
            with mocked_quotaholder():
832 595bc9b0 Christos Stavrakakis
                self.reconciler.reconcile()
833 595bc9b0 Christos Stavrakakis
            vm1 = VirtualMachine.objects.get(id=vm1.id)
834 595bc9b0 Christos Stavrakakis
            self.assertTrue(vm1.deleted)
835 595bc9b0 Christos Stavrakakis
            self.assertEqual(vm1.operstate, "DESTROYED")
836 595bc9b0 Christos Stavrakakis
837 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
838 595bc9b0 Christos Stavrakakis
                                             backendjobid=1,
839 595bc9b0 Christos Stavrakakis
                                             operstate="BUILD")
840 595bc9b0 Christos Stavrakakis
        vm1.backendtime = vm1.created - timedelta(seconds=120)
841 595bc9b0 Christos Stavrakakis
        vm1.backendjobid = 10
842 595bc9b0 Christos Stavrakakis
        vm1.save()
843 595bc9b0 Christos Stavrakakis
        cmrapi = self.reconciler.client
844 595bc9b0 Christos Stavrakakis
        cmrapi.GetInstances.return_value = \
845 595bc9b0 Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
846 595bc9b0 Christos Stavrakakis
             "beparams": {"maxmem": 1024,
847 595bc9b0 Christos Stavrakakis
                          "minmem": 1024,
848 595bc9b0 Christos Stavrakakis
                          "vcpus": 4},
849 595bc9b0 Christos Stavrakakis
             "oper_state": False,
850 595bc9b0 Christos Stavrakakis
             "mtime": time(),
851 595bc9b0 Christos Stavrakakis
             "disk.sizes": [],
852 595bc9b0 Christos Stavrakakis
             "nic.ips": [],
853 595bc9b0 Christos Stavrakakis
             "nic.macs": [],
854 595bc9b0 Christos Stavrakakis
             "nic.networks": [],
855 595bc9b0 Christos Stavrakakis
             "tags": []}]
856 595bc9b0 Christos Stavrakakis
        mrapi.GetJobStatus.return_value = {"status": "running"}
857 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
858 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
859 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
860 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "BUILD")
861 595bc9b0 Christos Stavrakakis
        mrapi.GetJobStatus.return_value = {"status": "error"}
862 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
863 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
864 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
865 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "ERROR")
866 595bc9b0 Christos Stavrakakis
867 595bc9b0 Christos Stavrakakis
    def test_stale_server(self, mrapi):
868 595bc9b0 Christos Stavrakakis
        mrapi.GetInstances = []
869 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
870 595bc9b0 Christos Stavrakakis
                                             deleted=False,
871 595bc9b0 Christos Stavrakakis
                                             operstate="ERROR")
872 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
873 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
874 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
875 595bc9b0 Christos Stavrakakis
        self.assertTrue(vm1.deleted)
876 595bc9b0 Christos Stavrakakis
877 595bc9b0 Christos Stavrakakis
    def test_orphan_server(self, mrapi):
878 595bc9b0 Christos Stavrakakis
        cmrapi = self.reconciler.client
879 595bc9b0 Christos Stavrakakis
        mrapi().GetInstances.return_value =\
880 595bc9b0 Christos Stavrakakis
            [{"name": "%s22" % settings.BACKEND_PREFIX_ID,
881 595bc9b0 Christos Stavrakakis
             "beparams": {"maxmem": 1024,
882 595bc9b0 Christos Stavrakakis
                          "minmem": 1024,
883 595bc9b0 Christos Stavrakakis
                          "vcpus": 4},
884 595bc9b0 Christos Stavrakakis
             "oper_state": True,
885 595bc9b0 Christos Stavrakakis
             "mtime": time(),
886 595bc9b0 Christos Stavrakakis
             "disk.sizes": [],
887 595bc9b0 Christos Stavrakakis
             "nic.ips": [],
888 595bc9b0 Christos Stavrakakis
             "nic.macs": [],
889 595bc9b0 Christos Stavrakakis
             "nic.networks": [],
890 595bc9b0 Christos Stavrakakis
             "tags": []}]
891 595bc9b0 Christos Stavrakakis
        self.reconciler.reconcile()
892 595bc9b0 Christos Stavrakakis
        cmrapi.DeleteInstance.assert_called_once_with(
893 595bc9b0 Christos Stavrakakis
                "%s22" % settings.BACKEND_PREFIX_ID)
894 595bc9b0 Christos Stavrakakis
895 595bc9b0 Christos Stavrakakis
    def test_unsynced_operstate(self, mrapi):
896 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
897 595bc9b0 Christos Stavrakakis
                                             deleted=False,
898 595bc9b0 Christos Stavrakakis
                                             operstate="STOPPED")
899 595bc9b0 Christos Stavrakakis
        mrapi().GetInstances.return_value =\
900 595bc9b0 Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
901 595bc9b0 Christos Stavrakakis
             "beparams": {"maxmem": 1024,
902 595bc9b0 Christos Stavrakakis
                          "minmem": 1024,
903 595bc9b0 Christos Stavrakakis
                          "vcpus": 4},
904 595bc9b0 Christos Stavrakakis
             "oper_state": True,
905 595bc9b0 Christos Stavrakakis
             "mtime": time(),
906 595bc9b0 Christos Stavrakakis
             "disk.sizes": [],
907 595bc9b0 Christos Stavrakakis
             "nic.ips": [],
908 595bc9b0 Christos Stavrakakis
             "nic.macs": [],
909 595bc9b0 Christos Stavrakakis
             "nic.networks": [],
910 595bc9b0 Christos Stavrakakis
             "tags": []}]
911 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
912 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
913 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
914 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
915 595bc9b0 Christos Stavrakakis
916 595bc9b0 Christos Stavrakakis
    def test_unsynced_flavor(self, mrapi):
917 595bc9b0 Christos Stavrakakis
        flavor1 = mfactory.FlavorFactory(cpu=2, ram=1024, disk=1,
918 595bc9b0 Christos Stavrakakis
                                         disk_template="drbd")
919 595bc9b0 Christos Stavrakakis
        flavor2 = mfactory.FlavorFactory(cpu=4, ram=2048, disk=1,
920 595bc9b0 Christos Stavrakakis
                                         disk_template="drbd")
921 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
922 595bc9b0 Christos Stavrakakis
                                             deleted=False,
923 595bc9b0 Christos Stavrakakis
                                             flavor=flavor1,
924 595bc9b0 Christos Stavrakakis
                                             operstate="STARTED")
925 595bc9b0 Christos Stavrakakis
        mrapi().GetInstances.return_value =\
926 595bc9b0 Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
927 595bc9b0 Christos Stavrakakis
             "beparams": {"maxmem": 2048,
928 595bc9b0 Christos Stavrakakis
                          "minmem": 2048,
929 595bc9b0 Christos Stavrakakis
                          "vcpus": 4},
930 595bc9b0 Christos Stavrakakis
             "oper_state": True,
931 595bc9b0 Christos Stavrakakis
             "mtime": time(),
932 595bc9b0 Christos Stavrakakis
             "disk.sizes": [],
933 595bc9b0 Christos Stavrakakis
             "nic.ips": [],
934 595bc9b0 Christos Stavrakakis
             "nic.macs": [],
935 595bc9b0 Christos Stavrakakis
             "nic.networks": [],
936 595bc9b0 Christos Stavrakakis
             "tags": []}]
937 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
938 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
939 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
940 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.flavor, flavor2)
941 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
942 595bc9b0 Christos Stavrakakis
943 595bc9b0 Christos Stavrakakis
    def test_unsynced_nics(self, mrapi):
944 595bc9b0 Christos Stavrakakis
        network1 = mfactory.NetworkFactory(subnet="10.0.0.0/24")
945 595bc9b0 Christos Stavrakakis
        network2 = mfactory.NetworkFactory(subnet="192.168.2.0/24")
946 595bc9b0 Christos Stavrakakis
        vm1 = mfactory.VirtualMachineFactory(backend=self.backend,
947 595bc9b0 Christos Stavrakakis
                                             deleted=False,
948 595bc9b0 Christos Stavrakakis
                                             operstate="STOPPED")
949 595bc9b0 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm1, network=network1,
950 595bc9b0 Christos Stavrakakis
                                         ipv4="10.0.0.0")
951 595bc9b0 Christos Stavrakakis
        mrapi().GetInstances.return_value =\
952 595bc9b0 Christos Stavrakakis
            [{"name": vm1.backend_vm_id,
953 595bc9b0 Christos Stavrakakis
             "beparams": {"maxmem": 2048,
954 595bc9b0 Christos Stavrakakis
                          "minmem": 2048,
955 595bc9b0 Christos Stavrakakis
                          "vcpus": 4},
956 595bc9b0 Christos Stavrakakis
             "oper_state": True,
957 595bc9b0 Christos Stavrakakis
             "mtime": time(),
958 595bc9b0 Christos Stavrakakis
             "disk.sizes": [],
959 595bc9b0 Christos Stavrakakis
             "nic.ips": ["192.168.2.1"],
960 595bc9b0 Christos Stavrakakis
             "nic.macs": ["aa:00:bb:cc:dd:ee"],
961 595bc9b0 Christos Stavrakakis
             "nic.networks": [network2.backend_id],
962 595bc9b0 Christos Stavrakakis
             "tags": []}]
963 595bc9b0 Christos Stavrakakis
        with mocked_quotaholder():
964 595bc9b0 Christos Stavrakakis
            self.reconciler.reconcile()
965 595bc9b0 Christos Stavrakakis
        vm1 = VirtualMachine.objects.get(id=vm1.id)
966 595bc9b0 Christos Stavrakakis
        self.assertEqual(vm1.operstate, "STARTED")
967 595bc9b0 Christos Stavrakakis
        nic = vm1.nics.all()[0]
968 595bc9b0 Christos Stavrakakis
        self.assertEqual(nic.network, network2)
969 595bc9b0 Christos Stavrakakis
        self.assertEqual(nic.ipv4, "192.168.2.1")
970 595bc9b0 Christos Stavrakakis
        self.assertEqual(nic.mac, "aa:00:bb:cc:dd:ee")
971 595bc9b0 Christos Stavrakakis
972 b66e4833 Christos Stavrakakis
973 b66e4833 Christos Stavrakakis
from synnefo.logic.test.rapi_pool_tests import *
974 b66e4833 Christos Stavrakakis
from synnefo.logic.test.utils_tests import *