Servicio: port_labels — Formato único de etiquetas de puerto (Regla 2)
Propósito
Módulo único de utilidades para formatear etiquetas de puertos en la API y servicios de red. Regla 2: Elimina duplicación literal de las funciones _port_label() y _get_ports() que vivían en:
network/api/port_connections.py(endpoint CRUD de conexiones)network/services/cable_report.py(generador de informes)
Ambas hacían exactamente lo mismo (procesaban puertos de perfiles para generar etiquetas legibles) — ahora fuente única de verdad.
Funciones públicas
format_port_label(port: dict, profile: dict = None) -> str
Genera la etiqueta legible de un puerto.
Entrada:
port(dict): puerto del perfil, estructura{name, description, speed_bps, direction, ...}profile(dict, opt): contexto del perfil si aplica
Salida: string como "ge-0/0/1 (10Gbps ↔)" o "Eth1/47 (1Gbps)".
Lógica:
- Extrae nombre del puerto (
port["name"]) - Si tiene descripción, la incluye entre paréntesis
- Si tiene velocidad, formatea con
speed_label_to_bps()(p.ej. “10Gbps”) - Si tiene
direction(envío/recepción), añade flecha (→/←/↔)
Fuente: originalmente en port_connections.py L154 y cable_report.py L391.
get_ports_from_profile(profile: dict, exclude_connected: bool = False) -> list
Extrae la lista de puertos disponibles de un perfil.
Entrada:
profile(dict): modeloDeviceProfileserializadoexclude_connected(bool): siTrue, filtra puertos ya conectados
Salida: lista de dicts [{name, description, speed_bps, ...}, ...]
Lógica:
- Accede a
profile.get("ports", [])ojson.loads(profile["ports"])si es string - Ordena por clave numérica (
_sort_port_key) - Opcionalmente filtra por
PortConnection.objects.filter(source_port=puerto)
Fuente: originalmente en port_connections.py L182.
map_to_port_key(port_name: str) -> tuple
Convierte un nombre de puerto a clave de orden (helper para sort).
Entrada: "ge-0/0/1", "Eth1/47", "eth0", etc.
Salida: tupla (tipo_num, modulo, puerto) para sort natural.
Lógica: extrae números de la cadena y los convierte a int para comparación numérica.
Fuente: originalmente en cable_report.py L381.
Integración
Reemplazos directos:
port_connections.py: importafrom network.services.port_labels import format_port_label, get_ports_from_profilecable_report.py: importa ídem
Eliminación de duplicados:
port_connections.py: borra_port_label(),_get_ports(),_sort_port_key()cable_report.py: borra_port_label(),_get_ports(),_port_label_legacy()
Historía
Creado en commit 14e9074 (sesión 118, auditoría suprema SA5) como rectificación de hallazgo BAJA/deuda (Regla 2: Duplicación). El análisis de auditoría (auditoria-suprema-network-sa5.js) lo identificó en la sección “Cable Report + Port suggestion”:
_port_labely_get_portsestán DUPLICADOS literalmente enport_connections.pyy enservices/cable_report.py(el comentario L24 lo admite “copied from port_connections API”) → deuda de unificacion.
Esfuerzo de rectificación: S (pequeño).
Véase también
- [[entity—network—endpoint—port-connections]]
- [[entity—network—service—cable-report]]
- [[incident—20260609—auditoria-sa5-red-network]]
- [[concept—architecture—code-reuse]]