Skip to content

Commit

Permalink
Merge pull request #18027 from davelopez/24.0_fix_files_sources_error…
Browse files Browse the repository at this point in the history
…_handling

[24.0] Fix remote files sources error handling
  • Loading branch information
mvdbeek authored Apr 21, 2024
2 parents 9d715ce + 0d1c41f commit 8f4968f
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 17 deletions.
37 changes: 24 additions & 13 deletions lib/galaxy/files/sources/_pyfilesystem2.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,14 @@
)

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,
Expand Down Expand Up @@ -42,19 +47,25 @@ def _open_fs(self, user_context=None, opts: Optional[FilesSourceOptions] = None)

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:
Expand Down
17 changes: 15 additions & 2 deletions lib/galaxy/files/sources/dropbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
Union,
)

from galaxy.exceptions import (
AuthenticationRequired,
MessageException,
)
from . import (
FilesSourceOptions,
FilesSourceProperties,
Expand All @@ -27,8 +31,17 @@ def _open_fs(self, user_context=None, opts: Optional[FilesSourceOptions] = None)
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",)
11 changes: 9 additions & 2 deletions lib/galaxy/managers/remote_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from galaxy import exceptions
from galaxy.files import (
ConfiguredFileSources,
FileSourcePath,
ProvidesUserFileSourcesUserContext,
)
from galaxy.files.sources import (
Expand Down Expand Up @@ -94,10 +95,10 @@ def index(
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:
Expand Down Expand Up @@ -131,6 +132,9 @@ def index(

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,
Expand Down Expand Up @@ -162,6 +166,9 @@ def create_entry(self, user_ctx: ProvidesUserContext, entry_data: CreateEntryPay
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)
Expand Down

0 comments on commit 8f4968f

Please sign in to comment.