haiku вайб 10

This commit is contained in:
dv 2026-04-08 12:38:42 +03:00
parent 0659f60fa3
commit 435e425cd1

View file

@ -479,6 +479,14 @@ async def discover_via_ssh(
return result return result
# Step 2: SSH into each rack, parse config, upsert devices # Step 2: SSH into each rack, parse config, upsert devices
# Build mapping of external_id -> Rack ID for device assignment
rack_id_mapping = {}
from app.models.rack import Rack
all_racks = (await db.execute(select(Rack).where(Rack.object_id == obj.id))).scalars().all()
for rack in all_racks:
if rack.external_id:
rack_id_mapping[rack.external_id] = rack.id
for external_id, rack_host, rack_name in rack_hosts: for external_id, rack_host, rack_name in rack_hosts:
# Resolve config_path override from the embedded device's connection_params # Resolve config_path override from the embedded device's connection_params
existing_rack_pc = (await db.execute( existing_rack_pc = (await db.execute(
@ -563,8 +571,9 @@ async def discover_via_ssh(
logger.info(f"[ssh_discovery] Found {len(devices_found)} devices from plugins in {rack_host}") logger.info(f"[ssh_discovery] Found {len(devices_found)} devices from plugins in {rack_host}")
for found in devices_found: for found in devices_found:
# Hostname: "rack{rack_name}-{plugin_name}", e.g. "rack01-camera_grz" # Hostname: "{external_id}-{plugin_name}", e.g. "lane-1-1-camera_1"
hostname = f"rack{rack_name}-{found.plugin_name}" hostname = f"{external_id}-{found.plugin_name}"
rack_id = rack_id_mapping.get(external_id)
try: try:
existing = (await db.execute( existing = (await db.execute(
@ -583,10 +592,14 @@ async def discover_via_ssh(
changes.append(f"role: other→{found.role}") changes.append(f"role: other→{found.role}")
existing.role = found.role existing.role = found.role
# Update hostname if it was never set or still auto-generated # Update hostname if it was never set or still auto-generated
if not existing.hostname or existing.hostname.startswith("rack"): if not existing.hostname or existing.hostname.startswith("rack") or existing.hostname.startswith("lane"):
if existing.hostname != hostname: if existing.hostname != hostname:
changes.append(f"hostname: '{existing.hostname}''{hostname}'") changes.append(f"hostname: '{existing.hostname}''{hostname}'")
existing.hostname = hostname existing.hostname = hostname
# Update rack_id if not set
if existing.rack_id is None and rack_id is not None:
existing.rack_id = rack_id
changes.append(f"rack_id: None→{rack_id}")
if changes: if changes:
logger.info(f"[ssh_discovery] {found.ip} ({found.plugin_name}) - UPDATED: {', '.join(changes)}") logger.info(f"[ssh_discovery] {found.ip} ({found.plugin_name}) - UPDATED: {', '.join(changes)}")
@ -618,9 +631,10 @@ async def discover_via_ssh(
category=found.category, category=found.category,
role=found.role, role=found.role,
source="auto_ssh", source="auto_ssh",
rack_id=rack_id,
device_meta={"plugin": found.plugin_name, "cls": found.cls}, device_meta={"plugin": found.plugin_name, "cls": found.cls},
)) ))
logger.info(f"[ssh_discovery] {found.ip} ({found.plugin_name}) - ADDED: category={found.category}, role={found.role}, hostname={hostname}, source=auto_ssh") logger.info(f"[ssh_discovery] {found.ip} ({found.plugin_name}) - ADDED: category={found.category}, role={found.role}, hostname={hostname}, rack_id={rack_id}, source=auto_ssh")
result.created += 1 result.created += 1
result.actions.append(DeviceAction( result.actions.append(DeviceAction(
ip=found.ip, ip=found.ip,