From e500eccaf7846acdc20f875029ed8a5b8c6aa478 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 6 Feb 2024 16:58:08 +0000 Subject: [PATCH] Finish upgrading folder actions to work with names instead of uuids & get tests fixed --- .../simulator/file_system/file_system.py | 48 ++++++++++--------- src/primaite/simulator/file_system/folder.py | 24 ++++++---- .../services/database/database_service.py | 4 ++ .../_file_system/test_file_actions.py | 8 ++-- .../_file_system/test_file_system_actions.py | 4 +- .../_file_system/test_folder_actions.py | 8 ++-- 6 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/primaite/simulator/file_system/file_system.py b/src/primaite/simulator/file_system/file_system.py index 2ab3b005..ee80587d 100644 --- a/src/primaite/simulator/file_system/file_system.py +++ b/src/primaite/simulator/file_system/file_system.py @@ -94,12 +94,12 @@ class FileSystem(SimComponent): self._restore_manager.add_request( name="file", 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( 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( name="restore", @@ -209,7 +209,7 @@ class FileSystem(SimComponent): folder = self.get_folder_by_id(folder_uuid=folder_uuid) 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. @@ -219,9 +219,13 @@ class FileSystem(SimComponent): for folder in self.folders.values(): if folder.name == folder_name: return folder + if include_deleted: + for folder in self.deleted_folders.values(): + if folder.name == folder_name: + return folder 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. @@ -283,7 +287,7 @@ class FileSystem(SimComponent): self._file_request_manager.add_request(name=file.name, request_type=RequestType(func=file._request_manager)) 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. @@ -291,9 +295,9 @@ class FileSystem(SimComponent): :param file_name: The name of the file to be retrieved, including its extension. :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: - 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}") def get_file_by_id( @@ -455,46 +459,44 @@ class FileSystem(SimComponent): for folder_id in self.folders: 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. 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 """ - 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: - 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 + self.deleted_folders.pop(folder.uuid, None) folder.restore() self.folders[folder.uuid] = folder - if folder.deleted: - self.deleted_folders.pop(folder.uuid) - - def restore_file(self, folder_uuid: str, file_uuid: str): + def restore_file(self, folder_name: str, file_name: str): """ Restore a 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 - :type: folder_uuid: str + :param: folder_name: name of the folder where the file is stored + :type: folder_name: str - :param: file_uuid: id of the file to restore - :type: file_uuid: str + :param: file_name: name of the file to restore + :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: - 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: - 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 - folder.restore_file(file_uuid=file_uuid) + folder.restore_file(file_name=file_name) diff --git a/src/primaite/simulator/file_system/folder.py b/src/primaite/simulator/file_system/folder.py index a93b2927..13fdc597 100644 --- a/src/primaite/simulator/file_system/folder.py +++ b/src/primaite/simulator/file_system/folder.py @@ -193,19 +193,19 @@ class Folder(FileSystemItemABC): if self.restore_countdown == 0: # repair all files - for file_id in self.files: - self.restore_file(file_uuid=file_id) + for file_id, file in self.files.items(): + self.restore_file(file_name=file.name) deleted_files = self.deleted_files.copy() - for file_id in deleted_files: - self.restore_file(file_uuid=file_id) + for file_id, file in deleted_files.items(): + self.restore_file(file_name=file.name) if self.deleted: self.deleted = False elif self.health_status in [FileSystemItemHealthStatus.CORRUPT, FileSystemItemHealthStatus.RESTORING]: 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. @@ -218,6 +218,10 @@ class Folder(FileSystemItemABC): for file in self.files.values(): if file.name == file_name: return file + if include_deleted: + for file in self.deleted_files.values(): + if file.name == file_name: + return file return None def get_file_by_id(self, file_uuid: str, include_deleted: Optional[bool] = False) -> File: @@ -297,23 +301,23 @@ class Folder(FileSystemItemABC): self.files = {} - def restore_file(self, file_uuid: str): + def restore_file(self, file_name: str): """ 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 - 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: - 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 file.restore() self.files[file.uuid] = file if file.deleted: - self.deleted_files.pop(file_uuid) + self.deleted_files.pop(file.uuid) def quarantine(self): """Quarantines the File System Folder.""" diff --git a/src/primaite/simulator/system/services/database/database_service.py b/src/primaite/simulator/system/services/database/database_service.py index c9c4d6fa..d75b4424 100644 --- a/src/primaite/simulator/system/services/database/database_service.py +++ b/src/primaite/simulator/system/services/database/database_service.py @@ -203,6 +203,10 @@ class DatabaseService(Service): """ 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 self.db_file.health_status == FileSystemItemHealthStatus.GOOD: return { diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_actions.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_actions.py index f43652d8..658b1b09 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_actions.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_actions.py @@ -61,18 +61,18 @@ def test_file_restore_request(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 - 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_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).deleted is False fs.apply_request(request=["file", file.name, "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 @@ -95,7 +95,7 @@ def test_deleted_file_cannot_be_interacted_with(populated_file_system): == 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 fs.apply_request(request=["file", file.name, "repair"]) diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_actions.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_actions.py index 1c8513f9..62af93c4 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_actions.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_actions.py @@ -21,7 +21,7 @@ def test_file_delete_request(populated_file_system): fs, folder, file = populated_file_system 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 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 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_file_by_id(folder_uuid=folder.uuid, file_uuid=file.uuid) is None diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_folder_actions.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_folder_actions.py index 398af0cc..6e904f2a 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_folder_actions.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_folder_actions.py @@ -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 # 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_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 # restore folder - fs.apply_request(request=["restore", "folder", folder.uuid]) + fs.apply_request(request=["restore", "folder", folder.name]) fs.apply_timestep(timestep=0) assert fs.get_folder(folder_name=folder.name) is not None 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 # restore folder - fs.apply_request(request=["restore", "folder", folder.uuid]) + fs.apply_request(request=["restore", "folder", folder.name]) fs.apply_timestep(timestep=0) 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 @@ -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"]) 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 fs.apply_request(request=["file", file.name, "repair"])