diff --git a/qa/qa/tools/shared_resource_deletion.rb b/qa/qa/tools/shared_resource_deletion.rb index 250b5c1a2941ed07a4f493d87d2136fc335bbb31..af58183f7126250810379e75c20f60cff8cb1de3 100644 --- a/qa/qa/tools/shared_resource_deletion.rb +++ b/qa/qa/tools/shared_resource_deletion.rb @@ -60,6 +60,8 @@ def delete_resource( return handle_successful_deletion(resource, response, delayed_verification, permanent, skip_verification) when response&.code == HTTP_STATUS_NOT_FOUND return log_permanent_deletion(resource) + when already_marked_for_deletion_response?(response) + return handle_already_marked_for_deletion(resource, permanent, delayed_verification, skip_verification) when should_remove_security_policy?(response, retry_count, max_retries) find_and_unassign_security_policy_project(resource) retry_count += 1 @@ -306,6 +308,33 @@ def find_and_unassign_security_policy_project(resource) private + # Checks if response indicates resource is already marked for deletion + # + # @param [Hash] response + # @return [Boolean] + def already_marked_for_deletion_response?(response) + response&.include?("already marked for deletion") || + response&.include?("Group has already been marked for deletion") || + response&.include?("Project must be marked for deletion first") + end + + # Handles the case where a resource is already marked for deletion + # + # @param [Hash] resource + # @param [Boolean] permanent + # @param [Boolean] delayed_verification + # @param [Boolean] skip_verification + # @return [Array] results + def handle_already_marked_for_deletion(resource, permanent, delayed_verification, skip_verification) + if permanent && group_or_project?(resource) + # If we want permanent deletion and the resource is already marked, proceed with permanent deletion + delete_permanently(resource, delayed_verification, skip_verification) + else + # If not permanent deletion, treat as already marked for deletion (success) + log_marked_for_deletion(resource) + end + end + # Unassigns security policy project from resource # # @param [String] path Full path of the resource @@ -338,7 +367,7 @@ def graphql_request(query) # @param [Hash] response # @return [Boolean] def deletion_successful?(response) - success?(response&.code) || response.include?("already marked for deletion") + success?(response&.code) end # Handles successful deletion