#!/usr/bin/env python3 """ Migration script to consolidate AnsibleExecution data into PlaybookExecution model and deprecate the old model structure. """ import sys import os import uuid from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # Add the project root to Python path sys.path.insert(0, '/home/pi/Desktop/Server_Monitorizare_v2') from config.database_config import get_db from app.models import AnsibleExecution, PlaybookExecution, PlaybookHostResult class AutomationMigration: def __init__(self): from config.database_config import DatabaseConfig db_config = DatabaseConfig() self.engine = db_config.engine self.Session = sessionmaker(bind=self.engine) def migrate_executions(self): """Migrate data from AnsibleExecution to PlaybookExecution""" print("šŸ”„ Starting automation model migration...") session = self.Session() try: # Get all existing AnsibleExecutions old_executions = session.query(AnsibleExecution).all() migrated_count = 0 for old_exec in old_executions: # Check if already migrated existing = session.query(PlaybookExecution).filter_by( playbook_name=old_exec.playbook_name, start_time=old_exec.start_time ).first() if existing: print(f" ā­ļø Skipping {old_exec.playbook_name} (already migrated)") continue # Create new PlaybookExecution from old data new_exec = PlaybookExecution( execution_id=str(uuid.uuid4()), playbook_name=old_exec.playbook_name, target_hosts=old_exec.target_devices, # Timing queued_at=old_exec.start_time, started_at=old_exec.start_time, completed_at=old_exec.end_time, # Status mapping status=self._map_status(old_exec.status), exit_code=old_exec.exit_code, # Logs stdout_log=old_exec.stdout_log, stderr_log=old_exec.stderr_log, ansible_log_file=old_exec.ansible_log_file, # Results successful_hosts=old_exec.successful_hosts, failed_hosts=old_exec.failed_hosts, unreachable_hosts=old_exec.unreachable_hosts, total_hosts=old_exec.successful_hosts + old_exec.failed_hosts + old_exec.unreachable_hosts, # Metadata execution_user=old_exec.execution_user, command_line=old_exec.command_line ) session.add(new_exec) migrated_count += 1 print(f" āœ… Migrated: {old_exec.playbook_name} ({old_exec.start_time})") session.commit() print(f"\nāœ… Migration completed: {migrated_count} executions migrated") except Exception as e: session.rollback() print(f"āŒ Migration failed: {e}") raise finally: session.close() def _map_status(self, old_status): """Map old status values to new enum""" status_mapping = { 'running': 'running', 'completed': 'completed', 'failed': 'failed', 'cancelled': 'cancelled' } return status_mapping.get(old_status, 'failed') def validate_migration(self): """Validate that migration was successful""" print("\nšŸ” Validating migration...") session = self.Session() try: old_count = session.query(AnsibleExecution).count() new_count = session.query(PlaybookExecution).count() print(f" šŸ“Š Old executions: {old_count}") print(f" šŸ“Š New executions: {new_count}") if new_count >= old_count: print(" āœ… Migration validation passed") return True else: print(" āŒ Migration validation failed: data missing") return False except Exception as e: print(f" āŒ Validation error: {e}") return False finally: session.close() def cleanup_old_tables(self, confirm=False): """Remove old AnsibleExecution table (use with caution)""" if not confirm: print("\nāš ļø Run with confirm=True to actually remove old table") print(" This will permanently delete AnsibleExecution data!") return print("\nšŸ—‘ļø Cleaning up old AnsibleExecution table...") session = self.Session() try: session.query(AnsibleExecution).delete() session.commit() print(" āœ… Old execution data cleaned up") except Exception as e: session.rollback() print(f" āŒ Cleanup failed: {e}") finally: session.close() if __name__ == "__main__": migration = AutomationMigration() print("šŸ”§ Automation Model Consolidation") print("=" * 50) # Step 1: Migrate data migration.migrate_executions() # Step 2: Validate if migration.validate_migration(): print("\nšŸŽ‰ Migration successful!") print("\nNext steps:") print("1. Test the new PlaybookExecution model") print("2. Update code to use only PlaybookExecution") print("3. Run cleanup_old_tables() when confident") else: print("\nāŒ Migration validation failed!") sys.exit(1)