Finish upgrading folder actions to work with names instead of uuids & get tests fixed
This commit is contained in:
@@ -94,12 +94,12 @@ class FileSystem(SimComponent):
|
|||||||
self._restore_manager.add_request(
|
self._restore_manager.add_request(
|
||||||
name="file",
|
name="file",
|
||||||
request_type=RequestType(
|
request_type=RequestType(
|
||||||
func=lambda request, context: self.restore_file(folder_uuid=request[0], file_uuid=request[1])
|
func=lambda request, context: self.restore_file(folder_name=request[0], file_name=request[1])
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
self._restore_manager.add_request(
|
self._restore_manager.add_request(
|
||||||
name="folder",
|
name="folder",
|
||||||
request_type=RequestType(func=lambda request, context: self.restore_folder(folder_uuid=request[0])),
|
request_type=RequestType(func=lambda request, context: self.restore_folder(folder_name=request[0])),
|
||||||
)
|
)
|
||||||
rm.add_request(
|
rm.add_request(
|
||||||
name="restore",
|
name="restore",
|
||||||
@@ -209,7 +209,7 @@ class FileSystem(SimComponent):
|
|||||||
folder = self.get_folder_by_id(folder_uuid=folder_uuid)
|
folder = self.get_folder_by_id(folder_uuid=folder_uuid)
|
||||||
self.delete_folder(folder_name=folder.name)
|
self.delete_folder(folder_name=folder.name)
|
||||||
|
|
||||||
def get_folder(self, folder_name: str) -> Optional[Folder]:
|
def get_folder(self, folder_name: str, include_deleted: bool = False) -> Optional[Folder]:
|
||||||
"""
|
"""
|
||||||
Get a folder by its name if it exists.
|
Get a folder by its name if it exists.
|
||||||
|
|
||||||
@@ -219,9 +219,13 @@ class FileSystem(SimComponent):
|
|||||||
for folder in self.folders.values():
|
for folder in self.folders.values():
|
||||||
if folder.name == folder_name:
|
if folder.name == folder_name:
|
||||||
return folder
|
return folder
|
||||||
|
if include_deleted:
|
||||||
|
for folder in self.deleted_folders.values():
|
||||||
|
if folder.name == folder_name:
|
||||||
|
return folder
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_folder_by_id(self, folder_uuid: str, include_deleted: bool = False) -> Optional[Folder]:
|
def get_folder_by_id(self, folder_uuid: str, include_deleted: Optional[bool] = False) -> Optional[Folder]:
|
||||||
"""
|
"""
|
||||||
Get a folder by its uuid if it exists.
|
Get a folder by its uuid if it exists.
|
||||||
|
|
||||||
@@ -283,7 +287,7 @@ class FileSystem(SimComponent):
|
|||||||
self._file_request_manager.add_request(name=file.name, request_type=RequestType(func=file._request_manager))
|
self._file_request_manager.add_request(name=file.name, request_type=RequestType(func=file._request_manager))
|
||||||
return file
|
return file
|
||||||
|
|
||||||
def get_file(self, folder_name: str, file_name: str) -> Optional[File]:
|
def get_file(self, folder_name: str, file_name: str, include_deleted: Optional[bool] = False) -> Optional[File]:
|
||||||
"""
|
"""
|
||||||
Retrieve a file by its name from a specific folder.
|
Retrieve a file by its name from a specific folder.
|
||||||
|
|
||||||
@@ -291,9 +295,9 @@ class FileSystem(SimComponent):
|
|||||||
:param file_name: The name of the file to be retrieved, including its extension.
|
:param file_name: The name of the file to be retrieved, including its extension.
|
||||||
:return: An instance of File if it exists, otherwise `None`.
|
:return: An instance of File if it exists, otherwise `None`.
|
||||||
"""
|
"""
|
||||||
folder = self.get_folder(folder_name)
|
folder = self.get_folder(folder_name, include_deleted=include_deleted)
|
||||||
if folder:
|
if folder:
|
||||||
return folder.get_file(file_name)
|
return folder.get_file(file_name, include_deleted=include_deleted)
|
||||||
self.sys_log.info(f"File not found /{folder_name}/{file_name}")
|
self.sys_log.info(f"File not found /{folder_name}/{file_name}")
|
||||||
|
|
||||||
def get_file_by_id(
|
def get_file_by_id(
|
||||||
@@ -455,46 +459,44 @@ class FileSystem(SimComponent):
|
|||||||
for folder_id in self.folders:
|
for folder_id in self.folders:
|
||||||
self.folders[folder_id].reveal_to_red(instant_scan=instant_scan)
|
self.folders[folder_id].reveal_to_red(instant_scan=instant_scan)
|
||||||
|
|
||||||
def restore_folder(self, folder_uuid: str):
|
def restore_folder(self, folder_name: str):
|
||||||
"""
|
"""
|
||||||
Restore a folder.
|
Restore a folder.
|
||||||
|
|
||||||
Checks the current folder's status and applies the correct fix for the folder.
|
Checks the current folder's status and applies the correct fix for the folder.
|
||||||
|
|
||||||
:param: folder_uuid: id of the folder to restore
|
:param: folder_name: name of the folder to restore
|
||||||
:type: folder_uuid: str
|
:type: folder_uuid: str
|
||||||
"""
|
"""
|
||||||
folder = self.get_folder_by_id(folder_uuid=folder_uuid, include_deleted=True)
|
folder = self.get_folder(folder_name=folder_name, include_deleted=True)
|
||||||
|
|
||||||
if folder is None:
|
if folder is None:
|
||||||
self.sys_log.error(f"Unable to restore folder with uuid {folder_uuid}. Folder does not exist.")
|
self.sys_log.error(f"Unable to restore folder {folder_name}. Folder is not in deleted folder list.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.deleted_folders.pop(folder.uuid, None)
|
||||||
folder.restore()
|
folder.restore()
|
||||||
self.folders[folder.uuid] = folder
|
self.folders[folder.uuid] = folder
|
||||||
|
|
||||||
if folder.deleted:
|
def restore_file(self, folder_name: str, file_name: str):
|
||||||
self.deleted_folders.pop(folder.uuid)
|
|
||||||
|
|
||||||
def restore_file(self, folder_uuid: str, file_uuid: str):
|
|
||||||
"""
|
"""
|
||||||
Restore a file.
|
Restore a file.
|
||||||
|
|
||||||
Checks the current file's status and applies the correct fix for the file.
|
Checks the current file's status and applies the correct fix for the file.
|
||||||
|
|
||||||
:param: folder_uuid: id of the folder where the file is stored
|
:param: folder_name: name of the folder where the file is stored
|
||||||
:type: folder_uuid: str
|
:type: folder_name: str
|
||||||
|
|
||||||
:param: file_uuid: id of the file to restore
|
:param: file_name: name of the file to restore
|
||||||
:type: file_uuid: str
|
:type: file_name: str
|
||||||
"""
|
"""
|
||||||
folder = self.get_folder_by_id(folder_uuid=folder_uuid, include_deleted=True)
|
folder = self.get_folder(folder_name=folder_name)
|
||||||
|
|
||||||
if folder:
|
if folder:
|
||||||
file = folder.get_file_by_id(file_uuid=file_uuid, include_deleted=True)
|
file = folder.get_file(file_name=file_name, include_deleted=True)
|
||||||
|
|
||||||
if file is None:
|
if file is None:
|
||||||
self.sys_log.error(f"Unable to restore file with uuid {file_uuid}. File does not exist.")
|
self.sys_log.error(f"Unable to restore file {file_name}. File does not exist.")
|
||||||
return
|
return
|
||||||
|
|
||||||
folder.restore_file(file_uuid=file_uuid)
|
folder.restore_file(file_name=file_name)
|
||||||
|
|||||||
@@ -193,19 +193,19 @@ class Folder(FileSystemItemABC):
|
|||||||
|
|
||||||
if self.restore_countdown == 0:
|
if self.restore_countdown == 0:
|
||||||
# repair all files
|
# repair all files
|
||||||
for file_id in self.files:
|
for file_id, file in self.files.items():
|
||||||
self.restore_file(file_uuid=file_id)
|
self.restore_file(file_name=file.name)
|
||||||
|
|
||||||
deleted_files = self.deleted_files.copy()
|
deleted_files = self.deleted_files.copy()
|
||||||
for file_id in deleted_files:
|
for file_id, file in deleted_files.items():
|
||||||
self.restore_file(file_uuid=file_id)
|
self.restore_file(file_name=file.name)
|
||||||
|
|
||||||
if self.deleted:
|
if self.deleted:
|
||||||
self.deleted = False
|
self.deleted = False
|
||||||
elif self.health_status in [FileSystemItemHealthStatus.CORRUPT, FileSystemItemHealthStatus.RESTORING]:
|
elif self.health_status in [FileSystemItemHealthStatus.CORRUPT, FileSystemItemHealthStatus.RESTORING]:
|
||||||
self.health_status = FileSystemItemHealthStatus.GOOD
|
self.health_status = FileSystemItemHealthStatus.GOOD
|
||||||
|
|
||||||
def get_file(self, file_name: str) -> Optional[File]:
|
def get_file(self, file_name: str, include_deleted: Optional[bool] = False) -> Optional[File]:
|
||||||
"""
|
"""
|
||||||
Get a file by its name.
|
Get a file by its name.
|
||||||
|
|
||||||
@@ -218,6 +218,10 @@ class Folder(FileSystemItemABC):
|
|||||||
for file in self.files.values():
|
for file in self.files.values():
|
||||||
if file.name == file_name:
|
if file.name == file_name:
|
||||||
return file
|
return file
|
||||||
|
if include_deleted:
|
||||||
|
for file in self.deleted_files.values():
|
||||||
|
if file.name == file_name:
|
||||||
|
return file
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_file_by_id(self, file_uuid: str, include_deleted: Optional[bool] = False) -> File:
|
def get_file_by_id(self, file_uuid: str, include_deleted: Optional[bool] = False) -> File:
|
||||||
@@ -297,23 +301,23 @@ class Folder(FileSystemItemABC):
|
|||||||
|
|
||||||
self.files = {}
|
self.files = {}
|
||||||
|
|
||||||
def restore_file(self, file_uuid: str):
|
def restore_file(self, file_name: str):
|
||||||
"""
|
"""
|
||||||
Restores a file.
|
Restores a file.
|
||||||
|
|
||||||
:param file_uuid: The id of the file to restore
|
:param file_name: The name of the file to restore
|
||||||
"""
|
"""
|
||||||
# if the file was not deleted, run a repair
|
# if the file was not deleted, run a repair
|
||||||
file = self.get_file_by_id(file_uuid=file_uuid, include_deleted=True)
|
file = self.get_file(file_name=file_name, include_deleted=True)
|
||||||
if not file:
|
if not file:
|
||||||
self.sys_log.error(f"Unable to restore file with uuid {file_uuid}. File does not exist.")
|
self.sys_log.error(f"Unable to restore file {file_name}. File does not exist.")
|
||||||
return
|
return
|
||||||
|
|
||||||
file.restore()
|
file.restore()
|
||||||
self.files[file.uuid] = file
|
self.files[file.uuid] = file
|
||||||
|
|
||||||
if file.deleted:
|
if file.deleted:
|
||||||
self.deleted_files.pop(file_uuid)
|
self.deleted_files.pop(file.uuid)
|
||||||
|
|
||||||
def quarantine(self):
|
def quarantine(self):
|
||||||
"""Quarantines the File System Folder."""
|
"""Quarantines the File System Folder."""
|
||||||
|
|||||||
@@ -203,6 +203,10 @@ class DatabaseService(Service):
|
|||||||
"""
|
"""
|
||||||
self.sys_log.info(f"{self.name}: Running {query}")
|
self.sys_log.info(f"{self.name}: Running {query}")
|
||||||
|
|
||||||
|
if not self.db_file:
|
||||||
|
self.sys_log.info(f"{self.name}: Failed to run {query} because the database file is missing.")
|
||||||
|
return {"status_code": 404, "data": False}
|
||||||
|
|
||||||
if query == "SELECT":
|
if query == "SELECT":
|
||||||
if self.db_file.health_status == FileSystemItemHealthStatus.GOOD:
|
if self.db_file.health_status == FileSystemItemHealthStatus.GOOD:
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -61,18 +61,18 @@ def test_file_restore_request(populated_file_system):
|
|||||||
fs, folder, file = populated_file_system
|
fs, folder, file = populated_file_system
|
||||||
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is not None
|
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is not None
|
||||||
|
|
||||||
fs.apply_request(request=["delete", "file", folder.uuid, file.uuid])
|
fs.apply_request(request=["delete", "file", folder.name, file.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
||||||
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid, include_deleted=True).deleted is True
|
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid, include_deleted=True).deleted is True
|
||||||
|
|
||||||
fs.apply_request(request=["restore", "file", folder.uuid, file.uuid])
|
fs.apply_request(request=["restore", "file", folder.name, file.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is not None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is not None
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).deleted is False
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).deleted is False
|
||||||
|
|
||||||
fs.apply_request(request=["file", file.name, "corrupt"])
|
fs.apply_request(request=["file", file.name, "corrupt"])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
||||||
|
|
||||||
fs.apply_request(request=["restore", "file", folder.uuid, file.uuid])
|
fs.apply_request(request=["restore", "file", folder.name, file.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.GOOD
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.GOOD
|
||||||
|
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ def test_deleted_file_cannot_be_interacted_with(populated_file_system):
|
|||||||
== FileSystemItemHealthStatus.GOOD
|
== FileSystemItemHealthStatus.GOOD
|
||||||
)
|
)
|
||||||
|
|
||||||
fs.apply_request(request=["delete", "file", folder.uuid, file.uuid])
|
fs.apply_request(request=["delete", "file", folder.name, file.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
||||||
|
|
||||||
fs.apply_request(request=["file", file.name, "repair"])
|
fs.apply_request(request=["file", file.name, "repair"])
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ def test_file_delete_request(populated_file_system):
|
|||||||
fs, folder, file = populated_file_system
|
fs, folder, file = populated_file_system
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is not None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is not None
|
||||||
|
|
||||||
fs.apply_request(request=["delete", "file", folder.uuid, file.uuid])
|
fs.apply_request(request=["delete", "file", folder.name, file.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
||||||
|
|
||||||
fs.show(full=True)
|
fs.show(full=True)
|
||||||
@@ -33,7 +33,7 @@ def test_folder_delete_request(populated_file_system):
|
|||||||
assert folder.get_file_by_id(file_uuid=file.uuid) is not None
|
assert folder.get_file_by_id(file_uuid=file.uuid) is not None
|
||||||
assert fs.get_folder_by_id(folder_uuid=folder.uuid) is not None
|
assert fs.get_folder_by_id(folder_uuid=folder.uuid) is not None
|
||||||
|
|
||||||
fs.apply_request(request=["delete", "folder", folder.uuid])
|
fs.apply_request(request=["delete", "folder", folder.name])
|
||||||
assert fs.get_folder_by_id(folder_uuid=folder.uuid) is None
|
assert fs.get_folder_by_id(folder_uuid=folder.uuid) is None
|
||||||
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is None
|
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is None
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ def test_folder_restore_request(populated_file_system):
|
|||||||
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is not None
|
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is not None
|
||||||
|
|
||||||
# delete folder
|
# delete folder
|
||||||
fs.apply_request(request=["delete", "folder", folder.uuid])
|
fs.apply_request(request=["delete", "folder", folder.name])
|
||||||
assert fs.get_folder(folder_name=folder.name) is None
|
assert fs.get_folder(folder_name=folder.name) is None
|
||||||
assert fs.get_folder_by_id(folder_uuid=folder.uuid, include_deleted=True).deleted is True
|
assert fs.get_folder_by_id(folder_uuid=folder.uuid, include_deleted=True).deleted is True
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ def test_folder_restore_request(populated_file_system):
|
|||||||
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid, include_deleted=True).deleted is True
|
assert fs.get_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid, include_deleted=True).deleted is True
|
||||||
|
|
||||||
# restore folder
|
# restore folder
|
||||||
fs.apply_request(request=["restore", "folder", folder.uuid])
|
fs.apply_request(request=["restore", "folder", folder.name])
|
||||||
fs.apply_timestep(timestep=0)
|
fs.apply_timestep(timestep=0)
|
||||||
assert fs.get_folder(folder_name=folder.name) is not None
|
assert fs.get_folder(folder_name=folder.name) is not None
|
||||||
assert (
|
assert (
|
||||||
@@ -121,7 +121,7 @@ def test_folder_restore_request(populated_file_system):
|
|||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
||||||
|
|
||||||
# restore folder
|
# restore folder
|
||||||
fs.apply_request(request=["restore", "folder", folder.uuid])
|
fs.apply_request(request=["restore", "folder", folder.name])
|
||||||
fs.apply_timestep(timestep=0)
|
fs.apply_timestep(timestep=0)
|
||||||
assert fs.get_folder(folder_name=folder.name).health_status == FileSystemItemHealthStatus.RESTORING
|
assert fs.get_folder(folder_name=folder.name).health_status == FileSystemItemHealthStatus.RESTORING
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
||||||
@@ -156,7 +156,7 @@ def test_deleted_folder_and_its_files_cannot_be_interacted_with(populated_file_s
|
|||||||
fs.apply_request(request=["file", file.name, "corrupt"])
|
fs.apply_request(request=["file", file.name, "corrupt"])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
assert fs.get_file(folder_name=folder.name, file_name=file.name).health_status == FileSystemItemHealthStatus.CORRUPT
|
||||||
|
|
||||||
fs.apply_request(request=["delete", "folder", folder.uuid])
|
fs.apply_request(request=["delete", "folder", folder.name])
|
||||||
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
assert fs.get_file(folder_name=folder.name, file_name=file.name) is None
|
||||||
|
|
||||||
fs.apply_request(request=["file", file.name, "repair"])
|
fs.apply_request(request=["file", file.name, "repair"])
|
||||||
|
|||||||
Reference in New Issue
Block a user