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:
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user