feat: add phase 2 endpoints, session persistence and actions
Co-authored-by: aider (openrouter/thinkingmachines/inkling-small:free) <aider@aider.chat>
This commit is contained in:
1 parent
18ca7b5885
commit
82ee3aa6c2
4 files changed
+249
-33
No files matched your search
+65
-17
@@ -12,41 +12,89 @@ app.add_middleware(
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
def run_kubectl(args, context=None):
|
||||
cmd = ["kubectl"]
|
||||
if context:
|
||||
cmd += ["--context", context]
|
||||
cmd += args
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
return result
|
||||
|
||||
@app.get("/")
|
||||
def root():
|
||||
return {"message": "Kubectl Web GUI backend"}
|
||||
|
||||
@app.get("/contexts")
|
||||
def get_contexts():
|
||||
result = subprocess.run(
|
||||
["kubectl", "config", "get-contexts", "-o", "name"],
|
||||
capture_output=True, text=True
|
||||
)
|
||||
result = run_kubectl(["config", "get-contexts", "-o", "name"])
|
||||
contexts = [line for line in result.stdout.splitlines() if line]
|
||||
current = ""
|
||||
try:
|
||||
cur = subprocess.run(
|
||||
["kubectl", "config", "current-context"],
|
||||
capture_output=True, text=True
|
||||
)
|
||||
cur = run_kubectl(["config", "current-context"])
|
||||
current = cur.stdout.strip()
|
||||
except Exception:
|
||||
pass
|
||||
return {"current": current, "contexts": contexts}
|
||||
|
||||
@app.get("/namespaces")
|
||||
def get_namespaces():
|
||||
result = subprocess.run(
|
||||
["kubectl", "get", "namespaces", "-o", "jsonpath={range .items[*]}{.metadata.name}{\"\\n\"}{end}"],
|
||||
capture_output=True, text=True
|
||||
def get_namespaces(context: str = None):
|
||||
result = run_kubectl(
|
||||
["get", "namespaces", "-o", "jsonpath={range .items[*]}{.metadata.name}{\"\\n\"}{end}"],
|
||||
context=context
|
||||
)
|
||||
namespaces = [line for line in result.stdout.splitlines() if line]
|
||||
return {"namespaces": namespaces}
|
||||
|
||||
@app.get("/pods")
|
||||
def get_pods(namespace: str = "default"):
|
||||
result = subprocess.run(
|
||||
["kubectl", "get", "pods", "-n", namespace, "-o", "json"],
|
||||
capture_output=True, text=True
|
||||
def get_pods(namespace: str = "default", context: str = None):
|
||||
result = run_kubectl(
|
||||
["get", "pods", "-n", namespace, "-o", "json"],
|
||||
context=context
|
||||
)
|
||||
return {"raw": result.stdout, "namespace": namespace}
|
||||
return {"raw": result.stdout, "namespace": namespace, "context": context}
|
||||
|
||||
@app.get("/nodes")
|
||||
def get_nodes(context: str = None):
|
||||
result = run_kubectl(
|
||||
["get", "nodes", "-o", "json"],
|
||||
context=context
|
||||
)
|
||||
return {"raw": result.stdout, "context": context}
|
||||
|
||||
@app.get("/pvcs")
|
||||
def get_pvcs(namespace: str = "default", context: str = None):
|
||||
result = run_kubectl(
|
||||
["get", "pvc", "-n", namespace, "-o", "json"],
|
||||
context=context
|
||||
)
|
||||
return {"raw": result.stdout, "namespace": namespace, "context": context}
|
||||
|
||||
@app.get("/describe")
|
||||
def describe(resource: str, name: str, namespace: str = "default", context: str = None):
|
||||
allowed = {"pod", "node", "pvc", "service", "deployment"}
|
||||
if resource not in allowed:
|
||||
return {"error": "Invalid resource type"}
|
||||
result = run_kubectl(
|
||||
["describe", resource, name, "-n", namespace],
|
||||
context=context
|
||||
)
|
||||
return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode}
|
||||
|
||||
@app.post("/delete")
|
||||
def delete(resource: str, name: str, namespace: str = "default", context: str = None):
|
||||
allowed = {"pod", "node", "pvc", "service", "deployment"}
|
||||
if resource not in allowed:
|
||||
return {"error": "Invalid resource type"}
|
||||
result = run_kubectl(
|
||||
["delete", resource, name, "-n", namespace, "--ignore-not-found=true"],
|
||||
context=context
|
||||
)
|
||||
return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode}
|
||||
|
||||
@app.get("/logs")
|
||||
def logs(pod: str, namespace: str = "default", context: str = None, tail: int = 100):
|
||||
result = run_kubectl(
|
||||
["logs", pod, "-n", namespace, "--tail", str(tail)],
|
||||
context=context
|
||||
)
|
||||
return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode}
|
||||
Reference in new issue
Block a user