Sammelcommit fuer den ueber mehrere Sitzungen gewachsenen, bisher nicht
eingecheckten Stand. Getrennte Commits waeren ehrlicher gewesen, sind es
nachtraeglich aber nicht mehr: BugRepo, changelog.json und die Doku tragen
Aenderungen aus allen Straengen gleichzeitig, und keine Zwischenstufe waere
lauffaehig.
ROADMAP IM DEPLOYMENTCENTER (2.7.0)
Planungsstand, Reihenfolge und Zustaendigkeit lagen in handgepflegten
Markdown-Dateien neben einem Bugtracker, der genau diese drei Dinge bereits
fuehrt. Zwei Pfleger fuer dasselbe Feld - Drift war eine Frage der Zeit.
Ab jetzt: Zustand im DC, Begruendung in der Datei. Kein Feld hat zwei Pfleger.
- Migration 016: epic, roadmap_rank, target_build, defer_trigger,
doc_anchor, Status "deferred", Tabelle roadmap_epics.
KEINE Roadmap-Tabelle - ein Eintrag ist ein bugtracker_item.
- Zugehoerigkeit ist ein Feld: Ein Item steht auf der Roadmap, wenn es ein
epic hat. Ein zweites Kennzeichen daneben koennte auseinanderlaufen.
- Kennung ist die Item-ID. Handvergebene Kuerzel ("A12") erzeugen die
schlimmste Fehlerart: Beide Seiten stimmig, Verschiedenes gemeint, weil
die Kennung nach einer Loeschung neu vergeben wurde.
- Zurueckstellen verlangt defer_trigger. Ohne benannten Anlass ist ein
Vorhaben nicht zurueckgestellt, sondern vergessen. Die Regel sitzt im
Repository, damit sie auf allen drei Schreibwegen gleich greift.
- Modules/Bugtracker/Roadmap.php, /api/bugtracker/v1/roadmap.php,
WebUI-Modul mit Filtern, cli/roadmap.php --write/--check,
dc_roadmap und dc_roadmap_set im MCP-Adapter.
- cli/roadmap.php --write ERZEUGT den Zustandsteil der Markdown-Datei;
--check prueft nur die Prosa. Was erzeugt wird, kann nicht driften.
- docs/ROADMAP_MIGRATION.md: Uebernahme fuer die anderen Projekte.
TESTINSTANZ UND TESTTOR
- dc-dev.mhdf.de: zweite Installation, eigene DB, eigene Schluessel,
Basic-Auth davor, Rocket.Chat aus.
- 124 Testfaelle in tests/e2e gegen API, Rechte, Migrationen, Sperre.
- scripts/deploy.py bringt vor jedem Upload erst den anstehenden Stand auf
die Testinstanz und laesst dann den Testlauf laufen. Erst bei
Rueckgabewert 0 geht etwas auf die Produktion (--ohne-test als Notausgang).
Andersherum prueft der Lauf aelteren Code als den, der gleich hochgeht.
- tests/ ist aus dem Produktiv-Deploy ausgeschlossen; testctl.php kann
nicht versehentlich auf dc.mhdf.de landen.
- Ein Lauf mit mehr uebersprungenen als geprueften Faellen endet mit
Rueckgabewert 2 statt 0. Nichts ist kaputt, geprueft wurde es aber auch
nicht - der Unterschied darf nicht am Rueckgabewert verschwinden.
SUPERVISOR, PROJEKTLANDSCHAFT, NACHPRUEFUNG (2.6.0/2.6.1)
- Migration 013: projektuebergreifend melden (dev_agent, evidence,
triage_external, affects).
- Migration 014: supervisor_findings, Katalog, fuenf serverseitige
Detektoren im Tick.
- Migration 015: Nachpruefung als Arbeitsschlange statt Benachrichtigung.
- DEV-Lizenzschluessel zur Selbstbedienung, dc-testkit fuer die Test-VM.
- MCP-Adapter: 15 Werkzeuge, ohne Fremdabhaengigkeiten, mit Abgrenzung
von Fremddaten gegen Prompt-Injektion.
BEHOBEN
- observe und status im Supervisor legten den Zustand des Befundes als
"status" in die Antwort. Http::ok() merged ['status' => 'success']
darunter, also gewann der Befundzustand - eine angenommene Meldung kam
als status="open" an. Heisst jetzt finding_status. War Item #59.
Migrationen 013-016 sind auf dem Produktivserver noch NICHT ausgefuehrt.
Ohne sie bricht das WebUI, weil die Roadmap-Ansicht bei jedem Seitenaufruf
gegen bugtracker_items.epic abfragt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
108 lines
4.4 KiB
Python
108 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Testlauf gegen die Testinstanz.
|
|
|
|
python tests/e2e/run.py # alles, mit Zuruecksetzen
|
|
python tests/e2e/run.py --gruppe sperre # nur eine Gruppe
|
|
python tests/e2e/run.py --nur roadmap # Namensfilter
|
|
python tests/e2e/run.py --kein-reset # bestehenden Datenbestand behalten
|
|
python tests/e2e/run.py --bericht bericht.json
|
|
python tests/e2e/run.py --log # bei Fehlern das Serverlog zeigen
|
|
|
|
Rueckgabewert: 0 wenn alles bestanden ist, 1 bei Fehlschlaegen, 2 wenn der
|
|
Lauf gar nicht erst starten konnte. scripts/deploy.py wertet genau das aus und
|
|
uebertraegt nichts auf die Produktion, solange hier etwas rot ist.
|
|
|
|
Testfaelle, die einen gemeldeten und noch offenen Befund festhalten, stehen in
|
|
bekannte_befunde.json. Sie laufen mit, erscheinen als BEK - und blockieren das
|
|
Deployment nicht. Besteht so ein Fall wieder, sagt der Lauf das ausdruecklich.
|
|
|
|
Gruppen:
|
|
sperre Zugangssperre und Webroot (.htaccess)
|
|
kern Zustand, OpenAPI, Migration, allgemeines Verhalten
|
|
token Token, Rechte, Provisionierung
|
|
bugtracker Melden, Arbeit holen, uebernehmen, abschliessen
|
|
roadmap Planung
|
|
fehlerstrom Ausnahmen aus Clients
|
|
lizenz Lizenzen und Entwicklungsschluessel
|
|
watchdog Lebenszeichen, Ereignisse, Auswertung
|
|
update Releases veroeffentlichen und finden
|
|
setup Erstinstallation
|
|
supervisor Befunde
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
|
|
import harness # noqa: E402
|
|
|
|
# Die Reihenfolge der Importe ist die Reihenfolge der Testfaelle.
|
|
import suite_sperre # noqa: E402,F401
|
|
import suite_kern # noqa: E402,F401
|
|
import suite_bugtracker # noqa: E402,F401
|
|
import suite_dienste # noqa: E402,F401
|
|
|
|
|
|
def main():
|
|
p = argparse.ArgumentParser(description="Testlauf gegen die Deploymentcenter-Testinstanz")
|
|
p.add_argument('--config', help="Pfad zu deploy_dev_config.json")
|
|
p.add_argument('--gruppe', action='append', help="nur diese Gruppe (mehrfach moeglich)")
|
|
p.add_argument('--nur', help="nur Testfaelle, deren Name diesen Text enthaelt")
|
|
p.add_argument('--kein-reset', dest='reset', action='store_false',
|
|
help="Datenbank nicht zuruecksetzen (dann master_token in der Konfiguration)")
|
|
p.add_argument('--bericht', help="Ergebnisse zusaetzlich als JSON ablegen")
|
|
p.add_argument('--log', action='store_true',
|
|
help="bei Fehlschlaegen das Serverlog der Testinstanz anzeigen")
|
|
p.add_argument('--stopp', action='store_true', help="beim ersten Fehlschlag abbrechen")
|
|
p.add_argument('--liste', action='store_true', help="nur die Testfaelle auflisten")
|
|
p.add_argument('--ipv4', action='store_true',
|
|
help="IPv4 erzwingen (sonst wird IPv6 einmal geprueft und bei "
|
|
"fehlender Route automatisch umgeschaltet)")
|
|
args = p.parse_args()
|
|
|
|
cfg = harness.lade_config(args.config)
|
|
|
|
if args.liste:
|
|
gruppe = None
|
|
for fall in harness.FAELLE:
|
|
if fall.gruppe != gruppe:
|
|
gruppe = fall.gruppe
|
|
print("")
|
|
print("%s:" % gruppe)
|
|
print(" %s" % fall.name)
|
|
print("")
|
|
print("%d Testfaelle" % len(harness.FAELLE))
|
|
return 0
|
|
|
|
code = harness.run(cfg,
|
|
gruppen=args.gruppe,
|
|
muster=args.nur,
|
|
reset=args.reset,
|
|
bericht_datei=args.bericht,
|
|
stoppen=args.stopp,
|
|
adressfamilie='ipv4' if args.ipv4 else None)
|
|
|
|
if code == 1 and args.log:
|
|
# Das Log liegt hinter der Sperre; ohne diesen Weg endet ein
|
|
# fehlgeschlagener Lauf bei "HTTP 500" und dem Raten, was dahinter
|
|
# stand.
|
|
client = harness.Client(cfg['base_url'],
|
|
cfg['basic_auth']['user'], cfg['basic_auth']['pass'])
|
|
r = client.post('/testctl.php', body={'action': 'log', 'lines': 40},
|
|
token=cfg['keys']['shared_key'])
|
|
print("")
|
|
print("--- Serverlog der Testinstanz " + "-" * 40)
|
|
for datei, zeilen in (r.feld('log', default={}) or {}).items():
|
|
print("[%s]" % datei)
|
|
for zeile in zeilen:
|
|
print(" %s" % zeile)
|
|
|
|
return code
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|