v0.5.44-beta - gedetecteerd netwerk verdween uit het formulier
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 22s
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:
parent
eb52c2ac41
commit
dea949a003
6 changed files with 49 additions and 6 deletions
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.5.43-beta
|
0.5.44-beta
|
||||||
|
|
|
||||||
|
|
@ -1392,9 +1392,13 @@ def api_networks():
|
||||||
entry["next_ip"] = networks.next_free_ip(n, _reserved_ips())
|
entry["next_ip"] = networks.next_free_ip(n, _reserved_ips())
|
||||||
out.append(entry)
|
out.append(entry)
|
||||||
gedetecteerd = networks.detect_host_networks()
|
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)}
|
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,
|
return jsonify(networks=out,
|
||||||
detected=voorstellen,
|
detected=voorstellen,
|
||||||
detect_error=gedetecteerd.get("error", ""),
|
detect_error=gedetecteerd.get("error", ""),
|
||||||
|
|
|
||||||
|
|
@ -910,7 +910,8 @@ tailwind.config = {
|
||||||
<div class="flex items-center gap-2 mb-1">
|
<div class="flex items-center gap-2 mb-1">
|
||||||
<span class="mdi mdi-ethernet text-ac dark:text-ac-dark"></span>
|
<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="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>
|
||||||
<div class="text-[11px] font-mono text-t2 dark:text-t2-dark grid gap-0.5">
|
<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>
|
<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 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>
|
<span><span x-text="t('detect_failed')"></span> <span class="font-mono" x-text="netDetectError"></span></span>
|
||||||
</p>
|
</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 -->
|
<!-- Uitleg: hoe subnet, gateway en range zich tot elkaar verhouden -->
|
||||||
<details class="rounded-xl border border-bd dark:border-bd-dark overflow-hidden">
|
<details class="rounded-xl border border-bd dark:border-bd-dark overflow-hidden">
|
||||||
|
|
|
||||||
|
|
@ -239,5 +239,7 @@
|
||||||
"to": "to",
|
"to": "to",
|
||||||
"range_ruim": "covers all",
|
"range_ruim": "covers all",
|
||||||
"range_krap": "fits inside",
|
"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."
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -239,5 +239,7 @@
|
||||||
"to": "tot",
|
"to": "tot",
|
||||||
"range_ruim": "dekt alles",
|
"range_ruim": "dekt alles",
|
||||||
"range_krap": "past binnen",
|
"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."
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -349,3 +349,31 @@ def test_range_endpoint(client):
|
||||||
d = r.get_json()
|
d = r.get_json()
|
||||||
assert d["ok"] is True
|
assert d["ok"] is True
|
||||||
assert d["options"][0]["cidr"] == "10.0.20.192/26"
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue