diff --git a/podman_compose.py b/podman_compose.py index 42f17c7..e3ee67b 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -680,6 +680,51 @@ def norm_ports(ports_in): return ports_out +def get_network_create_args(net_desc, proj_name, net_name): + args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + ] + # TODO: add more options here, like dns, ipv6, etc. + labels = net_desc.get("labels", None) or [] + for item in norm_as_list(labels): + args.extend(["--label", item]) + if net_desc.get("internal", None): + args.append("--internal") + driver = net_desc.get("driver", None) + if driver: + args.extend(("--driver", driver)) + driver_opts = net_desc.get("driver_opts", None) or {} + for key, value in driver_opts.items(): + args.extend(("--opt", f"{key}={value}")) + ipam = net_desc.get("ipam", None) or {} + ipam_driver = ipam.get("driver", None) + if ipam_driver: + args.extend(("--ipam-driver", ipam_driver)) + ipam_config_ls = ipam.get("config", None) or [] + if net_desc.get("enable_ipv6", None): + args.append("--ipv6") + + if is_dict(ipam_config_ls): + ipam_config_ls = [ipam_config_ls] + for ipam_config in ipam_config_ls: + subnet = ipam_config.get("subnet", None) + ip_range = ipam_config.get("ip_range", None) + gateway = ipam_config.get("gateway", None) + if subnet: + args.extend(("--subnet", subnet)) + if ip_range: + args.extend(("--ip-range", ip_range)) + if gateway: + args.extend(("--gateway", gateway)) + args.append(net_name) + + return args + + async def assert_cnt_nets(compose, cnt): """ create missing networks @@ -705,43 +750,7 @@ async def assert_cnt_nets(compose, cnt): except subprocess.CalledProcessError as e: if is_ext: raise RuntimeError(f"External network [{net_name}] does not exists") from e - args = [ - "create", - "--label", - f"io.podman.compose.project={proj_name}", - "--label", - f"com.docker.compose.project={proj_name}", - ] - # TODO: add more options here, like dns, ipv6, etc. - labels = net_desc.get("labels", None) or [] - for item in norm_as_list(labels): - args.extend(["--label", item]) - if net_desc.get("internal", None): - args.append("--internal") - driver = net_desc.get("driver", None) - if driver: - args.extend(("--driver", driver)) - driver_opts = net_desc.get("driver_opts", None) or {} - for key, value in driver_opts.items(): - args.extend(("--opt", f"{key}={value}")) - ipam = net_desc.get("ipam", None) or {} - ipam_driver = ipam.get("driver", None) - if ipam_driver: - args.extend(("--ipam-driver", ipam_driver)) - ipam_config_ls = ipam.get("config", None) or [] - if is_dict(ipam_config_ls): - ipam_config_ls = [ipam_config_ls] - for ipam_config in ipam_config_ls: - subnet = ipam_config.get("subnet", None) - ip_range = ipam_config.get("ip_range", None) - gateway = ipam_config.get("gateway", None) - if subnet: - args.extend(("--subnet", subnet)) - if ip_range: - args.extend(("--ip-range", ip_range)) - if gateway: - args.extend(("--gateway", gateway)) - args.append(net_name) + args = get_network_create_args(net_desc, proj_name, net_name) await compose.podman.output([], "network", args) await compose.podman.output([], "network", ["exists", net_name]) diff --git a/pytests/test_network_create_args.py b/pytests/test_network_create_args.py new file mode 100644 index 0000000..c2ab119 --- /dev/null +++ b/pytests/test_network_create_args.py @@ -0,0 +1,167 @@ +import unittest + +from podman_compose import get_network_create_args + + +class TestGetNetworkCreateArgs(unittest.TestCase): + def test_minimal(self): + net_desc = { + "labels": [], + "internal": False, + "driver": None, + "driver_opts": {}, + "ipam": {"config": []}, + "enable_ipv6": False, + } + proj_name = "test_project" + net_name = "test_network" + expected_args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + net_name, + ] + args = get_network_create_args(net_desc, proj_name, net_name) + self.assertEqual(args, expected_args) + + def test_ipv6(self): + net_desc = { + "labels": [], + "internal": False, + "driver": None, + "driver_opts": {}, + "ipam": {"config": []}, + "enable_ipv6": True, + } + proj_name = "test_project" + net_name = "test_network" + expected_args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + "--ipv6", + net_name, + ] + args = get_network_create_args(net_desc, proj_name, net_name) + self.assertEqual(args, expected_args) + + def test_bridge(self): + net_desc = { + "labels": [], + "internal": False, + "driver": "bridge", + "driver_opts": {"opt1": "value1", "opt2": "value2"}, + "ipam": {"config": []}, + "enable_ipv6": False, + } + proj_name = "test_project" + net_name = "test_network" + expected_args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + "--driver", + "bridge", + "--opt", + "opt1=value1", + "--opt", + "opt2=value2", + net_name, + ] + args = get_network_create_args(net_desc, proj_name, net_name) + self.assertEqual(args, expected_args) + + def test_ipam_driver(self): + net_desc = { + "labels": [], + "internal": False, + "driver": None, + "driver_opts": {}, + "ipam": { + "driver": "default", + "config": [ + { + "subnet": "192.168.0.0/24", + "ip_range": "192.168.0.2/24", + "gateway": "192.168.0.1", + } + ], + }, + } + proj_name = "test_project" + net_name = "test_network" + expected_args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + "--ipam-driver", + "default", + "--subnet", + "192.168.0.0/24", + "--ip-range", + "192.168.0.2/24", + "--gateway", + "192.168.0.1", + net_name, + ] + args = get_network_create_args(net_desc, proj_name, net_name) + self.assertEqual(args, expected_args) + + def test_complete(self): + net_desc = { + "labels": ["label1", "label2"], + "internal": True, + "driver": "bridge", + "driver_opts": {"opt1": "value1", "opt2": "value2"}, + "ipam": { + "driver": "default", + "config": [ + { + "subnet": "192.168.0.0/24", + "ip_range": "192.168.0.2/24", + "gateway": "192.168.0.1", + } + ], + }, + "enable_ipv6": True, + } + proj_name = "test_project" + net_name = "test_network" + expected_args = [ + "create", + "--label", + f"io.podman.compose.project={proj_name}", + "--label", + f"com.docker.compose.project={proj_name}", + "--label", + "label1", + "--label", + "label2", + "--internal", + "--driver", + "bridge", + "--opt", + "opt1=value1", + "--opt", + "opt2=value2", + "--ipam-driver", + "default", + "--ipv6", + "--subnet", + "192.168.0.0/24", + "--ip-range", + "192.168.0.2/24", + "--gateway", + "192.168.0.1", + net_name, + ] + args = get_network_create_args(net_desc, proj_name, net_name) + self.assertEqual(args, expected_args)