Clean up xenapi VM records on failed disk attaches

Breaks the create_vm_step up so that we can clean up the VM record in
case of disk attach failures.

Fixes bug 1073219

Change-Id: I54e28e2cce6fe4f29a03566eff998479410f7555
This commit is contained in:
Chris Behrens
2012-10-30 18:33:18 +00:00
parent 10db27b9fd
commit b1c1902bb7
2 changed files with 45 additions and 8 deletions

View File

@@ -516,6 +516,13 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
session = xenapi_conn.XenAPISession(url, username, password) session = xenapi_conn.XenAPISession(url, username, password)
return session.call_xenapi('VDI.get_all') return session.call_xenapi('VDI.get_all')
def _list_vms(self):
url = FLAGS.xenapi_connection_url
username = FLAGS.xenapi_connection_username
password = FLAGS.xenapi_connection_password
session = xenapi_conn.XenAPISession(url, username, password)
return session.call_xenapi('VM.get_all')
def _check_vdis(self, start_list, end_list): def _check_vdis(self, start_list, end_list):
for vdi_ref in end_list: for vdi_ref in end_list:
if not vdi_ref in start_list: if not vdi_ref in start_list:
@@ -588,30 +595,53 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
def test_spawn_fail_cleanup_1(self): def test_spawn_fail_cleanup_1(self):
"""Simulates an error while downloading an image. """Simulates an error while downloading an image.
Verifies that VDIs created are properly cleaned up. Verifies that the VM and VDIs created are properly cleaned up.
""" """
vdi_recs_start = self._list_vdis() vdi_recs_start = self._list_vdis()
start_vms = self._list_vms()
stubs.stubout_fetch_disk_image(self.stubs, raise_failure=True) stubs.stubout_fetch_disk_image(self.stubs, raise_failure=True)
self.assertRaises(xenapi_fake.Failure, self.assertRaises(xenapi_fake.Failure,
self._test_spawn, 1, 2, 3) self._test_spawn, 1, 2, 3)
# No additional VDI should be found. # No additional VDI should be found.
vdi_recs_end = self._list_vdis() vdi_recs_end = self._list_vdis()
end_vms = self._list_vms()
self._check_vdis(vdi_recs_start, vdi_recs_end) self._check_vdis(vdi_recs_start, vdi_recs_end)
# No additional VMs should be found.
self.assertEqual(start_vms, end_vms)
def test_spawn_fail_cleanup_2(self): def test_spawn_fail_cleanup_2(self):
"""Simulates an error while creating VM record. """Simulates an error while creating VM record.
It verifies that VDIs created are properly cleaned up. Verifies that the VM and VDIs created are properly cleaned up.
""" """
vdi_recs_start = self._list_vdis() vdi_recs_start = self._list_vdis()
start_vms = self._list_vms()
stubs.stubout_create_vm(self.stubs) stubs.stubout_create_vm(self.stubs)
self.assertRaises(xenapi_fake.Failure, self.assertRaises(xenapi_fake.Failure,
self._test_spawn, 1, 2, 3) self._test_spawn, 1, 2, 3)
# No additional VDI should be found. # No additional VDI should be found.
vdi_recs_end = self._list_vdis() vdi_recs_end = self._list_vdis()
end_vms = self._list_vms()
self._check_vdis(vdi_recs_start, vdi_recs_end) self._check_vdis(vdi_recs_start, vdi_recs_end)
# No additional VMs should be found.
self.assertEqual(start_vms, end_vms)
def test_spawn_fail_cleanup_3(self):
"""Simulates an error while attaching disks.
Verifies that the VM and VDIs created are properly cleaned up.
"""
stubs.stubout_attach_disks(self.stubs)
vdi_recs_start = self._list_vdis()
start_vms = self._list_vms()
self.assertRaises(xenapi_fake.Failure,
self._test_spawn, 1, 2, 3)
# No additional VDI should be found.
vdi_recs_end = self._list_vdis()
end_vms = self._list_vms()
self._check_vdis(vdi_recs_start, vdi_recs_end)
# No additional VMs should be found.
self.assertEqual(start_vms, end_vms)
@stub_vm_utils_with_vdi_attached_here @stub_vm_utils_with_vdi_attached_here
def test_spawn_raw_glance(self): def test_spawn_raw_glance(self):
@@ -1362,7 +1392,7 @@ class XenAPIAutoDiskConfigTestCase(stubs.XenAPITestBase):
vdis = {'root': {'uuid': vdi_uuid, 'ref': vdi_ref}} vdis = {'root': {'uuid': vdi_uuid, 'ref': vdi_ref}}
self.conn._vmops._attach_disks(instance, vm_ref, instance['name'], self.conn._vmops._attach_disks(instance, vm_ref, instance['name'],
disk_image_type, vdis) vdis, disk_image_type)
self.assertEqual(marker["partition_called"], called) self.assertEqual(marker["partition_called"], called)
@@ -1448,7 +1478,7 @@ class XenAPIGenerateLocal(stubs.XenAPITestBase):
self.called = False self.called = False
self.conn._vmops._attach_disks(instance, vm_ref, instance['name'], self.conn._vmops._attach_disks(instance, vm_ref, instance['name'],
disk_image_type, vdis) vdis, disk_image_type)
self.assertTrue(self.called) self.assertTrue(self.called)
def test_generate_swap(self): def test_generate_swap(self):

View File

@@ -138,11 +138,18 @@ def stubout_create_vm(stubs):
"""Simulates a failure in create_vm.""" """Simulates a failure in create_vm."""
def f(*args): def f(*args):
raise fake.Failure("Test Exception raised by " + raise fake.Failure("Test Exception raised by fake create_vm")
"fake create_vm")
stubs.Set(vm_utils, 'create_vm', f) stubs.Set(vm_utils, 'create_vm', f)
def stubout_attach_disks(stubs):
"""Simulates a failure in _attach_disks."""
def f(*args):
raise fake.Failure("Test Exception raised by fake _attach_disks")
stubs.Set(vmops.VMOps, '_attach_disks', f)
def _make_fake_vdi(): def _make_fake_vdi():
sr_ref = fake.get_all('SR')[0] sr_ref = fake.get_all('SR')[0]
vdi_ref = fake.create_vdi('', sr_ref) vdi_ref = fake.create_vdi('', sr_ref)