Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (25.2 kB)

1 b8033991 Georgios Gousios
# vim: set fileencoding=utf-8 :
2 47eeffa9 Christos Stavrakakis
# Copyright 2012 GRNET S.A. All rights reserved.
3 09c936a7 Vassilios Karakoidas
#
4 48130e66 Georgios Gousios
# Redistribution and use in source and binary forms, with or without
5 48130e66 Georgios Gousios
# modification, are permitted provided that the following conditions
6 48130e66 Georgios Gousios
# are met:
7 09c936a7 Vassilios Karakoidas
#
8 48130e66 Georgios Gousios
#   1. Redistributions of source code must retain the above copyright
9 48130e66 Georgios Gousios
#      notice, this list of conditions and the following disclaimer.
10 48130e66 Georgios Gousios
#
11 48130e66 Georgios Gousios
#  2. Redistributions in binary form must reproduce the above copyright
12 48130e66 Georgios Gousios
#     notice, this list of conditions and the following disclaimer in the
13 48130e66 Georgios Gousios
#     documentation and/or other materials provided with the distribution.
14 09c936a7 Vassilios Karakoidas
#
15 48130e66 Georgios Gousios
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 48130e66 Georgios Gousios
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 48130e66 Georgios Gousios
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 48130e66 Georgios Gousios
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 48130e66 Georgios Gousios
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 48130e66 Georgios Gousios
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 48130e66 Georgios Gousios
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 48130e66 Georgios Gousios
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 48130e66 Georgios Gousios
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 48130e66 Georgios Gousios
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 48130e66 Georgios Gousios
# SUCH DAMAGE.
26 09c936a7 Vassilios Karakoidas
#
27 48130e66 Georgios Gousios
# The views and conclusions contained in the software and documentation are
28 48130e66 Georgios Gousios
# those of the authors and should not be interpreted as representing official
29 48130e66 Georgios Gousios
# policies, either expressed or implied, of GRNET S.A.
30 48130e66 Georgios Gousios
31 48130e66 Georgios Gousios
# Provides automated tests for logic module
32 92c53da1 Vassilios Karakoidas
33 c25cc9ec Vangelis Koukis
from random import randint
34 c25cc9ec Vangelis Koukis
35 c25cc9ec Vangelis Koukis
from django.test import TestCase
36 c25cc9ec Vangelis Koukis
37 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 c8908e51 Christos Stavrakakis
from synnefo.logic.callbacks import (update_db, update_net, 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 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-net-status'
203 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
204 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
205 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
206 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
207 47eeffa9 Christos Stavrakakis
            msg[key] = val
208 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
209 47eeffa9 Christos Stavrakakis
        return message
210 47eeffa9 Christos Stavrakakis
211 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
212 47eeffa9 Christos Stavrakakis
        update_net(client, json.dumps({'body': {}}))
213 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
214 47eeffa9 Christos Stavrakakis
215 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
216 47eeffa9 Christos Stavrakakis
        update_net(client, {})
217 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
218 47eeffa9 Christos Stavrakakis
219 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
220 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
221 47eeffa9 Christos Stavrakakis
        update_net(client, msg)
222 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
223 47eeffa9 Christos Stavrakakis
224 47eeffa9 Christos Stavrakakis
    def test_missing_instance(self, client):
225 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_INSTANCE_STARTUP',
226 47eeffa9 Christos Stavrakakis
                              instance='foo')
227 47eeffa9 Christos Stavrakakis
        update_net(client, msg)
228 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
229 47eeffa9 Christos Stavrakakis
230 47eeffa9 Christos Stavrakakis
    def test_no_nics(self, client):
231 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
232 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
233 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
234 47eeffa9 Christos Stavrakakis
        mfactory.NetworkInterfaceFactory(machine=vm)
235 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(vm.nics.all()), 3)
236 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(nics=[],
237 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
238 47eeffa9 Christos Stavrakakis
        update_net(client, msg)
239 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
240 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
241 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(db_vm.nics.all()), 0)
242 47eeffa9 Christos Stavrakakis
243 47eeffa9 Christos Stavrakakis
    def test_empty_nic(self, client):
244 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
245 47eeffa9 Christos Stavrakakis
        for public in [True, False]:
246 47eeffa9 Christos Stavrakakis
            net = mfactory.NetworkFactory(public=public)
247 cc92b70f Christos Stavrakakis
            msg = self.create_msg(nics=[{'network': net.backend_id}],
248 47eeffa9 Christos Stavrakakis
                                  instance=vm.backend_vm_id)
249 47eeffa9 Christos Stavrakakis
            update_net(client, msg)
250 47eeffa9 Christos Stavrakakis
            client.basic_ack.assert_called_once()
251 47eeffa9 Christos Stavrakakis
            db_vm = VirtualMachine.objects.get(id=vm.id)
252 47eeffa9 Christos Stavrakakis
            nics = db_vm.nics.all()
253 47eeffa9 Christos Stavrakakis
            self.assertEqual(len(nics), 1)
254 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].index, 0)
255 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv4, '')
256 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].ipv6, '')
257 47eeffa9 Christos Stavrakakis
            self.assertEqual(nics[0].mac, '')
258 47eeffa9 Christos Stavrakakis
            if public:
259 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile,
260 47eeffa9 Christos Stavrakakis
                                 settings.DEFAULT_FIREWALL_PROFILE)
261 47eeffa9 Christos Stavrakakis
            else:
262 47eeffa9 Christos Stavrakakis
                self.assertEqual(nics[0].firewall_profile, '')
263 47eeffa9 Christos Stavrakakis
264 47eeffa9 Christos Stavrakakis
    def test_full_nic(self, client):
265 47eeffa9 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory(operstate='ERROR')
266 47eeffa9 Christos Stavrakakis
        net = mfactory.NetworkFactory(subnet='10.0.0.0/24')
267 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
268 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_available('10.0.0.22'))
269 47eeffa9 Christos Stavrakakis
        pool.save()
270 cc92b70f Christos Stavrakakis
        msg = self.create_msg(nics=[{'network': net.backend_id,
271 47eeffa9 Christos Stavrakakis
                                     'ip': '10.0.0.22',
272 47eeffa9 Christos Stavrakakis
                                     'mac': 'aa:bb:cc:00:11:22'}],
273 47eeffa9 Christos Stavrakakis
                              instance=vm.backend_vm_id)
274 47eeffa9 Christos Stavrakakis
        update_net(client, msg)
275 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
276 47eeffa9 Christos Stavrakakis
        db_vm = VirtualMachine.objects.get(id=vm.id)
277 47eeffa9 Christos Stavrakakis
        nics = db_vm.nics.all()
278 47eeffa9 Christos Stavrakakis
        self.assertEqual(len(nics), 1)
279 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].index, 0)
280 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv4, '10.0.0.22')
281 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].ipv6, '')
282 47eeffa9 Christos Stavrakakis
        self.assertEqual(nics[0].mac, 'aa:bb:cc:00:11:22')
283 47eeffa9 Christos Stavrakakis
        pool = net.get_pool()
284 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_available('10.0.0.22'))
285 47eeffa9 Christos Stavrakakis
        pool.save()
286 47eeffa9 Christos Stavrakakis
287 47eeffa9 Christos Stavrakakis
288 47eeffa9 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
289 47eeffa9 Christos Stavrakakis
class UpdateNetworkTest(TestCase):
290 47eeffa9 Christos Stavrakakis
    def create_msg(self, **kwargs):
291 47eeffa9 Christos Stavrakakis
        """Create snf-ganeti-eventd message"""
292 47eeffa9 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
293 47eeffa9 Christos Stavrakakis
        msg['type'] = 'ganeti-network-status'
294 47eeffa9 Christos Stavrakakis
        msg['status'] = 'success'
295 47eeffa9 Christos Stavrakakis
        msg['jobId'] = 1
296 47eeffa9 Christos Stavrakakis
        msg['logmsg'] = 'Dummy Log'
297 47eeffa9 Christos Stavrakakis
        for key, val in kwargs.items():
298 47eeffa9 Christos Stavrakakis
            msg[key] = val
299 47eeffa9 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
300 47eeffa9 Christos Stavrakakis
        return message
301 47eeffa9 Christos Stavrakakis
302 47eeffa9 Christos Stavrakakis
    def test_missing_attribute(self, client):
303 47eeffa9 Christos Stavrakakis
        update_network(client, json.dumps({'body': {}}))
304 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
305 47eeffa9 Christos Stavrakakis
306 47eeffa9 Christos Stavrakakis
    def test_unhandled_exception(self, client):
307 47eeffa9 Christos Stavrakakis
        update_network(client, {})
308 47eeffa9 Christos Stavrakakis
        client.basic_reject.assert_called_once()
309 47eeffa9 Christos Stavrakakis
310 47eeffa9 Christos Stavrakakis
    def test_wrong_type(self, client):
311 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
312 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
313 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
314 47eeffa9 Christos Stavrakakis
315 47eeffa9 Christos Stavrakakis
    def test_missing_network(self, client):
316 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CREATE',
317 47eeffa9 Christos Stavrakakis
                              network='foo')
318 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
319 47eeffa9 Christos Stavrakakis
        client.basic_nack.assert_called_once()
320 47eeffa9 Christos Stavrakakis
321 47eeffa9 Christos Stavrakakis
    def test_create(self, client):
322 47eeffa9 Christos Stavrakakis
        back_network = mfactory.BackendNetworkFactory(operstate='PENDING')
323 47eeffa9 Christos Stavrakakis
        net = back_network.network
324 47eeffa9 Christos Stavrakakis
        back1 = back_network.backend
325 47eeffa9 Christos Stavrakakis
326 47eeffa9 Christos Stavrakakis
        back_network2 = mfactory.BackendNetworkFactory(operstate='PENDING',
327 47eeffa9 Christos Stavrakakis
                                                       network=net)
328 47eeffa9 Christos Stavrakakis
        back2 = back_network2.backend
329 47eeffa9 Christos Stavrakakis
        # Message from first backend network
330 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
331 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
332 47eeffa9 Christos Stavrakakis
                              cluster=back1.clustername)
333 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
334 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
335 47eeffa9 Christos Stavrakakis
336 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
337 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
338 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
339 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_net.state, 'PENDING')
340 47eeffa9 Christos Stavrakakis
        # msg from second backend network
341 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
342 47eeffa9 Christos Stavrakakis
                              network=net.backend_id,
343 47eeffa9 Christos Stavrakakis
                              cluster=back2.clustername)
344 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
345 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
346 47eeffa9 Christos Stavrakakis
347 47eeffa9 Christos Stavrakakis
        db_net = Network.objects.get(id=net.id)
348 47eeffa9 Christos Stavrakakis
        self.assertEqual(db_net.state, 'ACTIVE')
349 47eeffa9 Christos Stavrakakis
        back_net = BackendNetwork.objects.get(id=back_network.id)
350 47eeffa9 Christos Stavrakakis
        self.assertEqual(back_net.operstate, 'ACTIVE')
351 47eeffa9 Christos Stavrakakis
352 039e3e61 Christos Stavrakakis
    def test_create_offline_backend(self, client):
353 039e3e61 Christos Stavrakakis
        """Test network creation when a backend is offline"""
354 039e3e61 Christos Stavrakakis
        net = mfactory.NetworkFactory()
355 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
356 039e3e61 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(network=net,
357 039e3e61 Christos Stavrakakis
                                             backend__offline=True)
358 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_CONNECT',
359 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
360 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
361 039e3e61 Christos Stavrakakis
        update_network(client, msg)
362 039e3e61 Christos Stavrakakis
        client.basic_ack.assert_called_once()
363 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
364 039e3e61 Christos Stavrakakis
        self.assertEqual(new_net.state, 'ACTIVE')
365 039e3e61 Christos Stavrakakis
366 47eeffa9 Christos Stavrakakis
    def test_disconnect(self, client):
367 47eeffa9 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(operstate='ACTIVE')
368 47eeffa9 Christos Stavrakakis
        net1 = bn1.network
369 47eeffa9 Christos Stavrakakis
        net1.operstate = 'ACTIVE'
370 47eeffa9 Christos Stavrakakis
        net1.save()
371 47eeffa9 Christos Stavrakakis
        bn2 = mfactory.BackendNetworkFactory(operstate='ACTIVE',
372 47eeffa9 Christos Stavrakakis
                                             network=net1)
373 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_DISCONNECT',
374 47eeffa9 Christos Stavrakakis
                              network=net1.backend_id,
375 47eeffa9 Christos Stavrakakis
                              cluster=bn2.backend.clustername)
376 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
377 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
378 47eeffa9 Christos Stavrakakis
        self.assertEqual(Network.objects.get(id=net1.id).state, 'PENDING')
379 47eeffa9 Christos Stavrakakis
        self.assertEqual(BackendNetwork.objects.get(id=bn2.id).operstate,
380 cc92b70f Christos Stavrakakis
                         'PENDING')
381 47eeffa9 Christos Stavrakakis
382 47eeffa9 Christos Stavrakakis
    def test_remove(self, client):
383 47eeffa9 Christos Stavrakakis
        mfactory.MacPrefixPoolTableFactory()
384 47eeffa9 Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
385 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(operstate='ACTIVE')
386 47eeffa9 Christos Stavrakakis
        for old_state in ['success', 'canceled', 'error']:
387 47eeffa9 Christos Stavrakakis
            for flavor in Network.FLAVORS.keys():
388 47eeffa9 Christos Stavrakakis
                bn.operstate = old_state
389 47eeffa9 Christos Stavrakakis
                bn.save()
390 47eeffa9 Christos Stavrakakis
                net = bn.network
391 47eeffa9 Christos Stavrakakis
                net.state = 'ACTIVE'
392 47eeffa9 Christos Stavrakakis
                net.flavor = flavor
393 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
394 47eeffa9 Christos Stavrakakis
                    net.link = allocate_resource('bridge')
395 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
396 47eeffa9 Christos Stavrakakis
                    net.mac_prefix = allocate_resource('mac_prefix')
397 47eeffa9 Christos Stavrakakis
                net.save()
398 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation='OP_NETWORK_REMOVE',
399 47eeffa9 Christos Stavrakakis
                                      network=net.backend_id,
400 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
401 184a2a8c Christos Stavrakakis
                with mocked_quotaholder():
402 184a2a8c Christos Stavrakakis
                    update_network(client, msg)
403 47eeffa9 Christos Stavrakakis
                client.basic_ack.assert_called_once()
404 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
405 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_bnet.operstate,
406 cc92b70f Christos Stavrakakis
                                 'DELETED')
407 47eeffa9 Christos Stavrakakis
                db_net = Network.objects.get(id=net.id)
408 47eeffa9 Christos Stavrakakis
                self.assertEqual(db_net.state, 'DELETED', flavor)
409 47eeffa9 Christos Stavrakakis
                self.assertTrue(db_net.deleted)
410 47eeffa9 Christos Stavrakakis
                if flavor == 'PHYSICAL_VLAN':
411 47eeffa9 Christos Stavrakakis
                    pool = BridgePoolTable.get_pool()
412 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.link))
413 47eeffa9 Christos Stavrakakis
                if flavor == 'MAC_FILTERED':
414 47eeffa9 Christos Stavrakakis
                    pool = MacPrefixPoolTable.get_pool()
415 47eeffa9 Christos Stavrakakis
                    self.assertTrue(pool.is_available(net.mac_prefix))
416 47eeffa9 Christos Stavrakakis
417 039e3e61 Christos Stavrakakis
    def test_remove_offline_backend(self, client):
418 039e3e61 Christos Stavrakakis
        """Test network removing when a backend is offline"""
419 3f77e63d Christos Stavrakakis
        mfactory.BridgePoolTableFactory()
420 3f77e63d Christos Stavrakakis
        net = mfactory.NetworkFactory(flavor='PHYSICAL_VLAN',
421 3f77e63d Christos Stavrakakis
                                      state='ACTIVE',
422 3f77e63d Christos Stavrakakis
                                      link='prv12')
423 039e3e61 Christos Stavrakakis
        bn1 = mfactory.BackendNetworkFactory(network=net)
424 039e3e61 Christos Stavrakakis
        mfactory.BackendNetworkFactory(network=net,
425 3f77e63d Christos Stavrakakis
                                       backend__offline=True)
426 039e3e61 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_REMOVE',
427 039e3e61 Christos Stavrakakis
                              network=net.backend_id,
428 039e3e61 Christos Stavrakakis
                              cluster=bn1.backend.clustername)
429 184a2a8c Christos Stavrakakis
        with mocked_quotaholder():
430 184a2a8c Christos Stavrakakis
            update_network(client, msg)
431 039e3e61 Christos Stavrakakis
        client.basic_ack.assert_called_once()
432 039e3e61 Christos Stavrakakis
        new_net = Network.objects.get(id=net.id)
433 3f77e63d Christos Stavrakakis
        self.assertEqual(new_net.state, 'DELETED')
434 039e3e61 Christos Stavrakakis
        self.assertTrue(new_net.deleted)
435 039e3e61 Christos Stavrakakis
436 47eeffa9 Christos Stavrakakis
    def test_error_opcode(self, client):
437 47eeffa9 Christos Stavrakakis
        for state, _ in Network.OPER_STATES:
438 47eeffa9 Christos Stavrakakis
            bn = mfactory.BackendNetworkFactory()
439 47eeffa9 Christos Stavrakakis
            bn.operstate = state
440 47eeffa9 Christos Stavrakakis
            bn.save()
441 47eeffa9 Christos Stavrakakis
            network = bn.network
442 47eeffa9 Christos Stavrakakis
            network.state = state
443 47eeffa9 Christos Stavrakakis
            network.save()
444 47eeffa9 Christos Stavrakakis
            for opcode, _ in BackendNetwork.BACKEND_OPCODES:
445 47eeffa9 Christos Stavrakakis
                if opcode in ['OP_NETWORK_REMOVE', 'OP_NETWORK_ADD']:
446 47eeffa9 Christos Stavrakakis
                    continue
447 47eeffa9 Christos Stavrakakis
                msg = self.create_msg(operation=opcode,
448 47eeffa9 Christos Stavrakakis
                                      network=bn.network.backend_id,
449 47eeffa9 Christos Stavrakakis
                                      status='error',
450 47eeffa9 Christos Stavrakakis
                                      cluster=bn.backend.clustername)
451 47eeffa9 Christos Stavrakakis
                update_network(client, msg)
452 47eeffa9 Christos Stavrakakis
                client.basic_ack.assert_called_once()
453 47eeffa9 Christos Stavrakakis
                db_bnet = BackendNetwork.objects.get(id=bn.id)
454 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.operstate, db_bnet.operstate)
455 47eeffa9 Christos Stavrakakis
                self.assertEqual(bn.network.state, db_bnet.network.state)
456 47eeffa9 Christos Stavrakakis
457 47eeffa9 Christos Stavrakakis
    def test_ips(self, client):
458 47eeffa9 Christos Stavrakakis
        network = mfactory.NetworkFactory(subnet='10.0.0.0/24')
459 47eeffa9 Christos Stavrakakis
        bn = mfactory.BackendNetworkFactory(network=network)
460 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
461 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
462 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
463 47eeffa9 Christos Stavrakakis
                              status='success',
464 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=['10.0.0.10', '10.0.0.20'],
465 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=[])
466 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
467 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
468 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
469 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.10'))
470 47eeffa9 Christos Stavrakakis
        self.assertTrue(pool.is_reserved('10.0.0.20'))
471 47eeffa9 Christos Stavrakakis
        pool.save()
472 47eeffa9 Christos Stavrakakis
        # Release them
473 47eeffa9 Christos Stavrakakis
        msg = self.create_msg(operation='OP_NETWORK_SET_PARAMS',
474 47eeffa9 Christos Stavrakakis
                              network=network.backend_id,
475 47eeffa9 Christos Stavrakakis
                              cluster=bn.backend.clustername,
476 47eeffa9 Christos Stavrakakis
                              add_reserved_ips=[],
477 47eeffa9 Christos Stavrakakis
                              remove_reserved_ips=['10.0.0.10', '10.0.0.20'])
478 47eeffa9 Christos Stavrakakis
        update_network(client, msg)
479 47eeffa9 Christos Stavrakakis
        client.basic_ack.assert_called_once()
480 47eeffa9 Christos Stavrakakis
        pool = network.get_pool()
481 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.10'))
482 47eeffa9 Christos Stavrakakis
        self.assertFalse(pool.is_reserved('10.0.0.20'))
483 95aee02c Vangelis Koukis
484 92c53da1 Vassilios Karakoidas
485 c8908e51 Christos Stavrakakis
@patch('synnefo.lib.amqp.AMQPClient')
486 c8908e51 Christos Stavrakakis
class UpdateBuildProgressTest(TestCase):
487 c8908e51 Christos Stavrakakis
    def setUp(self):
488 c8908e51 Christos Stavrakakis
        self.vm = mfactory.VirtualMachineFactory()
489 95aee02c Vangelis Koukis
490 c8908e51 Christos Stavrakakis
    def get_db_vm(self):
491 c8908e51 Christos Stavrakakis
        return VirtualMachine.objects.get(id=self.vm.id)
492 95aee02c Vangelis Koukis
493 c8908e51 Christos Stavrakakis
    def create_msg(self, **kwargs):
494 c8908e51 Christos Stavrakakis
        """Create snf-progress-monitor message"""
495 c8908e51 Christos Stavrakakis
        msg = {'event_time': split_time(time())}
496 c8908e51 Christos Stavrakakis
        msg['type'] = 'image-copy-progress'
497 c8908e51 Christos Stavrakakis
        msg['progress'] = 0
498 c8908e51 Christos Stavrakakis
        for key, val in kwargs.items():
499 c8908e51 Christos Stavrakakis
            msg[key] = val
500 c8908e51 Christos Stavrakakis
        message = {'body': json.dumps(msg)}
501 c8908e51 Christos Stavrakakis
        return message
502 95aee02c Vangelis Koukis
503 c8908e51 Christos Stavrakakis
    def test_missing_attribute(self, client):
504 c8908e51 Christos Stavrakakis
        update_build_progress(client, json.dumps({'body': {}}))
505 c8908e51 Christos Stavrakakis
        client.basic_nack.assert_called_once()
506 95aee02c Vangelis Koukis
507 c8908e51 Christos Stavrakakis
    def test_unhandled_exception(self, client):
508 c8908e51 Christos Stavrakakis
        update_build_progress(client, {})
509 c8908e51 Christos Stavrakakis
        client.basic_reject.assert_called_once()
510 c25cc9ec Vangelis Koukis
511 c8908e51 Christos Stavrakakis
    def test_missing_instance(self, client):
512 c8908e51 Christos Stavrakakis
        msg = self.create_msg(instance='foo')
513 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
514 c8908e51 Christos Stavrakakis
        client.basic_nack.assert_called_once()
515 9068cd85 Georgios Gousios
516 c8908e51 Christos Stavrakakis
    def test_wrong_type(self, client):
517 c8908e51 Christos Stavrakakis
        msg = self.create_msg(type="WRONG_TYPE")
518 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
519 c8908e51 Christos Stavrakakis
        client.basic_ack.assert_called_once()
520 9068cd85 Georgios Gousios
521 c8908e51 Christos Stavrakakis
    def test_progress_update(self, client):
522 c25cc9ec Vangelis Koukis
        rprogress = randint(10, 100)
523 c8908e51 Christos Stavrakakis
        msg = self.create_msg(progress=rprogress,
524 c8908e51 Christos Stavrakakis
                              instance=self.vm.backend_vm_id)
525 c8908e51 Christos Stavrakakis
        update_build_progress(client, msg)
526 c8908e51 Christos Stavrakakis
        client.basic_ack.assert_called_once()
527 c8908e51 Christos Stavrakakis
        vm = self.get_db_vm()
528 c8908e51 Christos Stavrakakis
        self.assertEqual(vm.buildpercentage, rprogress)
529 c8908e51 Christos Stavrakakis
530 c8908e51 Christos Stavrakakis
    def test_invalid_value(self, client):
531 c8908e51 Christos Stavrakakis
        old = self.vm.buildpercentage
532 c8908e51 Christos Stavrakakis
        for rprogress in [0, -1, 'a']:
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, old)
539 9068cd85 Georgios Gousios
540 9fea53cc Vangelis Koukis
541 c8908e51 Christos Stavrakakis
class ReconciliationTest(TestCase):
542 9fea53cc Vangelis Koukis
    SERVERS = 1000
543 9fea53cc Vangelis Koukis
    fixtures = ['db_test_data']
544 9fea53cc Vangelis Koukis
545 9fea53cc Vangelis Koukis
    def test_get_servers_from_db(self):
546 9fea53cc Vangelis Koukis
        """Test getting a dictionary from each server to its operstate"""
547 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.get_servers_from_db(),
548 9fea53cc Vangelis Koukis
                          {30000: 'STARTED', 30001: 'STOPPED', 30002: 'BUILD'})
549 9fea53cc Vangelis Koukis
550 9fea53cc Vangelis Koukis
    def test_stale_servers_in_db(self):
551 9fea53cc Vangelis Koukis
        """Test discovery of stale entries in DB"""
552 9fea53cc Vangelis Koukis
553 47eeffa9 Christos Stavrakakis
        D = {1: 'STARTED', 2: 'STOPPED', 3: 'STARTED', 30000: 'BUILD',
554 47eeffa9 Christos Stavrakakis
             30002: 'STOPPED'}
555 47eeffa9 Christos Stavrakakis
        G = {1: True, 3: True, 30000: True}
556 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.stale_servers_in_db(D, G),
557 47eeffa9 Christos Stavrakakis
                          set([2, 30002]))
558 9fea53cc Vangelis Koukis
559 c8908e51 Christos Stavrakakis
    @patch("synnefo.db.models.get_rapi_client")
560 c8908e51 Christos Stavrakakis
    def test_stale_building_vm(self, client):
561 c8908e51 Christos Stavrakakis
        vm = mfactory.VirtualMachineFactory()
562 c8908e51 Christos Stavrakakis
        vm.state = 'BUILD'
563 c8908e51 Christos Stavrakakis
        vm.backendjobid = 42
564 c8908e51 Christos Stavrakakis
        vm.save()
565 c8908e51 Christos Stavrakakis
        D = {vm.id: 'BUILD'}
566 c8908e51 Christos Stavrakakis
        G = {}
567 c8908e51 Christos Stavrakakis
        for status in ['queued', 'waiting', 'running']:
568 c8908e51 Christos Stavrakakis
            client.return_value.GetJobStatus.return_value = {'status': status}
569 c8908e51 Christos Stavrakakis
            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
570 cc92b70f Christos Stavrakakis
            client.return_value.GetJobStatus\
571 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backendjobid)
572 c8908e51 Christos Stavrakakis
            client.reset_mock()
573 c8908e51 Christos Stavrakakis
        for status in ['success', 'error', 'canceled']:
574 c8908e51 Christos Stavrakakis
            client.return_value.GetJobStatus.return_value = {'status': status}
575 c8908e51 Christos Stavrakakis
            self.assertEqual(reconciliation.stale_servers_in_db(D, G), set([]))
576 cc92b70f Christos Stavrakakis
            client.return_value.GetInstance\
577 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backend_vm_id)
578 cc92b70f Christos Stavrakakis
            client.return_value.GetJobStatus\
579 cc92b70f Christos Stavrakakis
                               .assert_called_once_with(vm.backendjobid)
580 c8908e51 Christos Stavrakakis
            client.reset_mock()
581 c8908e51 Christos Stavrakakis
        from synnefo.logic.rapi import GanetiApiError
582 c8908e51 Christos Stavrakakis
        client.return_value.GetJobStatus.side_effect = GanetiApiError('Foo')
583 cc92b70f Christos Stavrakakis
        self.assertEqual(reconciliation.stale_servers_in_db(D, G),
584 cc92b70f Christos Stavrakakis
                         set([vm.id]))
585 c8908e51 Christos Stavrakakis
586 9fea53cc Vangelis Koukis
    def test_orphan_instances_in_ganeti(self):
587 9fea53cc Vangelis Koukis
        """Test discovery of orphan instances in Ganeti, without a DB entry"""
588 9fea53cc Vangelis Koukis
589 9fea53cc Vangelis Koukis
        G = {1: True, 2: False, 3: False, 4: True, 50: True}
590 9fea53cc Vangelis Koukis
        D = {1: True, 3: False}
591 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.orphan_instances_in_ganeti(D, G),
592 46704e06 Vangelis Koukis
                          set([2, 4, 50]))
593 9fea53cc Vangelis Koukis
594 9fea53cc Vangelis Koukis
    def test_unsynced_operstate(self):
595 9fea53cc Vangelis Koukis
        """Test discovery of unsynced operstate between the DB and Ganeti"""
596 9fea53cc Vangelis Koukis
597 9fea53cc Vangelis Koukis
        G = {1: True, 2: False, 3: True, 4: False, 50: True}
598 9fea53cc Vangelis Koukis
        D = {1: 'STARTED', 2: 'STARTED', 3: 'BUILD', 4: 'STARTED', 50: 'BUILD'}
599 9fea53cc Vangelis Koukis
        self.assertEquals(reconciliation.unsynced_operstate(D, G),
600 46704e06 Vangelis Koukis
                          set([(2, 'STARTED', False),
601 cc92b70f Christos Stavrakakis
                               (3, 'BUILD', True), (4, 'STARTED', False),
602 cc92b70f Christos Stavrakakis
                               (50, 'BUILD', True)]))
603 b66e4833 Christos Stavrakakis
604 b66e4833 Christos Stavrakakis
from synnefo.logic.test.rapi_pool_tests import *
605 b66e4833 Christos Stavrakakis
from synnefo.logic.test.utils_tests import *