Merge pull request #18027 from davelopez/24.0_fix_files_sources_error_handling

[24.0] Fix remote files sources error handling
This commit is contained in:
Marius van den Beek
2024-04-21 09:57:19 +02:00
committed by GitHub
3 changed files with 48 additions and 17 deletions
+24 -13
View File
@@ -12,9 +12,14 @@ from typing import (
)
import fs
import fs.errors
from fs.base import FS
from typing_extensions import Unpack
from galaxy.exceptions import (
AuthenticationRequired,
MessageException,
)
from . import (
BaseFilesSource,
FilesSourceOptions,
@@ -42,19 +47,25 @@ class PyFilesystem2FilesSource(BaseFilesSource):
def _list(self, path="/", recursive=False, user_context=None, opts: Optional[FilesSourceOptions] = None):
"""Return dictionary of 'Directory's and 'File's."""
with self._open_fs(user_context=user_context, opts=opts) as h:
if recursive:
res: List[Dict[str, Any]] = []
for p, dirs, files in h.walk(path):
to_dict = functools.partial(self._resource_info_to_dict, p)
res.extend(map(to_dict, dirs))
res.extend(map(to_dict, files))
return res
else:
res = h.scandir(path, namespaces=["details"])
to_dict = functools.partial(self._resource_info_to_dict, path)
return list(map(to_dict, res))
try:
with self._open_fs(user_context=user_context, opts=opts) as h:
if recursive:
res: List[Dict[str, Any]] = []
for p, dirs, files in h.walk(path):
to_dict = functools.partial(self._resource_info_to_dict, p)
res.extend(map(to_dict, dirs))
res.extend(map(to_dict, files))
return res
else:
res = h.scandir(path, namespaces=["details"])
to_dict = functools.partial(self._resource_info_to_dict, path)
return list(map(to_dict, res))
except fs.errors.PermissionDenied as e:
raise AuthenticationRequired(
f"Permission Denied. Reason: {e}. Please check your credentials in your preferences for {self.label}."
)
except fs.errors.FSError as e:
raise MessageException(f"Problem listing file source path {path}. Reason: {e}") from e
def _realize_to(self, source_path, native_path, user_context=None, opts: Optional[FilesSourceOptions] = None):
with open(native_path, "wb") as write_file:
+15 -2
View File
@@ -8,6 +8,10 @@ from typing import (
Union,
)
from galaxy.exceptions import (
AuthenticationRequired,
MessageException,
)
from . import (
FilesSourceOptions,
FilesSourceProperties,
@@ -27,8 +31,17 @@ class DropboxFilesSource(PyFilesystem2FilesSource):
if "accessToken" in props:
props["access_token"] = props.pop("accessToken")
handle = DropboxFS(**{**props, **extra_props})
return handle
try:
handle = DropboxFS(**{**props, **extra_props})
return handle
except Exception as e:
# This plugin might raise dropbox.dropbox_client.BadInputException
# which is not a subclass of fs.errors.FSError
if "OAuth2" in str(e):
raise AuthenticationRequired(
f"Permission Denied. Reason: {e}. Please check your credentials in your preferences for {self.label}."
)
raise MessageException(f"Error connecting to Dropbox. Reason: {e}")
__all__ = ("DropboxFilesSource",)
+9 -2
View File
@@ -9,6 +9,7 @@ from typing import (
from galaxy import exceptions
from galaxy.files import (
ConfiguredFileSources,
FileSourcePath,
ProvidesUserFileSourcesUserContext,
)
from galaxy.files.sources import (
@@ -94,10 +95,10 @@ class RemoteFilesManager:
opts=opts,
)
except exceptions.MessageException:
log.warning(f"Problem listing file source path {file_source_path}", exc_info=True)
log.warning(self._get_error_message(file_source_path), exc_info=True)
raise
except Exception:
message = f"Problem listing file source path {file_source_path}"
message = self._get_error_message(file_source_path)
log.warning(message, exc_info=True)
raise exceptions.InternalServerError(message)
if format == RemoteFilesFormat.flat:
@@ -131,6 +132,9 @@ class RemoteFilesManager:
return index
def _get_error_message(self, file_source_path: FileSourcePath) -> str:
return f"Problem listing file source path {file_source_path.file_source.get_uri_root()}{file_source_path.path}"
def get_files_source_plugins(
self,
user_context: ProvidesUserContext,
@@ -162,6 +166,9 @@ class RemoteFilesManager:
file_source = file_source_path.file_source
try:
result = file_source.create_entry(entry_data.dict(), user_context=user_file_source_context)
except exceptions.MessageException:
log.warning(f"Problem creating entry {entry_data.name} in file source {entry_data.target}", exc_info=True)
raise
except Exception:
message = f"Problem creating entry {entry_data.name} in file source {entry_data.target}"
log.warning(message, exc_info=True)