123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- import pytest
- from render import Render
- @pytest.fixture
- def mock_values():
- return {
- "images": {
- "test_image": {
- "repository": "nginx",
- "tag": "latest",
- }
- },
- }
- def test_disable_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"] == {"disable": True}
- def test_use_built_in_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.use_built_in()
- output = render.render()
- assert "healthcheck" not in output["services"]["test_container"]
- def test_set_custom_test(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_custom_test("echo $1")
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"] == {
- "test": "echo $$1",
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- def test_set_custom_test_array(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_custom_test(["CMD", "echo", "1"])
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"] == {
- "test": ["CMD", "echo", "1"],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- def test_CMD_with_var_should_fail(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- with pytest.raises(Exception):
- c1.healthcheck.set_custom_test(["CMD", "echo", "$1"])
- def test_set_options(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_custom_test(["CMD", "echo", "123$567"])
- c1.healthcheck.set_interval(9)
- c1.healthcheck.set_timeout(8)
- c1.healthcheck.set_retries(7)
- c1.healthcheck.set_start_period(6)
- c1.healthcheck.set_start_interval(5)
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"] == {
- "test": ["CMD", "echo", "123$$567"],
- "interval": "9s",
- "timeout": "8s",
- "retries": 7,
- "start_period": "6s",
- "start_interval": "5s",
- }
- def test_adding_test_when_disabled(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- c1.healthcheck.set_custom_test("echo $1")
- def test_not_adding_test(mock_values):
- render = Render(mock_values)
- render.add_container("test_container", "test_image")
- with pytest.raises(Exception):
- render.render()
- def test_invalid_path(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- with pytest.raises(Exception):
- c1.healthcheck.set_test("http", {"port": 8080, "path": "invalid"})
- def test_http_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("http", {"port": 8080})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD-SHELL",
- f"""/bin/bash -c 'exec {{hc_fd}}<>/dev/tcp/127.0.0.1/8080 && echo -e "GET / HTTP/1.1\\r\\nHost: 127.0.0.1\\r\\nConnection: close\\r\\n\\r\\n" >&$${{hc_fd}} && cat <&$${{hc_fd}} | grep "HTTP" | grep -q "200"'""", # noqa
- ]
- def test_curl_healthcheck_as_CMD(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("curl", {"port": 8080, "path": "/health", "data": {"test": "val"}, "exec_type": "CMD"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "curl",
- "--request",
- "GET",
- "--silent",
- "--output",
- "/dev/null",
- "--show-error",
- "--fail",
- "--data",
- '{"test": "val"}',
- "http://127.0.0.1:8080/health",
- ]
- def test_curl_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("curl", {"port": 8080, "path": "/health", "data": {"test": "val"}})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "curl",
- "--request",
- "GET",
- "--silent",
- "--output",
- "/dev/null",
- "--show-error",
- "--fail",
- "--data",
- '{"test": "val"}',
- "http://127.0.0.1:8080/health",
- ]
- def test_curl_healthcheck_with_headers_and_method_and_data(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test(
- "curl", {"port": 8080, "path": "/health", "method": "POST", "headers": [("X-Test", "some-value")], "data": {}}
- )
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "curl",
- "--request",
- "POST",
- "--silent",
- "--output",
- "/dev/null",
- "--show-error",
- "--fail",
- "--header",
- "X-Test: some-value",
- "--data",
- "{}",
- "http://127.0.0.1:8080/health",
- ]
- def test_wget_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("wget", {"port": 8080, "path": "/health"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "wget",
- "--quiet",
- "--spider",
- "http://127.0.0.1:8080/health",
- ]
- def test_wget_healthcheck_no_spider(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("wget", {"port": 8080, "path": "/health", "spider": False})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "wget",
- "--quiet",
- "-O",
- "/dev/null",
- "http://127.0.0.1:8080/health",
- ]
- def test_netcat_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("netcat", {"port": 8080})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "nc",
- "-z",
- "-w",
- "1",
- "127.0.0.1",
- "8080",
- ]
- def test_netcat_udp_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("netcat", {"port": 8080, "udp": True})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "nc",
- "-z",
- "-w",
- "1",
- "-u",
- "127.0.0.1",
- "8080",
- ]
- def test_tcp_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("tcp", {"port": 8080})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "timeout",
- "1",
- "bash",
- "-c",
- "cat < /dev/null > /dev/tcp/127.0.0.1/8080",
- ]
- def test_redis_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("redis", {"password": "test"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "redis-cli",
- "-h",
- "127.0.0.1",
- "-p",
- "6379",
- "-a",
- "test",
- "ping",
- ]
- def test_redis_healthcheck_no_password(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("redis", {"password": ""})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "redis-cli",
- "-h",
- "127.0.0.1",
- "-p",
- "6379",
- "ping",
- ]
- def test_postgres_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("postgres", {"user": "test-user", "db": "test-db"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "pg_isready",
- "-h",
- "127.0.0.1",
- "-p",
- "5432",
- "-U",
- "test-user",
- "-d",
- "test-db",
- ]
- def test_mariadb_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("mariadb", {"password": "test-pass"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "mariadb-admin",
- "--user=root",
- "--host=127.0.0.1",
- "--port=3306",
- "--password=test-pass",
- "ping",
- ]
- def test_mongodb_healthcheck(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.set_test("mongodb", {"db": "test-db"})
- output = render.render()
- assert output["services"]["test_container"]["healthcheck"]["test"] == [
- "CMD",
- "mongosh",
- "--host",
- "127.0.0.1",
- "--port",
- "27017",
- "test-db",
- "--eval",
- 'db.adminCommand("ping")',
- "--quiet",
- ]
|