From 9996757e4b62a53b2cc7bae2a4ad5a83b3cb6939 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Mon, 4 May 2026 16:15:46 +0200 Subject: [PATCH] feat(snapshot): branche prod/hprod via prefixe hostname (vp/sp/lp = prod/metier ; reste = hprod/gestion) + fix matching DR vpsiaavcs1 (etait vpsicavcs1) + tolerance par name --- app/routers/planning_import.py | 10 ++++++--- app/services/quickwin_snapshot_service.py | 27 ++++++++++++++--------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/routers/planning_import.py b/app/routers/planning_import.py index e29f465..a25f0aa 100644 --- a/app/routers/planning_import.py +++ b/app/routers/planning_import.py @@ -692,9 +692,13 @@ async def iexec_snapshot(request: Request, row_id: int, db=Depends(get_db)): if not hostname: return JSONResponse({"ok": False, "detail": "Pas de hostname"}, status_code=400) - # Branche prod / hprod selon l'environnement Excel - env = str(row.environnement or "").lower() - branch = "prod" if env.startswith("prod") else "hprod" + # Branche prod / hprod basée sur le préfixe hostname (convention SANEF) : + # vp/sp/lp → prod → vCenter "metier" (Nanterre, vpmetavcs1) + # le reste → hprod → vCenter "gestion" (Senlis, vpgesavcs1) + # Plus fiable que la colonne environnement Excel (peut être bug-prone). + prefix = (hostname.split(".")[0] or "").lower()[:2] + PROD_PREFIXES = ("vp", "sp", "lp") + branch = "prod" if prefix in PROD_PREFIXES else "hprod" # Nom snapshot : __avant_patch intervenant = (row.intervenant or "patcheur").strip().replace(" ", "_") diff --git a/app/services/quickwin_snapshot_service.py b/app/services/quickwin_snapshot_service.py index 210c51e..5d84183 100644 --- a/app/services/quickwin_snapshot_service.py +++ b/app/services/quickwin_snapshot_service.py @@ -77,8 +77,14 @@ def _take_snapshot(vm, snap_name, description=""): def get_vcenter_order(db, branch): """Retourne la liste ordonnee des vCenters selon la branche. - hprod: Senlis → Nanterre → DR - prod: Nanterre → Senlis → DR""" + Endpoints reconnus : + - gestion : vpgesavcs1(.sanef.groupe) (= Senlis) + - metier : vpmetavcs1(.sanef.groupe) (= Nanterre) + - DR/SIA : vpsiaavcs1(.sanef.groupe) (fallback ultime) + Matching tolérant par endpoint OU par name de la table vcenters. + Ordre : + prod : metier → gestion → dr + hprod : gestion → metier → dr""" from sqlalchemy import text vcenters = db.execute(text( "SELECT id, name, endpoint FROM vcenters WHERE is_active = true ORDER BY id" @@ -86,20 +92,21 @@ def get_vcenter_order(db, branch): vc_map = {} for vc in vcenters: - ep = vc.endpoint.lower() - if "vpgesavcs1" in ep: - vc_map["senlis"] = vc - elif "vpmetavcs1" in ep: - vc_map["nanterre"] = vc - elif "vpsicavcs1" in ep: + ep = (vc.endpoint or "").lower() + nm = (vc.name or "").lower() + if "vpgesavcs1" in ep or "gestion" in nm: + vc_map["gestion"] = vc + elif "vpmetavcs1" in ep or "metier" in nm: + vc_map["metier"] = vc + elif "vpsiaavcs1" in ep or "vpsicavcs1" in ep or "sia" in nm or nm == "dr": vc_map["dr"] = vc else: vc_map.setdefault("other", []).append(vc) if branch == "prod": - order = [vc_map.get("nanterre"), vc_map.get("senlis"), vc_map.get("dr")] + order = [vc_map.get("metier"), vc_map.get("gestion"), vc_map.get("dr")] else: - order = [vc_map.get("senlis"), vc_map.get("nanterre"), vc_map.get("dr")] + order = [vc_map.get("gestion"), vc_map.get("metier"), vc_map.get("dr")] return [v for v in order if v is not None]