v0.5.44-beta - gedetecteerd netwerk verdween uit het formulier
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 22s

Zodra je een netwerk had toegevoegd, was het blok "gevonden op deze server" leeg
bij een volgende poging. Ik filterde subnetten eruit die al geconfigureerd
waren, met de gedachte "niet nog een keer voorstellen". Dat pakt verkeerd uit:
je kunt prima een tweede netwerk op hetzelfde subnet willen met een andere
range, en de gegevens zijn sowieso handig om te kunnen naslaan. Zonder dat blok
lijkt het formulier bovendien kapot.

- Gedetecteerde netwerken blijven altijd staan; ze krijgen een vlag
  'configured' en tonen 'al toegevoegd' in plaats van 'gebruiken'.
- Levert de detectie niets op zonder dat er een fout is, dan staat er nu een
  uitleg in plaats van een leeg blok.
- Regressietest die het blok controleert voor en na het aanmaken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
This commit is contained in:
Ramon 2026-07-27 00:34:22 +02:00
parent eb52c2ac41
commit dea949a003
6 changed files with 49 additions and 6 deletions

View file

@ -1 +1 @@
0.5.43-beta
0.5.44-beta

View file

@ -1392,9 +1392,13 @@ def api_networks():
entry["next_ip"] = networks.next_free_ip(n, _reserved_ips())
out.append(entry)
gedetecteerd = networks.detect_host_networks()
# Al geconfigureerde subnetten niet nog een keer voorstellen.
# Gedetecteerde netwerken blijven altijd staan, ook als er al een netwerk op
# dat subnet bestaat: je kunt er prima een tweede aanmaken met een andere
# range, en de gegevens zijn sowieso handig om te kunnen naslaan. Ze worden
# alleen gemarkeerd als 'al toegevoegd'.
bestaand = {n.get("subnet") for n in defined if isinstance(n, dict)}
voorstellen = [n for n in gedetecteerd["networks"] if n["subnet"] not in bestaand]
voorstellen = [{**n, "configured": n["subnet"] in bestaand}
for n in gedetecteerd["networks"]]
return jsonify(networks=out,
detected=voorstellen,
detect_error=gedetecteerd.get("error", ""),

View file

@ -910,7 +910,8 @@ tailwind.config = {
<div class="flex items-center gap-2 mb-1">
<span class="mdi mdi-ethernet text-ac dark:text-ac-dark"></span>
<span class="font-semibold text-sm text-wh dark:text-wh-dark font-mono" x-text="d.interface"></span>
<span class="badge badge-dim ml-auto" x-text="t('use_this')">Gebruiken</span>
<span class="badge ml-auto" :class="d.configured ? 'badge-ok' : 'badge-dim'"
x-text="d.configured ? t('already_added') : t('use_this')">Gebruiken</span>
</div>
<div class="text-[11px] font-mono text-t2 dark:text-t2-dark grid gap-0.5">
<div><span x-text="t('subnet')"></span>: <span x-text="d.subnet"></span></div>
@ -926,6 +927,12 @@ tailwind.config = {
<span class="mdi mdi-alert-outline shrink-0"></span>
<span><span x-text="t('detect_failed')"></span> <span class="font-mono" x-text="netDetectError"></span></span>
</p>
<!-- Detectie gelukt maar niets bruikbaars gevonden: dan mag het blok niet
stilzwijgend leeg blijven. -->
<p x-show="!netDetected.length && !netDetectError" class="text-[11px] text-t2 dark:text-t2-dark flex items-start gap-1.5">
<span class="mdi mdi-information-outline shrink-0"></span>
<span x-text="t('detect_empty')"></span>
</p>
<!-- Uitleg: hoe subnet, gateway en range zich tot elkaar verhouden -->
<details class="rounded-xl border border-bd dark:border-bd-dark overflow-hidden">

View file

@ -239,5 +239,7 @@
"to": "to",
"range_ruim": "covers all",
"range_krap": "fits inside",
"range_count": "{count} addresses"
"range_count": "{count} addresses",
"already_added": "already added",
"detect_empty": "No network with a default route was found on this server. Fill in the details below manually."
}

View file

@ -239,5 +239,7 @@
"to": "tot",
"range_ruim": "dekt alles",
"range_krap": "past binnen",
"range_count": "{count} adressen"
"range_count": "{count} adressen",
"already_added": "al toegevoegd",
"detect_empty": "Er is geen netwerk met een default route gevonden op deze server. Vul de gegevens hieronder handmatig in."
}

View file

@ -349,3 +349,31 @@ def test_range_endpoint(client):
d = r.get_json()
assert d["ok"] is True
assert d["options"][0]["cidr"] == "10.0.20.192/26"
def test_gedetecteerd_netwerk_blijft_zichtbaar_na_toevoegen(client, monkeypatch):
"""Een al geconfigureerd subnet werd uit de suggesties gefilterd, waardoor
het hele 'gevonden op deze server'-blok verdween zodra je het netwerk had
aangemaakt. Nu blijft het staan, gemarkeerd als al toegevoegd."""
from conftest import login
from core import networks as nw
csrf = login(client)
monkeypatch.setattr(nw, "detect_host_networks", lambda force=False: {
"networks": [{"interface": "ens18", "subnet": "10.0.20.0/24",
"gateway": "10.0.20.1", "suggested_range": "10.0.20.240/28",
"driver": "macvlan", "name": "lan"}], "error": ""})
monkeypatch.setattr(nw, "exists", lambda naam: False)
monkeypatch.setattr(nw, "create", lambda net: (True, "ok"))
monkeypatch.setattr(nw, "used_ips", lambda naam: set())
assert client.get("/api/networks").get_json()["detected"][0]["configured"] is False
client.post("/api/networks",
json={"name": "lan", "driver": "macvlan", "parent": "ens18",
"subnet": "10.0.20.0/24", "gateway": "10.0.20.1",
"ip_range": "10.0.20.240/28"},
headers={"X-CSRF-Token": csrf})
detected = client.get("/api/networks").get_json()["detected"]
assert len(detected) == 1, "suggestie mag niet verdwijnen"
assert detected[0]["configured"] is True