CreaRack-SL

DeviceProfile · Modelo network

Entidadactiveverificado Tue Sep 08#network#model#discovery#snmp#ssh

Propósito

DeviceProfile es la fuente de verdad sobre cualquier dispositivo de red descubierto por la Auto-Provision Tool. Almacena identidad (IP, hostname, vendor, modelo, serial), capacidades (SNMP/SSH/NETCONF), volcado ifTable SNMP, vecinos LLDP/CDP, deep discovery con MIBs vendor-específicas y confidence_score (0-100). A partir de este registro se auto-configuran Observatory (MonitoringTarget con ifIndex correcto), Rack Editor (sugerencia Stencil) y gestión de red (credenciales SSH).

Contrato

Campos principales:

CampoTipoDescripción
organizationFK(core.Organization)Tenant dueño
ip_addressGenericIPAddressFieldIP del dispositivo (PK lógico)
pending_ip_addressGenericIPAddressField (null)B-27 (25-09-2026): IP nueva detectada por un re-escaneo, pendiente de que un usuario la confirme o la descarte — ver [[feature—network—readdress-ip]]
dismissed_ip_addressGenericIPAddressField (null)B-27: IP que un usuario ya descartó para esta ficha; no se vuelve a proponer
hostname / fqdnCharFieldNombre resuelto
vendor / modelCharFieldFabricante y modelo inferidos
serial_number / mac_addressCharFieldIdentidad hardware
os_type / os_version / firmware_versionCharFieldSoftware
device_typeCharField(choices)router/switch/firewall/access_point/…
capabilitiesArrayFieldrouting, switching, vpn…
supports_snmp/ssh/telnet/netconf/restconfBooleanFieldProtocolos confirmados
snmp_version / snmp_communityCharFieldCredenciales SNMP v2c
snmp_v3_*CharFieldCredenciales SNMPv3
snmp_sys_descr / snmp_sys_object_id / snmp_uptime—OIDs base
interfacesJSONFieldifTable completa keyed por ifIndex
cpu_count / memory_total_mb / chassis_type—Hardware básico
deep_snmp_dataJSONFieldDeep discovery por categoría
mib_modules_loadedArrayFieldMIBs usados exitosamente
lldp_neighbors / cdp_neighborsJSONFieldVecinos topológicos
suggested_stencil_id / stencil_confidenceIntMatch fuzzy Stencil
discovery_methodCharField(choices)snmp/ssh/snmp+ssh/manual
confidence_scoreIntegerField(0-100)base 10 + identidad/SNMP/interfaces/hardware/método/plantilla/vecinos (fórmula completa en scoring.py::calculate_confidence); identidad verificada por sysObjectID: +10 si trae fabricante y modelo, +5 si solo uno de los dos o hay plantilla ≥70 (s314, v1.132.0)
linked_monitoring_targetFK(monitoring.MonitoringTarget)Auto-creado
linked_deviceFK(racks.Device)Device vinculado
groupsM2M(racks.RackGroup)Grupos
raw_snmp_data / raw_ssh_dataJSONFieldDumps crudos para debug

Métodos y propiedades:

  • get_interface_by_description(description).
  • get_interface_by_index(if_index).
  • get_uplink_interfaces(min_speed_bps=1Gbps) — filtra alta velocidad para Observatory.
  • get_operational_interfaces() — ifOperStatus == 1.
  • interface_count, has_neighbors, neighbor_count (properties).
  • is_high_confidence — confidence_score >= 80.
  • is_linked_to_observatory, is_linked_to_rack_editor (properties).
  • update_last_verified() — timezone.now() con update_fields.

Meta:

  • Tabla: device_profiles.
  • unique_together: [organization, ip_address].
  • ordering: -confidence_score, -discovered_at.
  • Índices: vendor+model, confidence_score, discovered_at, org+device_type, org+supports_snmp.

Dependencias entrantes

MóduloArchivoUso
DeviceDiscoveryServicenetwork/services/device_discovery/service.pyprovision_device/bulk_provision_subnet
ProvisionStagesMixinnetwork/services/device_discovery/provision_stages.py_persist_profile con update_or_create; antes de apply_manual_lock llama a scoring.py::carry_over_knowledge, que rellena con la ficha anterior los campos que esta pasada trae vacíos (s314)
AutoConfigServicenetwork/services/auto_config.pyCrea MonitoringTarget, sugiere Stencil
network/api/discovery.pyAPIPOST /auto-provision/discover; expone DeviceProfileOut
network/api/profiles.pyAPICRUD + re-scan ifTable + propagate ports + pending-ip/apply y /dismiss (B-27)
network/services/readdress.pyServicechange_profile_ip, propose_ip_change, clear_stale_ip_change, dismiss_pending_ip_change (B-27)
network/services/device_discovery/rescan_hooks.pyServicereaddress_profile_by_mac — propone el cambio pendiente cuando el re-escaneo ve la MAC en otra IP (B-27)
racks/services/racks.pyServiceAuto-link a Device, inyecta puertos desde ifTable
monitoring/views.pyViewsbulk_update de linked_monitoring_target
monitoring/api/wireless.py / ups.pyAPIsListan y vinculan por device_type
monitoring/services/group_service.pyGruposConsulta por grupo y device_type
terminal/consumers.pySentinelResuelve OIDs vía DeviceProfile → VendorProfile
PortConnectionnetwork/models.pyOneToOne FK port_connection
signage/models.pySignageFK directa desde modelos
core/services/backup_service.pyBackupSerializa en exports

Dependencias salientes

  • core.Organization — FK CASCADE.
  • monitoring.MonitoringTarget — link auto-creado (SET_NULL).
  • racks.Device — link al Device del Rack Editor (SET_NULL).
  • racks.RackGroup — M2M wireless/UPS/signage groups.
  • network.VendorProfile — consultado por servicios externos; no FK directa.

Ejemplos

  • Discovery mínimo: solo ip_address + organization; confidence_score = 10 (ping).
  • SNMP completo: snmp_sys_descr poblado, interfaces con ifTable, confidence_score >= 60.
  • Full con SSH: discovery_method = "snmp+ssh", serial_number y os_version enriquecidos, confidence_score >= 80.
  • Post auto-config: linked_monitoring_target apunta a MT con snmp_interface_index; linked_device apunta al Device con puertos inyectados desde interfaces.
  • Cambio de IP pendiente: pending_ip_address poblada tras un re-escaneo que vio la MAC en otra IP; la ficha sigue sirviendo por su ip_address de siempre hasta que un usuario confirma o descarta (B-27).

Notas operativas

  • Backfill de firmware_version (migración network/0065_backfill_firmware_from_deep_snmp, v1.126.0 · 2026-09-06, task #281 pt.3): el escritor de terminal/api/sentinel_ingest.py solo rellena firmware_version cuando llega una foto NUEVA de deep discovery — las fichas cuya foto se tomó antes de ese arreglo se quedaban con el campo vacío aunque el dato ya estuviera en deep_snmp_data. La migración es idempotente (solo toca fichas con firmware_version vacío y foto con valor; lo escrito a mano no se pisa) y usa una copia local del extractor, con un test de paridad contra sentinel_ingest.extract_firmware (tests/network/test_ronda_0906_tanda5.py) para no depender del código vivo. En PROD recuperó 123 de 129 fichas con foto y sin firmware (medido 30-08-2026) — visible en el inventario de puntos de acceso, su detalle, el informe y el CSV.
  • La nota de confianza sobrevive a una pasada floja (network/services/device_discovery/scoring.py::carry_over_knowledge, llamado en provision_stages.py::_persist_profile antes de apply_manual_lock, v1.132.0 · 2026-09-08, medido en el escaneo del CCIB, s314): antes, una pasada que no hablaba SNMP con un equipo ya conocido pisaba hostname/modelo/serie/OS/sysDescr/sysObjectID/CPU/memoria con huecos vacíos, apagaba supports_snmp/supports_ssh, devolvía device_type a “other” y recalculaba la nota solo con lo de esa pasada — 47 puntos de acceso Cambium cayeron a 30 (ficha completa: 45) y un switch Cisco a 45 (ficha: 60). Ahora un campo vacío de esta pasada se rellena con el valor anterior, los flags no se apagan, y la nota nunca baja de la que ya tenía la ficha; los campos bloqueados a mano los sigue respetando apply_manual_lock igual que antes. Además la identidad confirmada por sysObjectID ya no exige plantilla de rack para subir de nota (con fabricante y modelo suma +10 en vez de +5) — un punto de acceso, un SAI o un sensor plenamente identificados dejan de tener techo bajo. Y en los switches Cisco, model guarda ahora el chasis (p.ej. C9300-48P) en vez de “IOS”, que es el nombre del sistema operativo (ssh_stage.py::_cisco_ios_model).
  • Cambio de IP pendiente de confirmación (network/0067_deviceprofile_pending_ip.py, 25-09-2026, decisión de Edu que sustituye la de la task #314): un re-escaneo que ve la MAC de esta ficha en otra IP ya no reescribe ip_address sola; la deja en pending_ip_address hasta que un usuario la aplica o la descarta desde la página Devices. Campo nuevo → viaja en el backup/restore de racks/api/export/{backup,restore}.py (vigilado por tests/api/test_backup_scope.py::test_device_profile_serializer_covers_model_fields). Detalle completo del flujo en [[feature—network—readdress-ip]].
  • entity--network--model--vendorprofile — proporciona communities, OIDs y regex usados en discovery.
  • entity--racks--model--device — destino de linked_device; recibe puertos desde ifTable.
  • concept--network--auto-provision — flujo orquestado por DeviceDiscoveryService.
  • feature--network--readdress-ip — servicio único que escribe ip_address, a mano o vía confirmación de un cambio pendiente.

Véase también

  • [[entity—network—model—vendorprofile]]
  • [[entity—racks—model—device]]
  • [[concept—network—auto-provision]]
  • [[feature—network—readdress-ip]]