Merge "Account for error status during volume delete"

This commit is contained in:
Jenkins 2015-09-18 13:15:26 +00:00 committed by Gerrit Code Review
commit 84781fb3af
2 changed files with 40 additions and 5 deletions

View File

@ -113,6 +113,12 @@ class BaseVolume(resource.Resource):
result=_('Volume backup failed'))
def _delete_volume(self):
"""Call the volume delete API
Returns False if further checking of volume status is required,
True otherwise.
"""
try:
cinder = self.client()
vol = cinder.volumes.get(self.resource_id)
@ -122,13 +128,10 @@ class BaseVolume(resource.Resource):
# just wait for the deletion to complete
if vol.status != 'deleting':
cinder.volumes.delete(self.resource_id)
else:
return True
return False
except Exception as ex:
self.client_plugin().ignore_not_found(ex)
return True
else:
return False
def check_delete_complete(self, prg):
if not prg.backup['called']:
@ -147,11 +150,14 @@ class BaseVolume(resource.Resource):
if not prg.delete['complete']:
try:
self.client().volumes.get(self.resource_id)
vol = self.client().volumes.get(self.resource_id)
except Exception as ex:
self.client_plugin().ignore_not_found(ex)
prg.delete['complete'] = True
return True
if 'error' in vol.status.lower():
raise exception.ResourceInError(status_reason='delete',
resource_status=vol.status)
else:
return False
return True

View File

@ -449,6 +449,10 @@ class VolumeTest(vt_base.BaseVolumeTest):
self.cinder_fc.volumes.get(fv.id).AndReturn(
vt_base.FakeVolume('deleting'))
self.cinder_fc.volumes.get(fv.id).AndReturn(
vt_base.FakeVolume('deleting'))
self.cinder_fc.volumes.get(fv.id).AndRaise(
cinder_exp.NotFound('NotFound'))
self.m.ReplayAll()
@ -458,6 +462,31 @@ class VolumeTest(vt_base.BaseVolumeTest):
self.m.VerifyAll()
def test_volume_delete_error(self):
fv = vt_base.FakeVolume('creating')
stack_name = 'test_volume_deleting_stack'
fv = self._mock_create_volume(vt_base.FakeVolume('creating'),
stack_name)
self.cinder_fc.volumes.get(fv.id).AndReturn(fv)
self.cinder_fc.volumes.delete(fv.id).AndReturn(True)
self.cinder_fc.volumes.get(fv.id).AndReturn(
vt_base.FakeVolume('deleting'))
self.cinder_fc.volumes.get(fv.id).AndReturn(
vt_base.FakeVolume('error_deleting'))
self.m.ReplayAll()
stack = utils.parse_stack(self.t, stack_name=stack_name)
rsrc = self.create_volume(self.t, stack, 'DataVolume')
deleter = scheduler.TaskRunner(rsrc.destroy)
self.assertRaisesRegexp(exception.ResourceFailure,
".*ResourceInError.*error_deleting.*delete",
deleter)
self.m.VerifyAll()
def test_volume_update_not_supported(self):
stack_name = 'test_volume_updnotsup_stack'
fv = vt_base.FakeVolume('creating')