diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0ab62..1d84b38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# v0.8.03-beta — Mappen zonder compose-bestand verdwenen geruisloos + +`GET /api/stacks` sloeg elke map zonder compose-bestand over met een kale +`continue`. Staat er zo'n map in je stacks-map, dan duikt hij nergens meer op: +niet in de lijst, en de containers die erbij horen belanden onder "handmatig +gestart" omdat ook `beheerd` op datzelfde compose-bestand afgaat. Je ziet een +leeg scherm, en nergens staat waarom. + +De interface hééft er een weergave voor — rode stip, een streepje in plaats van +een status, geen knoppen — maar die kon door dat `continue` nooit te zien zijn. +Dode weergavecode voor een toestand die de API niet kon opleveren. + +Zulke mappen staan er nu gewoon tussen, mét die waarschuwing. Beter een app die +zegt dat er iets mis is dan een app die verdwijnt. + # v0.8.02-beta — Koppelingen ónder BASE_DIR `--doctor` zei dat `/opt/serverup` netjes gekoppeld was, en dat klopte ook. diff --git a/VERSION b/VERSION index cc73fb6..582cb11 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.02-beta +0.8.03-beta diff --git a/server-up/app.py b/server-up/app.py index 65529c9..cfd99c8 100644 --- a/server-up/app.py +++ b/server-up/app.py @@ -612,13 +612,20 @@ def api_stacks(): for d in sorted(lib.iterdir()): if not d.is_dir() or d.name.startswith("."): continue - if not docker.has_compose(d): - continue - ct = docker.compose_ps(d, name=d.name) + # Een map zonder compose-bestand werd hier stilzwijgend overgeslagen. + # Dan staat er een map in je stacks-map die nergens meer opduikt: niet + # in de lijst, en de containers die erbij horen belanden onder + # "handmatig gestart". Je ziet een leeg scherm en nergens staat waarom. + # + # De interface hééft er een weergave voor — rode stip, een streepje in + # plaats van een status, geen knoppen — die door dit `continue` nooit te + # zien kon zijn. Tonen mét die waarschuwing is beter dan verzwijgen. + heeft_compose = docker.has_compose(d) + ct = docker.compose_ps(d, name=d.name) if heeft_compose else [] logo_url, icon = _stack_logo(d) meta = _stack_meta(d) out.append({ - "name": d.name, "path": str(d), "has_compose": True, + "name": d.name, "path": str(d), "has_compose": heeft_compose, "running": any(c["running"] for c in ct), "containers": ct, "logo_url": logo_url, "icon": icon, diff --git a/tests/test_containers.py b/tests/test_containers.py index a7ed0ec..4562ca4 100644 --- a/tests/test_containers.py +++ b/tests/test_containers.py @@ -116,3 +116,36 @@ def test_viewer_mag_geen_containers_bedienen(client, host): assert client.get("/api/containers").status_code == 200 assert client.post("/api/containers/forgejo/stop", headers={"X-CSRF-Token": kijker_csrf}).status_code == 403 + + +# ── Een map zonder compose-bestand ─────────────────────────────────────────── +# Die werd stilzwijgend overgeslagen: niet in de lijst, en de containers die +# erbij hoorden belandden onder "handmatig gestart". Je zag een leeg scherm en +# nergens stond waarom. + +def test_map_zonder_compose_verdwijnt_niet_uit_de_lijst(client, env): + from conftest import login + login(client) + (env["lib"] / "kapotte-app").mkdir(parents=True, exist_ok=True) + + d = client.get("/api/stacks").get_json() + namen = [s["name"] for s in d] + assert "kapotte-app" in namen, f"de map is niet zichtbaar: {namen}" + s = next(s for s in d if s["name"] == "kapotte-app") + assert s["has_compose"] is False, "hij doet alsof er compose is" + assert s["containers"] == [] + assert s["running"] is False + + +def test_een_gewone_app_blijft_gewoon_staan(client, env, monkeypatch): + from conftest import login + from core import docker + monkeypatch.setattr(docker, "compose_ps", lambda *a, **k: []) + login(client) + d = env["lib"] / "echte-app" + d.mkdir(parents=True, exist_ok=True) + (d / "docker-compose.yml").write_text("services:\n web:\n image: nginx\n") + + uit = client.get("/api/stacks").get_json() + s = next(s for s in uit if s["name"] == "echte-app") + assert s["has_compose"] is True