diff --git a/tests/environment/__init__.py b/tests/environment/__init__.py index 3c62614..4b633b4 100644 --- a/tests/environment/__init__.py +++ b/tests/environment/__init__.py @@ -4,7 +4,10 @@ import subprocess import time import json import atexit -import pytest +try: + import pytest +except: + pass import requests thisdir = os.path.abspath(os.path.dirname(__file__)) @@ -68,6 +71,9 @@ class TestEnvironment(object): if not self._wait_for_meshcentral(): self.__exit__(None, None, None) raise Exception("Failed to create docker instance") + if not self._wait_for_client_server(): + self.__exit__(None, None, None) + raise Exception("Failed to create client server") return self def _wait_for_meshcentral(self, timeout=30): @@ -90,6 +96,26 @@ class TestEnvironment(object): return False return True + def _wait_for_client_server(self, timeout=30): + start = time.time() + while time.time() - start < timeout: + try: + data = subprocess.check_output(["docker", "inspect", "meshctrl-client", "--format='{{json .State.Health}}'"], cwd=thisdir, stderr=subprocess.DEVNULL) + # docker outputs for humans, not computers. This is the easiest way to chop off the ends + data = json.loads(data.strip()[1:-1]) + except Exception as e: + time.sleep(1) + continue + try: + if data["Status"] == "healthy": + break + except: + pass + time.sleep(1) + else: + return False + return True + def __exit__(self, exc_t, exc_v, exc_tb): pass @@ -112,10 +138,13 @@ def _kill_docker_process(): atexit.register(_kill_docker_process) -@pytest.fixture(scope="session") -def env(): - with TestEnvironment() as e: - yield e +try: + @pytest.fixture(scope="session") + def env(): + with TestEnvironment() as e: + yield e +except: + pass if __name__ == "__main__": diff --git a/tests/environment/compose.yaml b/tests/environment/compose.yaml index 93d58fc..73a2ca8 100644 --- a/tests/environment/compose.yaml +++ b/tests/environment/compose.yaml @@ -9,6 +9,8 @@ services: image: client build: dockerfile: client.dockerfile + sysctls: + net.ipv6.conf.all.disable_ipv6: 1 ports: - 5000:5000 depends_on: @@ -20,6 +22,10 @@ services: # - ./meshcentral/mongodb_data:/data/db networks: - meshctrl + healthcheck: + test: curl --fail http://localhost:5000/ || exit 1 + interval: 5s + timeout: 120s extra_hosts: - "host.docker.internal:host-gateway" @@ -28,6 +34,8 @@ services: container_name: meshctrl-meshcentral # use the official meshcentral container image: meshcentral + sysctls: + net.ipv6.conf.all.disable_ipv6: 1 build: dockerfile: meshcentral.dockerfile ports: @@ -55,6 +63,8 @@ services: image: ubuntu/squid:latest restart: unless-stopped container_name: meshctrl-squid + sysctls: + net.ipv6.conf.all.disable_ipv6: 1 ports: - 3128:3128 diff --git a/tests/environment/config/squid/conf.d/meshctrl.conf b/tests/environment/config/squid/conf.d/meshctrl.conf index 255186b..0697d4a 100644 --- a/tests/environment/config/squid/conf.d/meshctrl.conf +++ b/tests/environment/config/squid/conf.d/meshctrl.conf @@ -1,9 +1,19 @@ # Logs are managed by logrotate on Debian logfile_rotate 0 -acl all src all +acl to_ipv6 dst ipv6 +acl from_ipv6 src ipv6 + +acl to_ipv4 dst ipv4 +acl from_ipv4 src ipv4 + +#acl all src all acl Safe_ports port 8086 acl SSS_ports port 8086 +http_access allow to_ipv4 +http_access allow from_ipv4 +http_access deny to_ipv6 +http_access deny from_ipv6 http_access allow all debug_options ALL,0 85,2 88,2 diff --git a/tests/environment/meshcentral.dockerfile b/tests/environment/meshcentral.dockerfile index b97a6da..7227cfa 100644 --- a/tests/environment/meshcentral.dockerfile +++ b/tests/environment/meshcentral.dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/ylianst/meshcentral:1.1.50 +FROM ghcr.io/ylianst/meshcentral:1.1.56 RUN apk add curl RUN apk add python3 WORKDIR /opt/meshcentral/ diff --git a/tests/environment/scripts/client/agent_server.py b/tests/environment/scripts/client/agent_server.py index 52e42e8..0f4f7b7 100644 --- a/tests/environment/scripts/client/agent_server.py +++ b/tests/environment/scripts/client/agent_server.py @@ -62,7 +62,7 @@ def remove_agent(agentid): @api.route('/', methods=['GET']) def slash(): - return [_["id"] for _ in agents] + return [value["id"] for key, value in agents.items()] if __name__ == '__main__': api.run() \ No newline at end of file