From da3a8a498538842acf05dc21922fa45ac6d9353f Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 5 Aug 2024 11:06:14 -0400 Subject: [PATCH] Improve tool shed API error messages for repo path bug. --- lib/galaxy/exceptions/__init__.py | 5 +++++ lib/galaxy/exceptions/error_codes.json | 5 +++++ lib/tool_shed/managers/tools.py | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/lib/galaxy/exceptions/__init__.py b/lib/galaxy/exceptions/__init__.py index 8deab77bc17b..82f66efdbe7d 100644 --- a/lib/galaxy/exceptions/__init__.py +++ b/lib/galaxy/exceptions/__init__.py @@ -250,6 +250,11 @@ class InconsistentDatabase(MessageException): err_code = error_codes_by_name["INCONSISTENT_DATABASE"] +class InconsistentApplicationState(MessageException): + status_code = 500 + err_code = error_codes_by_name["INCONSISTENT_APPLICATION_STATE"] + + class InternalServerError(MessageException): status_code = 500 err_code = error_codes_by_name["INTERNAL_SERVER_ERROR"] diff --git a/lib/galaxy/exceptions/error_codes.json b/lib/galaxy/exceptions/error_codes.json index 99464306acb6..e148b102b786 100644 --- a/lib/galaxy/exceptions/error_codes.json +++ b/lib/galaxy/exceptions/error_codes.json @@ -189,6 +189,11 @@ "code": 500006, "message": "Reference data required for program execution failed to load." }, + { + "name": "INCONSISTENT_APPLICATION_STATE", + "code": 500007, + "message": "Inconsistent application state (likely not dbms related) prevented fulfilling the request." + }, { "name": "NOT_IMPLEMENTED", "code": 501001, diff --git a/lib/tool_shed/managers/tools.py b/lib/tool_shed/managers/tools.py index b9dc6209e1b3..f569935d51ee 100644 --- a/lib/tool_shed/managers/tools.py +++ b/lib/tool_shed/managers/tools.py @@ -10,6 +10,7 @@ from galaxy import exceptions from galaxy.exceptions import ( + InconsistentApplicationState, InternalServerError, ObjectNotFound, RequestParameterInvalidException, @@ -149,8 +150,12 @@ def _shed_tool_source_for( if error_message: raise InternalServerError("Failed to materialize target repository revision") repo_files_dir = repository_metadata.repository.repo_path(trans.app) + if not repo_files_dir: + raise InconsistentApplicationState(f"Failed to resolve repository path from hgweb_config_manager for [{trs_tool_id}], inconsistent repository state or application configuration") repo_rel_tool_path = relpath(tool_config, repo_files_dir) path_to_tool = os.path.join(work_dir, repo_rel_tool_path) + if not os.path.exists(path_to_tool): + raise InconsistentApplicationState(f"Target tool expected at [{path_to_tool}] and not found, inconsistent repository state or application configuration") tool_source = get_tool_source(path_to_tool) return tool_source finally: