Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix multiple networks with separately specified ip and mac #867

Merged
merged 10 commits into from
Apr 8, 2024
Prev Previous commit
Next Next commit
Add unit tests for get_net_args()
Signed-off-by: Bas Zoetekouw <[email protected]>
  • Loading branch information
baszoetekouw authored and p12tic committed Mar 28, 2024
commit 91fbea3d89d7e27b8c6c7f44a853052cc347add0
4 changes: 2 additions & 2 deletions pytests/test_container_to_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
from podman_compose import container_to_args


def create_compose_mock():
def create_compose_mock(project_name="test_project_name"):
compose = mock.Mock()
compose.project_name = "test_project_name"
compose.project_name = project_name
compose.dirname = "test_dirname"
compose.container_names_by_service.get = mock.Mock(return_value=None)
compose.prefer_volume_over_mount = False
Expand Down
216 changes: 216 additions & 0 deletions pytests/test_get_net_args.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
import unittest

from podman_compose import get_net_args

from .test_container_to_args import create_compose_mock

PROJECT_NAME = "test_project_name"
SERVICE_NAME = "service_name"
CONTAINER_NAME = f"{PROJECT_NAME}_{SERVICE_NAME}_1"


def get_networked_compose(num_networks=1):
compose = create_compose_mock(PROJECT_NAME)
for network in range(num_networks):
compose.networks[f"net{network}"] = {
"driver": "bridge",
"ipam": {
"config": [
{"subnet": f"192.168.{network}.0/24"},
{"subnet": f"fd00:{network}::/64"},
]
},
"enable_ipv6": True,
}

return compose


def get_minimal_container():
return {
"name": CONTAINER_NAME,
"service_name": SERVICE_NAME,
"image": "busybox",
}


class TestGetNetArgs(unittest.TestCase):
def test_minimal(self):
compose = get_networked_compose()
container = get_minimal_container()
container["networks"] = {"net0": {}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_alias(self):
compose = get_networked_compose()
container = get_minimal_container()
container["networks"] = {"net0": {}}
container["_aliases"] = ["alias1", "alias2"]

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--network-alias",
f"{SERVICE_NAME},alias1,alias2",
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_one_ipv4(self):
ip = "192.168.0.42"
compose = get_networked_compose()
container = get_minimal_container()
container["networks"] = {"net0": {"ipv4_address": ip}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--ip=" + ip,
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertEqual(expected_args, args)

def test_one_ipv6(self):
ipv6_address = "fd00:0::42"
compose = get_networked_compose()
container = get_minimal_container()
container["networks"] = {"net0": {"ipv6_address": ipv6_address}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--ip6=" + ipv6_address,
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_one_mac(self):
mac = "00:11:22:33:44:55"
compose = get_networked_compose()
container = get_minimal_container()
container["networks"] = {"net0": {}}
container["mac_address"] = mac

expected_args = [
"--mac-address",
mac,
"--network",
f"{PROJECT_NAME}_net0",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_two_nets_as_dict(self):
compose = get_networked_compose(num_networks=2)
container = get_minimal_container()
container["networks"] = {"net0": {}, "net1": {}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--network",
f"{PROJECT_NAME}_net1",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_two_nets_as_list(self):
compose = get_networked_compose(num_networks=2)
container = get_minimal_container()
container["networks"] = ["net0", "net1"]

expected_args = [
"--network",
f"{PROJECT_NAME}_net0",
"--network",
f"{PROJECT_NAME}_net1",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_two_ipv4(self):
ip0 = "192.168.0.42"
ip1 = "192.168.1.42"
compose = get_networked_compose(num_networks=2)
container = get_minimal_container()
container["networks"] = {"net0": {"ipv4_address": ip0}, "net1": {"ipv4_address": ip1}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0:ip={ip0}",
"--network",
f"{PROJECT_NAME}_net1:ip={ip1}",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_two_ipv6(self):
ip0 = "fd00:0::42"
ip1 = "fd00:1::42"
compose = get_networked_compose(num_networks=2)
container = get_minimal_container()
container["networks"] = {"net0": {"ipv6_address": ip0}, "net1": {"ipv6_address": ip1}}

expected_args = [
"--network",
f"{PROJECT_NAME}_net0:ip={ip0}",
"--network",
f"{PROJECT_NAME}_net1:ip={ip1}",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)

def test_mixed_config(self):
ip4_0 = "192.168.0.42"
ip4_1 = "192.168.1.42"
ip6_0 = "fd00:0::42"
ip6_2 = "fd00:2::42"
mac = "00:11:22:33:44:55"
compose = get_networked_compose(num_networks=4)
container = get_minimal_container()
container["networks"] = {
"net0": {"ipv4_address": ip4_0, "ipv6_address": ip6_0},
"net1": {"ipv4_address": ip4_1},
"net2": {"ipv6_address": ip6_2},
"net3": {},
}
container["mac_address"] = mac

expected_args = [
"--mac-address",
mac,
"--network",
f"{PROJECT_NAME}_net0:ip={ip4_0},ip={ip6_0}",
"--network",
f"{PROJECT_NAME}_net1:ip={ip4_1}",
"--network",
f"{PROJECT_NAME}_net2:ip={ip6_2}",
"--network",
f"{PROJECT_NAME}_net3",
"--network-alias",
SERVICE_NAME,
]
args = get_net_args(compose, container)
self.assertListEqual(expected_args, args)