mirror of
https://github.com/containers/podman-compose.git
synced 2025-08-15 08:12:37 +02:00
Merge pull request #1264 from p12tic/network-routes
Add support to set --route of podman network create
This commit is contained in:
@ -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:
|
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.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.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
|
For example, the following docker-compose.yml allows all containers on the same network to use the
|
||||||
specified nameservers:
|
specified nameservers:
|
||||||
@ -61,6 +61,19 @@ network:
|
|||||||
- "10.1.2.4"
|
- "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
|
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).
|
[Podman network create command Documentation](https://docs.podman.io/en/latest/markdown/podman-network-create.1.html).
|
||||||
|
|
||||||
|
2
newsfragments/x-podman-network-routes.feature
Normal file
2
newsfragments/x-podman-network-routes.feature
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Added support to set `--route` option to `podman network create` via
|
||||||
|
`x-podman.routes` key on network configuration.
|
@ -898,6 +898,10 @@ def get_network_create_args(net_desc: dict[str, Any], proj_name: str, net_name:
|
|||||||
"--dns",
|
"--dns",
|
||||||
",".join(norm_as_list(net_desc.get("x-podman.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):
|
if isinstance(ipam_config_ls, dict):
|
||||||
ipam_config_ls = [ipam_config_ls]
|
ipam_config_ls = [ipam_config_ls]
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from podman_compose import get_network_create_args
|
from podman_compose import get_network_create_args
|
||||||
|
|
||||||
|
|
||||||
class TestGetNetworkCreateArgs(unittest.TestCase):
|
class TestGetNetworkCreateArgs(unittest.TestCase):
|
||||||
def test_minimal(self) -> None:
|
def get_minimal_net_desc(self) -> dict[str, Any]:
|
||||||
net_desc = {
|
return {
|
||||||
"labels": [],
|
"labels": [],
|
||||||
"internal": False,
|
"internal": False,
|
||||||
"driver": None,
|
"driver": None,
|
||||||
@ -13,6 +14,9 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
"ipam": {"config": []},
|
"ipam": {"config": []},
|
||||||
"enable_ipv6": False,
|
"enable_ipv6": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def test_minimal(self) -> None:
|
||||||
|
net_desc = self.get_minimal_net_desc()
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -27,14 +31,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_ipv6(self) -> None:
|
def test_ipv6(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["enable_ipv6"] = True
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {"config": []},
|
|
||||||
"enable_ipv6": True,
|
|
||||||
}
|
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -50,14 +48,9 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_bridge(self) -> None:
|
def test_bridge(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["driver"] = "bridge"
|
||||||
"internal": False,
|
net_desc["driver_opts"] = {"opt1": "value1", "opt2": "value2"}
|
||||||
"driver": "bridge",
|
|
||||||
"driver_opts": {"opt1": "value1", "opt2": "value2"},
|
|
||||||
"ipam": {"config": []},
|
|
||||||
"enable_ipv6": False,
|
|
||||||
}
|
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -78,12 +71,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_ipam_driver_default(self) -> None:
|
def test_ipam_driver_default(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["ipam"] = {
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {
|
|
||||||
"driver": "default",
|
"driver": "default",
|
||||||
"config": [
|
"config": [
|
||||||
{
|
{
|
||||||
@ -92,7 +81,6 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
"gateway": "192.168.0.1",
|
"gateway": "192.168.0.1",
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
|
||||||
}
|
}
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
@ -114,12 +102,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_ipam_driver(self) -> None:
|
def test_ipam_driver(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["ipam"] = {
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {
|
|
||||||
"driver": "someipamdriver",
|
"driver": "someipamdriver",
|
||||||
"config": [
|
"config": [
|
||||||
{
|
{
|
||||||
@ -128,7 +112,6 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
"gateway": "192.168.0.1",
|
"gateway": "192.168.0.1",
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
|
||||||
}
|
}
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
@ -203,15 +186,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_disable_dns(self) -> None:
|
def test_disable_dns(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["x-podman.disable_dns"] = True
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {"config": []},
|
|
||||||
"enable_ipv6": False,
|
|
||||||
"x-podman.disable_dns": True,
|
|
||||||
}
|
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -227,15 +203,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_dns_string(self) -> None:
|
def test_dns_string(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["x-podman.dns"] = "192.168.1.2"
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {"config": []},
|
|
||||||
"enable_ipv6": False,
|
|
||||||
"x-podman.dns": "192.168.1.2",
|
|
||||||
}
|
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -252,15 +221,8 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
self.assertEqual(args, expected_args)
|
self.assertEqual(args, expected_args)
|
||||||
|
|
||||||
def test_dns_list(self) -> None:
|
def test_dns_list(self) -> None:
|
||||||
net_desc = {
|
net_desc = self.get_minimal_net_desc()
|
||||||
"labels": [],
|
net_desc["x-podman.dns"] = ["192.168.1.2", "192.168.1.3"]
|
||||||
"internal": False,
|
|
||||||
"driver": None,
|
|
||||||
"driver_opts": {},
|
|
||||||
"ipam": {"config": []},
|
|
||||||
"enable_ipv6": False,
|
|
||||||
"x-podman.dns": ["192.168.1.2", "192.168.1.3"],
|
|
||||||
}
|
|
||||||
proj_name = "test_project"
|
proj_name = "test_project"
|
||||||
net_name = "test_network"
|
net_name = "test_network"
|
||||||
expected_args = [
|
expected_args = [
|
||||||
@ -275,3 +237,41 @@ class TestGetNetworkCreateArgs(unittest.TestCase):
|
|||||||
]
|
]
|
||||||
args = get_network_create_args(net_desc, proj_name, net_name)
|
args = get_network_create_args(net_desc, proj_name, net_name)
|
||||||
self.assertEqual(args, expected_args)
|
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)
|
||||||
|
Reference in New Issue
Block a user