Merge "Add more tests for share/snapshot deferred deletion"

This commit is contained in:
Zuul 2024-03-13 19:56:47 +00:00 committed by Gerrit Code Review
commit adf48763db
4 changed files with 146 additions and 5 deletions

View File

@ -98,7 +98,7 @@ deprecated_list_snapshots_in_deferred_deletion_states = policy.DeprecatedRule(
name=BASE_POLICY_NAME % 'list_snapshots_in_deferred_deletion_states',
check_str=base.RULE_ADMIN_API,
deprecated_reason=DEPRECATED_REASON,
deprecated_since='2023.2/Bobcat'
deprecated_since='2024.1/Caracal'
)
share_snapshot_policies = [

View File

@ -224,7 +224,7 @@ deprecated_list_shares_in_deferred_deletion_states = policy.DeprecatedRule(
name=BASE_POLICY_NAME % 'list_shares_in_deferred_deletion_states',
check_str=base.RULE_ADMIN_API,
deprecated_reason=DEPRECATED_REASON,
deprecated_since='2023.2/Bobcat'
deprecated_since='2024.1/Caracal'
)
shares_policies = [

View File

@ -2341,6 +2341,41 @@ class ShareAPITestCase(test.TestCase):
db_api.share_get.assert_called_once_with(
self.context, snapshot['share_id'])
@ddt.data(True, False)
def test_delete_snapshot_deferred(self, force):
CONF.set_default("is_deferred_deletion_enabled", True)
snapshot = db_utils.create_snapshot(
with_share=True, status=constants.STATUS_AVAILABLE)
share = snapshot['share']
self.mock_object(db_api, 'share_snapshot_instance_update',
mock.Mock())
with mock.patch.object(db_api, 'share_get',
mock.Mock(return_value=share)):
self.api.delete_snapshot(self.context, snapshot, force=force)
if force:
self.share_rpcapi.delete_snapshot.assert_called_once_with(
self.context, snapshot, share['host'], force=True,
deferred_delete=False)
db_api.share_snapshot_instance_update.assert_called_once_with(
self.context,
snapshot['instance']['id'],
{'status': constants.STATUS_DELETING})
else:
self.share_rpcapi.delete_snapshot.assert_called_once_with(
self.context, snapshot, share['host'], force=False,
deferred_delete=True)
db_api.share_snapshot_instance_update.assert_called_once_with(
self.context,
snapshot['instance']['id'],
{'status': constants.STATUS_DEFERRED_DELETING})
share_api.policy.check_policy.assert_called_once_with(
self.context, 'share', 'delete_snapshot', snapshot)
db_api.share_get.assert_called_once_with(
self.context, snapshot['share_id'])
def test_delete_snapshot_wrong_status(self):
snapshot = db_utils.create_snapshot(
with_share=True, status=constants.STATUS_CREATING)
@ -2797,6 +2832,51 @@ class ShareAPITestCase(test.TestCase):
{'updated_at': self.dt_utc}
)
@ddt.data({'status': constants.STATUS_DEFERRED_DELETING, 'force': True},
{'status': constants.STATUS_AVAILABLE, 'force': False},
{'status': constants.STATUS_AVAILABLE, 'force': True})
@ddt.unpack
def test_delete_share_instance_deferred(self, status, force):
CONF.set_default("is_deferred_deletion_enabled", True)
instance = self._setup_delete_share_instance_mocks(
status=status, share_server_id='fake')
self.api.delete_instance(self.context, instance, force=force)
if force:
if status != constants.STATUS_DEFERRED_DELETING:
db_api.share_instance_update.assert_called_once_with(
self.context,
instance['id'],
{'status': constants.STATUS_DELETING,
'terminated_at': self.dt_utc}
)
self.api.share_rpcapi.delete_share_instance.\
assert_called_once_with(
self.context,
instance,
force=True,
deferred_delete=False
)
else:
db_api.share_instance_update.assert_called_once_with(
self.context,
instance['id'],
{'status': constants.STATUS_DEFERRED_DELETING,
'terminated_at': self.dt_utc}
)
self.api.share_rpcapi.delete_share_instance.\
assert_called_once_with(
self.context,
instance,
force=False,
deferred_delete=True
)
db_api.share_server_update(
self.context,
instance['share_server_id'],
{'updated_at': self.dt_utc}
)
def test_delete_share_instance_invalid_status(self):
instance = self._setup_delete_share_instance_mocks(
status=constants.STATUS_CREATING, share_server_id='fake')

View File

@ -2371,15 +2371,45 @@ class ShareManagerTestCase(test.TestCase):
self.mock_object(self.share_manager, '_get_share_server',
mock.Mock(return_value=None))
mock_delete_share = self.mock_object(
mock_delete_snapshot = self.mock_object(
self.share_manager.driver, 'delete_snapshot')
self.mock_object(self.share_manager.db,
'share_snapshot_instance_update')
self.share_manager.do_deferred_snapshot_deletion(self.context)
if consider_error_deleting:
self.assertEqual(2, mock_delete_share.call_count)
self.assertEqual(2, mock_delete_snapshot.call_count)
else:
self.assertEqual(1, mock_delete_share.call_count)
self.assertEqual(1, mock_delete_snapshot.call_count)
def test_do_deferred_snapshot_deletion_exception(self):
instance_1 = db_utils.create_share_instance(
share_id='fake_id',
share_type_id='fake_type_id')
share = db_utils.create_share(
id='fake_id',
instances=[instance_1])
snapshot = db_utils.create_snapshot(share_id=share['id'])
si = db_utils.create_snapshot_instance(
snapshot_id=snapshot['id'],
share_instance_id=instance_1['id'],
status='deferred_deleting')
self.mock_object(self.share_manager, '_get_share_server',
mock.Mock(return_value=None))
self.mock_object(
self.share_manager.driver, 'delete_snapshot',
mock.Mock(side_effect=exception.ManilaException))
self.mock_object(self.share_manager.db,
'share_snapshot_instance_update')
mock_delete_snapshot_db = self.mock_object(
self.share_manager.db,
'share_snapshot_instance_delete')
self.share_manager.do_deferred_snapshot_deletion(self.context)
self.share_manager.db.share_snapshot_instance_update.assert_any_call(
mock.ANY, si['id'],
{'status': constants.STATUS_ERROR_DEFERRED_DELETING})
mock_delete_snapshot_db.assert_not_called()
def test_create_share_instance_with_share_network_dhss_false(self):
manager.CONF.set_default('driver_handles_share_servers', False)
@ -4074,6 +4104,37 @@ class ShareManagerTestCase(test.TestCase):
else:
self.assertEqual(2, mock_delete_share.call_count)
def test_do_deferred_share_deletion_exception(self):
share = db_utils.create_share_without_instance(
id='fake_id',
status=constants.STATUS_AVAILABLE)
share_server = fakes.fake_share_server_get()
kwargs = {
'id': 1,
'share_id': share['id'],
'share_server_id': share_server['id'],
'status': 'deferred_deleting',
'updated_at': timeutils.utcnow()
}
si = db_utils.create_share_instance(**kwargs)
self.mock_object(self.share_manager.db, 'share_server_get',
mock.Mock(return_value=share_server))
self.mock_object(self.share_manager.db, 'share_get',
mock.Mock(return_value=share))
self.mock_object(self.share_manager.db, 'share_instance_update')
mock_delete = self.mock_object(self.share_manager.db,
'share_instance_delete')
self.mock_object(
self.share_manager.driver, 'delete_share',
mock.Mock(side_effect=exception.ManilaException))
self.share_manager.do_deferred_share_deletion(self.context)
self.share_manager.db.share_instance_update.assert_any_call(
mock.ANY, si['id'],
{'status': constants.STATUS_ERROR_DEFERRED_DELETING})
mock_delete.assert_not_called()
def test_setup_server(self):
# Setup required test data
metadata = {'fake_metadata_key': 'fake_metadata_value'}