2023-09-06 22:01:51 +01:00
|
|
|
from ipaddress import IPv4Address
|
2023-12-08 17:07:57 +00:00
|
|
|
from typing import Tuple
|
2023-08-29 13:21:34 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
import pytest
|
|
|
|
|
|
2024-02-07 23:05:34 +00:00
|
|
|
from primaite.simulator.network.container import Network
|
|
|
|
|
from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState
|
|
|
|
|
from primaite.simulator.network.hardware.nodes.host.computer import Computer
|
2024-02-05 08:44:10 +00:00
|
|
|
from primaite.simulator.network.hardware.nodes.host.server import Server
|
2023-09-08 16:50:49 +01:00
|
|
|
from primaite.simulator.system.applications.database_client import DatabaseClient
|
2023-09-18 14:20:19 +01:00
|
|
|
from primaite.simulator.system.services.database.database_service import DatabaseService
|
2023-09-28 12:23:49 +01:00
|
|
|
from primaite.simulator.system.services.ftp.ftp_server import FTPServer
|
2023-11-23 21:48:11 +00:00
|
|
|
from primaite.simulator.system.services.service import ServiceOperatingState
|
2023-08-29 13:21:34 +01:00
|
|
|
|
2023-08-29 14:15:49 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
@pytest.fixture(scope="function")
|
2024-02-07 23:05:34 +00:00
|
|
|
def peer_to_peer() -> Tuple[Computer, Computer]:
|
|
|
|
|
network = Network()
|
2024-02-08 10:53:30 +00:00
|
|
|
node_a = Computer(hostname="node_a", ip_address="192.168.0.10", subnet_mask="255.255.255.0", start_up_duration=0)
|
2024-02-07 23:05:34 +00:00
|
|
|
node_a.power_on()
|
2023-12-08 17:07:57 +00:00
|
|
|
node_a.software_manager.get_open_ports()
|
2023-09-08 16:50:49 +01:00
|
|
|
|
2024-02-08 10:53:30 +00:00
|
|
|
node_b = Computer(hostname="node_b", ip_address="192.168.0.11", subnet_mask="255.255.255.0", start_up_duration=0)
|
2024-02-07 23:05:34 +00:00
|
|
|
node_b.power_on()
|
|
|
|
|
network.connect(node_a.network_interface[1], node_b.network_interface[1])
|
2023-08-29 14:15:49 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
assert node_a.ping("192.168.0.11")
|
2023-08-29 14:15:49 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
node_a.software_manager.install(DatabaseClient)
|
|
|
|
|
node_a.software_manager.software["DatabaseClient"].configure(server_ip_address=IPv4Address("192.168.0.11"))
|
|
|
|
|
node_a.software_manager.software["DatabaseClient"].run()
|
2023-09-06 22:01:51 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
node_b.software_manager.install(DatabaseService)
|
|
|
|
|
database_service: DatabaseService = node_b.software_manager.software["DatabaseService"] # noqa
|
|
|
|
|
database_service.start()
|
|
|
|
|
return node_a, node_b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
2024-02-07 23:05:34 +00:00
|
|
|
def peer_to_peer_secure_db(peer_to_peer) -> Tuple[Computer, Computer]:
|
|
|
|
|
node_a, node_b = peer_to_peer
|
2023-12-08 17:07:57 +00:00
|
|
|
|
|
|
|
|
database_service: DatabaseService = node_b.software_manager.software["DatabaseService"] # noqa
|
2024-02-07 23:05:34 +00:00
|
|
|
database_service.stop()
|
2023-12-08 17:07:57 +00:00
|
|
|
database_service.password = "12345"
|
|
|
|
|
database_service.start()
|
|
|
|
|
return node_a, node_b
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
|
|
|
|
|
def test_database_client_server_connection(peer_to_peer):
|
|
|
|
|
node_a, node_b = peer_to_peer
|
|
|
|
|
|
|
|
|
|
db_client: DatabaseClient = node_a.software_manager.software["DatabaseClient"]
|
|
|
|
|
|
|
|
|
|
db_service: DatabaseService = node_b.software_manager.software["DatabaseService"]
|
|
|
|
|
|
|
|
|
|
db_client.connect()
|
|
|
|
|
assert len(db_client.connections) == 1
|
|
|
|
|
assert len(db_service.connections) == 1
|
2023-09-11 16:15:03 +01:00
|
|
|
|
|
|
|
|
db_client.disconnect()
|
2023-12-08 17:07:57 +00:00
|
|
|
assert len(db_client.connections) == 0
|
|
|
|
|
assert len(db_service.connections) == 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_database_client_server_correct_password(peer_to_peer_secure_db):
|
|
|
|
|
node_a, node_b = peer_to_peer_secure_db
|
2023-09-11 16:15:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_client: DatabaseClient = node_a.software_manager.software["DatabaseClient"]
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_service: DatabaseService = node_b.software_manager.software["DatabaseService"]
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_client.configure(server_ip_address=IPv4Address("192.168.0.11"), server_password="12345")
|
|
|
|
|
db_client.connect()
|
|
|
|
|
assert len(db_client.connections) == 1
|
2023-09-11 11:31:03 +01:00
|
|
|
assert len(db_service.connections) == 1
|
|
|
|
|
|
|
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
def test_database_client_server_incorrect_password(peer_to_peer_secure_db):
|
|
|
|
|
node_a, node_b = peer_to_peer_secure_db
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_client: DatabaseClient = node_a.software_manager.software["DatabaseClient"]
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_service: DatabaseService = node_b.software_manager.software["DatabaseService"]
|
|
|
|
|
|
|
|
|
|
# should fail
|
|
|
|
|
db_client.connect()
|
|
|
|
|
assert len(db_client.connections) == 0
|
|
|
|
|
assert len(db_service.connections) == 0
|
2023-09-11 11:31:03 +01:00
|
|
|
|
2023-12-08 17:07:57 +00:00
|
|
|
db_client.configure(server_ip_address=IPv4Address("192.168.0.11"), server_password="wrongpass")
|
|
|
|
|
db_client.connect()
|
|
|
|
|
assert len(db_client.connections) == 0
|
2023-09-11 11:31:03 +01:00
|
|
|
assert len(db_service.connections) == 0
|
|
|
|
|
|
|
|
|
|
|
2023-09-08 16:50:49 +01:00
|
|
|
def test_database_client_query(uc2_network):
|
|
|
|
|
"""Tests DB query across the network returns HTTP status 200 and date."""
|
|
|
|
|
web_server: Server = uc2_network.get_node_by_hostname("web_server")
|
2023-12-08 17:07:57 +00:00
|
|
|
db_client: DatabaseClient = web_server.software_manager.software["DatabaseClient"]
|
|
|
|
|
db_client.connect()
|
2023-09-08 16:50:49 +01:00
|
|
|
|
2023-11-18 03:40:08 +00:00
|
|
|
assert db_client.query("SELECT")
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_create_database_backup(uc2_network):
|
|
|
|
|
"""Run the backup_database method and check if the FTP server has the relevant file."""
|
|
|
|
|
db_server: Server = uc2_network.get_node_by_hostname("database_server")
|
2023-12-08 17:07:57 +00:00
|
|
|
db_service: DatabaseService = db_server.software_manager.software["DatabaseService"]
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
# back up should be created
|
2023-10-02 12:14:59 +01:00
|
|
|
assert db_service.backup_database() is True
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
backup_server: Server = uc2_network.get_node_by_hostname("backup_server")
|
2023-12-08 17:07:57 +00:00
|
|
|
ftp_server: FTPServer = backup_server.software_manager.software["FTPServer"]
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
# backup file should exist in the backup server
|
2023-10-02 12:14:59 +01:00
|
|
|
assert ftp_server.file_system.get_file(folder_name=db_service.uuid, file_name="database.db") is not None
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_restore_backup(uc2_network):
|
|
|
|
|
"""Run the restore_backup method and check if the backup is properly restored."""
|
|
|
|
|
db_server: Server = uc2_network.get_node_by_hostname("database_server")
|
2023-12-08 17:07:57 +00:00
|
|
|
db_service: DatabaseService = db_server.software_manager.software["DatabaseService"]
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
# create a back up
|
2023-10-02 12:14:59 +01:00
|
|
|
assert db_service.backup_database() is True
|
|
|
|
|
|
|
|
|
|
# delete database locally
|
|
|
|
|
db_service.file_system.delete_file(folder_name="database", file_name="database.db")
|
|
|
|
|
|
|
|
|
|
assert db_service.file_system.get_file(folder_name="database", file_name="database.db") is None
|
2023-09-28 12:23:49 +01:00
|
|
|
|
|
|
|
|
# back up should be restored
|
2023-10-02 12:14:59 +01:00
|
|
|
assert db_service.restore_backup() is True
|
|
|
|
|
|
|
|
|
|
assert db_service.file_system.get_file(folder_name="database", file_name="database.db") is not None
|
2023-11-23 21:48:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_database_client_cannot_query_offline_database_server(uc2_network):
|
|
|
|
|
"""Tests DB query across the network returns HTTP status 404 when db server is offline."""
|
|
|
|
|
db_server: Server = uc2_network.get_node_by_hostname("database_server")
|
2023-11-30 13:49:37 +00:00
|
|
|
db_service: DatabaseService = db_server.software_manager.software.get("DatabaseService")
|
2023-11-23 21:48:11 +00:00
|
|
|
|
|
|
|
|
assert db_server.operating_state is NodeOperatingState.ON
|
|
|
|
|
assert db_service.operating_state is ServiceOperatingState.RUNNING
|
|
|
|
|
|
|
|
|
|
web_server: Server = uc2_network.get_node_by_hostname("web_server")
|
2023-11-30 13:49:37 +00:00
|
|
|
db_client: DatabaseClient = web_server.software_manager.software.get("DatabaseClient")
|
2023-12-08 17:07:57 +00:00
|
|
|
assert len(db_client.connections)
|
2023-11-23 21:48:11 +00:00
|
|
|
|
|
|
|
|
assert db_client.query("SELECT") is True
|
|
|
|
|
|
|
|
|
|
db_server.power_off()
|
|
|
|
|
|
|
|
|
|
for i in range(db_server.shut_down_duration + 1):
|
|
|
|
|
uc2_network.apply_timestep(timestep=i)
|
|
|
|
|
|
|
|
|
|
assert db_server.operating_state is NodeOperatingState.OFF
|
|
|
|
|
assert db_service.operating_state is ServiceOperatingState.STOPPED
|
|
|
|
|
|
|
|
|
|
assert db_client.query("SELECT") is False
|