Files
Iliyan Angelov 6b247e5b9f Updates
2025-09-19 11:58:53 +03:00

64 lines
2.5 KiB
Python

"""
Signal handlers for automation_orchestration app
"""
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.utils import timezone
from .models import (
RunbookExecution,
AutoRemediationExecution,
MaintenanceWindow,
)
@receiver(post_save, sender=RunbookExecution)
def update_runbook_statistics(sender, instance, created, **kwargs):
"""Update runbook statistics when execution is completed"""
if instance.status in ['COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT']:
runbook = instance.runbook
runbook.execution_count += 1
if instance.status == 'COMPLETED':
# Update success rate
total_executions = runbook.execution_count
successful_executions = RunbookExecution.objects.filter(
runbook=runbook,
status='COMPLETED'
).count()
runbook.success_rate = successful_executions / total_executions if total_executions > 0 else 0.0
runbook.last_executed_at = instance.started_at
runbook.save(update_fields=['execution_count', 'success_rate', 'last_executed_at'])
@receiver(post_save, sender=AutoRemediationExecution)
def update_auto_remediation_statistics(sender, instance, created, **kwargs):
"""Update auto-remediation statistics when execution is completed"""
if instance.status in ['COMPLETED', 'FAILED', 'CANCELLED', 'TIMEOUT']:
remediation = instance.auto_remediation
remediation.execution_count += 1
if instance.status == 'COMPLETED':
remediation.success_count += 1
remediation.last_executed_at = instance.triggered_at
remediation.save(update_fields=['execution_count', 'success_count', 'last_executed_at'])
@receiver(pre_save, sender=MaintenanceWindow)
def validate_maintenance_window(sender, instance, **kwargs):
"""Validate maintenance window before saving"""
if instance.start_time and instance.end_time:
if instance.start_time >= instance.end_time:
raise ValueError("Start time must be before end time")
# Auto-update status based on current time
now = timezone.now()
if instance.start_time and instance.end_time:
if instance.start_time <= now <= instance.end_time:
if instance.status == 'SCHEDULED':
instance.status = 'ACTIVE'
elif instance.end_time < now:
if instance.status in ['SCHEDULED', 'ACTIVE']:
instance.status = 'COMPLETED'