Skip to content

Commit d1675c5

Browse files
authored
Merge pull request #428 from Limmen/start_ids
test_start_stop snort/ossec_ids
2 parents 3442ea4 + a2b6768 commit d1675c5

9 files changed

+449
-7
lines changed

emulation-system/tests/test_start_client_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging

emulation-system/tests/test_start_elk_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging

emulation-system/tests/test_start_kafka_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging

emulation-system/tests/test_start_ossec_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging

emulation-system/tests/test_start_ryu_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging

emulation-system/tests/test_start_snort_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Any, Generator
1+
from typing import List, Any
22
import pytest
33
import docker
44
import logging
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
from typing import List, Any
2+
import pytest
3+
import docker
4+
import logging
5+
import grpc
6+
from unittest.mock import MagicMock
7+
from docker.types import IPAMConfig, IPAMPool
8+
import time
9+
from csle_common.dao.emulation_config.emulation_env_config import EmulationEnvConfig
10+
import csle_common.constants.constants as constants
11+
import csle_collector.ossec_ids_manager.ossec_ids_manager_pb2_grpc
12+
import csle_collector.ossec_ids_manager.ossec_ids_manager_pb2
13+
import csle_collector.ossec_ids_manager.query_ossec_ids_manager
14+
from csle_common.metastore.metastore_facade import MetastoreFacade
15+
from typing import Generator
16+
17+
18+
@pytest.fixture(scope="module")
19+
def docker_client() -> None:
20+
"""
21+
Initialize and Provide a Docker client instance for the test
22+
23+
:return: None
24+
"""
25+
return docker.from_env()
26+
27+
28+
@pytest.fixture(scope="module")
29+
def network(docker_client) -> Generator:
30+
"""
31+
Create a custom network with a specific subnet
32+
33+
:param docker_client: docker_client
34+
:yield: network
35+
36+
:return: Generator
37+
"""
38+
subnet = "15.15.15.0/24"
39+
ipam_pool = IPAMPool(subnet=subnet)
40+
ipam_config = IPAMConfig(pool_configs=[ipam_pool])
41+
logging.info(f"Creating virtual network with subnet: {subnet}")
42+
network = docker_client.networks.create("test_network", driver="bridge", ipam=ipam_config)
43+
yield network
44+
network.remove()
45+
46+
47+
def get_containers(docker_client) -> List[Any]:
48+
"""
49+
Get all the containers except the blank ones
50+
51+
:param docker_client: docker_client
52+
53+
:return: None
54+
"""
55+
all_images = constants.CONTAINER_IMAGES.OSSEC_IDS_IMAGES
56+
return all_images
57+
58+
59+
@pytest.fixture(scope="module", params=get_containers(docker.from_env()))
60+
def container_setup(request, docker_client, network) -> Generator:
61+
"""
62+
Starts a Docker container before running tests and ensures its stopped and removed after tests complete.
63+
64+
:param request: request
65+
:param docker_client: docker_client
66+
:yield: container
67+
68+
:return: None
69+
"""
70+
# Create and start each derived container
71+
config = MetastoreFacade.get_config(id=1)
72+
version = config.version
73+
image = request.param
74+
container = docker_client.containers.create(
75+
f"{constants.CONTAINER_IMAGES.DOCKERHUB_USERNAME}/{image}:{version}",
76+
command="sh -c 'while true; do sleep 3600; done'",
77+
detach=True,
78+
)
79+
network.connect(container)
80+
container.start()
81+
yield container
82+
logging.info(f"Stopping and removing container: {container.id} with image: {container.image.tags}")
83+
container.stop()
84+
container.remove()
85+
86+
87+
def test_start_ossec_manager(container_setup) -> None:
88+
"""
89+
Start ossec_manager in a container
90+
91+
:param container_setup: container_setup
92+
93+
:return: None
94+
"""
95+
failed_containers = []
96+
containers_info = []
97+
container_setup.reload()
98+
assert container_setup.status == "running"
99+
# Mock emulation_env_config
100+
emulation_env_config = MagicMock(spec=EmulationEnvConfig)
101+
emulation_env_config.get_connection.return_value = MagicMock()
102+
emulation_env_config.ossec_ids_manager_config = MagicMock()
103+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port = 50051
104+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_log_dir = "/var/log/ossec"
105+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_log_file = "ossec.log"
106+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_max_workers = 4
107+
108+
ip = container_setup.attrs[constants.DOCKER.NETWORK_SETTINGS][constants.DOCKER.IP_ADDRESS_INFO]
109+
port = emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port
110+
try:
111+
# Start host_manager command
112+
cmd = (
113+
f"/root/miniconda3/bin/python3 /ossec_ids_manager.py "
114+
f"--port {emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port} "
115+
f"--logdir {emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_log_dir} "
116+
f"--logfile {emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_log_file} "
117+
f"--maxworkers {emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_max_workers}"
118+
)
119+
# Run cmd in the container
120+
logging.info(
121+
f"Starting ossec manager in container: {container_setup.id} " f"with image: {container_setup.image.tags}"
122+
)
123+
container_setup.exec_run(cmd, detach=True)
124+
# Check if ossec_manager starts
125+
cmd = (
126+
f"sh -c '{constants.COMMANDS.PS_AUX} | {constants.COMMANDS.GREP} "
127+
f"{constants.COMMANDS.SPACE_DELIM}{constants.TRAFFIC_COMMANDS.OSSEC_IDS_MANAGER_FILE_NAME}'"
128+
)
129+
logging.info(
130+
f"Verifying that ossec manager is running in container: {container_setup.id} "
131+
f"with image: {container_setup.image.tags}"
132+
)
133+
result = container_setup.exec_run(cmd)
134+
output = result.output.decode("utf-8")
135+
assert constants.COMMANDS.SEARCH_OSSEC_IDS_MANAGER in output, "ossec manager is not running in the container"
136+
time.sleep(5)
137+
# Call grpc
138+
with grpc.insecure_channel(f"{ip}:{port}", options=constants.GRPC_SERVERS.GRPC_OPTIONS) as channel:
139+
stub = csle_collector.ossec_ids_manager.ossec_ids_manager_pb2_grpc.OSSECIdsManagerStub(channel)
140+
status = csle_collector.ossec_ids_manager.query_ossec_ids_manager.get_ossec_ids_monitor_status(stub=stub)
141+
assert status
142+
except Exception as e:
143+
print(f"Error occurred in container {container_setup.name}: {e}")
144+
failed_containers.append(container_setup.name)
145+
containers_info.append(
146+
{
147+
"container_status": container_setup.status,
148+
"container_image": container_setup.image.tags,
149+
"name": container_setup.name,
150+
"error": str(e),
151+
}
152+
)
153+
if failed_containers:
154+
logging.info("Containers that failed to start the ossec manager:")
155+
logging.info(containers_info)
156+
assert not failed_containers, f"T{failed_containers} failed"
157+
158+
159+
def test_start_ossec_ids(container_setup) -> None:
160+
"""
161+
Start ossec_ids in a container
162+
163+
:param container_setup: container_setup
164+
165+
:return: None
166+
"""
167+
emulation_env_config = MagicMock()
168+
emulation_env_config.ossec_ids_manager_config = MagicMock()
169+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port = 50051
170+
emulation_env_config.execution_id = "1"
171+
emulation_env_config.level = "2"
172+
173+
logger = logging.getLogger("test_logger")
174+
ip = container_setup.attrs[constants.DOCKER.NETWORK_SETTINGS][constants.DOCKER.IP_ADDRESS_INFO]
175+
port = emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port
176+
logger.debug(f"Attempting to connect to gRPC server at {ip}:{port}")
177+
# gRPC call
178+
try:
179+
with grpc.insecure_channel(f'{ip}:{port}', options=constants.GRPC_SERVERS.GRPC_OPTIONS) as channel:
180+
stub = csle_collector.ossec_ids_manager.ossec_ids_manager_pb2_grpc.OSSECIdsManagerStub(channel)
181+
response = csle_collector.ossec_ids_manager.query_ossec_ids_manager.start_ossec_ids(
182+
stub=stub
183+
)
184+
logger.info(f"gRPC Response: {response}")
185+
assert response, f"Failed to start ossec IDS on {ip}. Response: {response}"
186+
except grpc.RpcError as e:
187+
logger.error(f"gRPC Error: {e}")
188+
assert False, f"gRPC call failed with error: {e}"
189+
190+
191+
def test_stop_ossec_ids(container_setup) -> None:
192+
"""
193+
Stop ossec_ids in a container
194+
195+
:param container_setup: container_setup
196+
197+
:return: None
198+
"""
199+
emulation_env_config = MagicMock()
200+
emulation_env_config.ossec_ids_manager_config = MagicMock()
201+
emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port = 50051
202+
emulation_env_config.execution_id = "1"
203+
emulation_env_config.level = "2"
204+
logger = logging.getLogger("test_logger")
205+
ip = container_setup.attrs[constants.DOCKER.NETWORK_SETTINGS][constants.DOCKER.IP_ADDRESS_INFO]
206+
port = emulation_env_config.ossec_ids_manager_config.ossec_ids_manager_port
207+
logger.debug(f"Attempting to connect to gRPC server at {ip}:{port}")
208+
# gRPC call
209+
try:
210+
with grpc.insecure_channel(f'{ip}:{port}', options=constants.GRPC_SERVERS.GRPC_OPTIONS) as channel:
211+
stub = csle_collector.ossec_ids_manager.ossec_ids_manager_pb2_grpc.OSSECIdsManagerStub(channel)
212+
response = csle_collector.ossec_ids_manager.query_ossec_ids_manager.stop_ossec_ids(
213+
stub=stub
214+
)
215+
logger.info(f"gRPC Response: {response}")
216+
assert response, f"Failed to stop IDS on {ip}. Response: {response}"
217+
except grpc.RpcError as e:
218+
logger.error(f"gRPC Error: {e}")
219+
assert False, f"gRPC call failed with error: {e}"

0 commit comments

Comments
 (0)