Implementar nueva lógica de estados de sincronización basada en ubicación de archivos
- Agregar nuevos estados: Recibido y Procesando
- Implementar función determine_sync_status() que verifica:
* D:\sftp\{nodo}.zip -> estado 'Recibido'
* D:\BackupSFTP\{nodo}.zip -> estado 'Procesando'
* Comparación de fechas para estado 'Actualizada'
- Actualizar get_node_status() y get_all_nodes() para usar nueva lógica
- Agregar script de pruebas test_sync_status.py
This commit is contained in:
@@ -9,6 +9,8 @@ class EstadoSincronizacion(str, Enum):
|
||||
ACTUALIZADA = "Actualizada"
|
||||
ATENCION = "Atención"
|
||||
ERROR = "Error"
|
||||
RECIBIDO = "Recibido"
|
||||
PROCESANDO = "Procesando"
|
||||
|
||||
|
||||
class NodeStatus(BaseModel):
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from fastapi import APIRouter, HTTPException, Path, Query
|
||||
from typing import List, Optional
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from database.connection import db_connection
|
||||
from models.sync_models import (
|
||||
@@ -42,6 +43,64 @@ def calculate_time_since_sync(last_sync: Optional[datetime]) -> Optional[str]:
|
||||
return f"{days} días"
|
||||
|
||||
|
||||
def determine_sync_status(node_name: str, last_restore_date: Optional[datetime] = None) -> str:
|
||||
"""
|
||||
Determina el estado de sincronización basado en la ubicación de los archivos ZIP del nodo.
|
||||
|
||||
Lógica:
|
||||
- Si existe en D:\sftp -> "Recibido"
|
||||
- Si existe en D:\BackupSFTP -> "Procesando"
|
||||
- Si la fecha de última sincronización es mayor a la del archivo en D:\BackupSFTP -> "Actualizada"
|
||||
- En otros casos sigue la lógica anterior basada en fechas
|
||||
"""
|
||||
try:
|
||||
sftp_path = f"D:\\sftp\\{node_name}.zip"
|
||||
backup_sftp_path = f"D:\\BackupSFTP\\{node_name}.zip"
|
||||
|
||||
# Verificar si existe en D:\sftp (prioridad más alta)
|
||||
if os.path.exists(sftp_path):
|
||||
return EstadoSincronizacion.RECIBIDO.value
|
||||
|
||||
# Verificar si existe en D:\BackupSFTP
|
||||
if os.path.exists(backup_sftp_path):
|
||||
# Si tenemos fecha de última restauración, comparar
|
||||
if last_restore_date:
|
||||
try:
|
||||
# Obtener fecha de modificación del archivo
|
||||
file_mod_time = datetime.fromtimestamp(os.path.getmtime(backup_sftp_path))
|
||||
|
||||
# Si la última sincronización es más reciente que el archivo
|
||||
if last_restore_date > file_mod_time:
|
||||
return EstadoSincronizacion.ACTUALIZADA.value
|
||||
except OSError:
|
||||
# Si hay error leyendo el archivo, asumir procesando
|
||||
pass
|
||||
|
||||
return EstadoSincronizacion.PROCESANDO.value
|
||||
|
||||
# Si no existe en ninguna ruta SFTP, usar lógica basada en fechas de restauración
|
||||
if last_restore_date is None:
|
||||
return EstadoSincronizacion.ERROR.value
|
||||
elif last_restore_date < datetime.now() - timedelta(days=7):
|
||||
return EstadoSincronizacion.ERROR.value
|
||||
elif last_restore_date < datetime.now() - timedelta(hours=24):
|
||||
return EstadoSincronizacion.ATENCION.value
|
||||
else:
|
||||
return EstadoSincronizacion.ACTUALIZADA.value
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error determinando estado de sincronización para {node_name}: {str(e)}")
|
||||
# En caso de error, usar lógica de fechas como fallback
|
||||
if last_restore_date is None:
|
||||
return EstadoSincronizacion.ERROR.value
|
||||
elif last_restore_date < datetime.now() - timedelta(days=7):
|
||||
return EstadoSincronizacion.ERROR.value
|
||||
elif last_restore_date < datetime.now() - timedelta(hours=24):
|
||||
return EstadoSincronizacion.ATENCION.value
|
||||
else:
|
||||
return EstadoSincronizacion.ACTUALIZADA.value
|
||||
|
||||
|
||||
@router.get("/{node_name}/status",
|
||||
response_model=NodeStatus,
|
||||
summary="Obtener estado específico de un nodo",
|
||||
@@ -108,15 +167,8 @@ async def get_node_status(
|
||||
last_restore_date = restore_info.get('last_restore_date')
|
||||
size_mb = restore_info.get('size_mb', 0)
|
||||
|
||||
# Determinar estado basado en fecha de restauración
|
||||
if last_restore_date is None:
|
||||
estado = 'Error'
|
||||
elif last_restore_date < datetime.now() - timedelta(days=7):
|
||||
estado = 'Error'
|
||||
elif last_restore_date < datetime.now() - timedelta(hours=24):
|
||||
estado = 'Atención'
|
||||
else:
|
||||
estado = 'Actualizada'
|
||||
# Determinar estado basado en ubicación de archivos y fecha de restauración
|
||||
estado = determine_sync_status(node_name, last_restore_date)
|
||||
|
||||
# Calcular tiempo desde última sincronización
|
||||
time_since_sync = calculate_time_since_sync(last_restore_date)
|
||||
@@ -207,15 +259,8 @@ async def get_all_nodes(
|
||||
# Buscar por nombre de BD o nodo
|
||||
last_restore = restore_map.get(bd_name) or restore_map.get(nodo_name)
|
||||
|
||||
# Determinar estado basado en fecha de restauración
|
||||
if last_restore is None:
|
||||
estado_sync = 'Error'
|
||||
elif last_restore < datetime.now() - timedelta(days=7):
|
||||
estado_sync = 'Error'
|
||||
elif last_restore < datetime.now() - timedelta(hours=24):
|
||||
estado_sync = 'Atención'
|
||||
else:
|
||||
estado_sync = 'Actualizada'
|
||||
# Determinar estado basado en ubicación de archivos y fecha de restauración
|
||||
estado_sync = determine_sync_status(nodo_name, last_restore)
|
||||
|
||||
# Aplicar filtros
|
||||
if estado and estado_sync != estado.value:
|
||||
|
||||
Reference in New Issue
Block a user