Files
podman-mvp/control/05_app.py
T

88 lines
3.1 KiB
Python

import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests_unixsocket
import uvicorn
app = FastAPI(title="Podman MVP Control Plane")
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.get("/workloads/read/{filename:path}")
def read_workload(filename: str):
"""Leest de inhoud van een specifiek YAML bestand."""
path = os.path.join(WORKLOADS_DIR, filename)
if not os.path.exists(path):
raise HTTPException(status_code=404, detail="Bestand niet gevonden")
with open(path, 'r') as f:
return {"filename": filename, "content": f.read()}
@app.post("/workloads/deploy/{filename:path}")
def deploy_workload(filename: str):
path = os.path.join(WORKLOADS_DIR, filename)
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()}
@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():
url = f"{PODMAN_API_BASE}/libpod/pods/json"
response = SESSION.get(url)
return response.json()
# --- NIEUWE MANAGEMENT ENDPOINTS ---
@app.post("/pods/stop/{name}")
def stop_pod(name: str):
"""Stopt alle containers in een pod."""
url = f"{PODMAN_API_BASE}/libpod/pods/{name}/stop"
response = SESSION.post(url)
return {"status": "success" if response.status_code == 200 else "error", "code": response.status_code}
@app.post("/pods/start/{name}")
def start_pod(name: str):
"""Start alle containers in een pod."""
url = f"{PODMAN_API_BASE}/libpod/pods/{name}/start"
response = SESSION.post(url)
return {"status": "success" if response.status_code == 200 else "error", "code": response.status_code}
@app.post("/pods/rm/{name}")
def remove_pod(name: str):
"""Verwijdert een pod (geforceerd)."""
url = f"{PODMAN_API_BASE}/libpod/pods/{name}?force=true"
response = SESSION.delete(url)
return {"status": "success" if response.status_code == 201 or response.status_code == 200 else "error"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)