diff --git a/manila_tempest_tests/services/share/json/shares_client.py b/manila_tempest_tests/services/share/json/shares_client.py index fb03afca..63a634ce 100644 --- a/manila_tempest_tests/services/share/json/shares_client.py +++ b/manila_tempest_tests/services/share/json/shares_client.py @@ -304,37 +304,41 @@ class SharesClient(rest_client.RestClient): return True else: 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: 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: 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: 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: 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: 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: 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: return self._is_resource_deleted( - self.get_share_backup, kwargs.get("backup_id")) + self.get_share_backup, kwargs.get("backup_id"), + "share_backup") else: raise share_exceptions.InvalidResource( message=str(kwargs)) - def _is_resource_deleted(self, func, res_id, **kwargs): + def _is_resource_deleted(self, func, res_id, resource_name, **kwargs): try: - res = func(res_id, **kwargs) + res = func(res_id, **kwargs)[resource_name] except exceptions.NotFound: return True + if res.get('status') in ['error_deleting', 'error']: # Resource has "error_deleting" status and can not be deleted. resource_type = func.__name__.split('_', 1)[-1] diff --git a/manila_tempest_tests/services/share/v2/json/shares_client.py b/manila_tempest_tests/services/share/v2/json/shares_client.py index d744021d..a9ab1992 100644 --- a/manila_tempest_tests/services/share/v2/json/shares_client.py +++ b/manila_tempest_tests/services/share/v2/json/shares_client.py @@ -208,29 +208,33 @@ class SharesV2Client(shares_client.SharesClient): """ if "share_instance_id" in kwargs: 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: 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: return self._is_resource_deleted( 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: 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: 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: 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: subnet_kwargs = { - "sn_id": kwargs["extra_params"]["share_network_id"]} + "share_network_id": kwargs["sn_id"]} return self._is_resource_deleted( self.get_subnet, kwargs.get("share_network_subnet_id"), - **subnet_kwargs + "share_network_subnet", **subnet_kwargs ) else: return super(SharesV2Client, self).is_resource_deleted( diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py index 12c87798..9583de88 100755 --- a/manila_tempest_tests/tests/api/base.py +++ b/manila_tempest_tests/tests/api/base.py @@ -898,69 +898,80 @@ class BaseSharesTest(test.BaseTestCase): res["deleted"] = False if "client" not in res.keys(): res["client"] = cls.shares_client - if not res["deleted"]: - res_id = res['id'] - client = res["client"] - with handle_cleanup_exceptions(): - if res["type"] == "share": - cls.clear_share_replicas(res_id) - share_group_id = res.get('share_group_id') - if share_group_id: - params = {'share_group_id': share_group_id} - client.delete_share(res_id, params=params) + if not (res["deleted"]): + try: + res_id = res['id'] + client = res["client"] + with handle_cleanup_exceptions(): + if res["type"] == "share": + cls.clear_share_replicas(res_id) + share_group_id = res.get('share_group_id') + if share_group_id: + 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: - 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: - LOG.warning("Provided unsupported resource type for " - "cleanup '%s'. Skipping.", res["type"]) + LOG.warning("Provided unsupported resource 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 # Useful assertions diff --git a/releasenotes/notes/bug-2006792-fix-stop-cleanup-error-2a314862576f655b.yaml b/releasenotes/notes/bug-2006792-fix-stop-cleanup-error-2a314862576f655b.yaml new file mode 100644 index 00000000..aaa31055 --- /dev/null +++ b/releasenotes/notes/bug-2006792-fix-stop-cleanup-error-2a314862576f655b.yaml @@ -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