import os import sys import asyncio from datetime import datetime from typing import Dict, Any, Optional import uvicorn from fastapi import FastAPI, HTTPException, Depends, BackgroundTasks from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.trustedhost import TrustedHostMiddleware from pydantic import BaseModel, ValidationError from loguru import logger # Configure logging logger.remove() logger.add(sys.stdout, level="INFO", format="{time} | {level} | {message}") # Pydantic models class HealthResponse(BaseModel): status: str service: str timestamp: str version: str uptime: float class ServiceRequest(BaseModel): project_id: Optional[str] = None data: Dict[str, Any] = {} metadata: Dict[str, Any] = {} class ServiceResponse(BaseModel): success: bool data: Dict[str, Any] = {} message: str = "" timestamp: str = "" # Initialize FastAPI app app = FastAPI( title="deployment-manager", description="deployment-manager service for automated development pipeline", version="1.0.0", docs_url="/docs", redoc_url="/redoc" ) # Add middleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware( TrustedHostMiddleware, allowed_hosts=["*"] ) # Global variables start_time = datetime.utcnow() # Routes @app.get("/health", response_model=HealthResponse) async def health_check(): """Comprehensive health check endpoint""" uptime = (datetime.utcnow() - start_time).total_seconds() return HealthResponse( status="healthy", service="deployment-manager", timestamp=datetime.utcnow().isoformat(), version="1.0.0", uptime=uptime ) @app.get("/") async def root(): """Root endpoint""" return { "message": "deployment-manager is running", "service": "deployment-manager", "status": "active", "timestamp": datetime.utcnow().isoformat(), "version": "1.0.0" } @app.get("/api/v1/status") async def service_status(): """Detailed service status endpoint""" uptime = (datetime.utcnow() - start_time).total_seconds() return { "service": "deployment-manager", "status": "ready", "capabilities": [ "health_check", "status_check", "async_processing" ], "uptime": uptime, "timestamp": datetime.utcnow().isoformat(), "version": "1.0.0" } @app.post("/api/v1/process", response_model=ServiceResponse) async def process_request(request: ServiceRequest, background_tasks: BackgroundTasks): """Main processing endpoint for deployment-manager""" try: logger.info(f"Processing request for project: {request.project_id}") # Simulate processing await asyncio.sleep(0.1) response_data = { "processed": True, "service": "deployment-manager", "project_id": request.project_id, "input_data_keys": list(request.data.keys()) if request.data else [] } return ServiceResponse( success=True, data=response_data, message="Request processed successfully by deployment-manager", timestamp=datetime.utcnow().isoformat() ) except Exception as e: logger.error(f"Error processing request: {e}") raise HTTPException( status_code=500, detail=f"Processing failed: {str(e)}" ) @app.get("/api/v1/cache/{project_id}") async def get_cached_result(project_id: str): """Get cached result for a project""" return { "found": False, "message": "Cache not implemented yet", "project_id": project_id, "timestamp": datetime.utcnow().isoformat() } if __name__ == "__main__": port = int(os.getenv("PORT", 8006)) log_level = os.getenv("LOG_LEVEL", "info") logger.info(f"Starting deployment-manager on port {port}") uvicorn.run( "main:app", host="0.0.0.0", port=port, reload=False, log_level=log_level, access_log=True )