mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-19 10:51:34 +08:00
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:
@@ -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:
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
Reference in New Issue
Block a user