Statistics
| Branch: | Tag: | Revision:

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

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