Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (27.7 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 420f2c20 Georgios Gousios
from synnefo.db.models import *
38 47eeffa9 Christos Stavrakakis
from synnefo.db import models_factory as mfactory
39 9fea53cc Vangelis Koukis
from synnefo.logic import reconciliation
40 47eeffa9 Christos Stavrakakis
from synnefo.lib.utils import split_time
41 47eeffa9 Christos Stavrakakis
from datetime import datetime
42 47eeffa9 Christos Stavrakakis
from mock import patch
43 47eeffa9 Christos Stavrakakis
from synnefo.api.util import allocate_resource
44 fd95834e Christos Stavrakakis
from synnefo.logic.callbacks import (update_db, update_network,
45 cc92b70f Christos Stavrakakis
                                     update_build_progress)
46 184a2a8c Christos Stavrakakis
from snf_django.utils.testing import mocked_quotaholder
47 198d91c3 Christos Stavrakakis
from synnefo.logic.rapi import GanetiApiError
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 47eeffa9 Christos Stavrakakis
## Test Callbacks
54 47eeffa9 Christos Stavrakakis
55 47eeffa9 Christos Stavrakakis
56 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
57 47eeffa9 Christos Stavrakakis
class UpdateDBTest(TestCase):
58 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
59 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-eventd message"""
60 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
61 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-op-status'
62 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
63 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
64 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
65 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
66 47eeffa9 Christos Stavrakakis
            msg[key] = val
67 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
68 47eeffa9 Christos Stavrakakis
        return message
69 47eeffa9 Christos Stavrakakis
70 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
71 47eeffa9 Christos Stavrakakis
        update_db(client, json.dumps({'body': {}}))
72 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
73 47eeffa9 Christos Stavrakakis
74 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
75 47eeffa9 Christos Stavrakakis
        update_db(client, {})
76 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
77 47eeffa9 Christos Stavrakakis
78 47eeffa9 Christos Stavrakakis
    def test_missing_instance(self, client):
79 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
80 47eeffa9 Christos Stavrakakis
                              instance='foo')
81 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
82 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
83 47eeffa9 Christos Stavrakakis
84 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
85 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
86 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
87 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
88 47eeffa9 Christos Stavrakakis
89 b66e4833 Christos Stavrakakis
    def test_old_msg(self, client):
90 b66e4833 Christos Stavrakakis
        from time import sleep
91 b66e4833 Christos Stavrakakis
        from datetime import datetime
92 b66e4833 Christos Stavrakakis
        old_time = time()
93 b66e4833 Christos Stavrakakis
        sleep(0.01)
94 b66e4833 Christos Stavrakakis
        new_time = datetime.fromtimestamp(time())
95 b66e4833 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(backendtime=new_time)
96 b66e4833 Christos Stavrakakis
        vm.operstate = 'STOPPED'
97 b66e4833 Christos Stavrakakis
        vm.save()
98 b66e4833 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
99 b66e4833 Christos Stavrakakis
                              event_time=split_time(old_time),
100 b66e4833 Christos Stavrakakis
                              instance=vm.backend_vm_id)
101 b66e4833 Christos Stavrakakis
        update_db(client, msg)
102 b66e4833 Christos Stavrakakis
        client.basic_ack.assert_called_once()
103 b66e4833 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
104 b66e4833 Christos Stavrakakis
        self.assertEquals(db_vm.operstate, "STOPPED")
105 b66e4833 Christos Stavrakakis
        self.assertEquals(db_vm.backendtime, new_time)
106 b66e4833 Christos Stavrakakis
107 47eeffa9 Christos Stavrakakis
    def test_start(self, client):
108 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
109 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
110 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
111 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
112 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
113 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
114 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
115 47eeffa9 Christos Stavrakakis
116 47eeffa9 Christos Stavrakakis
    def test_stop(self, client):
117 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
118 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_SHUTDOWN',
119 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
120 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
121 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
122 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
123 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STOPPED')
124 47eeffa9 Christos Stavrakakis
125 47eeffa9 Christos Stavrakakis
    def test_reboot(self, client):
126 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
127 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REBOOT',
128 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
129 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
130 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
131 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
132 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
133 47eeffa9 Christos Stavrakakis
134 47eeffa9 Christos Stavrakakis
    def test_remove(self, client):
135 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
136 47eeffa9 Christos Stavrakakis
        # Also create a NIC
137 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
138 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
139 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
140 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
141 184a2a8c Christos Stavrakakis
            update_db(client, msg)
142 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
143 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
144 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'DESTROYED')
145 47eeffa9 Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
146 47eeffa9 Christos Stavrakakis
        # Check that nics are deleted
147 47eeffa9 Christos Stavrakakis
        self.assertFalse(db_vm.nics.all())
148 47eeffa9 Christos Stavrakakis
149 198d91c3 Christos Stavrakakis
    @patch("synnefo.logic.rapi_pool.GanetiRapiClient")
150 198d91c3 Christos Stavrakakis
    def test_remove_error(self, rapi, client):
151 198d91c3 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
152 198d91c3 Christos Stavrakakis
        # Also create a NIC
153 198d91c3 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
154 198d91c3 Christos Stavrakakis
                              status="error",
155 198d91c3 Christos Stavrakakis
                              instance=vm.backend_vm_id)
156 198d91c3 Christos Stavrakakis
        rapi().GetInstance.return_value = {}
157 198d91c3 Christos Stavrakakis
        update_db(client, msg)
158 198d91c3 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
159 198d91c3 Christos Stavrakakis
        self.assertFalse(db_vm.deleted)
160 198d91c3 Christos Stavrakakis
161 198d91c3 Christos Stavrakakis
        rapi().GetInstance.side_effect = GanetiApiError(msg="msg",
162 198d91c3 Christos Stavrakakis
                                                        code=503)
163 198d91c3 Christos Stavrakakis
        update_db(client, msg)
164 198d91c3 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
165 198d91c3 Christos Stavrakakis
        self.assertFalse(db_vm.deleted)
166 198d91c3 Christos Stavrakakis
167 198d91c3 Christos Stavrakakis
        rapi().GetInstance.side_effect = GanetiApiError(msg="msg",
168 198d91c3 Christos Stavrakakis
                                                        code=404)
169 198d91c3 Christos Stavrakakis
        with mocked_quotaholder():
170 198d91c3 Christos Stavrakakis
            update_db(client, msg)
171 198d91c3 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
172 198d91c3 Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
173 198d91c3 Christos Stavrakakis
174 47eeffa9 Christos Stavrakakis
    def test_create(self, client):
175 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
176 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_CREATE',
177 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
178 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
179 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
180 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
181 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'STARTED')
182 47eeffa9 Christos Stavrakakis
183 47eeffa9 Christos Stavrakakis
    def test_create_error(self, client):
184 47eeffa9 Christos Stavrakakis
        """Test that error create sets vm to ERROR state"""
185 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
186 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_CREATE',
187 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id,
188 47eeffa9 Christos Stavrakakis
                              status='error')
189 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
190 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
191 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
192 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'ERROR')
193 47eeffa9 Christos Stavrakakis
194 47eeffa9 Christos Stavrakakis
    def test_remove_from_error(self, client):
195 47eeffa9 Christos Stavrakakis
        """Test that error removes delete error builds"""
196 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
197 47eeffa9 Christos Stavrakakis
        # Also create a NIC
198 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
199 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_REMOVE',
200 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
201 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
202 184a2a8c Christos Stavrakakis
            update_db(client, msg)
203 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
204 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
205 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, 'DESTROYED')
206 47eeffa9 Christos Stavrakakis
        self.assertTrue(db_vm.deleted)
207 47eeffa9 Christos Stavrakakis
        # Check that nics are deleted
208 47eeffa9 Christos Stavrakakis
        self.assertFalse(db_vm.nics.all())
209 47eeffa9 Christos Stavrakakis
210 47eeffa9 Christos Stavrakakis
    def test_other_error(self, client):
211 47eeffa9 Christos Stavrakakis
        """Test that other error messages do no affect the VM"""
212 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
213 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
214 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id,
215 47eeffa9 Christos Stavrakakis
                              status='error')
216 47eeffa9 Christos Stavrakakis
        update_db(client, msg)
217 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
218 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
219 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.operstate, vm.operstate)
220 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_vm.backendtime, vm.backendtime)
221 47eeffa9 Christos Stavrakakis
222 47eeffa9 Christos Stavrakakis
223 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
224 47eeffa9 Christos Stavrakakis
class UpdateNetTest(TestCase):
225 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
226 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-hook message"""
227 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
228 fd95834e Christos Stavrakakis
        msg['type'] = 'ganeti-op-status'
229 fd95834e Christos Stavrakakis
        msg['operation'] = 'OP_INSTANCE_SET_PARAMS'
230 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
231 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
232 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
233 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
234 47eeffa9 Christos Stavrakakis
            msg[key] = val
235 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
236 47eeffa9 Christos Stavrakakis
        return message
237 47eeffa9 Christos Stavrakakis
238 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
239 fd95834e Christos Stavrakakis
        update_db(client, json.dumps({'body': {}}))
240 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
241 47eeffa9 Christos Stavrakakis
242 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
243 fd95834e Christos Stavrakakis
        update_db(client, {})
244 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
245 47eeffa9 Christos Stavrakakis
246 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
247 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
248 fd95834e Christos Stavrakakis
        update_db(client, msg)
249 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
250 47eeffa9 Christos Stavrakakis
251 47eeffa9 Christos Stavrakakis
    def test_missing_instance(self, client):
252 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
253 47eeffa9 Christos Stavrakakis
                              instance='foo')
254 fd95834e Christos Stavrakakis
        update_db(client, msg)
255 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
256 47eeffa9 Christos Stavrakakis
257 47eeffa9 Christos Stavrakakis
    def test_no_nics(self, client):
258 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
259 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
260 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
261 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
262 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(vm.nics.all()), 3)
263 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(nics=[],
264 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
265 fd95834e Christos Stavrakakis
        update_db(client, msg)
266 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
267 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
268 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(db_vm.nics.all()), 0)
269 47eeffa9 Christos Stavrakakis
270 47eeffa9 Christos Stavrakakis
    def test_empty_nic(self, client):
271 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
272 47eeffa9 Christos Stavrakakis
        for public in [True, False]:
273 47eeffa9 Christos Stavrakakis
            net = mfactory.NetworkFactory(public=public)
274 cc92b70f Christos Stavrakakis
            msg = self.create_msg(nics=[{'network': net.backend_id}],
275 47eeffa9 Christos Stavrakakis
                                  instance=vm.backend_vm_id)
276 fd95834e Christos Stavrakakis
            update_db(client, msg)
277 47eeffa9 Christos Stavrakakis
            client.basic_ack.assert_called_once()
278 47eeffa9 Christos Stavrakakis
            db_vm = VirtualMachine.objects.get(id=vm.id)
279 47eeffa9 Christos Stavrakakis
            nics = db_vm.nics.all()
280 47eeffa9 Christos Stavrakakis
            self.assertEqual(len(nics), 1)
281 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].index, 0)
282 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv4, '')
283 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv6, '')
284 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].mac, '')
285 47eeffa9 Christos Stavrakakis
            if public:
286 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile,
287 47eeffa9 Christos Stavrakakis
                                 settings.DEFAULT_FIREWALL_PROFILE)
288 47eeffa9 Christos Stavrakakis
            else:
289 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile, '')
290 47eeffa9 Christos Stavrakakis
291 47eeffa9 Christos Stavrakakis
    def test_full_nic(self, client):
292 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
293 47eeffa9 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet='10.0.0.0/24')
294 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
295 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_available('10.0.0.22'))
296 47eeffa9 Christos Stavrakakis
        pool.save()
297 cc92b70f Christos Stavrakakis
        msg = self.create_msg(nics=[{'network': net.backend_id,
298 47eeffa9 Christos Stavrakakis
                                     'ip': '10.0.0.22',
299 47eeffa9 Christos Stavrakakis
                                     'mac': 'aa:bb:cc:00:11:22'}],
300 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
301 fd95834e Christos Stavrakakis
        update_db(client, msg)
302 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
303 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
304 47eeffa9 Christos Stavrakakis
        nics = db_vm.nics.all()
305 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(nics), 1)
306 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].index, 0)
307 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv4, '10.0.0.22')
308 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv6, '')
309 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].mac, 'aa:bb:cc:00:11:22')
310 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
311 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_available('10.0.0.22'))
312 47eeffa9 Christos Stavrakakis
        pool.save()
313 47eeffa9 Christos Stavrakakis
314 47eeffa9 Christos Stavrakakis
315 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
316 47eeffa9 Christos Stavrakakis
class UpdateNetworkTest(TestCase):
317 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
318 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-eventd message"""
319 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
320 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-network-status'
321 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
322 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
323 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
324 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
325 47eeffa9 Christos Stavrakakis
            msg[key] = val
326 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
327 47eeffa9 Christos Stavrakakis
        return message
328 47eeffa9 Christos Stavrakakis
329 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
330 47eeffa9 Christos Stavrakakis
        update_network(client, json.dumps({'body': {}}))
331 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
332 47eeffa9 Christos Stavrakakis
333 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
334 47eeffa9 Christos Stavrakakis
        update_network(client, {})
335 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
336 47eeffa9 Christos Stavrakakis
337 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
338 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
339 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
340 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
341 47eeffa9 Christos Stavrakakis
342 47eeffa9 Christos Stavrakakis
    def test_missing_network(self, client):
343 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CREATE',
344 47eeffa9 Christos Stavrakakis
                              network='foo')
345 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
346 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
347 47eeffa9 Christos Stavrakakis
348 47eeffa9 Christos Stavrakakis
    def test_create(self, client):
349 47eeffa9 Christos Stavrakakis
        back_network = mfactory.BackendNetworkFactory(operstate='PENDING')
350 47eeffa9 Christos Stavrakakis
        net = back_network.network
351 1d04ef8b Christos Stavrakakis
        net.state = 'ACTIVE'
352 1d04ef8b Christos Stavrakakis
        net.save()
353 47eeffa9 Christos Stavrakakis
        back1 = back_network.backend
354 47eeffa9 Christos Stavrakakis
355 47eeffa9 Christos Stavrakakis
        back_network2 = mfactory.BackendNetworkFactory(operstate='PENDING',
356 47eeffa9 Christos Stavrakakis
                                                       network=net)
357 47eeffa9 Christos Stavrakakis
        back2 = back_network2.backend
358 47eeffa9 Christos Stavrakakis
        # Message from first backend network
359 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
360 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
361 47eeffa9 Christos Stavrakakis
                              cluster=back1.clustername)
362 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
363 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
364 47eeffa9 Christos Stavrakakis
365 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
366 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
367 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
368 1d04ef8b Christos Stavrakakis
        self.assertEqual(db_net.state, 'ACTIVE')
369 47eeffa9 Christos Stavrakakis
        # msg from second backend network
370 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
371 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
372 47eeffa9 Christos Stavrakakis
                              cluster=back2.clustername)
373 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
374 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
375 47eeffa9 Christos Stavrakakis
376 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
377 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_net.state, 'ACTIVE')
378 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
379 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
380 47eeffa9 Christos Stavrakakis
381 039e3e61 Christos Stavrakakis
    def test_create_offline_backend(self, client):
382 039e3e61 Christos Stavrakakis
        """Test network creation when a backend is offline"""
383 1d04ef8b Christos Stavrakakis
        net = mfactory.NetworkFactory(state='ACTIVE')
384 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
385 039e3e61 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(network=net,
386 039e3e61 Christos Stavrakakis
                                             backend__offline=True)
387 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
388 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
389 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
390 039e3e61 Christos Stavrakakis
        update_network(client, msg)
391 039e3e61 Christos Stavrakakis
        client.basic_ack.assert_called_once()
392 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
393 039e3e61 Christos Stavrakakis
        self.assertEqual(new_net.state, 'ACTIVE')
394 039e3e61 Christos Stavrakakis
395 47eeffa9 Christos Stavrakakis
    def test_disconnect(self, client):
396 47eeffa9 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(operstate='ACTIVE')
397 47eeffa9 Christos Stavrakakis
        net1 = bn1.network
398 1d04ef8b Christos Stavrakakis
        net1.state = "ACTIVE"
399 1d04ef8b Christos Stavrakakis
        net1.state = 'ACTIVE'
400 47eeffa9 Christos Stavrakakis
        net1.save()
401 47eeffa9 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(operstate='ACTIVE',
402 47eeffa9 Christos Stavrakakis
                                             network=net1)
403 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_DISCONNECT',
404 47eeffa9 Christos Stavrakakis
                              network=net1.backend_id,
405 47eeffa9 Christos Stavrakakis
                              cluster=bn2.backend.clustername)
406 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
407 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
408 1d04ef8b Christos Stavrakakis
        self.assertEqual(Network.objects.get(id=net1.id).state, 'ACTIVE')
409 47eeffa9 Christos Stavrakakis
        self.assertEqual(BackendNetwork.objects.get(id=bn2.id).operstate,
410 cc92b70f Christos Stavrakakis
                         'PENDING')
411 47eeffa9 Christos Stavrakakis
412 47eeffa9 Christos Stavrakakis
    def test_remove(self, client):
413 47eeffa9 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
414 47eeffa9 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
415 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(operstate='ACTIVE')
416 47eeffa9 Christos Stavrakakis
        for old_state in ['success', 'canceled', 'error']:
417 47eeffa9 Christos Stavrakakis
            for flavor in Network.FLAVORS.keys():
418 47eeffa9 Christos Stavrakakis
                bn.operstate = old_state
419 47eeffa9 Christos Stavrakakis
                bn.save()
420 47eeffa9 Christos Stavrakakis
                net = bn.network
421 47eeffa9 Christos Stavrakakis
                net.state = 'ACTIVE'
422 47eeffa9 Christos Stavrakakis
                net.flavor = flavor
423 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
424 47eeffa9 Christos Stavrakakis
                    net.link = allocate_resource('bridge')
425 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
426 47eeffa9 Christos Stavrakakis
                    net.mac_prefix = allocate_resource('mac_prefix')
427 47eeffa9 Christos Stavrakakis
                net.save()
428 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation='OP_NETWORK_REMOVE',
429 47eeffa9 Christos Stavrakakis
                                      network=net.backend_id,
430 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
431 184a2a8c Christos Stavrakakis
                with mocked_quotaholder():
432 184a2a8c Christos Stavrakakis
                    update_network(client, msg)
433 47eeffa9 Christos Stavrakakis
                client.basic_ack.assert_called_once()
434 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
435 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_bnet.operstate,
436 cc92b70f Christos Stavrakakis
                                 'DELETED')
437 47eeffa9 Christos Stavrakakis
                db_net = Network.objects.get(id=net.id)
438 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_net.state, 'DELETED', flavor)
439 47eeffa9 Christos Stavrakakis
                self.assertTrue(db_net.deleted)
440 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
441 47eeffa9 Christos Stavrakakis
                    pool = BridgePoolTable.get_pool()
442 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.link))
443 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
444 47eeffa9 Christos Stavrakakis
                    pool = MacPrefixPoolTable.get_pool()
445 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.mac_prefix))
446 47eeffa9 Christos Stavrakakis
447 198d91c3 Christos Stavrakakis
    @patch("synnefo.logic.rapi_pool.GanetiRapiClient")
448 198d91c3 Christos Stavrakakis
    def test_remove_error(self, rapi, client):
449 198d91c3 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
450 198d91c3 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
451 198d91c3 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(operstate='ACTIVE')
452 198d91c3 Christos Stavrakakis
        network = bn.network
453 198d91c3 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_REMOVE',
454 198d91c3 Christos Stavrakakis
                              network=network.backend_id,
455 198d91c3 Christos Stavrakakis
                              status="error",
456 198d91c3 Christos Stavrakakis
                              cluster=bn.backend.clustername)
457 198d91c3 Christos Stavrakakis
        rapi().GetNetwork.return_value = {}
458 198d91c3 Christos Stavrakakis
        update_network(client, msg)
459 198d91c3 Christos Stavrakakis
        bn = BackendNetwork.objects.get(id=bn.id)
460 198d91c3 Christos Stavrakakis
        self.assertNotEqual(bn.operstate, "DELETED")
461 198d91c3 Christos Stavrakakis
        rapi().GetNetwork.side_effect = GanetiApiError(msg="foo", code=404)
462 198d91c3 Christos Stavrakakis
        with mocked_quotaholder():
463 198d91c3 Christos Stavrakakis
            update_network(client, msg)
464 198d91c3 Christos Stavrakakis
        bn = BackendNetwork.objects.get(id=bn.id)
465 198d91c3 Christos Stavrakakis
        self.assertEqual(bn.operstate, "DELETED")
466 198d91c3 Christos Stavrakakis
467 039e3e61 Christos Stavrakakis
    def test_remove_offline_backend(self, client):
468 039e3e61 Christos Stavrakakis
        """Test network removing when a backend is offline"""
469 3f77e63d Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
470 3f77e63d Christos Stavrakakis
        net = mfactory.NetworkFactory(flavor='PHYSICAL_VLAN',
471 3f77e63d Christos Stavrakakis
                                      state='ACTIVE',
472 3f77e63d Christos Stavrakakis
                                      link='prv12')
473 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
474 039e3e61 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net,
475 c6c889f7 Christos Stavrakakis
                                       operstate="ACTIVE",
476 3f77e63d Christos Stavrakakis
                                       backend__offline=True)
477 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_REMOVE',
478 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
479 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
480 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
481 184a2a8c Christos Stavrakakis
            update_network(client, msg)
482 039e3e61 Christos Stavrakakis
        client.basic_ack.assert_called_once()
483 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
484 1d04ef8b Christos Stavrakakis
        self.assertEqual(new_net.state, 'ACTIVE')
485 1d04ef8b Christos Stavrakakis
        self.assertFalse(new_net.deleted)
486 039e3e61 Christos Stavrakakis
487 47eeffa9 Christos Stavrakakis
    def test_error_opcode(self, client):
488 c6c889f7 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
489 c6c889f7 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
490 47eeffa9 Christos Stavrakakis
        for state, _ in Network.OPER_STATES:
491 c6c889f7 Christos Stavrakakis
            bn = mfactory.BackendNetworkFactory(operstate="ACTIVE")
492 47eeffa9 Christos Stavrakakis
            bn.operstate = state
493 47eeffa9 Christos Stavrakakis
            bn.save()
494 47eeffa9 Christos Stavrakakis
            network = bn.network
495 47eeffa9 Christos Stavrakakis
            network.state = state
496 47eeffa9 Christos Stavrakakis
            network.save()
497 47eeffa9 Christos Stavrakakis
            for opcode, _ in BackendNetwork.BACKEND_OPCODES:
498 47eeffa9 Christos Stavrakakis
                if opcode in ['OP_NETWORK_REMOVE', 'OP_NETWORK_ADD']:
499 47eeffa9 Christos Stavrakakis
                    continue
500 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation=opcode,
501 47eeffa9 Christos Stavrakakis
                                      network=bn.network.backend_id,
502 47eeffa9 Christos Stavrakakis
                                      status='error',
503 c6c889f7 Christos Stavrakakis
                                      add_reserved_ips=[],
504 c6c889f7 Christos Stavrakakis
                                      remove_reserved_ips=[],
505 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
506 c6c889f7 Christos Stavrakakis
                with mocked_quotaholder():
507 c6c889f7 Christos Stavrakakis
                    update_network(client, msg)
508 47eeffa9 Christos Stavrakakis
                client.basic_ack.assert_called_once()
509 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
510 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.operstate, db_bnet.operstate)
511 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.network.state, db_bnet.network.state)
512 47eeffa9 Christos Stavrakakis
513 47eeffa9 Christos Stavrakakis
    def test_ips(self, client):
514 47eeffa9 Christos Stavrakakis
        network = mfactory.NetworkFactory(subnet='10.0.0.0/24')
515 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=network)
516 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
517 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
518 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
519 47eeffa9 Christos Stavrakakis
                              status='success',
520 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=['10.0.0.10', '10.0.0.20'],
521 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=[])
522 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
523 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
524 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
525 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.10'))
526 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.20'))
527 47eeffa9 Christos Stavrakakis
        pool.save()
528 47eeffa9 Christos Stavrakakis
        # Release them
529 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
530 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
531 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
532 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=[],
533 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=['10.0.0.10', '10.0.0.20'])
534 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
535 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
536 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
537 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.10'))
538 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.20'))
539 95aee02c Vangelis Koukis
540 92c53da1 Vassilios Karakoidas
541 c8908e51 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
542 c8908e51 Christos Stavrakakis
class UpdateBuildProgressTest(TestCase):
543 c8908e51 Christos Stavrakakis
    def setUp(self):
544 c8908e51 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
545 95aee02c Vangelis Koukis
546 c8908e51 Christos Stavrakakis
    def get_db_vm(self):
547 c8908e51 Christos Stavrakakis
        return VirtualMachine.objects.get(id=self.vm.id)
548 95aee02c Vangelis Koukis
549 c8908e51 Christos Stavrakakis
    def create_msg(self, **kwargs):
550 c8908e51 Christos Stavrakakis
        """Create snf-progress-monitor message"""
551 c8908e51 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
552 c8908e51 Christos Stavrakakis
        msg['type'] = 'image-copy-progress'
553 c8908e51 Christos Stavrakakis
        msg['progress'] = 0
554 c8908e51 Christos Stavrakakis
        for key, val in kwargs.items():
555 c8908e51 Christos Stavrakakis
            msg[key] = val
556 c8908e51 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
557 c8908e51 Christos Stavrakakis
        return message
558 95aee02c Vangelis Koukis
559 c8908e51 Christos Stavrakakis
    def test_missing_attribute(self, client):
560 c8908e51 Christos Stavrakakis
        update_build_progress(client, json.dumps({'body': {}}))
561 c8908e51 Christos Stavrakakis
        client.basic_nack.assert_called_once()
562 95aee02c Vangelis Koukis
563 c8908e51 Christos Stavrakakis
    def test_unhandled_exception(self, client):
564 c8908e51 Christos Stavrakakis
        update_build_progress(client, {})
565 c8908e51 Christos Stavrakakis
        client.basic_reject.assert_called_once()
566 c25cc9ec Vangelis Koukis
567 c8908e51 Christos Stavrakakis
    def test_missing_instance(self, client):
568 c8908e51 Christos Stavrakakis
        msg = self.create_msg(instance='foo')
569 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
570 c8908e51 Christos Stavrakakis
        client.basic_nack.assert_called_once()
571 9068cd85 Georgios Gousios
572 c8908e51 Christos Stavrakakis
    def test_wrong_type(self, client):
573 c8908e51 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
574 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
575 c8908e51 Christos Stavrakakis
        client.basic_ack.assert_called_once()
576 9068cd85 Georgios Gousios
577 c8908e51 Christos Stavrakakis
    def test_progress_update(self, client):
578 c25cc9ec Vangelis Koukis
        rprogress = randint(10, 100)
579 c8908e51 Christos Stavrakakis
        msg = self.create_msg(progress=rprogress,
580 c8908e51 Christos Stavrakakis
                              instance=self.vm.backend_vm_id)
581 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
582 c8908e51 Christos Stavrakakis
        client.basic_ack.assert_called_once()
583 c8908e51 Christos Stavrakakis
        vm = self.get_db_vm()
584 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.buildpercentage, rprogress)
585 c8908e51 Christos Stavrakakis
586 c8908e51 Christos Stavrakakis
    def test_invalid_value(self, client):
587 c8908e51 Christos Stavrakakis
        old = self.vm.buildpercentage
588 c8908e51 Christos Stavrakakis
        for rprogress in [0, -1, 'a']:
589 c8908e51 Christos Stavrakakis
            msg = self.create_msg(progress=rprogress,
590 c8908e51 Christos Stavrakakis
                                  instance=self.vm.backend_vm_id)
591 c8908e51 Christos Stavrakakis
            update_build_progress(client, msg)
592 c8908e51 Christos Stavrakakis
            client.basic_ack.assert_called_once()
593 c8908e51 Christos Stavrakakis
            vm = self.get_db_vm()
594 c8908e51 Christos Stavrakakis
            self.assertEqual(vm.buildpercentage, old)
595 9068cd85 Georgios Gousios
596 9fea53cc Vangelis Koukis
597 eb99b367 Christos Stavrakakis
#class ReconciliationTest(TestCase):
598 eb99b367 Christos Stavrakakis
#    SERVERS = 1000
599 eb99b367 Christos Stavrakakis
#    fixtures = ['db_test_data']
600 eb99b367 Christos Stavrakakis
#
601 eb99b367 Christos Stavrakakis
#    def test_get_servers_from_db(self):
602 eb99b367 Christos Stavrakakis
#        """Test getting a dictionary from each server to its operstate"""
603 eb99b367 Christos Stavrakakis
#        self.assertEquals(reconciliation.get_servers_from_db(),
604 eb99b367 Christos Stavrakakis
#                          {30000: 'STARTED', 30001: 'STOPPED', 30002: 'BUILD'})
605 eb99b367 Christos Stavrakakis
#
606 eb99b367 Christos Stavrakakis
#    def test_stale_servers_in_db(self):
607 eb99b367 Christos Stavrakakis
#        """Test discovery of stale entries in DB"""
608 eb99b367 Christos Stavrakakis
#
609 eb99b367 Christos Stavrakakis
#        D = {1: 'STARTED', 2: 'STOPPED', 3: 'STARTED', 30000: 'BUILD',
610 eb99b367 Christos Stavrakakis
#             30002: 'STOPPED'}
611 eb99b367 Christos Stavrakakis
#        G = {1: True, 3: True, 30000: True}
612 eb99b367 Christos Stavrakakis
#        self.assertEquals(reconciliation.stale_servers_in_db(D, G),
613 eb99b367 Christos Stavrakakis
#                          set([2, 30002]))
614 eb99b367 Christos Stavrakakis
#
615 eb99b367 Christos Stavrakakis
#    @patch("synnefo.db.models.get_rapi_client")
616 eb99b367 Christos Stavrakakis
#    def test_stale_building_vm(self, client):
617 eb99b367 Christos Stavrakakis
#        vm = mfactory.VirtualMachineFactory()
618 eb99b367 Christos Stavrakakis
#        vm.state = 'BUILD'
619 eb99b367 Christos Stavrakakis
#        vm.backendjobid = 42
620 eb99b367 Christos Stavrakakis
#        vm.save()
621 eb99b367 Christos Stavrakakis
#        D = {vm.id: 'BUILD'}
622 eb99b367 Christos Stavrakakis
#        G = {}
623 eb99b367 Christos Stavrakakis
#        for status in ['queued', 'waiting', 'running']:
624 eb99b367 Christos Stavrakakis
#            client.return_value.GetJobStatus.return_value = {'status': status}
625 eb99b367 Christos Stavrakakis
#            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
626 eb99b367 Christos Stavrakakis
#            client.return_value.GetJobStatus\
627 eb99b367 Christos Stavrakakis
#                               .assert_called_once_with(vm.backendjobid)
628 eb99b367 Christos Stavrakakis
#            client.reset_mock()
629 eb99b367 Christos Stavrakakis
#        for status in ['success', 'error', 'canceled']:
630 eb99b367 Christos Stavrakakis
#            client.return_value.GetJobStatus.return_value = {'status': status}
631 eb99b367 Christos Stavrakakis
#            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
632 eb99b367 Christos Stavrakakis
#            client.return_value.GetInstance\
633 eb99b367 Christos Stavrakakis
#                               .assert_called_once_with(vm.backend_vm_id)
634 eb99b367 Christos Stavrakakis
#            client.return_value.GetJobStatus\
635 eb99b367 Christos Stavrakakis
#                               .assert_called_once_with(vm.backendjobid)
636 eb99b367 Christos Stavrakakis
#            client.reset_mock()
637 eb99b367 Christos Stavrakakis
#        from synnefo.logic.rapi import GanetiApiError
638 eb99b367 Christos Stavrakakis
#        client.return_value.GetJobStatus.side_effect = GanetiApiError('Foo')
639 eb99b367 Christos Stavrakakis
#        self.assertEqual(reconciliation.stale_servers_in_db(D, G),
640 eb99b367 Christos Stavrakakis
#                         set([vm.id]))
641 eb99b367 Christos Stavrakakis
#
642 eb99b367 Christos Stavrakakis
#    def test_orphan_instances_in_ganeti(self):
643 eb99b367 Christos Stavrakakis
#        """Test discovery of orphan instances in Ganeti, without a DB entry"""
644 eb99b367 Christos Stavrakakis
#
645 eb99b367 Christos Stavrakakis
#        G = {1: True, 2: False, 3: False, 4: True, 50: True}
646 eb99b367 Christos Stavrakakis
#        D = {1: True, 3: False}
647 eb99b367 Christos Stavrakakis
#        self.assertEquals(reconciliation.orphan_instances_in_ganeti(D, G),
648 eb99b367 Christos Stavrakakis
#                          set([2, 4, 50]))
649 eb99b367 Christos Stavrakakis
#
650 eb99b367 Christos Stavrakakis
#    def test_unsynced_operstate(self):
651 eb99b367 Christos Stavrakakis
#        """Test discovery of unsynced operstate between the DB and Ganeti"""
652 eb99b367 Christos Stavrakakis
#
653 eb99b367 Christos Stavrakakis
#        G = {1: True, 2: False, 3: True, 4: False, 50: True}
654 eb99b367 Christos Stavrakakis
#        D = {1: 'STARTED', 2: 'STARTED', 3: 'BUILD', 4: 'STARTED', 50: 'BUILD'}
655 eb99b367 Christos Stavrakakis
#        self.assertEquals(reconciliation.unsynced_operstate(D, G),
656 eb99b367 Christos Stavrakakis
#                          set([(2, 'STARTED', False),
657 eb99b367 Christos Stavrakakis
#                               (3, 'BUILD', True), (4, 'STARTED', False),
658 eb99b367 Christos Stavrakakis
#                               (50, 'BUILD', True)]))
659 b66e4833 Christos Stavrakakis
660 b66e4833 Christos Stavrakakis
from synnefo.logic.test.rapi_pool_tests import *
661 b66e4833 Christos Stavrakakis
from synnefo.logic.test.utils_tests import *