Problema
El botón Refresh en el panel de Auto-Provision (Parte 4a) llamaba a un endpoint server-side:
POST /auto-provision/profiles/{id}/rediscover
Este endpoint ejecutaba el descubrimiento completo (Ping, ARP, SNMP, HTTP) en el servidor PROD (Hetzner) reutilizando las credenciales SNMP/SSH del DeviceProfile.
Pero el problema: los dispositivos a descubrir viven en la LAN privada del cliente (IPs privadas: 10.x.x.x, 192.168.x.x, 172.16.x.x), y el servidor PROD no alcanza esas redes. Resultado: Device 10.4.4.2 is not reachable → respuesta 400.
Los tests de CI mockeaban DeviceDiscoveryService.provision_device(), por lo que pasaban en verde sin detectar el problema.
Solución
El descubrimiento DEBE ir siempre por el Local Agent (cliente), igual que el escaneo de subred normal. El servidor nunca debe intentar ping/nmap/SNMP directo: esas redes son inaccesibles.
Cambios realizados
1. Nuevo método _agentProbeIp() en discovery.js
Probe silencioso vía Local Agent sin modificar la UI del wizard. Fases:
- ICMP Ping →
http://localhost:5050/network/ping-icmp?host=<ip> - ARP lookup →
http://localhost:5050/network/arp-table?subnet=10.4.4.0 - SNMP discover →
POST http://localhost:5050/network/snmp-discovercon múltiples communities (guardada + vendor-specific + públicas) - HTTP fingerprint →
POST http://localhost:5050/network/http-fingerprint(opcional)
Devuelve objeto:
{
pingResult: { reachable: true, rtt_ms: 2.5 },
arpData: { mac: "00:11:22:33:44:55", vendor: "Cisco Systems" },
snmpData: { sysDescr: "...", sysObjectID: "...", ... },
httpData: { ports: [...], certificates: [...], ... }
}
Reutiliza la community SNMP guardada en el profile + intenta fallback a communities conocidas.
2. refreshProfile() en deep_discovery.js — client-side
Flujo nuevo:
- Obtiene credenciales SSH guardadas (endpoint
GET /api/network/auto-provision/profiles/{id}/credentials). - Llama
_agentProbeIp(ip, { snmpCommunity })→ ejecuta probe en el cliente. - Construye payload compatible con el endpoint normal
/api/network/auto-provision/discover:{ ip, snmp_community, mac_address, vendor_hint, rtt_ms, snmp_data, http_data, ssh_username, ssh_password, snmp_version, // 'v2c' o 'v3' snmp_v3_* // si aplica } - Reutiliza el mismo endpoint de enriquecimiento que el discovery normal → actualiza el
DeviceProfilein-place.
3. Eliminación de /auto-provision/profiles/{id}/rediscover
Se retira completamente:
- Endpoint en
network/api/discovery.py(55 LOC). - Test en
tests/api/test_network_rediscover.py(64 LOC).
El código es architecturally broken para el caso real (LAN privada) y fue un patrón de error que pasó por fallback de mocks en CI.
Impacto arquitectónico
- Antes: Re-discovery = endpoint server-side →
DeviceDiscoveryService.provision_device()desde PROD. - Después: Re-discovery = llamada Agent desde cliente (como escaneo normal).
Coherencia: ahora TODO el discovery (escaneo + refresh) es vía Local Agent, eliminando dependencia de conectividad PROD→LAN cliente.
Requisitos para el Local Agent
El Local Agent debe implementar estos endpoints (accesibles en http://localhost:5050/):
GET /network/ping-icmp?host=<ip>&timeout=3000→{ reachable: bool, rtt_ms: number }GET /network/arp-table?subnet=10.4.4.0→{ devices: [{ ip, mac, vendor }] }POST /network/snmp-discover(body:{ ip, communities: [...], timeout: 3.0 }) →{ success, sysDescr, ... }POST /network/http-fingerprint(body:{ ip, ports: [80, 443], timeout: 3.0 }) →{ success, ports: [...] }
Si el Local Agent no está disponible, _agentProbeIp() lanza: "Local Agent not available. Please start CreaRackAgent.exe".
Testing
- Se eliminó test para
rediscover(endpoint broken). refreshProfile()requiere integration test del lado del cliente (o manual en sandbox) para verificar:- Probe sin error si el Agent está corriendo.
- Error claro si el Agent no está disponible.
- Credenciales SSH se recuperan y se envían si existen.
- Payload se construye correctamente (MAC, vendor, RTT, SNMP v2c/v3).
Véase también
- [[entity—network—endpoint—discover-device]]
- [[entity—network—endpoint—assign-types]]
- [[entity—network—model—device-profile]]
- [[concept—network—device-discovery]]
- [[concept—saas—multi-tenancy]]
Referenciado desde
- Auto-Provision no pierde su listado de resultados por el cierre de sesión
- Auto-Provision prueba "public" justo después de tu comunidad SNMP, y admite varias separadas por comas
- El auto-descubrimiento identifica un equipo por su MAC, no por su IP — un re-escaneo actualiza la ficha en vez de duplicarla
- Onboarding guiado de descarga del Local Agent (PR #182, #293)