| """Real-time deployment status monitoring.""" |
|
|
| from __future__ import annotations |
|
|
| import time |
| from typing import Any, Dict, List, Optional |
|
|
|
|
| class DeploymentMonitor: |
| """Monitors deployment status in real-time.""" |
|
|
| def __init__(self): |
| self.deployments: Dict[str, Dict[str, Any]] = {} |
|
|
| def track_deployment( |
| self, |
| deployment_id: str, |
| platform: str, |
| repo: str, |
| status: str = "initiated" |
| ) -> Dict[str, Any]: |
| """Track a new deployment.""" |
| deployment = { |
| "id": deployment_id, |
| "platform": platform, |
| "repo": repo, |
| "status": status, |
| "started_at": time.time(), |
| "updated_at": time.time(), |
| "stages": [], |
| "logs": [] |
| } |
| self.deployments[deployment_id] = deployment |
| return deployment |
|
|
| def update_deployment_status( |
| self, |
| deployment_id: str, |
| status: str, |
| stage: Optional[str] = None, |
| log_message: Optional[str] = None |
| ) -> Dict[str, Any]: |
| """Update deployment status.""" |
| if deployment_id not in self.deployments: |
| return {"error": "Deployment not found"} |
|
|
| deployment = self.deployments[deployment_id] |
| deployment["status"] = status |
| deployment["updated_at"] = time.time() |
|
|
| if stage: |
| deployment["stages"].append({ |
| "name": stage, |
| "status": status, |
| "timestamp": time.time() |
| }) |
|
|
| if log_message: |
| deployment["logs"].append({ |
| "message": log_message, |
| "timestamp": time.time(), |
| "level": "info" if status == "success" else "warning" if status == "pending" else "error" |
| }) |
|
|
| return deployment |
|
|
| def get_deployment_status(self, deployment_id: str) -> Dict[str, Any]: |
| """Get current deployment status.""" |
| if deployment_id not in self.deployments: |
| return {"error": "Deployment not found"} |
|
|
| deployment = self.deployments[deployment_id] |
| elapsed = time.time() - deployment["started_at"] |
|
|
| return { |
| **deployment, |
| "elapsed_time": f"{elapsed:.1f}s", |
| "is_complete": deployment["status"] in ["success", "failed", "cancelled"], |
| "is_running": deployment["status"] in ["initiated", "building", "deploying"] |
| } |
|
|
| def get_status_summary(self) -> Dict[str, Any]: |
| """Get summary of all deployments.""" |
| total = len(self.deployments) |
| running = len([d for d in self.deployments.values() if d["status"] in ["initiated", "building", "deploying"]]) |
| successful = len([d for d in self.deployments.values() if d["status"] == "success"]) |
| failed = len([d for d in self.deployments.values() if d["status"] == "failed"]) |
|
|
| return { |
| "total_deployments": total, |
| "running": running, |
| "successful": successful, |
| "failed": failed, |
| "success_rate": (successful / total * 100) if total > 0 else 0 |
| } |
|
|
|
|