Servicio target_lifecycle — un solo camino para borrar y desactivar MonitoringTarget
Descripción
Módulo: monitoring/services/target_lifecycle.py (nuevo, 59 LOC)
Centraliza el ciclo de vida de baja de un MonitoringTarget en dos funciones. Antes la lógica de borrado estaba duplicada — y desincronizada — entre el endpoint DELETE /targets/{id} y el borrado en cascada de una ficha de dispositivo.
Introducido en la auditoría #261, ciclo 3 (task #264, PR #435, commit 39c13ea8):
- A21 —
DELETE /targets/{id}purgaba grupos de incidencias vacíos (#250) y avisaba al Agente Local tras borrar, pero el botón “Delete” de la ficha de dispositivo (delete_profile_full) se limitaba atargets.delete()sin hacer ninguna de las dos cosas: tarjetas fantasma en ITSM y el Agente sondeando equipos que ya no existían. - A23 — borrar un
racks.Devicedejaba su target huérfano (device=NULLpor elSET_NULLdel FK) pero activo y sondeado: un “target manual” que nadie había pedido.
Contrato
delete_targets(org, targets) -> int
Borra targets (queryset o lista) de org dejando el sistema coherente:
MonitoringTarget.objects.filter(organization=org, id__in=ids).delete().purge_empty_groups(org)— limpia los grupos deIncidentGroupque el borrado en cascada de alertas/insights deja vacíos.notify_agents(org.id)— el Agente Local no hace pull periódico; sin este aviso seguiría sondeando el target borrado hasta la próxima reconexión.
Devuelve cuántos targets se borraron; con lista vacía no toca la base de datos.
Llamadores: DELETE /api/monitoring/targets/{id} (monitoring/api/targets.py::delete_target) y delete_profile_full (network/api/profiles.py, borrado en cascada desde la ficha de dispositivo) — mismo camino, mismo comportamiento.
disable_targets_of_device(device) -> int
Desactiva (enabled=False) los targets de device sin borrarlos — conserva el histórico de métricas y alertas. Si más tarde un Device con la misma IP de gestión vuelve a existir, MonitoringTarget.get_or_create_for_device lo reactiva por el invariante “gestión de red válida → target activo”.
Llamador: señal pre_delete de racks.Device, conectada en MonitoringConfig.ready() (monitoring/apps.py). Se usa pre_delete — no post_delete — porque en post_delete el SET_NULL del FK ya habría desvinculado el target, y no podría localizarse por device_id.
Dependencias
monitoring.models.MonitoringTarget— entidad operada por ambas funciones.monitoring.api.common.notify_agents— aviso al Agente Local (import diferido para evitar ciclo de imports).monitoring.services.correlation_service.purge_empty_groups— limpieza deIncidentGrouptras el borrado (#250).racks.models.Device— disparadisable_targets_of_devicevía señalpre_delete.
Ejemplo de uso
from monitoring.services.target_lifecycle import delete_targets
deleted = delete_targets(org, MonitoringTarget.objects.filter(organization=org, ip_address=ip))
Cambios relacionados del mismo PR
El mismo commit toca otros puntos del ciclo de vida de los targets que no viven en este módulo pero son parte de la misma auditoría: AutoConfigService.configure_observatory deja de pisar los flags del usuario (A51, ver entity--network--service--auto-config) y MonitoringTarget.get_or_create_for_device deja de reenlazar el target entre Devices con la misma IP (A52, ver entity--monitoring--model--monitoringtarget).
Véase también
- [[entity—monitoring—model—monitoringtarget]]
- [[entity—racks—model—device]]
- [[entity—network—service—auto-config]]
- [[entity—monitoring—service—provisioning]]
- [[entity—monitoring—service—reopen-group]]