Skip to content

Commit

Permalink
fix: Raise explicit error if multiple entries found when deleting a v…
Browse files Browse the repository at this point in the history
…folder (#492)

* Add `TooManyVFoldersFound` API error class
* Raise the error when getting multiple entries from querying vfolder to delete
  • Loading branch information
lizable committed Jun 24, 2022
1 parent 126126c commit a3fee59
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 13 deletions.
1 change: 1 addition & 0 deletions changes/492.fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Do not delete a virtual folder if there are other folders with the same name (in other folder hosts) and handle by new relevant exception, `TooManyVFoldersFound`, rather than blindly and dangerously deleting the first-queried one.
5 changes: 5 additions & 0 deletions src/ai/backend/manager/api/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,11 @@ class VFolderCreationFailed(BackendError, web.HTTPBadRequest):
error_title = 'Virtual folder creation has failed.'


class TooManyVFoldersFound(BackendError, web.HTTPNotFound):
error_type = 'https://api.backend.ai/probs/too-many-vfolders'
error_title = 'There are two or more matching vfolders.'


class VFolderNotFound(ObjectNotFound):
object_name = 'virtual folder'

Expand Down
44 changes: 31 additions & 13 deletions src/ai/backend/manager/api/vfolder.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
)
from .auth import admin_required, auth_required, superadmin_required
from .exceptions import (
VFolderCreationFailed, VFolderNotFound, VFolderAlreadyExists,
VFolderCreationFailed, TooManyVFoldersFound, VFolderNotFound, VFolderAlreadyExists,
GenericForbidden, ObjectNotFound, InvalidAPIParameters, ServerMisconfiguredError,
BackendAgentError, InternalServerError, GroupNotFound,
)
Expand Down Expand Up @@ -1608,20 +1608,38 @@ async def delete(request: web.Request) -> web.Response:
user_role=user_role,
domain_name=domain_name,
allowed_vfolder_types=allowed_vfolder_types,
extra_vf_conds=(vfolders.c.name == folder_name),
)
for entry in entries:
if entry['name'] == folder_name:
# Folder owner OR user who have DELETE permission can delete folder.
if (
not entry['is_owner']
and entry['permission'] != VFolderPermission.RW_DELETE
):
raise InvalidAPIParameters(
'Cannot delete the vfolder '
'that is not owned by myself.')
break
else:
# for entry in entries:
# if entry['name'] == folder_name:
# # Folder owner OR user who have DELETE permission can delete folder.
# if (
# not entry['is_owner']
# and entry['permission'] != VFolderPermission.RW_DELETE
# ):
# raise InvalidAPIParameters(
# 'Cannot delete the vfolder '
# 'that is not owned by myself.')
# break
# FIXME: For now, multiple entries on delete vfolder will raise an error. Will be fixed in 22.06
if len(entries) > 1:
log.error('VFOLDER.DELETE(folder name:{}, hosts:{}', folder_name, [entry['host'] for entry in entries])
raise TooManyVFoldersFound(
extra_msg="Multiple folders with the same name.",
extra_data=None,
)
elif len(entries) == 0:
raise InvalidAPIParameters('No such vfolder.')
# query_accesible_vfolders returns list
entry = entries[0]
# Folder owner OR user who have DELETE permission can delete folder.
if (
not entry['is_owner']
and entry['permission'] != VFolderPermission.RW_DELETE
):
raise InvalidAPIParameters(
'Cannot delete the vfolder '
'that is not owned by myself.')
folder_host = entry['host']
folder_id = entry['id']
query = (sa.delete(vfolders).where(vfolders.c.id == folder_id))
Expand Down

0 comments on commit a3fee59

Please sign in to comment.