Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions docs/Extensions.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ For explanations of these extensions, please refer to the [podman-run --volume d

The following extension keys are available under network configuration:

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

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

* `x-podman.routes` - Specifies a list of additional routes for the network. This corresponds to
`--route` option in `podman network create`.

For example, the following docker-compose.yml blocks network connectivity to specified subnet from
all containers on the network:
```yml
version: "3"
network:
my_network:
x-podman.routes:
- "10.2.3.4,127.0.0.1"
```

For explanations of these extensions, please refer to the
[Podman network create command Documentation](https://docs.podman.io/en/latest/markdown/podman-network-create.1.html).

Expand Down
2 changes: 2 additions & 0 deletions newsfragments/x-podman-network-routes.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Added support to set `--route` option to `podman network create` via
`x-podman.routes` key on network configuration.
4 changes: 4 additions & 0 deletions podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,10 @@ def get_network_create_args(net_desc: dict[str, Any], proj_name: str, net_name:
"--dns",
",".join(norm_as_list(net_desc.get("x-podman.dns"))),
))
if net_desc.get("x-podman.routes"):
routes = norm_as_list(net_desc.get("x-podman.routes"))
for route in routes:
args.extend(["--route", route])

if isinstance(ipam_config_ls, dict):
ipam_config_ls = [ipam_config_ls]
Expand Down
150 changes: 75 additions & 75 deletions tests/unit/test_get_network_create_args.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
import unittest
from typing import Any

from podman_compose import get_network_create_args


class TestGetNetworkCreateArgs(unittest.TestCase):
def test_minimal(self) -> None:
net_desc = {
def get_minimal_net_desc(self) -> dict[str, Any]:
return {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {"config": []},
"enable_ipv6": False,
}

def test_minimal(self) -> None:
net_desc = self.get_minimal_net_desc()
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -27,14 +31,8 @@ def test_minimal(self) -> None:
self.assertEqual(args, expected_args)

def test_ipv6(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {"config": []},
"enable_ipv6": True,
}
net_desc = self.get_minimal_net_desc()
net_desc["enable_ipv6"] = True
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -50,14 +48,9 @@ def test_ipv6(self) -> None:
self.assertEqual(args, expected_args)

def test_bridge(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": "bridge",
"driver_opts": {"opt1": "value1", "opt2": "value2"},
"ipam": {"config": []},
"enable_ipv6": False,
}
net_desc = self.get_minimal_net_desc()
net_desc["driver"] = "bridge"
net_desc["driver_opts"] = {"opt1": "value1", "opt2": "value2"}
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -78,21 +71,16 @@ def test_bridge(self) -> None:
self.assertEqual(args, expected_args)

def test_ipam_driver_default(self) -> None:
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",
}
],
},
net_desc = self.get_minimal_net_desc()
net_desc["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"
Expand All @@ -114,21 +102,16 @@ def test_ipam_driver_default(self) -> None:
self.assertEqual(args, expected_args)

def test_ipam_driver(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {
"driver": "someipamdriver",
"config": [
{
"subnet": "192.168.0.0/24",
"ip_range": "192.168.0.2/24",
"gateway": "192.168.0.1",
}
],
},
net_desc = self.get_minimal_net_desc()
net_desc["ipam"] = {
"driver": "someipamdriver",
"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"
Expand Down Expand Up @@ -203,15 +186,8 @@ def test_complete(self) -> None:
self.assertEqual(args, expected_args)

def test_disable_dns(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {"config": []},
"enable_ipv6": False,
"x-podman.disable_dns": True,
}
net_desc = self.get_minimal_net_desc()
net_desc["x-podman.disable_dns"] = True
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -227,15 +203,8 @@ def test_disable_dns(self) -> None:
self.assertEqual(args, expected_args)

def test_dns_string(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {"config": []},
"enable_ipv6": False,
"x-podman.dns": "192.168.1.2",
}
net_desc = self.get_minimal_net_desc()
net_desc["x-podman.dns"] = "192.168.1.2"
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -252,15 +221,8 @@ def test_dns_string(self) -> None:
self.assertEqual(args, expected_args)

def test_dns_list(self) -> None:
net_desc = {
"labels": [],
"internal": False,
"driver": None,
"driver_opts": {},
"ipam": {"config": []},
"enable_ipv6": False,
"x-podman.dns": ["192.168.1.2", "192.168.1.3"],
}
net_desc = self.get_minimal_net_desc()
net_desc["x-podman.dns"] = ["192.168.1.2", "192.168.1.3"]
proj_name = "test_project"
net_name = "test_network"
expected_args = [
Expand All @@ -275,3 +237,41 @@ def test_dns_list(self) -> None:
]
args = get_network_create_args(net_desc, proj_name, net_name)
self.assertEqual(args, expected_args)

def test_routes_string(self) -> None:
net_desc = self.get_minimal_net_desc()
net_desc["x-podman.routes"] = "192.168.1.0/24"
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}",
"--route",
"192.168.1.0/24",
net_name,
]
args = get_network_create_args(net_desc, proj_name, net_name)
self.assertEqual(args, expected_args)

def test_routes_list(self) -> None:
net_desc = self.get_minimal_net_desc()
net_desc["x-podman.routes"] = ["192.168.1.0/24", "192.168.2.0/24"]
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}",
"--route",
"192.168.1.0/24",
"--route",
"192.168.2.0/24",
net_name,
]
args = get_network_create_args(net_desc, proj_name, net_name)
self.assertEqual(args, expected_args)