Skip to content

Commit 121b5f6

Browse files
authored
Merge pull request #749 from maxi0604/more-network-options
Add support for enable_ipv6
2 parents 970e4ac + 969edb8 commit 121b5f6

File tree

2 files changed

+213
-37
lines changed

2 files changed

+213
-37
lines changed

podman_compose.py

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,51 @@ def norm_ports(ports_in):
680680
return ports_out
681681

682682

683+
def get_network_create_args(net_desc, proj_name, net_name):
684+
args = [
685+
"create",
686+
"--label",
687+
f"io.podman.compose.project={proj_name}",
688+
"--label",
689+
f"com.docker.compose.project={proj_name}",
690+
]
691+
# TODO: add more options here, like dns, ipv6, etc.
692+
labels = net_desc.get("labels", None) or []
693+
for item in norm_as_list(labels):
694+
args.extend(["--label", item])
695+
if net_desc.get("internal", None):
696+
args.append("--internal")
697+
driver = net_desc.get("driver", None)
698+
if driver:
699+
args.extend(("--driver", driver))
700+
driver_opts = net_desc.get("driver_opts", None) or {}
701+
for key, value in driver_opts.items():
702+
args.extend(("--opt", f"{key}={value}"))
703+
ipam = net_desc.get("ipam", None) or {}
704+
ipam_driver = ipam.get("driver", None)
705+
if ipam_driver:
706+
args.extend(("--ipam-driver", ipam_driver))
707+
ipam_config_ls = ipam.get("config", None) or []
708+
if net_desc.get("enable_ipv6", None):
709+
args.append("--ipv6")
710+
711+
if is_dict(ipam_config_ls):
712+
ipam_config_ls = [ipam_config_ls]
713+
for ipam_config in ipam_config_ls:
714+
subnet = ipam_config.get("subnet", None)
715+
ip_range = ipam_config.get("ip_range", None)
716+
gateway = ipam_config.get("gateway", None)
717+
if subnet:
718+
args.extend(("--subnet", subnet))
719+
if ip_range:
720+
args.extend(("--ip-range", ip_range))
721+
if gateway:
722+
args.extend(("--gateway", gateway))
723+
args.append(net_name)
724+
725+
return args
726+
727+
683728
async def assert_cnt_nets(compose, cnt):
684729
"""
685730
create missing networks
@@ -705,43 +750,7 @@ async def assert_cnt_nets(compose, cnt):
705750
except subprocess.CalledProcessError as e:
706751
if is_ext:
707752
raise RuntimeError(f"External network [{net_name}] does not exists") from e
708-
args = [
709-
"create",
710-
"--label",
711-
f"io.podman.compose.project={proj_name}",
712-
"--label",
713-
f"com.docker.compose.project={proj_name}",
714-
]
715-
# TODO: add more options here, like dns, ipv6, etc.
716-
labels = net_desc.get("labels", None) or []
717-
for item in norm_as_list(labels):
718-
args.extend(["--label", item])
719-
if net_desc.get("internal", None):
720-
args.append("--internal")
721-
driver = net_desc.get("driver", None)
722-
if driver:
723-
args.extend(("--driver", driver))
724-
driver_opts = net_desc.get("driver_opts", None) or {}
725-
for key, value in driver_opts.items():
726-
args.extend(("--opt", f"{key}={value}"))
727-
ipam = net_desc.get("ipam", None) or {}
728-
ipam_driver = ipam.get("driver", None)
729-
if ipam_driver:
730-
args.extend(("--ipam-driver", ipam_driver))
731-
ipam_config_ls = ipam.get("config", None) or []
732-
if is_dict(ipam_config_ls):
733-
ipam_config_ls = [ipam_config_ls]
734-
for ipam_config in ipam_config_ls:
735-
subnet = ipam_config.get("subnet", None)
736-
ip_range = ipam_config.get("ip_range", None)
737-
gateway = ipam_config.get("gateway", None)
738-
if subnet:
739-
args.extend(("--subnet", subnet))
740-
if ip_range:
741-
args.extend(("--ip-range", ip_range))
742-
if gateway:
743-
args.extend(("--gateway", gateway))
744-
args.append(net_name)
753+
args = get_network_create_args(net_desc, proj_name, net_name)
745754
await compose.podman.output([], "network", args)
746755
await compose.podman.output([], "network", ["exists", net_name])
747756

pytests/test_network_create_args.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
import unittest
2+
3+
from podman_compose import get_network_create_args
4+
5+
6+
class TestGetNetworkCreateArgs(unittest.TestCase):
7+
def test_minimal(self):
8+
net_desc = {
9+
"labels": [],
10+
"internal": False,
11+
"driver": None,
12+
"driver_opts": {},
13+
"ipam": {"config": []},
14+
"enable_ipv6": False,
15+
}
16+
proj_name = "test_project"
17+
net_name = "test_network"
18+
expected_args = [
19+
"create",
20+
"--label",
21+
f"io.podman.compose.project={proj_name}",
22+
"--label",
23+
f"com.docker.compose.project={proj_name}",
24+
net_name,
25+
]
26+
args = get_network_create_args(net_desc, proj_name, net_name)
27+
self.assertEqual(args, expected_args)
28+
29+
def test_ipv6(self):
30+
net_desc = {
31+
"labels": [],
32+
"internal": False,
33+
"driver": None,
34+
"driver_opts": {},
35+
"ipam": {"config": []},
36+
"enable_ipv6": True,
37+
}
38+
proj_name = "test_project"
39+
net_name = "test_network"
40+
expected_args = [
41+
"create",
42+
"--label",
43+
f"io.podman.compose.project={proj_name}",
44+
"--label",
45+
f"com.docker.compose.project={proj_name}",
46+
"--ipv6",
47+
net_name,
48+
]
49+
args = get_network_create_args(net_desc, proj_name, net_name)
50+
self.assertEqual(args, expected_args)
51+
52+
def test_bridge(self):
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+
}
61+
proj_name = "test_project"
62+
net_name = "test_network"
63+
expected_args = [
64+
"create",
65+
"--label",
66+
f"io.podman.compose.project={proj_name}",
67+
"--label",
68+
f"com.docker.compose.project={proj_name}",
69+
"--driver",
70+
"bridge",
71+
"--opt",
72+
"opt1=value1",
73+
"--opt",
74+
"opt2=value2",
75+
net_name,
76+
]
77+
args = get_network_create_args(net_desc, proj_name, net_name)
78+
self.assertEqual(args, expected_args)
79+
80+
def test_ipam_driver(self):
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+
},
96+
}
97+
proj_name = "test_project"
98+
net_name = "test_network"
99+
expected_args = [
100+
"create",
101+
"--label",
102+
f"io.podman.compose.project={proj_name}",
103+
"--label",
104+
f"com.docker.compose.project={proj_name}",
105+
"--ipam-driver",
106+
"default",
107+
"--subnet",
108+
"192.168.0.0/24",
109+
"--ip-range",
110+
"192.168.0.2/24",
111+
"--gateway",
112+
"192.168.0.1",
113+
net_name,
114+
]
115+
args = get_network_create_args(net_desc, proj_name, net_name)
116+
self.assertEqual(args, expected_args)
117+
118+
def test_complete(self):
119+
net_desc = {
120+
"labels": ["label1", "label2"],
121+
"internal": True,
122+
"driver": "bridge",
123+
"driver_opts": {"opt1": "value1", "opt2": "value2"},
124+
"ipam": {
125+
"driver": "default",
126+
"config": [
127+
{
128+
"subnet": "192.168.0.0/24",
129+
"ip_range": "192.168.0.2/24",
130+
"gateway": "192.168.0.1",
131+
}
132+
],
133+
},
134+
"enable_ipv6": True,
135+
}
136+
proj_name = "test_project"
137+
net_name = "test_network"
138+
expected_args = [
139+
"create",
140+
"--label",
141+
f"io.podman.compose.project={proj_name}",
142+
"--label",
143+
f"com.docker.compose.project={proj_name}",
144+
"--label",
145+
"label1",
146+
"--label",
147+
"label2",
148+
"--internal",
149+
"--driver",
150+
"bridge",
151+
"--opt",
152+
"opt1=value1",
153+
"--opt",
154+
"opt2=value2",
155+
"--ipam-driver",
156+
"default",
157+
"--ipv6",
158+
"--subnet",
159+
"192.168.0.0/24",
160+
"--ip-range",
161+
"192.168.0.2/24",
162+
"--gateway",
163+
"192.168.0.1",
164+
net_name,
165+
]
166+
args = get_network_create_args(net_desc, proj_name, net_name)
167+
self.assertEqual(args, expected_args)

0 commit comments

Comments
 (0)