Statistics
| Branch: | Tag: | Revision:

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

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