#2561 - Set the DatabaseServer service to automatically install the upon install to enable backup. Added some defensive statements that gracefully handle backup/restore requests when FTPClient is not installed.

This commit is contained in:
Chris McCarthy
2024-05-13 07:58:43 +01:00
parent 22e4b04a21
commit e2f061fde0
2 changed files with 34 additions and 10 deletions

View File

@@ -42,6 +42,11 @@ class DatabaseService(Service):
super().__init__(**kwargs)
self._create_db_file()
def install(self):
super().install()
if not self.software_manager.software.get("FTPClient"):
self.sys_log.info(f"{self.name}: Installing FTPClient to enable database backups")
self.software_manager.install(FTPClient)
def configure_backup(self, backup_server: IPv4Address):
"""
Set up the database backup.
@@ -64,9 +69,17 @@ 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 +105,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),
@@ -151,11 +170,11 @@ class DatabaseService(Service):
return str(uuid4())
def _process_connect(
self,
src_ip: IPv4Address,
connection_request_id: str,
password: Optional[str] = None,
session_id: Optional[str] = None,
self,
src_ip: IPv4Address,
connection_request_id: str,
password: Optional[str] = None,
session_id: Optional[str] = None,
) -> Dict[str, Union[int, Dict[str, bool]]]:
"""Process an incoming connection request.
@@ -196,10 +215,10 @@ class DatabaseService(Service):
}
def _process_sql(
self,
query: Literal["SELECT", "DELETE", "INSERT", "ENCRYPT"],
query_id: str,
connection_id: Optional[str] = None,
self,
query: Literal["SELECT", "DELETE", "INSERT", "ENCRYPT"],
query_id: str,
connection_id: Optional[str] = None,
) -> Dict[str, Union[int, List[Any]]]:
"""
Executes the given SQL query and returns the result.

View File

@@ -356,3 +356,8 @@ 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")