def test_docker_compose_up_down(): docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose_ends_quickly.yml" ]) docker.compose.up(["busybox", "alpine"]) docker.compose.down(timeout=1)
def test_compose_logs_follow(): docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/compose_logs.yml" ]) docker.compose.up(detach=True) signal.signal(signal.SIGALRM, mock_KeyboardInterrupt) signal.alarm(15) start = datetime.now() try: full_output = docker.compose.logs(follow=True) # interrupt the alarm in case the command ends before the timeout signal.alarm(0) # catch and ignore the exception when the command is interruped by the timeout except KeyboardInterrupt: pass end = datetime.now() # 5 seconds because the command can end before the timeout (set to 15 seconds)... # but it is enough to verify that the follow flag was working # otherwise the logs command should completed in much less than 5 seconds assert (end - start).seconds >= 5 assert "error with my_other_service" in full_output assert "--- www.google.com ping statistics ---" in full_output docker.compose.down(timeout=1)
def test_docker_compose_up_abort_on_container_exit(): docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose_ends_quickly.yml" ]) docker.compose.up(["alpine"], abort_on_container_exit=True) for container in docker.compose.ps(): assert not container.state.running docker.compose.down()
def test_compose_logs_simple_use_case(): docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/compose_logs.yml" ]) docker.compose.up(detach=True) # Wait some seconds to let the container to complete the execution of ping # and print the statistics time.sleep(15) full_output = docker.compose.logs() assert "error with my_other_service" in full_output assert "--- www.google.com ping statistics ---" in full_output docker.compose.down(timeout=1)
def test_compose_down_volumes(): compose_file = (PROJECT_ROOT / "tests/python_on_whales/components/complexe-compose.yml") docker = DockerClient(compose_files=[compose_file]) docker.compose.up(["my_service"], detach=True, scales=dict(my_service=1), build=True) assert docker.volume.exists("components_dodo") docker.compose.down() assert docker.volume.exists("components_dodo") docker.compose.down(volumes=True) assert not docker.volume.exists("components_dodo")
def test_compose_project_name(): docker = DockerClient( compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose.yml" ], compose_project_name="dudu", ) docker.compose.up(["busybox", "alpine"], detach=True) containers = docker.compose.ps() container_names = set(x.name for x in containers) assert container_names == {"dudu_busybox_1", "dudu_alpine_1"} docker.compose.down(timeout=1)
def test_passing_env_files(tmp_path: Path): compose_env_file = tmp_path / "dodo.env" compose_env_file.write_text("SOME_VARIABLE_TO_INSERT=hello\n") docker = DockerClient( compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose_ends_quickly.yml" ], compose_env_file=compose_env_file, ) output = docker.compose.config() assert output.services["alpine"].environment["SOME_VARIABLE"] == "hello"
def test_compose_single_profile(): docker = DockerClient( compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose.yml" ], compose_profiles=["my_test_profile"], ) docker.compose.up(detach=True) container_names = [x.name for x in docker.compose.ps()] assert "components_profile_test_service_1" in container_names docker.compose.down(timeout=1)
def test_compose_logs_stream(): docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/compose_logs.yml" ]) docker.compose.up(detach=True) time.sleep(15) logs = docker.compose.logs(stream=True) logs = list(logs) assert any( ["error with my_other_service" in log[1].decode() for log in logs]) assert any([ "--- www.google.com ping statistics ---" in log[1].decode() for log in logs ]) docker.compose.down(timeout=1)
def test_config_complexe_compose(): """Checking that the pydantic model does its job""" compose_file = (PROJECT_ROOT / "tests/python_on_whales/components/complexe-compose.yml") docker = DockerClient(compose_files=[compose_file]) config = docker.compose.config() assert (config.services["my_service"].build.context == ( compose_file.parent / "my_service_build").absolute()) assert config.services["my_service"].image == "some_random_image" assert config.services["my_service"].command == [ "ping", "-c", "2", "www.google.com", ] assert config.services["my_service"].ports[0].published == 5000 assert config.services["my_service"].ports[0].target == 5000 assert config.services["my_service"].volumes[0].source == "/tmp" assert config.services["my_service"].volumes[0].target == "/tmp" assert config.services["my_service"].volumes[1].source == "dodo" assert config.services["my_service"].volumes[1].target == "/dodo" assert config.services["my_service"].environment == { "DATADOG_HOST": "something" } assert config.services["my_service"].deploy.placement.constraints == [ "node.labels.hello-world == yes" ] assert config.services["my_service"].deploy.resources.limits.cpus == 2 assert config.services[ "my_service"].deploy.resources.limits.memory == 41943040 assert config.services[ "my_service"].deploy.resources.reservations.cpus == 1 assert (config.services["my_service"].deploy.resources.reservations.memory == 20971520) assert config.services["my_service"].deploy.replicas == 4 assert not config.volumes["dodo"].external
import pytz import python_on_whales from python_on_whales import DockerClient from python_on_whales.components.compose.models import ComposeConfig from python_on_whales.exceptions import NoSuchImage from python_on_whales.test_utils import get_all_jsons from python_on_whales.utils import PROJECT_ROOT pytestmark = pytest.mark.skipif( not python_on_whales.docker.compose.is_installed(), reason="Those tests need docker compose.", ) docker = DockerClient(compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose.yml" ]) def mock_KeyboardInterrupt(signum, frame): raise KeyboardInterrupt("Time is up") def test_compose_project_name(): docker = DockerClient( compose_files=[ PROJECT_ROOT / "tests/python_on_whales/components/dummy_compose.yml" ], compose_project_name="dudu", )
import os import pytest from python_on_whales import DockerClient pytestmark = pytest.mark.skipif(os.getenv("RUN_COMPOSE_TESTS", "0") == "0", reason="Do not run compose tests") docker = DockerClient(compose_files=["./dummy_compose.yml"]) def test_docker_compose_build(): docker.compose.build() docker.compose.build(["my_service"]) def test_docker_compose_up_down(): docker.compose.up(detach=True) docker.compose.down() def test_docker_compose_up_down_some_services(): docker.compose.up(["my_service", "redis"], detach=True) docker.compose.down()