import os from fastapi import FastAPI, HTTPException from pydantic import BaseModel import requests_unixsocket import uvicorn app = FastAPI(title="Podman MVP Control Plane") # Gebruik requests-unixsocket voor communicatie met de Podman socket SESSION = requests_unixsocket.Session() PODMAN_API_BASE = "http+unix://%2Frun%2Fuser%2F1000%2Fpodman%2Fpodman.sock/v5.4.2" WORKLOADS_DIR = "/app/workloads" class FileCreate(BaseModel): path: str content: str @app.get("/workloads") def list_workloads(): yaml_files = [] try: for root, dirs, files in os.walk(WORKLOADS_DIR): for file in files: if file.endswith((".yaml", ".kube")): full_path = os.path.join(root, file) rel_path = os.path.relpath(full_path, WORKLOADS_DIR) yaml_files.append(rel_path) return {"workloads": sorted(yaml_files)} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/workloads/deploy/{filename:path}") def deploy_workload(filename: str): path = os.path.join(WORKLOADS_DIR, filename) try: with open(path, 'r') as f: yaml_content = f.read() url = f"{PODMAN_API_BASE}/libpod/kube/play" response = SESSION.post(url, data=yaml_content) return {"status": "success", "podman_response": response.json()} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/workloads/create-folder/{foldername:path}") def create_folder(foldername: str): target_path = os.path.join(WORKLOADS_DIR, foldername) os.makedirs(target_path, exist_ok=True) return {"status": "success", "message": f"Map {foldername} aangemaakt"} @app.post("/workloads/save-file") def save_file(file_data: FileCreate): target_path = os.path.join(WORKLOADS_DIR, file_data.path) os.makedirs(os.path.dirname(target_path), exist_ok=True) with open(target_path, 'w') as f: f.write(file_data.content) return {"status": "success", "message": f"Bestand {file_data.path} opgeslagen"} @app.get("/pods") def list_pods(): """Haalt de lijst met pods en hun status op via de Podman API.""" try: url = f"{PODMAN_API_BASE}/libpod/pods/json" response = SESSION.get(url) if response.status_code != 200: return {"status": "error", "details": response.json()} # We geven de ruwe lijst met pods terug return response.json() except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)