Revision 9dcfad23
b/snf-cyclades-app/synnefo/api/tests/servers.py | ||
---|---|---|
519 | 519 |
with mocked_quotaholder(): |
520 | 520 |
response = self.mypost('servers', 'test_user', |
521 | 521 |
json.dumps(request), 'json') |
522 |
self.assertEqual(response.status_code, 500)
|
|
522 |
self.assertEqual(response.status_code, 202)
|
|
523 | 523 |
mrapi().CreateInstance.assert_called_once() |
524 | 524 |
vm = VirtualMachine.objects.get() |
525 |
# The VM has been deleted |
|
526 |
self.assertTrue(vm.deleted) |
|
527 |
# and it has no nics |
|
528 |
self.assertEqual(len(vm.nics.all()), 0) |
|
529 |
self.assertEqual(vm.backendjobid, 0) |
|
525 |
# The VM has not been deleted |
|
526 |
self.assertFalse(vm.deleted) |
|
527 |
# but is in "ERROR" operstate |
|
528 |
self.assertEqual(vm.operstate, "ERROR") |
|
530 | 529 |
|
531 | 530 |
|
532 | 531 |
@patch('synnefo.logic.rapi_pool.GanetiRapiClient') |
b/snf-cyclades-app/synnefo/db/models.py | ||
---|---|---|
692 | 692 |
STATES = ( |
693 | 693 |
("ACTIVE", "Active"), |
694 | 694 |
("BUILDING", "Building"), |
695 |
("ERROR", "Error"), |
|
695 | 696 |
) |
696 | 697 |
|
697 | 698 |
machine = models.ForeignKey(VirtualMachine, related_name='nics') |
b/snf-cyclades-app/synnefo/logic/servers.py | ||
---|---|---|
1 | 1 |
import logging |
2 |
import datetime |
|
3 | 2 |
|
4 | 3 |
from socket import getfqdn |
5 | 4 |
from functools import wraps |
... | ... | |
171 | 170 |
# Create the server in Ganeti. |
172 | 171 |
create_server(vm, nics, flavor, image, personality, password) |
173 | 172 |
except: |
174 |
# If an exception is raised, then the user will never get the VM id. |
|
175 |
# In order to delete it from DB and release it's resources, we |
|
176 |
# mock a successful OP_INSTANCE_REMOVE job. |
|
177 |
backend.process_op_status(vm=vm, etime=datetime.datetime.now(), |
|
178 |
jobid=-0, |
|
179 |
opcode="OP_INSTANCE_REMOVE", |
|
180 |
status="success", |
|
181 |
logmsg="Reconciled eventd: VM creation" |
|
182 |
" failed.") |
|
183 |
raise |
|
173 |
log.exception("Failed create instance '%s'", vm) |
|
174 |
vm.operstate = "ERROR" |
|
175 |
vm.backendlogmsg = "Failed to send job to Ganeti." |
|
176 |
vm.save() |
|
177 |
vm.nics.all().update(state="ERROR") |
|
184 | 178 |
|
185 | 179 |
return vm |
186 | 180 |
|
b/snf-cyclades-app/synnefo/logic/tests/servers.py | ||
---|---|---|
72 | 72 |
# error in enqueue. check the vm is deleted and resources released |
73 | 73 |
mrapi().CreateInstance.side_effect = Exception("ganeti is down") |
74 | 74 |
with mocked_quotaholder(): |
75 |
self.assertRaises(Exception, servers.create, **kwargs)
|
|
75 |
servers.create(**kwargs)
|
|
76 | 76 |
vm = models.VirtualMachine.objects.get() |
77 |
self.assertTrue(vm.deleted) |
|
78 |
self.assertEqual(len(vm.nics.all()), 0) |
|
79 |
vm.delete() |
|
77 |
self.assertFalse(vm.deleted) |
|
78 |
self.assertEqual(vm.operstate, "ERROR") |
|
79 |
self.assertEqual(len(vm.nics.all()), 1) |
|
80 |
for nic in vm.nics.all(): |
|
81 |
self.assertEqual(nic.state, "ERROR") |
|
80 | 82 |
|
81 | 83 |
# success with no nics |
82 | 84 |
mrapi().CreateInstance.side_effect = None |
... | ... | |
85 | 87 |
DEFAULT_INSTANCE_NETWORKS=[]): |
86 | 88 |
with mocked_quotaholder(): |
87 | 89 |
vm = servers.create(**kwargs) |
88 |
self.assertEqual(models.VirtualMachine.objects.count(), 1) |
|
89 | 90 |
vm = models.VirtualMachine.objects.get(id=vm.id) |
90 | 91 |
self.assertEqual(vm.nics.count(), 0) |
91 | 92 |
self.assertEqual(vm.backendjobid, 42) |
Also available in: Unified diff