Skip to content

Commit 04b12e0

Browse files
authored
Merge pull request #1264 from p12tic/network-routes
Add support to set --route of podman network create
2 parents 87d065d + 8113a16 commit 04b12e0

File tree

4 files changed

+96
-77
lines changed

4 files changed

+96
-77
lines changed

docs/Extensions.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ For explanations of these extensions, please refer to the [podman-run --volume d
4747

4848
The following extension keys are available under network configuration:
4949

50-
* `x-podman.disable-dns` - Disable the DNS plugin for the network when set to 'true'.
51-
* `x-podman.dns` - Set nameservers for the network using supplied addresses (cannot be used with x-podman.disable-dns`).
50+
* `x-podman.disable_dns` - Disable the DNS plugin for the network when set to 'true'.
51+
* `x-podman.dns` - Specifies a list of nameservers for the network This cannot be used with x-podman.disable_dns`.
5252

5353
For example, the following docker-compose.yml allows all containers on the same network to use the
5454
specified nameservers:
@@ -61,6 +61,19 @@ network:
6161
- "10.1.2.4"
6262
```
6363

64+
* `x-podman.routes` - Specifies a list of additional routes for the network. This corresponds to
65+
`--route` option in `podman network create`.
66+
67+
For example, the following docker-compose.yml blocks network connectivity to specified subnet from
68+
all containers on the network:
69+
```yml
70+
version: "3"
71+
network:
72+
my_network:
73+
x-podman.routes:
74+
- "10.2.3.4,127.0.0.1"
75+
```
76+
6477
For explanations of these extensions, please refer to the
6578
[Podman network create command Documentation](https://docs.podman.io/en/latest/markdown/podman-network-create.1.html).
6679

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Added support to set `--route` option to `podman network create` via
2+
`x-podman.routes` key on network configuration.

podman_compose.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,10 @@ def get_network_create_args(net_desc: dict[str, Any], proj_name: str, net_name:
898898
"--dns",
899899
",".join(norm_as_list(net_desc.get("x-podman.dns"))),
900900
))
901+
if net_desc.get("x-podman.routes"):
902+
routes = norm_as_list(net_desc.get("x-podman.routes"))
903+
for route in routes:
904+
args.extend(["--route", route])
901905

902906
if isinstance(ipam_config_ls, dict):
903907
ipam_config_ls = [ipam_config_ls]

tests/unit/test_get_network_create_args.py

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
import unittest
2+
from typing import Any
23

34
from podman_compose import get_network_create_args
45

56

67
class TestGetNetworkCreateArgs(unittest.TestCase):
7-
def test_minimal(self) -> None:
8-
net_desc = {
8+
def get_minimal_net_desc(self) -> dict[str, Any]:
9+
return {
910
"labels": [],
1011
"internal": False,
1112
"driver": None,
1213
"driver_opts": {},
1314
"ipam": {"config": []},
1415
"enable_ipv6": False,
1516
}
17+
18+
def test_minimal(self) -> None:
19+
net_desc = self.get_minimal_net_desc()
1620
proj_name = "test_project"
1721
net_name = "test_network"
1822
expected_args = [
@@ -27,14 +31,8 @@ def test_minimal(self) -> None:
2731
self.assertEqual(args, expected_args)
2832

2933
def test_ipv6(self) -> None:
30-
net_desc = {
31-
"labels": [],
32-
"internal": False,
33-
"driver": None,
34-
"driver_opts": {},
35-
"ipam": {"config": []},
36-
"enable_ipv6": True,
37-
}
34+
net_desc = self.get_minimal_net_desc()
35+
net_desc["enable_ipv6"] = True
3836
proj_name = "test_project"
3937
net_name = "test_network"
4038
expected_args = [
@@ -50,14 +48,9 @@ def test_ipv6(self) -> None:
5048
self.assertEqual(args, expected_args)
5149

5250
def test_bridge(self) -> None:
53-
net_desc = {
54-
"labels": [],
55-
"internal": False,
56-
"driver": "bridge",
57-
"driver_opts": {"opt1": "value1", "opt2": "value2"},
58-
"ipam": {"config": []},
59-
"enable_ipv6": False,
60-
}
51+
net_desc = self.get_minimal_net_desc()
52+
net_desc["driver"] = "bridge"
53+
net_desc["driver_opts"] = {"opt1": "value1", "opt2": "value2"}
6154
proj_name = "test_project"
6255
net_name = "test_network"
6356
expected_args = [
@@ -78,21 +71,16 @@ def test_bridge(self) -> None:
7871
self.assertEqual(args, expected_args)
7972

8073
def test_ipam_driver_default(self) -> None:
81-
net_desc = {
82-
"labels": [],
83-
"internal": False,
84-
"driver": None,
85-
"driver_opts": {},
86-
"ipam": {
87-
"driver": "default",
88-
"config": [
89-
{
90-
"subnet": "192.168.0.0/24",
91-
"ip_range": "192.168.0.2/24",
92-
"gateway": "192.168.0.1",
93-
}
94-
],
95-
},
74+
net_desc = self.get_minimal_net_desc()
75+
net_desc["ipam"] = {
76+
"driver": "default",
77+
"config": [
78+
{
79+
"subnet": "192.168.0.0/24",
80+
"ip_range": "192.168.0.2/24",
81+
"gateway": "192.168.0.1",
82+
}
83+
],
9684
}
9785
proj_name = "test_project"
9886
net_name = "test_network"
@@ -114,21 +102,16 @@ def test_ipam_driver_default(self) -> None:
114102
self.assertEqual(args, expected_args)
115103

116104
def test_ipam_driver(self) -> None:
117-
net_desc = {
118-
"labels": [],
119-
"internal": False,
120-
"driver": None,
121-
"driver_opts": {},
122-
"ipam": {
123-
"driver": "someipamdriver",
124-
"config": [
125-
{
126-
"subnet": "192.168.0.0/24",
127-
"ip_range": "192.168.0.2/24",
128-
"gateway": "192.168.0.1",
129-
}
130-
],
131-
},
105+
net_desc = self.get_minimal_net_desc()
106+
net_desc["ipam"] = {
107+
"driver": "someipamdriver",
108+
"config": [
109+
{
110+
"subnet": "192.168.0.0/24",
111+
"ip_range": "192.168.0.2/24",
112+
"gateway": "192.168.0.1",
113+
}
114+
],
132115
}
133116
proj_name = "test_project"
134117
net_name = "test_network"
@@ -203,15 +186,8 @@ def test_complete(self) -> None:
203186
self.assertEqual(args, expected_args)
204187

205188
def test_disable_dns(self) -> None:
206-
net_desc = {
207-
"labels": [],
208-
"internal": False,
209-
"driver": None,
210-
"driver_opts": {},
211-
"ipam": {"config": []},
212-
"enable_ipv6": False,
213-
"x-podman.disable_dns": True,
214-
}
189+
net_desc = self.get_minimal_net_desc()
190+
net_desc["x-podman.disable_dns"] = True
215191
proj_name = "test_project"
216192
net_name = "test_network"
217193
expected_args = [
@@ -227,15 +203,8 @@ def test_disable_dns(self) -> None:
227203
self.assertEqual(args, expected_args)
228204

229205
def test_dns_string(self) -> None:
230-
net_desc = {
231-
"labels": [],
232-
"internal": False,
233-
"driver": None,
234-
"driver_opts": {},
235-
"ipam": {"config": []},
236-
"enable_ipv6": False,
237-
"x-podman.dns": "192.168.1.2",
238-
}
206+
net_desc = self.get_minimal_net_desc()
207+
net_desc["x-podman.dns"] = "192.168.1.2"
239208
proj_name = "test_project"
240209
net_name = "test_network"
241210
expected_args = [
@@ -252,15 +221,8 @@ def test_dns_string(self) -> None:
252221
self.assertEqual(args, expected_args)
253222

254223
def test_dns_list(self) -> None:
255-
net_desc = {
256-
"labels": [],
257-
"internal": False,
258-
"driver": None,
259-
"driver_opts": {},
260-
"ipam": {"config": []},
261-
"enable_ipv6": False,
262-
"x-podman.dns": ["192.168.1.2", "192.168.1.3"],
263-
}
224+
net_desc = self.get_minimal_net_desc()
225+
net_desc["x-podman.dns"] = ["192.168.1.2", "192.168.1.3"]
264226
proj_name = "test_project"
265227
net_name = "test_network"
266228
expected_args = [
@@ -275,3 +237,41 @@ def test_dns_list(self) -> None:
275237
]
276238
args = get_network_create_args(net_desc, proj_name, net_name)
277239
self.assertEqual(args, expected_args)
240+
241+
def test_routes_string(self) -> None:
242+
net_desc = self.get_minimal_net_desc()
243+
net_desc["x-podman.routes"] = "192.168.1.0/24"
244+
proj_name = "test_project"
245+
net_name = "test_network"
246+
expected_args = [
247+
"create",
248+
"--label",
249+
f"io.podman.compose.project={proj_name}",
250+
"--label",
251+
f"com.docker.compose.project={proj_name}",
252+
"--route",
253+
"192.168.1.0/24",
254+
net_name,
255+
]
256+
args = get_network_create_args(net_desc, proj_name, net_name)
257+
self.assertEqual(args, expected_args)
258+
259+
def test_routes_list(self) -> None:
260+
net_desc = self.get_minimal_net_desc()
261+
net_desc["x-podman.routes"] = ["192.168.1.0/24", "192.168.2.0/24"]
262+
proj_name = "test_project"
263+
net_name = "test_network"
264+
expected_args = [
265+
"create",
266+
"--label",
267+
f"io.podman.compose.project={proj_name}",
268+
"--label",
269+
f"com.docker.compose.project={proj_name}",
270+
"--route",
271+
"192.168.1.0/24",
272+
"--route",
273+
"192.168.2.0/24",
274+
net_name,
275+
]
276+
args = get_network_create_args(net_desc, proj_name, net_name)
277+
self.assertEqual(args, expected_args)

0 commit comments

Comments
 (0)