Fix stop on cleanup error

Add an error treatment to the clear_resources function and fix the
returned object status when checking if the resource is deleted

Change-Id: Idd896a39f7be7a4dcde9fac3cdb0bd26cc814af3
Closes-Bug: #2006792
This commit is contained in:
Felipe Rodrigues
2023-02-09 21:45:49 -03:00
committed by Kiran Pawar
parent 65ca50c796
commit 9cdeda15a0
4 changed files with 105 additions and 80 deletions

View File

@@ -304,37 +304,41 @@ class SharesClient(rest_client.RestClient):
return True return True
else: else:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share, kwargs.get("share_id")) self.get_share, kwargs.get("share_id"), "share")
elif "snapshot_id" in kwargs: elif "snapshot_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_snapshot, kwargs.get("snapshot_id")) self.get_snapshot, kwargs.get("snapshot_id"), "snapshot")
elif "sn_id" in kwargs: elif "sn_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_network, kwargs.get("sn_id")) self.get_share_network, kwargs.get("sn_id"), "share_network")
elif "ss_id" in kwargs: elif "ss_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_security_service, kwargs.get("ss_id")) self.get_security_service, kwargs.get("ss_id"),
"security_service")
elif "vt_id" in kwargs: elif "vt_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_volume_type, kwargs.get("vt_id")) self.get_volume_type, kwargs.get("vt_id"), "volume_type")
elif "st_id" in kwargs: elif "st_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_type, kwargs.get("st_id")) self.get_share_type, kwargs.get("st_id"), "share_type")
elif "server_id" in kwargs: elif "server_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.show_share_server, kwargs.get("server_id")) self.show_share_server, kwargs.get("server_id"),
"share_server")
elif "backup_id" in kwargs: elif "backup_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_backup, kwargs.get("backup_id")) self.get_share_backup, kwargs.get("backup_id"),
"share_backup")
else: else:
raise share_exceptions.InvalidResource( raise share_exceptions.InvalidResource(
message=str(kwargs)) message=str(kwargs))
def _is_resource_deleted(self, func, res_id, **kwargs): def _is_resource_deleted(self, func, res_id, resource_name, **kwargs):
try: try:
res = func(res_id, **kwargs) res = func(res_id, **kwargs)[resource_name]
except exceptions.NotFound: except exceptions.NotFound:
return True return True
if res.get('status') in ['error_deleting', 'error']: if res.get('status') in ['error_deleting', 'error']:
# Resource has "error_deleting" status and can not be deleted. # Resource has "error_deleting" status and can not be deleted.
resource_type = func.__name__.split('_', 1)[-1] resource_type = func.__name__.split('_', 1)[-1]

View File

@@ -208,29 +208,33 @@ class SharesV2Client(shares_client.SharesClient):
""" """
if "share_instance_id" in kwargs: if "share_instance_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_instance, kwargs.get("share_instance_id")) self.get_share_instance, kwargs.get("share_instance_id"),
"share_instance")
elif "share_group_id" in kwargs: elif "share_group_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_group, kwargs.get("share_group_id")) self.get_share_group, kwargs.get("share_group_id"),
"share_group")
elif "share_group_snapshot_id" in kwargs: elif "share_group_snapshot_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_group_snapshot, self.get_share_group_snapshot,
kwargs.get("share_group_snapshot_id")) kwargs.get("share_group_snapshot_id"), "share_group_snapshot")
elif "share_group_type_id" in kwargs: elif "share_group_type_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_group_type, kwargs.get("share_group_type_id")) self.get_share_group_type, kwargs.get("share_group_type_id"),
"share_group_type")
elif "replica_id" in kwargs: elif "replica_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_share_replica, kwargs.get("replica_id")) self.get_share_replica, kwargs.get("replica_id"),
"share_replica")
elif "message_id" in kwargs: elif "message_id" in kwargs:
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_message, kwargs.get("message_id")) self.get_message, kwargs.get("message_id"), "message")
elif "share_network_subnet_id" in kwargs: elif "share_network_subnet_id" in kwargs:
subnet_kwargs = { subnet_kwargs = {
"sn_id": kwargs["extra_params"]["share_network_id"]} "share_network_id": kwargs["sn_id"]}
return self._is_resource_deleted( return self._is_resource_deleted(
self.get_subnet, kwargs.get("share_network_subnet_id"), self.get_subnet, kwargs.get("share_network_subnet_id"),
**subnet_kwargs "share_network_subnet", **subnet_kwargs
) )
else: else:
return super(SharesV2Client, self).is_resource_deleted( return super(SharesV2Client, self).is_resource_deleted(

View File

@@ -898,7 +898,8 @@ class BaseSharesTest(test.BaseTestCase):
res["deleted"] = False res["deleted"] = False
if "client" not in res.keys(): if "client" not in res.keys():
res["client"] = cls.shares_client res["client"] = cls.shares_client
if not res["deleted"]: if not (res["deleted"]):
try:
res_id = res['id'] res_id = res['id']
client = res["client"] client = res["client"]
with handle_cleanup_exceptions(): with handle_cleanup_exceptions():
@@ -913,7 +914,8 @@ class BaseSharesTest(test.BaseTestCase):
client.wait_for_resource_deletion(share_id=res_id) client.wait_for_resource_deletion(share_id=res_id)
elif res["type"] == "snapshot": elif res["type"] == "snapshot":
client.delete_snapshot(res_id) client.delete_snapshot(res_id)
client.wait_for_resource_deletion(snapshot_id=res_id) client.wait_for_resource_deletion(
snapshot_id=res_id)
elif (res["type"] == "share_network" and elif (res["type"] == "share_network" and
res_id != CONF.share.share_network_id): res_id != CONF.share.share_network_id):
client.delete_share_network(res_id) client.delete_share_network(res_id)
@@ -943,7 +945,8 @@ class BaseSharesTest(test.BaseTestCase):
share_group_snapshot_id=res_id) share_group_snapshot_id=res_id)
elif res["type"] == "share_replica": elif res["type"] == "share_replica":
client.delete_share_replica(res_id) client.delete_share_replica(res_id)
client.wait_for_resource_deletion(replica_id=res_id) client.wait_for_resource_deletion(
replica_id=res_id)
elif res["type"] == "share_backup": elif res["type"] == "share_backup":
client.delete_share_backup(res_id) client.delete_share_backup(res_id)
client.wait_for_resource_deletion(backup_id=res_id) client.wait_for_resource_deletion(backup_id=res_id)
@@ -959,8 +962,16 @@ class BaseSharesTest(test.BaseTestCase):
elif res["type"] == "resource_lock": elif res["type"] == "resource_lock":
client.delete_resource_lock(res_id) client.delete_resource_lock(res_id)
else: else:
LOG.warning("Provided unsupported resource type for " LOG.warning("Provided unsupported resource type "
"cleanup '%s'. Skipping.", res["type"]) "for cleanup '%s'. Skipping.",
res["type"])
except share_exceptions.ResourceReleaseFailed as e:
# Resource is on error deleting state, so we remove it from
# the list to delete, since it cannot be deleted anymore.
# It raises because the current cleanup class or method
# must fail.
res["deleted"] = True
raise e
res["deleted"] = True res["deleted"] = True
# Useful assertions # Useful assertions

View File

@@ -0,0 +1,6 @@
---
fixes:
- |
Fixed bug #2006792. Now the clear resources function has an error
treatment to avoid time out exceptions. Also fix the returned
object in the _is_resource_deleted function