[Storwize]:Fix delete_group_snapshot cleanup issue

delete_group_snapshot doesn't handle flash copy consistency
group cleanup properly.
In case of multiple snapshots in the group,existing code exits
if any one snapshot deletion fails, but it should update error
state and continue with deleting other snapshots.

closes bug: #1890241

Change-Id: I87c9f35f34c94bff3ada7d428cd963fc8703a2ad
This commit is contained in:
katarimanojkumar 2020-08-04 06:49:14 +00:00
parent 422184c9f2
commit 933a833b8d
3 changed files with 100 additions and 12 deletions

View File

@ -6295,6 +6295,76 @@ class StorwizeSVCCommonDriverTestCase(test.TestCase):
for volume in model_update[1]:
self.assertEqual(fields.SnapshotStatus.DELETED, volume['status'])
@mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall',
new=testutils.ZeroIntervalLoopingCall)
@mock.patch.object(storwize_svc_common.StorwizeHelpers,
'delete_vdisk')
@mock.patch.object(storwize_svc_common.StorwizeHelpers,
'delete_fc_consistgrp')
@mock.patch('cinder.volume.volume_utils.is_group_a_cg_snapshot_type')
def test_storwize_delete_consistgroup_snapshot(self,
is_grp_a_cg_snapshot_type,
delete_fc_consistgrp,
delete_vdisk):
is_grp_a_cg_snapshot_type.side_effect = [True, True, True, False, True]
type_ref = volume_types.create(self.ctxt, 'testtype', None)
group = testutils.create_group(self.ctxt,
group_type_id=fake.GROUP_TYPE_ID,
volume_type_ids=[type_ref['id']])
self._create_volume(volume_type_id=type_ref['id'], group_id=group.id)
self._create_volume(volume_type_id=type_ref['id'], group_id=group.id)
group_snapshot, snapshots = self._create_group_snapshot(group.id)
cgsnapshot_id = group_snapshot.id
cg_name = 'cg_snap-' + cgsnapshot_id
self.driver._helpers.delete_consistgrp_snapshots(cg_name, snapshots)
delete_fc_consistgrp.assert_has_calls([mock.call(cg_name)])
self.assertEqual(2, delete_fc_consistgrp.call_count)
calls = [mock.call(snapshots[0]['name'], force_delete=True,
force_unmap=False),
mock.call(snapshots[1]['name'], force_delete=True,
force_unmap=False)]
delete_vdisk.assert_has_calls(calls, any_order=True)
@mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall',
new=testutils.ZeroIntervalLoopingCall)
@mock.patch.object(storwize_svc_common.StorwizeHelpers,
'delete_vdisk')
@mock.patch.object(storwize_svc_common.StorwizeHelpers,
'delete_fc_consistgrp')
@mock.patch('cinder.volume.volume_utils.is_group_a_cg_snapshot_type')
def test_storwize_delete_consistgroup_snapshot_1(self,
is_grp_a_cg_snapshot_type,
delete_fc_consistgrp,
delete_vdisk):
is_grp_a_cg_snapshot_type.side_effect = [True, True, True, False, True]
type_ref = volume_types.create(self.ctxt, 'testtype', None)
group = testutils.create_group(self.ctxt,
group_type_id=fake.GROUP_TYPE_ID,
volume_type_ids=[type_ref['id']])
self._create_volume(volume_type_id=type_ref['id'], group_id=group.id)
self._create_volume(volume_type_id=type_ref['id'], group_id=group.id)
group_snapshot, snapshots = self._create_group_snapshot(group.id)
cgsnapshot_id = group_snapshot.id
cg_name = 'cg_snap-' + cgsnapshot_id
delete_vdisk.side_effect = exception.VolumeBackendAPIException(data='')
(model_update,
snap_model_update) = self.driver._helpers.delete_consistgrp_snapshots(
cg_name, snapshots)
self.assertEqual(fields.GroupSnapshotStatus.ERROR_DELETING,
model_update['status'])
for snapshot in snap_model_update:
self.assertEqual(fields.SnapshotStatus.ERROR_DELETING,
snapshot['status'])
@mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall',
new=testutils.ZeroIntervalLoopingCall)
def test_storwize_create_group_from_src_invalid(self):

View File

@ -53,6 +53,7 @@ from cinder.volume import volume_utils
INTERVAL_1_SEC = 1
DEFAULT_TIMEOUT = 15
CMMVC5753E = "CMMVC5753E"
LOG = logging.getLogger(__name__)
storwize_svc_opts = [
@ -1851,21 +1852,30 @@ class StorwizeHelpers(object):
snapshots_model_update = []
try:
for snapshot in snapshots:
self.delete_fc_consistgrp(fc_consistgrp)
except exception.VolumeBackendAPIException as err:
if CMMVC5753E in err.msg:
LOG.warning('Failed to delete as flash copy consistency '
'group %s does not exist,ignoring err: %s',
fc_consistgrp, err)
for snapshot in snapshots:
try:
self.delete_vdisk(snapshot['name'],
force_unmap=False,
force_delete=True)
except exception.VolumeBackendAPIException as err:
model_update['status'] = (
fields.GroupSnapshotStatus.ERROR_DELETING)
LOG.error("Failed to delete the snapshot %(snap)s of "
"CGSnapshot. Exception: %(exception)s.",
{'snap': snapshot['name'], 'exception': err})
for snapshot in snapshots:
snapshots_model_update.append(
{'id': snapshot['id'],
'status': model_update['status']})
snapshots_model_update.append(
{'id': snapshot['id'],
'status': fields.GroupSnapshotStatus.DELETED})
except exception.VolumeBackendAPIException as err:
model_update['status'] = (
fields.GroupSnapshotStatus.ERROR_DELETING)
snapshots_model_update.append(
{'id': snapshot['id'],
'status': fields.GroupSnapshotStatus.ERROR_DELETING})
LOG.error("Failed to delete the snapshot %(snap)s of "
"CGSnapshot. Exception: %(exception)s.",
{'snap': snapshot['name'], 'exception': err})
return model_update, snapshots_model_update

View File

@ -0,0 +1,8 @@
---
fixes:
- |
`Bug #1890241 <https://bugs.launchpad.net/cinder/+bug/1890241>`_:
During delete_group_snapshot on IBM storwize, in case of multiple
snapshots in the group, delete flow exits if any one snapshot deletion
fails, but it should update error state and continue with deleting
other snapshots.