Revision 41a7fae7 snf-cyclades-app/synnefo/logic/tests.py
b/snf-cyclades-app/synnefo/logic/tests.py | ||
---|---|---|
34 | 34 |
|
35 | 35 |
from django.test import TestCase |
36 | 36 |
|
37 |
from snf_django.lib.api import faults |
|
37 | 38 |
from synnefo.db.models import * |
38 | 39 |
from synnefo.db import models_factory as mfactory |
39 |
from synnefo.logic import reconciliation |
|
40 |
from synnefo.logic import reconciliation, servers
|
|
40 | 41 |
from synnefo.lib.utils import split_time |
41 | 42 |
from datetime import datetime |
42 | 43 |
from mock import patch |
... | ... | |
49 | 50 |
from time import time |
50 | 51 |
import json |
51 | 52 |
|
53 |
|
|
54 |
@patch("synnefo.logic.rapi_pool.GanetiRapiClient") |
|
55 |
class ServerCommandTest(TestCase): |
|
56 |
def test_pending_task(self, mrapi): |
|
57 |
vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1) |
|
58 |
self.assertRaises(faults.BadRequest, servers.start, vm) |
|
59 |
vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1) |
|
60 |
self.assertRaises(faults.BuildInProgress, servers.start, vm) |
|
61 |
# Assert always succeeds |
|
62 |
vm = mfactory.VirtualMachineFactory(task="BUILD", task_job_id=1) |
|
63 |
mrapi().DeleteInstance.return_value = 1 |
|
64 |
with mocked_quotaholder(): |
|
65 |
servers.destroy(vm) |
|
66 |
vm = mfactory.VirtualMachineFactory(task="REBOOT", task_job_id=1) |
|
67 |
with mocked_quotaholder(): |
|
68 |
servers.destroy(vm) |
|
69 |
|
|
70 |
def test_deleted_vm(self, mrapi): |
|
71 |
vm = mfactory.VirtualMachineFactory(deleted=True) |
|
72 |
self.assertRaises(faults.BadRequest, servers.start, vm) |
|
73 |
|
|
74 |
def test_invalid_operstate_for_action(self, mrapi): |
|
75 |
vm = mfactory.VirtualMachineFactory(operstate="STARTED") |
|
76 |
self.assertRaises(faults.BadRequest, servers.start, vm) |
|
77 |
vm = mfactory.VirtualMachineFactory(operstate="STOPPED") |
|
78 |
self.assertRaises(faults.BadRequest, servers.stop, vm) |
|
79 |
vm = mfactory.VirtualMachineFactory(operstate="STARTED") |
|
80 |
self.assertRaises(faults.BadRequest, servers.resize, vm) |
|
81 |
vm = mfactory.VirtualMachineFactory(operstate="STOPPED") |
|
82 |
self.assertRaises(faults.BadRequest, servers.stop, vm) |
|
83 |
#test valid |
|
84 |
mrapi().StartupInstance.return_value = 1 |
|
85 |
with mocked_quotaholder(): |
|
86 |
servers.start(vm) |
|
87 |
vm.task = None |
|
88 |
vm.task_job_id = None |
|
89 |
vm.save() |
|
90 |
mrapi().RebootInstance.return_value = 1 |
|
91 |
with mocked_quotaholder(): |
|
92 |
servers.reboot(vm, "HARD") |
|
93 |
|
|
94 |
def test_commission(self, mrapi): |
|
95 |
vm = mfactory.VirtualMachineFactory(operstate="STOPPED") |
|
96 |
# Still pending |
|
97 |
vm.serial = mfactory.QuotaHolderSerialFactory(serial=200, |
|
98 |
resolved=False, |
|
99 |
pending=True) |
|
100 |
serial = vm.serial |
|
101 |
mrapi().StartupInstance.return_value = 1 |
|
102 |
with mocked_quotaholder() as m: |
|
103 |
servers.start(vm) |
|
104 |
m.resolve_commissions.assert_called_once_with('', [], |
|
105 |
[serial.serial]) |
|
106 |
self.assertTrue(m.issue_one_commission.called) |
|
107 |
# Not pending, rejct |
|
108 |
vm.task = None |
|
109 |
vm.serial = mfactory.QuotaHolderSerialFactory(serial=400, |
|
110 |
resolved=False, |
|
111 |
pending=False, |
|
112 |
accept=False) |
|
113 |
serial = vm.serial |
|
114 |
mrapi().StartupInstance.return_value = 1 |
|
115 |
with mocked_quotaholder() as m: |
|
116 |
servers.start(vm) |
|
117 |
m.resolve_commissions.assert_called_once_with('', [], |
|
118 |
[serial.serial]) |
|
119 |
self.assertTrue(m.issue_one_commission.called) |
|
120 |
# Not pending, accept |
|
121 |
vm.task = None |
|
122 |
vm.serial = mfactory.QuotaHolderSerialFactory(serial=600, |
|
123 |
resolved=False, |
|
124 |
pending=False, |
|
125 |
accept=True) |
|
126 |
serial = vm.serial |
|
127 |
mrapi().StartupInstance.return_value = 1 |
|
128 |
with mocked_quotaholder() as m: |
|
129 |
servers.start(vm) |
|
130 |
m.resolve_commissions.assert_called_once_with('', [serial.serial], |
|
131 |
[]) |
|
132 |
self.assertTrue(m.issue_one_commission.called) |
|
133 |
|
|
134 |
mrapi().StartupInstance.side_effect = ValueError |
|
135 |
vm.task = None |
|
136 |
vm.serial = None |
|
137 |
# Test reject if Ganeti erro |
|
138 |
with mocked_quotaholder() as m: |
|
139 |
try: |
|
140 |
servers.start(vm) |
|
141 |
except: |
|
142 |
m.resolve_commissions.assert_called_once_with('', [], |
|
143 |
[vm.serial.serial]) |
|
144 |
|
|
145 |
def test_task_after(self, mrapi): |
|
146 |
return |
|
147 |
vm = mfactory.VirtualMachineFactory() |
|
148 |
mrapi().StartupInstance.return_value = 1 |
|
149 |
mrapi().ShutdownInstance.return_value = 2 |
|
150 |
mrapi().RebootInstance.return_value = 2 |
|
151 |
with mocked_quotaholder() as m: |
|
152 |
vm.task = None |
|
153 |
vm.operstate = "STOPPED" |
|
154 |
servers.start(vm) |
|
155 |
self.assertEqual(vm.task, "START") |
|
156 |
self.assertEqual(vm.task_job_id, 1) |
|
157 |
with mocked_quotaholder() as m: |
|
158 |
vm.task = None |
|
159 |
vm.operstate = "STARTED" |
|
160 |
servers.stop(vm) |
|
161 |
self.assertEqual(vm.task, "STOP") |
|
162 |
self.assertEqual(vm.task_job_id, 2) |
|
163 |
with mocked_quotaholder() as m: |
|
164 |
vm.task = None |
|
165 |
servers.reboot(vm) |
|
166 |
self.assertEqual(vm.task, "REBOOT") |
|
167 |
self.assertEqual(vm.task_job_id, 3) |
|
168 |
|
|
169 |
|
|
170 |
|
|
52 | 171 |
## Test Callbacks |
53 | 172 |
|
54 | 173 |
|
... | ... | |
107 | 226 |
vm = mfactory.VirtualMachineFactory() |
108 | 227 |
msg = self.create_msg(operation='OP_INSTANCE_STARTUP', |
109 | 228 |
instance=vm.backend_vm_id) |
110 |
update_db(client, msg) |
|
229 |
with mocked_quotaholder(): |
|
230 |
update_db(client, msg) |
|
111 | 231 |
self.assertTrue(client.basic_ack.called) |
112 | 232 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
113 | 233 |
self.assertEqual(db_vm.operstate, 'STARTED') |
... | ... | |
116 | 236 |
vm = mfactory.VirtualMachineFactory() |
117 | 237 |
msg = self.create_msg(operation='OP_INSTANCE_SHUTDOWN', |
118 | 238 |
instance=vm.backend_vm_id) |
119 |
update_db(client, msg) |
|
239 |
with mocked_quotaholder(): |
|
240 |
update_db(client, msg) |
|
120 | 241 |
self.assertTrue(client.basic_ack.called) |
121 | 242 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
122 | 243 |
self.assertEqual(db_vm.operstate, 'STOPPED') |
... | ... | |
202 | 323 |
beparams={}, |
203 | 324 |
status=status) |
204 | 325 |
client.reset_mock() |
205 |
update_db(client, msg) |
|
326 |
with mocked_quotaholder(): |
|
327 |
update_db(client, msg) |
|
206 | 328 |
self.assertTrue(client.basic_ack.called) |
207 | 329 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
208 | 330 |
self.assertEqual(db_vm.operstate, vm.operstate) |
... | ... | |
217 | 339 |
update_db(client, msg) |
218 | 340 |
self.assertTrue(client.basic_ack.called) |
219 | 341 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
220 |
self.assertEqual(db_vm.operstate, "RESIZE")
|
|
342 |
self.assertEqual(db_vm.operstate, "STOPPED")
|
|
221 | 343 |
# Test operstate after error |
222 | 344 |
msg = self.create_msg(operation='OP_INSTANCE_SET_PARAMS', |
223 | 345 |
instance=vm.backend_vm_id, |
224 | 346 |
beparams={"vcpus": 4}, |
225 | 347 |
status="error") |
226 | 348 |
client.reset_mock() |
227 |
update_db(client, msg) |
|
349 |
with mocked_quotaholder(): |
|
350 |
update_db(client, msg) |
|
228 | 351 |
self.assertTrue(client.basic_ack.called) |
229 | 352 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
230 | 353 |
self.assertEqual(db_vm.operstate, "STOPPED") |
... | ... | |
241 | 364 |
"maxmem": 2048}, |
242 | 365 |
status="success") |
243 | 366 |
client.reset_mock() |
244 |
update_db(client, msg) |
|
367 |
with mocked_quotaholder(): |
|
368 |
update_db(client, msg) |
|
245 | 369 |
self.assertTrue(client.basic_ack.called) |
246 | 370 |
db_vm = VirtualMachine.objects.get(id=vm.id) |
247 | 371 |
self.assertEqual(db_vm.operstate, "STOPPED") |
... | ... | |
252 | 376 |
"maxmem": 2048}, |
253 | 377 |
status="success") |
254 | 378 |
client.reset_mock() |
255 |
update_db(client, msg) |
|
379 |
with mocked_quotaholder(): |
|
380 |
update_db(client, msg) |
|
256 | 381 |
self.assertTrue(client.basic_reject.called) |
257 | 382 |
|
258 | 383 |
|
Also available in: Unified diff