Skip to content

Commit 876d830

Browse files
authored
Merge pull request #388 from Limmen/docker_util
docker_util unit test
2 parents 2479b8e + ca60849 commit 876d830

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
from unittest.mock import patch, MagicMock
2+
from csle_common.util.docker_util import DockerUtil
3+
import csle_common.constants.constants as constants
4+
import json
5+
6+
7+
class TestDockerUtilSuite:
8+
"""
9+
Test suite for docker util
10+
"""
11+
12+
@patch("docker.from_env")
13+
@patch("docker.APIClient")
14+
@patch("csle_common.util.docker_util.DockerUtil.parse_running_containers")
15+
@patch("csle_common.util.docker_util.DockerUtil.parse_running_emulation_envs")
16+
def test_parse_running_emulation_infos(
17+
self, mock_parse_running_emulation_envs, mock_parse_running_containers, mock_APIClient, mock_from_env
18+
) -> None:
19+
"""
20+
Test method that queries docker to get a list of all running emulation environments
21+
22+
:param mock_parse_running_emulation_envs: mock_parse_running_emulation_envs
23+
:param mock_parse_running_containers: mock_parse_running_containers
24+
:param mock_APIClient: mock_APIClient
25+
:param mock_from_env: mock_from_env
26+
27+
:return: None
28+
"""
29+
mock_client_1 = MagicMock()
30+
mock_client_2 = MagicMock()
31+
mock_from_env.return_value = mock_client_1
32+
mock_APIClient.return_value = mock_client_2
33+
mock_parsed_containers = [MagicMock()]
34+
mock_parse_running_containers.return_value = mock_parsed_containers
35+
mock_parsed_envs = [MagicMock()]
36+
mock_parse_running_emulation_envs.return_value = mock_parsed_envs
37+
result = DockerUtil.parse_runnning_emulation_infos()
38+
mock_from_env.assert_called()
39+
mock_APIClient.assert_called()
40+
mock_parse_running_containers.assert_called()
41+
mock_parse_running_emulation_envs.assert_called()
42+
assert result == mock_parsed_envs
43+
44+
@patch("docker.from_env")
45+
@patch("docker.APIClient")
46+
@patch("csle_common.util.docker_util.DockerUtil.parse_running_containers")
47+
def test_get_container_hex_id(self, mock_parse_running_containers, mock_APIClient, mock_from_env) -> None:
48+
"""
49+
Test method that queries the docker engine for the id of a container with a given name
50+
51+
:param mock_parse_running_containers: mock_parse_running_containers
52+
:param mock_APIClient: mock_APIClient
53+
:param mock_from_env: mock_from_env
54+
55+
:return: None
56+
"""
57+
mock_client_1 = MagicMock()
58+
mock_client_2 = MagicMock()
59+
mock_from_env.return_value = mock_client_1
60+
mock_APIClient.return_value = mock_client_2
61+
container_1 = MagicMock()
62+
container_1.name = "container_1"
63+
container_1.id = "1"
64+
container_2 = MagicMock()
65+
container_2.name = "container_2"
66+
container_2.id = "2"
67+
mock_parse_running_containers.return_value = [container_1, container_2]
68+
result = DockerUtil.get_container_hex_id("container_1")
69+
assert result == "1"
70+
71+
@patch("csle_common.util.docker_util.DockerUtil.parse_containers")
72+
def test_parse_running_container(self, mock_parse_containers) -> None:
73+
"""
74+
Test method that queries docker to get a list of all running containers
75+
76+
:param mock_parse_containers: mock_parse_containers
77+
78+
:return: None
79+
"""
80+
mock_client_1 = MagicMock()
81+
mock_client_2 = MagicMock()
82+
container_1 = MagicMock()
83+
container_2 = MagicMock()
84+
mock_client_1.containers.list.return_value = [container_1, container_2]
85+
mock_parsed_container_1 = MagicMock()
86+
mock_parsed_container_2 = MagicMock()
87+
mock_parse_containers.return_value = [mock_parsed_container_1, mock_parsed_container_2]
88+
result = DockerUtil.parse_running_containers(client_1=mock_client_1, client_2=mock_client_2)
89+
mock_client_1.containers.list.assert_called()
90+
mock_parse_containers.assert_called()
91+
assert result == [mock_parsed_container_1, mock_parsed_container_2]
92+
93+
@patch("csle_common.util.docker_util.DockerUtil.parse_containers")
94+
def test_parse_stopped_container(self, mock_parse_containers) -> None:
95+
"""
96+
Test method that queries docker to get a list of all stopped csle containers
97+
98+
:param mock_parse_containers: mock_parse_containers
99+
100+
:return: None
101+
"""
102+
mock_client_1 = MagicMock()
103+
mock_client_2 = MagicMock()
104+
container_1 = MagicMock()
105+
container_1.status = constants.DOCKER.CONTAINER_EXIT_STATUS
106+
container_2 = MagicMock()
107+
container_2.status = constants.DOCKER.CONTAINER_CREATED_STATUS
108+
mock_client_1.containers.list.return_value = [container_1, container_2]
109+
mock_parsed_container_1 = MagicMock()
110+
mock_parsed_container_2 = MagicMock()
111+
mock_parse_containers.return_value = [mock_parsed_container_1, mock_parsed_container_2]
112+
result = DockerUtil.parse_stopped_containers(client_1=mock_client_1, client2=mock_client_2)
113+
mock_client_1.containers.list.assert_called()
114+
mock_parse_containers.assert_called()
115+
assert result == [mock_parsed_container_1, mock_parsed_container_2]
116+
117+
@patch("csle_common.metastore.metastore_facade.MetastoreFacade.get_emulation_by_name")
118+
def test_parse_running_emulation_envs(self, mock_get_emulation_by_name) -> None:
119+
"""
120+
Test method that queries docker to get a list of all active emulation environments
121+
122+
:param mock_get_emulation_by_name: mock_get_emulation_by_name
123+
124+
:return: None
125+
"""
126+
container_1 = MagicMock()
127+
container_1.emulation = "emulation1"
128+
container_1.ip = "192.168.1.2"
129+
container_1.ip_prefix_len = 24
130+
container_1.level = "level1"
131+
132+
container_2 = MagicMock()
133+
container_2.emulation = "emulation1"
134+
container_2.ip = "192.168.1.3"
135+
container_2.ip_prefix_len = 24
136+
container_2.level = "level1"
137+
138+
containers = [container_1, container_2]
139+
emulations = ["emulation1"]
140+
141+
mock_em_record = MagicMock()
142+
mock_get_emulation_by_name.return_value = mock_em_record
143+
144+
result = DockerUtil.parse_running_emulation_envs(emulations=emulations, containers=containers)
145+
mock_get_emulation_by_name.assert_called()
146+
assert result
147+
148+
@patch("docker.APIClient.inspect_container")
149+
def test_parse_containers(self, mock_inspect_container) -> None:
150+
"""
151+
Test method that queries docker to get a list of running or stopped csle containers
152+
153+
:param mock_inspect_container: mock_inspect_container
154+
155+
:return: None
156+
"""
157+
mock_client2 = MagicMock()
158+
mock_inspect_info = {
159+
constants.DOCKER.NETWORK_SETTINGS: {
160+
constants.DOCKER.NETWORKS: {
161+
"net": {
162+
constants.DOCKER.IP_ADDRESS_INFO: "192.168.1.2",
163+
constants.DOCKER.NETWORK_ID_INFO: "network_1",
164+
constants.DOCKER.GATEWAY_INFO: "192.168.1.1",
165+
constants.DOCKER.MAC_ADDRESS_INFO: "02:42:ac:11:00:02",
166+
constants.DOCKER.IP_PREFIX_LEN_INFO: 24,
167+
}
168+
}
169+
},
170+
constants.DOCKER.CREATED_INFO: "2021-01-01T00:00:00Z",
171+
constants.DOCKER.CONFIG: {constants.DOCKER.HOSTNAME_INFO: "container_1", constants.DOCKER.IMAGE: "image_1"},
172+
}
173+
mock_inspect_container.return_value = mock_inspect_info
174+
175+
container_1 = MagicMock()
176+
container_1.name = "csle_container_1-level1-1"
177+
container_1.status = "running"
178+
container_1.short_id = "1"
179+
container_1.image.short_id = "image1"
180+
container_1.image.tags = ["latest"]
181+
container_1.id = "container_id_1"
182+
container_1.labels = {
183+
constants.DOCKER.CFG: "/path/to/config",
184+
constants.DOCKER.CONTAINER_CONFIG_DIR: "/path/to/dir",
185+
constants.DOCKER.EMULATION: "emulation_1",
186+
constants.DOCKER.KAFKA_CONFIG: "kafka_config_1",
187+
}
188+
containers = [container_1]
189+
result = DockerUtil.parse_containers(containers=containers, client2=mock_client2)
190+
# mock_inspect_container.assert_called_once_with("container_id_1")
191+
assert result
192+
193+
@patch("os.popen")
194+
def test_get_docker_gw_bridge_ip(self, mock_popen) -> None:
195+
"""
196+
Test method that gets the docker gw bridge ip of a container
197+
198+
:param mock_popen: mock_popen
199+
200+
:return: None
201+
"""
202+
mock_json_output = json.dumps(
203+
[{constants.DOCKER.CONTAINERS_KEY: {"container_id_1": {constants.DOCKER.IPV4_KEY: "192.168.1.2/24"}}}]
204+
)
205+
mock_stream = MagicMock()
206+
mock_stream.read.return_value = mock_json_output
207+
mock_popen.return_value = mock_stream
208+
result = DockerUtil.get_docker_gw_bridge_ip("container_id_1")
209+
assert result == "192.168.1.2"

0 commit comments

Comments
 (0)