diff --git a/packages/pytest-simcore/src/pytest_simcore/simcore_webserver_service.py b/packages/pytest-simcore/src/pytest_simcore/simcore_webserver_service.py new file mode 100644 index 00000000000..0d745698ac9 --- /dev/null +++ b/packages/pytest-simcore/src/pytest_simcore/simcore_webserver_service.py @@ -0,0 +1,43 @@ +# pylint:disable=unused-variable +# pylint:disable=unused-argument +# pylint:disable=redefined-outer-name + +from typing import Dict + +import aiohttp +import pytest +import tenacity +from yarl import URL + +from servicelib.minio_utils import MinioRetryPolicyUponInitialization + +from .helpers.utils_docker import get_service_published_port + + +@pytest.fixture(scope="module") +def webserver_endpoint(docker_stack: Dict, devel_environ: Dict) -> URL: + assert "simcore_webserver" in docker_stack["services"] + endpoint = f"127.0.0.1:{get_service_published_port('webserver', '8080')}" + + return URL(f"http://{endpoint}") + + +@pytest.fixture(scope="function") +async def webserver_service(webserver_endpoint: URL, docker_stack: Dict) -> URL: + await wait_till_webserver_responsive(webserver_endpoint) + + yield webserver_endpoint + + +# HELPERS -- + +# TODO: this can be used by ANY of the simcore services! +@tenacity.retry(**MinioRetryPolicyUponInitialization().kwargs) +async def wait_till_webserver_responsive(webserver_endpoint: URL): + async with aiohttp.ClientSession() as session: + async with session.get(webserver_endpoint.with_path("/v0/")) as resp: + assert resp.status == 200 + data = await resp.json() + assert "data" in data + assert "status" in data["data"] + assert data["data"]["status"] == "SERVICE_RUNNING" diff --git a/tests/swarm-deploy/conftest.py b/tests/swarm-deploy/conftest.py index 6b91f2d17dc..8068ff98ae2 100644 --- a/tests/swarm-deploy/conftest.py +++ b/tests/swarm-deploy/conftest.py @@ -19,7 +19,8 @@ "pytest_simcore.rabbit_service", "pytest_simcore.postgres_service", "pytest_simcore.minio_service", - "pytest_simcore.traefik_service" + "pytest_simcore.traefik_service", + "pytest_simcore.simcore_webserver_service", ] log = logging.getLogger(__name__) @@ -44,8 +45,14 @@ def prepare_all_services( return services +@pytest.fixture(scope="module") +def create_db_on_start(devel_environ: Dict[str, str]): + devel_environ["WEBSERVER_DB_INITTABLES"] = "1" + + @pytest.fixture(scope="module") def make_up_prod( + create_db_on_start, prepare_all_services: Dict, simcore_docker_compose: Dict, ops_docker_compose: Dict, diff --git a/tests/swarm-deploy/test_swarm_runs.py b/tests/swarm-deploy/test_swarm_runs.py index d1025f4632e..9b5208117e7 100644 --- a/tests/swarm-deploy/test_swarm_runs.py +++ b/tests/swarm-deploy/test_swarm_runs.py @@ -12,6 +12,7 @@ from typing import Dict, List import pytest +import tenacity from docker import DockerClient from docker.models.services import Service from yarl import URL @@ -146,10 +147,25 @@ def test_core_service_running( ) +RETRY_WAIT_SECS = 2 +RETRY_COUNT = 20 + + def test_check_serve_root(loop, make_up_prod: Dict, traefik_service: URL): + req = urllib.request.Request("http://127.0.0.1:9081/") try: - resp = urllib.request.urlopen(req) + # it takes a bit of time until traefik sets up the correct proxy and the webserver takes time to start + @tenacity.retry( + wait=tenacity.wait_fixed(RETRY_WAIT_SECS), + stop=tenacity.stop_after_attempt(RETRY_COUNT), + before_sleep=tenacity.before_sleep_log(logger, logging.INFO), + ) + def check_root(request): + resp = urllib.request.urlopen(req) + return resp + + resp = check_root(req) charset = resp.info().get_content_charset() content = resp.read().decode(charset) # TODO: serch osparc-simcore commit id e.g. 'osparc-simcore v817d82e'