]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
test: basic startup test and related fixes (however still failing)
authorVasek Sraier <git@vakabus.cz>
Tue, 9 Mar 2021 12:23:01 +0000 (13:23 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:51 +0000 (16:17 +0200)
manager/integration/tests/basic_startup/Dockerfile [new file with mode: 0644]
manager/integration/tests/basic_startup/knot-resolver.service [new file with mode: 0644]
manager/integration/tests/basic_startup/run [new file with mode: 0755]
manager/knot_resolver_manager/__main__.py
manager/knot_resolver_manager/systemd.py

diff --git a/manager/integration/tests/basic_startup/Dockerfile b/manager/integration/tests/basic_startup/Dockerfile
new file mode 100644 (file)
index 0000000..9c27a9c
--- /dev/null
@@ -0,0 +1,37 @@
+FROM debian:latest
+
+ENV LC_ALL=C.UTF-8
+
+# install project dependencies
+
+## build essentials
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y build-essential git ca-certificates
+
+## python
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y python3 python3-pip python3-dev
+
+## glib dependencies
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y libcairo2-dev libglib2.0-0 libgirepository1.0-dev
+
+## python setuptools
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y python3-setuptools
+
+## python libraries
+RUN pip3 install aiohttp strictyaml pydbus PyGObject
+
+## systemd
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y systemd
+
+## kresd
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y wget
+RUN wget https://secure.nic.cz/files/knot-resolver/knot-resolver-release.deb && dpkg -i knot-resolver-release.deb
+RUN apt-get update && apt-get install -y knot-resolver
+
+# dbus
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y dbus
+
+
+# install test dependencies
+RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y curl
+
+CMD ["/bin/systemd"]
diff --git a/manager/integration/tests/basic_startup/knot-resolver.service b/manager/integration/tests/basic_startup/knot-resolver.service
new file mode 100644 (file)
index 0000000..b09045c
--- /dev/null
@@ -0,0 +1,12 @@
+[Unit]
+Description=Knot Resolver Manager
+Requires=dbus
+After=dbus
+
+[Service]
+WorkingDirectory=/repo
+ExecStart=/usr/bin/python3 -m knot_resolver_manager
+KillSignal=SIGINT
+
+[Install]
+WantedBy=multi-user.target
diff --git a/manager/integration/tests/basic_startup/run b/manager/integration/tests/basic_startup/run
new file mode 100755 (executable)
index 0000000..d25cbbf
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# fail early
+set -e
+
+cd /test
+echo "Starting manager..."
+cp knot-manager.service /etc/systemd/system
+systemctl daemon-reload
+systemctl start knot-manager.service
+
+
+echo -e "lua_config: \"\"\nnum_workers: 4" | curl -X POST --unix-socket /tmp/manager.sock localhost/config -f --data-binary @-
+
+# assert that any kresd process is running
+systemctl status | grep kresd
index 59af3c5caca76295a59b988cb9e2e3b24fb76841..7c91c5c620d838fa456597c8339925cdb99eeb2c 100644 (file)
@@ -1,9 +1,12 @@
+import asyncio
+import signal
 from aiohttp import web
 from knot_resolver_manager.kresd_manager import KresdManager
 
 from . import confmodel
 from . import compat
 
+_SOCKET_PATH = '/tmp/manager.sock'
 
 async def hello(_request: web.Request) -> web.Response:
     return web.Response(text="Hello, world")
@@ -21,14 +24,16 @@ def main():
 
     # initialize KresdManager
     manager = KresdManager()
-    compat.asyncio_run(manager.load_system_state())
     app["kresd_manager"] = manager
+    async def init_manager(app):
+        await app['kresd_manager'].load_system_state()
+    app.on_startup.append(init_manager)
 
     # configure routing
     app.add_routes([web.get("/", hello), web.post("/config", apply_config)])
 
     # run forever
-    web.run_app(app, path="./manager.sock")
+    web.run_app(app, path=_SOCKET_PATH)
 
 
 if __name__ == "__main__":
index e62c01f309cc4e1b7963edcb3b1e3713f4bbffef..e3c9a0d1b8fbe11d2e970cbf9a3b4cffa1df1b88 100644 (file)
@@ -1,5 +1,6 @@
 from typing import List, Union
 from typing_extensions import Literal
+from threading import Thread
 
 from pydbus import SystemBus
 from gi.repository import GLib
@@ -22,17 +23,22 @@ def _create_manager_interface():
 
 
 def _wait_for_job_completion(systemd, job):
-    global result_state
-
-    loop = GLib.MainLoop()
-    systemd.JobRemoved.connect(_wait_for_job_completion_handler(loop, job))
-    result_state = None
-    loop.run()
+    def event_loop_isolation_thread():
+        global result_state
 
-    if result_state != "done":
-        raise SystemdException(
-            f"Job completed with state '{result_state}' instead of expected 'done'"
-        )
+        loop = GLib.MainLoop()
+        systemd.JobRemoved.connect(_wait_for_job_completion_handler(loop, job))
+        result_state = None
+        loop.run()
+
+        if result_state != "done":
+            raise SystemdException(
+                f"Job completed with state '{result_state}' instead of expected 'done'"
+            )
+    
+    thread = Thread(target=event_loop_isolation_thread)
+    thread.start()
+    thread.join()
 
 
 def _wait_for_job_completion_handler(loop, job_path):