Hitachi: Fix exception when deleted volume is busy

This patch is to fix an exception name when deleted volume is busy
in delete_volume().
Although exception ``VolumeIsBusy`` should be issued in that case,
``VolumeDriverException`` is issued. It should be fixed.

Closes-Bug: #2024418
Change-Id: I5405790c7cd4ca513ceea70380be723a54c3fe3c
This commit is contained in:
Atsushi Kawai 2023-06-20 19:24:01 +09:00 committed by Brian Rosmaita
parent e5b7b41ae9
commit a0d075219a
4 changed files with 104 additions and 18 deletions

View File

@ -141,19 +141,20 @@ def _volume_get(context, volume_id):
TEST_SNAPSHOT = []
snapshot = {}
snapshot['id'] = '10000000-0000-0000-0000-{0:012d}'.format(0)
snapshot['name'] = 'TEST_SNAPSHOT{0:d}'.format(0)
snapshot['provider_location'] = '{0:d}'.format(1)
snapshot['status'] = 'available'
snapshot['volume_id'] = '00000000-0000-0000-0000-{0:012d}'.format(0)
snapshot['volume'] = _volume_get(None, snapshot['volume_id'])
snapshot['volume_name'] = 'test-volume{0:d}'.format(0)
snapshot['volume_size'] = 128
snapshot = obj_snap.Snapshot._from_db_object(
CTXT, obj_snap.Snapshot(),
fake_snapshot.fake_db_snapshot(**snapshot))
TEST_SNAPSHOT.append(snapshot)
for i in range(2):
snapshot = {}
snapshot['id'] = '10000000-0000-0000-0000-{0:012d}'.format(i)
snapshot['name'] = 'TEST_SNAPSHOT{0:d}'.format(i)
snapshot['provider_location'] = '{0:d}'.format(i + 1)
snapshot['status'] = 'available'
snapshot['volume_id'] = '00000000-0000-0000-0000-{0:012d}'.format(i)
snapshot['volume'] = _volume_get(None, snapshot['volume_id'])
snapshot['volume_name'] = 'test-volume{0:d}'.format(i)
snapshot['volume_size'] = 128
snapshot = obj_snap.Snapshot._from_db_object(
CTXT, obj_snap.Snapshot(),
fake_snapshot.fake_db_snapshot(**snapshot))
TEST_SNAPSHOT.append(snapshot)
TEST_GROUP = []
for i in range(2):
@ -373,6 +374,18 @@ GET_SNAPSHOTS_RESULT_BUSY = {
],
}
GET_SNAPSHOTS_RESULT_TEST = {
"data": [
{
"primaryOrSecondary": "S-VOL",
"status": "PSUS",
"pvolLdevId": 1,
"muNumber": 1,
"svolLdevId": 1,
},
],
}
GET_LUNS_RESULT = {
"data": [
{
@ -999,6 +1012,23 @@ class HBSDMIRRORFCDriverTest(test.TestCase):
self.driver.delete_snapshot(TEST_SNAPSHOT[0])
self.assertEqual(14, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_delete_snapshot_pldev_in_loc(self, request):
self.assertRaises(exception.VolumeDriverException,
self.driver.delete_snapshot,
TEST_SNAPSHOT[1])
self.assertEqual(1, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_delete_snapshot_snapshot_is_busy(self, request):
request.side_effect = [FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, NOTFOUND_RESULT),
FakeResponse(200, GET_SNAPSHOTS_RESULT_TEST)]
self.assertRaises(exception.SnapshotIsBusy,
self.driver.delete_snapshot,
TEST_SNAPSHOT[0])
self.assertEqual(3, request.call_count)
@mock.patch.object(requests.Session, "request")
@mock.patch.object(volume_types, 'get_volume_type')
@mock.patch.object(volume_types, 'get_volume_type_extra_specs')
@ -1232,6 +1262,14 @@ class HBSDMIRRORFCDriverTest(test.TestCase):
self.driver.unmanage(TEST_VOLUME[0])
self.assertEqual(3, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_unmanage_has_rep_pair_true(self, request):
request.return_value = FakeResponse(200, GET_LDEV_RESULT_REP)
self.assertRaises(exception.VolumeDriverException,
self.driver.unmanage,
TEST_VOLUME[4])
self.assertEqual(1, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_copy_image_to_volume(self, request):
image_service = 'fake_image_service'

View File

@ -243,6 +243,14 @@ GET_LDEV_RESULT_PAIR = {
"status": "NML",
}
GET_LDEV_RESULT_PAIR_TEST = {
"emulationType": "OPEN-V-CVS",
"blockCapacity": 2097152,
"attributes": ["CVS", "HDP", "HTI", "111"],
"status": "NML",
"snapshotPoolId": 0
}
GET_LDEV_RESULT_PAIR_STATUS_TEST = {
"emulationType": "OPEN-V-CVS",
"blockCapacity": 2097152,
@ -834,7 +842,7 @@ class HBSDRESTFCDriverTest(test.TestCase):
self.assertEqual(4, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_delete_volume_temporary_busy(self, request):
def test_delete_volume_wait_copy_pair_deleting(self, request):
request.side_effect = [FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, GET_SNAPSHOTS_RESULT_BUSY),
FakeResponse(200, GET_LDEV_RESULT),
@ -849,7 +857,7 @@ class HBSDRESTFCDriverTest(test.TestCase):
@mock.patch('oslo_service.loopingcall.FixedIntervalLoopingCall',
new=test_utils.ZeroIntervalLoopingCall)
@mock.patch.object(requests.Session, "request")
def test_delete_volume_busy_timeout(self, request):
def test_delete_volume_request_failed(self, request):
request.side_effect = [FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, GET_SNAPSHOTS_RESULT_BUSY),
FakeResponse(200, GET_LDEV_RESULT_PAIR),
@ -860,6 +868,15 @@ class HBSDRESTFCDriverTest(test.TestCase):
TEST_VOLUME[0])
self.assertGreater(request.call_count, 2)
@mock.patch.object(requests.Session, "request")
def test_delete_volume_volume_is_busy(self, request):
request.side_effect = [FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, GET_SNAPSHOTS_RESULT_PAIR)]
self.assertRaises(exception.VolumeIsBusy,
self.driver.delete_volume,
TEST_VOLUME[0])
self.assertEqual(2, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_extend_volume(self, request):
request.side_effect = [FakeResponse(200, GET_LDEV_RESULT),
@ -1243,6 +1260,31 @@ class HBSDRESTFCDriverTest(test.TestCase):
self.driver.unmanage(TEST_VOLUME[0])
self.assertEqual(2, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_unmanage_volume_is_busy(self, request):
request.side_effect = [
FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, NOTFOUND_RESULT),
FakeResponse(200, GET_SNAPSHOTS_RESULT_PAIR),
]
self.assertRaises(exception.VolumeIsBusy,
self.driver.unmanage,
TEST_VOLUME[1])
self.assertEqual(4, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_unmanage_volume_is_busy_raise_ex(self, request):
request.side_effect = [
FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(200, GET_LDEV_RESULT_PAIR),
FakeResponse(400, GET_SNAPSHOTS_RESULT_BUSY)
]
self.assertRaises(exception.VolumeDriverException,
self.driver.unmanage,
TEST_VOLUME[0])
self.assertEqual(3, request.call_count)
@mock.patch.object(requests.Session, "request")
def test_copy_image_to_volume(self, request):
image_service = 'fake_image_service'

View File

@ -400,7 +400,7 @@ class HBSDCommon():
try:
self.delete_ldev(ldev)
except exception.VolumeDriverException as ex:
if ex.msg == utils.BUSY_MESSAGE:
if utils.BUSY_MESSAGE in ex.msg:
raise exception.VolumeIsBusy(volume_name=volume['name'])
else:
raise ex
@ -437,7 +437,7 @@ class HBSDCommon():
try:
self.delete_ldev(ldev)
except exception.VolumeDriverException as ex:
if ex.msg == utils.BUSY_MESSAGE:
if utils.BUSY_MESSAGE in ex.msg:
raise exception.SnapshotIsBusy(snapshot_name=snapshot['name'])
else:
raise ex
@ -592,7 +592,7 @@ class HBSDCommon():
try:
self.delete_pair(ldev)
except exception.VolumeDriverException as ex:
if ex.msg == utils.BUSY_MESSAGE:
if utils.BUSY_MESSAGE in ex.msg:
raise exception.VolumeIsBusy(volume_name=volume['name'])
else:
raise ex

View File

@ -0,0 +1,6 @@
fixes:
- |
Hitachi driver `bug #2024418
<https://bugs.launchpad.net/cinder/+bug/2024418>`_: Fixed to raise
correct exception when volume is busy while performing delete volume
operation.