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:
committed by
Kiran Pawar
parent
65ca50c796
commit
9cdeda15a0
@@ -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]
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -898,69 +898,80 @@ 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"]):
|
||||||
res_id = res['id']
|
try:
|
||||||
client = res["client"]
|
res_id = res['id']
|
||||||
with handle_cleanup_exceptions():
|
client = res["client"]
|
||||||
if res["type"] == "share":
|
with handle_cleanup_exceptions():
|
||||||
cls.clear_share_replicas(res_id)
|
if res["type"] == "share":
|
||||||
share_group_id = res.get('share_group_id')
|
cls.clear_share_replicas(res_id)
|
||||||
if share_group_id:
|
share_group_id = res.get('share_group_id')
|
||||||
params = {'share_group_id': share_group_id}
|
if share_group_id:
|
||||||
client.delete_share(res_id, params=params)
|
params = {'share_group_id': share_group_id}
|
||||||
|
client.delete_share(res_id, params=params)
|
||||||
|
else:
|
||||||
|
client.delete_share(res_id)
|
||||||
|
client.wait_for_resource_deletion(share_id=res_id)
|
||||||
|
elif res["type"] == "snapshot":
|
||||||
|
client.delete_snapshot(res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
snapshot_id=res_id)
|
||||||
|
elif (res["type"] == "share_network" and
|
||||||
|
res_id != CONF.share.share_network_id):
|
||||||
|
client.delete_share_network(res_id)
|
||||||
|
client.wait_for_resource_deletion(sn_id=res_id)
|
||||||
|
elif res["type"] == "dissociate_security_service":
|
||||||
|
sn_id = res["extra_params"]["share_network_id"]
|
||||||
|
client.remove_sec_service_from_share_network(
|
||||||
|
sn_id=sn_id, ss_id=res_id
|
||||||
|
)
|
||||||
|
elif res["type"] == "security_service":
|
||||||
|
client.delete_security_service(res_id)
|
||||||
|
client.wait_for_resource_deletion(ss_id=res_id)
|
||||||
|
elif res["type"] == "share_type":
|
||||||
|
client.delete_share_type(res_id)
|
||||||
|
client.wait_for_resource_deletion(st_id=res_id)
|
||||||
|
elif res["type"] == "share_group":
|
||||||
|
client.delete_share_group(res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
share_group_id=res_id)
|
||||||
|
elif res["type"] == "share_group_type":
|
||||||
|
client.delete_share_group_type(res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
share_group_type_id=res_id)
|
||||||
|
elif res["type"] == "share_group_snapshot":
|
||||||
|
client.delete_share_group_snapshot(res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
share_group_snapshot_id=res_id)
|
||||||
|
elif res["type"] == "share_replica":
|
||||||
|
client.delete_share_replica(res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
replica_id=res_id)
|
||||||
|
elif res["type"] == "share_backup":
|
||||||
|
client.delete_share_backup(res_id)
|
||||||
|
client.wait_for_resource_deletion(backup_id=res_id)
|
||||||
|
elif res["type"] == "share_network_subnet":
|
||||||
|
sn_id = res["extra_params"]["share_network_id"]
|
||||||
|
client.delete_subnet(sn_id, res_id)
|
||||||
|
client.wait_for_resource_deletion(
|
||||||
|
share_network_subnet_id=res_id,
|
||||||
|
sn_id=sn_id)
|
||||||
|
elif res["type"] == "quotas":
|
||||||
|
user_id = res.get('user_id')
|
||||||
|
client.reset_quotas(res_id, user_id=user_id)
|
||||||
|
elif res["type"] == "resource_lock":
|
||||||
|
client.delete_resource_lock(res_id)
|
||||||
else:
|
else:
|
||||||
client.delete_share(res_id)
|
LOG.warning("Provided unsupported resource type "
|
||||||
client.wait_for_resource_deletion(share_id=res_id)
|
"for cleanup '%s'. Skipping.",
|
||||||
elif res["type"] == "snapshot":
|
res["type"])
|
||||||
client.delete_snapshot(res_id)
|
except share_exceptions.ResourceReleaseFailed as e:
|
||||||
client.wait_for_resource_deletion(snapshot_id=res_id)
|
# Resource is on error deleting state, so we remove it from
|
||||||
elif (res["type"] == "share_network" and
|
# the list to delete, since it cannot be deleted anymore.
|
||||||
res_id != CONF.share.share_network_id):
|
# It raises because the current cleanup class or method
|
||||||
client.delete_share_network(res_id)
|
# must fail.
|
||||||
client.wait_for_resource_deletion(sn_id=res_id)
|
res["deleted"] = True
|
||||||
elif res["type"] == "dissociate_security_service":
|
raise e
|
||||||
sn_id = res["extra_params"]["share_network_id"]
|
|
||||||
client.remove_sec_service_from_share_network(
|
|
||||||
sn_id=sn_id, ss_id=res_id
|
|
||||||
)
|
|
||||||
elif res["type"] == "security_service":
|
|
||||||
client.delete_security_service(res_id)
|
|
||||||
client.wait_for_resource_deletion(ss_id=res_id)
|
|
||||||
elif res["type"] == "share_type":
|
|
||||||
client.delete_share_type(res_id)
|
|
||||||
client.wait_for_resource_deletion(st_id=res_id)
|
|
||||||
elif res["type"] == "share_group":
|
|
||||||
client.delete_share_group(res_id)
|
|
||||||
client.wait_for_resource_deletion(
|
|
||||||
share_group_id=res_id)
|
|
||||||
elif res["type"] == "share_group_type":
|
|
||||||
client.delete_share_group_type(res_id)
|
|
||||||
client.wait_for_resource_deletion(
|
|
||||||
share_group_type_id=res_id)
|
|
||||||
elif res["type"] == "share_group_snapshot":
|
|
||||||
client.delete_share_group_snapshot(res_id)
|
|
||||||
client.wait_for_resource_deletion(
|
|
||||||
share_group_snapshot_id=res_id)
|
|
||||||
elif res["type"] == "share_replica":
|
|
||||||
client.delete_share_replica(res_id)
|
|
||||||
client.wait_for_resource_deletion(replica_id=res_id)
|
|
||||||
elif res["type"] == "share_backup":
|
|
||||||
client.delete_share_backup(res_id)
|
|
||||||
client.wait_for_resource_deletion(backup_id=res_id)
|
|
||||||
elif res["type"] == "share_network_subnet":
|
|
||||||
sn_id = res["extra_params"]["share_network_id"]
|
|
||||||
client.delete_subnet(sn_id, res_id)
|
|
||||||
client.wait_for_resource_deletion(
|
|
||||||
share_network_subnet_id=res_id,
|
|
||||||
sn_id=sn_id)
|
|
||||||
elif res["type"] == "quotas":
|
|
||||||
user_id = res.get('user_id')
|
|
||||||
client.reset_quotas(res_id, user_id=user_id)
|
|
||||||
elif res["type"] == "resource_lock":
|
|
||||||
client.delete_resource_lock(res_id)
|
|
||||||
else:
|
|
||||||
LOG.warning("Provided unsupported resource type for "
|
|
||||||
"cleanup '%s'. Skipping.", res["type"])
|
|
||||||
res["deleted"] = True
|
res["deleted"] = True
|
||||||
|
|
||||||
# Useful assertions
|
# Useful assertions
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user