mirror of
https://github.com/hansjone/netx.git
synced 2026-10-15 06:03:18 +08:00
Optimize cutover compare/monitor per the 2026-10-12 plan.
Correctness (A): normalize port-map names with the template rules (snapshot v2, v1 replays unchanged); protect mappings/templates that are referenced; stop dropping edited mapping text; accept pulled-but-not-shutdown ports as migrated; validate baseline ownership on project create; one canonical key form; fix built-in template tolerances and upgrade old packaged values in place. Cross-vendor identity (B): single identity pipeline for every path, per-side and per-vendor interface rules, value maps, filters after normalization, mapping pre-flight for compare and cutover projects, SQL eligibility fixes. Data quality (V): no_data / suspect_parse / not_collected sheet states, command slice coverage, directional compare modes, value-sorted duplicate pairing, before-side raw names in results and CSV. Robustness (H): bounded auto-run history, background evaluate/finish with polling, manual route tables out of the acceptance gate, baseline row cache, scoped duplicate-key failures, merged HF tasks with a per-NE session cap, same-device cutover, explicit scope_by_port_map, read-only GETs, resolvable red tickets. Frontend: pre-flight report, mapping table view, template editor support for the new rules, data-state banners. Docs: canonical field contract. Not included: Huawei status parsers (no real samples), SQL-path route compare. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fff7d63b9b
commit
315539e0fd
59 changed files with 6483 additions and 487 deletions
|
|
@ -151,6 +151,12 @@ def api_baseline_ports(project_id: str, db: Session = Depends(get_db)):
|
|||
return svc.list_baseline_ports(db, project_id)
|
||||
|
||||
|
||||
@router.get("/projects/{project_id}/preflight")
|
||||
@router.post("/projects/{project_id}/preflight")
|
||||
def api_project_preflight(project_id: str, db: Session = Depends(get_db)):
|
||||
return svc.preflight_project(db, project_id)
|
||||
|
||||
|
||||
@router.get("/projects/{project_id}/baseline-expect")
|
||||
def api_baseline_expect(project_id: str, db: Session = Depends(get_db)):
|
||||
"""Multi-metric baseline keys for expect-set picking (from monitor template sheets)."""
|
||||
|
|
@ -222,8 +228,13 @@ def api_finish_batch(
|
|||
mark_done: bool = False,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""本批完成:终验 + 小结 + 红单(允许带红继续)."""
|
||||
return svc.finish_batch(db, batch_id, mark_done=mark_done)
|
||||
"""本批完成:终验 + 小结 + 红单(允许带红继续). Runs in the background; poll the run."""
|
||||
return svc.enqueue_finish(db, batch_id, mark_done=mark_done)
|
||||
|
||||
|
||||
@router.post("/projects/{project_id}/red-tickets/resolve-resolvable")
|
||||
def api_resolve_resolvable(project_id: str, db: Session = Depends(get_db)):
|
||||
return svc.resolve_resolvable_red_tickets(db, project_id)
|
||||
|
||||
|
||||
@router.get("/projects/{project_id}/red-tickets")
|
||||
|
|
@ -258,9 +269,10 @@ def api_patch_batch(batch_id: str, body: BatchPatchIn, db: Session = Depends(get
|
|||
@router.post("/batches/{batch_id}/evaluate")
|
||||
def api_evaluate(batch_id: str, body: EvaluateIn | None = None, db: Session = Depends(get_db)):
|
||||
payload = body.model_dump() if body else {}
|
||||
return svc.run_evaluate(
|
||||
# Returns the ``running`` run at once; poll GET /runs/{id} until ``status`` settles.
|
||||
return svc.enqueue_evaluate(
|
||||
db,
|
||||
batch_id=batch_id,
|
||||
batch_id,
|
||||
old_batch_id=str(payload.get("old_batch_id") or ""),
|
||||
new_batch_id=str(payload.get("new_batch_id") or ""),
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue