diff --git a/src/primaite/notebooks/Training-an-SB3-Agent.ipynb b/src/primaite/notebooks/Training-an-SB3-Agent.ipynb index 5d9a704d..9faf5820 100644 --- a/src/primaite/notebooks/Training-an-SB3-Agent.ipynb +++ b/src/primaite/notebooks/Training-an-SB3-Agent.ipynb @@ -177,9 +177,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/src/primaite/simulator/system/services/database/database_service.py b/src/primaite/simulator/system/services/database/database_service.py index 519b6512..861b5c7d 100644 --- a/src/primaite/simulator/system/services/database/database_service.py +++ b/src/primaite/simulator/system/services/database/database_service.py @@ -42,6 +42,18 @@ class DatabaseService(Service): super().__init__(**kwargs) self._create_db_file() + def install(self): + """ + Perform first-time setup of the DatabaseService. + + Installs an instance of FTPClient on the Node to enable database backup if it isn't installed already. + """ + super().install() + + if not self.parent.software_manager.software.get("FTPClient"): + self.parent.sys_log.info(f"{self.name}: Installing FTPClient to enable database backups") + self.parent.software_manager.install(FTPClient) + def configure_backup(self, backup_server: IPv4Address): """ Set up the database backup. @@ -64,9 +76,15 @@ class DatabaseService(Service): software_manager: SoftwareManager = self.software_manager ftp_client_service: FTPClient = software_manager.software.get("FTPClient") + if not ftp_client_service: + self.sys_log.error( + f"{self.name}: Failed to perform database backup as the FTPClient software is not installed" + ) + return False + # send backup copy of database file to FTP server if not self.db_file: - self.sys_log.error("Attempted to backup database file but it doesn't exist.") + self.sys_log.error(f"{self.name}: Attempted to backup database file but it doesn't exist.") return False response = ftp_client_service.send_file( @@ -92,6 +110,12 @@ class DatabaseService(Service): software_manager: SoftwareManager = self.software_manager ftp_client_service: FTPClient = software_manager.software.get("FTPClient") + if not ftp_client_service: + self.sys_log.error( + f"{self.name}: Failed to restore database backup as the FTPClient software is not installed" + ) + return False + # retrieve backup file from backup server response = ftp_client_service.request_file( src_folder_name=str(self.uuid), diff --git a/tests/integration_tests/system/test_database_on_node.py b/tests/integration_tests/system/test_database_on_node.py index 8a2a9793..ea7d7aae 100644 --- a/tests/integration_tests/system/test_database_on_node.py +++ b/tests/integration_tests/system/test_database_on_node.py @@ -356,3 +356,9 @@ def test_client_connection_terminate_does_not_terminate_another_clients_connecti assert db_connection_b.query("SELECT") assert len(db_service.connections) == 1 + + +def test_database_server_install_ftp_client(): + server = Server(hostname="db_server", ip_address="192.168.1.2", subnet_mask="255.255.255.0", start_up_duration=0) + server.software_manager.install(DatabaseService) + assert server.software_manager.software.get("FTPClient")