Sync iTop: responsables domaine par fréquence + emails
- domain_environments.responsable_nom/email = responsable_domaine iTop le plus fréquent par couple domaine×env - servers.responsable_nom/email = responsable_serveur iTop (par VM) - servers.referent_nom/email = responsable_domaine iTop (par VM) - Mapping Excel: Resp Domaine DTS → domain_environments.responsable, Valideur RA = par serveur
This commit is contained in:
parent
73cec814b6
commit
3707308063
@ -3,6 +3,7 @@ import logging
|
|||||||
import requests
|
import requests
|
||||||
import json
|
import json
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from collections import defaultdict
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -183,7 +184,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
|
|||||||
fullname = f"{p.get('first_name','')} {p.get('name','')}".strip()
|
fullname = f"{p.get('first_name','')} {p.get('name','')}".strip()
|
||||||
person_email[fullname.lower()] = p.get("email", "")
|
person_email[fullname.lower()] = p.get("email", "")
|
||||||
|
|
||||||
# ─── 7. VirtualMachines ───
|
# ─── 7. Pre-collect responsables per domaine×env (most frequent wins) ───
|
||||||
|
# Will be populated during VM processing, then used to update domain_environments
|
||||||
|
de_responsables = defaultdict(lambda: {"resp_dom": defaultdict(int), "resp_dom_email": {},
|
||||||
|
"referent": defaultdict(int), "referent_email": {}})
|
||||||
|
|
||||||
|
# ─── 8. VirtualMachines ───
|
||||||
vms = client.get_all("VirtualMachine",
|
vms = client.get_all("VirtualMachine",
|
||||||
"name,description,status,managementip,osfamily_id_friendlyname,"
|
"name,description,status,managementip,osfamily_id_friendlyname,"
|
||||||
"osversion_id_friendlyname,organization_name,cpu,ram,"
|
"osversion_id_friendlyname,organization_name,cpu,ram,"
|
||||||
@ -214,12 +220,8 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
|
|||||||
de_id = row.id
|
de_id = row.id
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
resp_dom_name = v.get("responsable_domaine_name", "")
|
db.execute(text("INSERT INTO domain_environments (domain_id, environment_id) VALUES (:d, :e)"),
|
||||||
resp_dom_email = person_email.get(resp_dom_name.lower(), "")
|
{"d": did, "e": eid})
|
||||||
db.execute(text("INSERT INTO domain_environments (domain_id, environment_id, responsable_nom, responsable_email, referent_nom, referent_email) VALUES (:d, :e, :rn, :re, :fn, :fe)"),
|
|
||||||
{"d": did, "e": eid, "rn": resp_dom_name, "re": resp_dom_email,
|
|
||||||
"fn": v.get("responsable_serveur_name", ""),
|
|
||||||
"fe": person_email.get(v.get("responsable_serveur_name", "").lower(), "")})
|
|
||||||
db.commit()
|
db.commit()
|
||||||
row = db.execute(text("SELECT id FROM domain_environments WHERE domain_id=:d AND environment_id=:e"),
|
row = db.execute(text("SELECT id FROM domain_environments WHERE domain_id=:d AND environment_id=:e"),
|
||||||
{"d": did, "e": eid}).fetchone()
|
{"d": did, "e": eid}).fetchone()
|
||||||
@ -227,6 +229,13 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
|
|||||||
except Exception:
|
except Exception:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
|
|
||||||
|
# Collect responsables for this domain×env
|
||||||
|
if de_id:
|
||||||
|
resp_dom = v.get("responsable_domaine_name", "")
|
||||||
|
if resp_dom:
|
||||||
|
de_responsables[de_id]["resp_dom"][resp_dom] += 1
|
||||||
|
de_responsables[de_id]["resp_dom_email"][resp_dom] = person_email.get(resp_dom.lower(), "")
|
||||||
|
|
||||||
zone_id = zone_map.get(v.get("zone_name", "").lower())
|
zone_id = zone_map.get(v.get("zone_name", "").lower())
|
||||||
tier_raw = v.get("tier_name", "")
|
tier_raw = v.get("tier_name", "")
|
||||||
tier = tier_raw.lower().replace(" ", "") if tier_raw else "a_definir"
|
tier = tier_raw.lower().replace(" ", "") if tier_raw else "a_definir"
|
||||||
@ -295,7 +304,19 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
|
|||||||
db.rollback()
|
db.rollback()
|
||||||
stats["errors"].append(f"VM {hostname}: {str(e)[:80]}")
|
stats["errors"].append(f"VM {hostname}: {str(e)[:80]}")
|
||||||
|
|
||||||
# ─── 8. Physical Servers ───
|
# ─── 8b. Update domain_environments with most frequent responsables ───
|
||||||
|
for de_id, resps in de_responsables.items():
|
||||||
|
updates = {}
|
||||||
|
if resps["resp_dom"]:
|
||||||
|
top_resp = max(resps["resp_dom"], key=resps["resp_dom"].get)
|
||||||
|
updates["responsable_nom"] = top_resp
|
||||||
|
updates["responsable_email"] = resps["resp_dom_email"].get(top_resp, "")
|
||||||
|
db.execute(text("""UPDATE domain_environments SET
|
||||||
|
responsable_nom=:responsable_nom, responsable_email=:responsable_email
|
||||||
|
WHERE id=:id"""),
|
||||||
|
{"id": de_id, **updates}) if updates else None
|
||||||
|
|
||||||
|
# ─── 9. Physical Servers ───
|
||||||
phys = client.get_all("Server",
|
phys = client.get_all("Server",
|
||||||
"name,description,status,managementip,osfamily_id_friendlyname,"
|
"name,description,status,managementip,osfamily_id_friendlyname,"
|
||||||
"osversion_id_friendlyname,contacts_list,location_name")
|
"osversion_id_friendlyname,contacts_list,location_name")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user