64 lines
2.5 KiB
Python
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'
|