Device · Modelo racks
Device · Modelo racks
Propósito
Device representa un dispositivo físico instalado dentro de un Rack. Registra su posición en unidades U, metadatos de modelo en JSON, estado de monitorización y configuración de red con cifrado Fernet para IPs sensibles. Es el nodo central del editor: conecta la visualización de posición con los subsistemas de red, monitorización y terminal SSH.
Contrato
Campos:
| Campo | Tipo | Notas |
|---|---|---|
rack | FK(Rack, CASCADE) | Rack contenedor; la organización se hereda |
name | CharField(100) | Nombre del dispositivo |
u_position | IntegerField | Posición inferior en unidades U |
u_height | IntegerField(default=1) | Altura en U |
notes | TextField(blank) | Notas libres |
model_data | TextField(default="{}") | JSON con metadatos de modelo y puertos enriquecidos |
status | CharField | online / offline / warning / unknown |
last_status_check | DateTimeField(null) | Última comprobación |
management_config | TextField(default="{}") | JSON con IP (Fernet si empieza gAAAA), creds, vendor |
groups | M2M(RackGroup) | Grupos lógicos compartidos con el rack |
Métodos y propiedades:
has_network_management—Truesimanagement_configtiene IP válida yenabledno esFalse.management_ip— extrae y descifra IP (soporta clavesip_address,ip,host).management_vendor— extraevendordemanagement_config(default"generic")._decrypt_if_needed(value)— detecta tokens Fernet (gAAAA…) y delega aCredentialManager.safe_decrypt.
Meta:
- Índice compuesto
idx_device_rack_upossobre(rack, u_position). __str__devuelve"{name} in {rack}".
Dependencias entrantes
| Módulo | Archivo | Relación |
|---|---|---|
monitoring.MonitoringTarget | monitoring/models.py | FK("racks.Device", SET_NULL) |
network.DeviceProfile | network/models.py | linked_device = FK("racks.Device", SET_NULL) |
network.PortConnection | network/models.py | device y connected_device FKs |
racks.ConfigBackup | racks/models.py | FK(Device, CASCADE) |
terminal/api/network.py | terminal | Lookup para SSH |
terminal/views.py | terminal | Actualización de estado |
network/api/devices.py | network | CRUD config red |
core/tasks.py | core | Tareas Huey de monitorización |
core/api/search.py | core | Búsqueda global |
Dependencias salientes
racks.Rack— FK directa; organización se resuelve viarack__organization.racks.RackGroup— M2M compartida con el rack.core.security.CredentialManager— descifrado Fernet de IPs enmanagement_config.network.models.DeviceProfile— vinculado vía_try_link_device_profile(racks/services/racks.py).network.services.auto_config.AutoConfigService— invocado tras crear Device con IP para auto-configurar Observatory.
Ejemplos
- Creación bulk con link automático:
RackService.bulk_update_deviceshaceDevice.objects.bulk_create, luego_try_link_device_profilevincula DeviceProfile porprofile_ido match de IP, inyecta puertos enriquecidos enmodel_datae inicia auto-config. - Validación de IP duplicada:
check_duplicate_management_iprecorremanagement_configde todos los devices del tenant (caché bulk) y lanzaValueErrorsi la IP ya está asignada. - Terminal SSH:
terminal/api/network.pyobtiene Device porid + rack__organization, extraemanagement_ipymanagement_vendorpara abrir sesión SSH.
Related
entity--racks--model--rack— contenedor directo; organización y soft-delete se heredan.entity--racks--model--stencil— plantilla de la que puede derivarmodel_data.entity--network--model--deviceprofile— perfil de red descubierto vinculable.entity--monitoring--model--monitoringtarget— target auto-generado al crear Device con IP.
Véase también
- [[entity—racks—model—rack]]
- [[entity—racks—model—stencil]]
- [[entity—network—model—deviceprofile]]
- [[entity—monitoring—model—monitoringtarget]]