123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- import pytest
- from render import Render
- @pytest.fixture
- def mock_values():
- return {
- "images": {
- "test_image": {
- "repository": "nginx",
- "tag": "latest",
- }
- },
- }
- tests = [
- {
- "name": "add_ports_should_work",
- "inputs": [
- {
- "values": ({"bind_mode": "published", "port_number": 8081}, {"container_port": 8080}),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8082},
- {"container_port": 8080, "protocol": "udp"},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress"},
- {"published": 8082, "target": 8080, "protocol": "udp", "mode": "ingress"},
- ],
- },
- {
- "name": "add_duplicate_ports_should_fail",
- "inputs": [
- {
- "values": ({"bind_mode": "published", "port_number": 8081}, {"container_port": 8080}),
- "expect_error": False,
- },
- {
- "values": ({"bind_mode": "published", "port_number": 8081}, {"container_port": 8080}),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_duplicate_port_different_protocol_should_work",
- "inputs": [
- {
- "values": ({"bind_mode": "published", "port_number": 8081}, {"container_port": 8080}),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "protocol": "udp"},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress"},
- {"published": 8081, "target": 8080, "protocol": "udp", "mode": "ingress"},
- ],
- },
- {
- "name": "adding_same_port_for_both_wildcard_families_should_work",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["0.0.0.0"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["::"]},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress"},
- ],
- },
- {
- "name": "adding_duplicate_port_for_v4_ip_and_v4_wildcard_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["0.0.0.0"]},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_duplicate_port_for_v4_wildcard_and_v4_ip_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["0.0.0.0"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_duplicate_port_for_v4_wildcard_and_v6_ip_should_work",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["fd00:1234:5678:abcd::10"]},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.10"},
- {
- "published": 8081,
- "target": 8080,
- "protocol": "tcp",
- "mode": "ingress",
- "host_ip": "fd00:1234:5678:abcd::10",
- },
- ],
- },
- {
- "name": "adding_duplicate_port_for_v6_wildcard_and_v4_ip_should_work",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["::"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.10"},
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "::"},
- ],
- },
- {
- "name": "adding_duplicate_port_for_v6_wildcard_and_v6_ip_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["::"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["fd00:1234:5678:abcd::10"]},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_duplicate_port_for_v6_ip_and_v6_wildcard_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["fd00:1234:5678:abcd::10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["::"]},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_duplicate_port_with_different_v4_ip_should_work",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.11"]},
- ),
- "expect_error": False,
- },
- ],
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.10"},
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.11"},
- ],
- },
- {
- "name": "adding_port_with_invalid_protocol_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "protocol": "invalid_protocol"},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_port_with_invalid_mode_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "mode": "invalid_mode"},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_port_with_invalid_ip_should_fail",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["invalid_ip"]},
- ),
- "expect_error": True,
- },
- ],
- },
- {
- "name": "adding_port_with_invalid_port_number_should_fail",
- "inputs": [
- {"values": ({"bind_mode": "published", "port_number": -1}, {"container_port": 8080}), "expect_error": True},
- ],
- },
- {
- "name": "adding_port_with_invalid_container_port_should_fail",
- "inputs": [
- {"values": ({"bind_mode": "published", "port_number": 8081}, {"container_port": -1}), "expect_error": True},
- ],
- },
- {
- "name": "adding_duplicate_ports_with_different_host_ip_should_work",
- "inputs": [
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.10"], "protocol": "udp"},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.11"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["192.168.1.11"], "protocol": "udp"},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["fd00:1234:5678:abcd::10"]},
- ),
- "expect_error": False,
- },
- {
- "values": (
- {"bind_mode": "published", "port_number": 8081},
- {"container_port": 8080, "host_ips": ["fd00:1234:5678:abcd::11"]},
- ),
- "expect_error": False,
- },
- ],
- # fmt: off
- "expected": [
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.10"},
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "192.168.1.11"},
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "fd00:1234:5678:abcd::10"}, # noqa
- {"published": 8081, "target": 8080, "protocol": "tcp", "mode": "ingress", "host_ip": "fd00:1234:5678:abcd::11"}, # noqa
- {"published": 8081, "target": 8080, "protocol": "udp", "mode": "ingress", "host_ip": "192.168.1.10"},
- {"published": 8081, "target": 8080, "protocol": "udp", "mode": "ingress", "host_ip": "192.168.1.11"},
- ],
- # fmt: on
- },
- ]
- @pytest.mark.parametrize("test", tests)
- def test_ports(test):
- mock_values = {
- "images": {
- "test_image": {
- "repository": "nginx",
- "tag": "latest",
- }
- },
- }
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- errored = False
- for input in test["inputs"]:
- if input["expect_error"]:
- with pytest.raises(Exception):
- c1.add_port(*input["values"])
- errored = True
- else:
- c1.add_port(*input["values"])
- errored = True if [i["expect_error"] for i in test["inputs"]].count(True) > 0 else False
- if errored:
- return
- output = render.render()
- assert output["services"]["test_container"]["ports"] == test["expected"]
|