diff --git a/backend/main.py b/backend/main.py index 78a0a9a..0b07b83 100644 --- a/backend/main.py +++ b/backend/main.py @@ -115,3 +115,13 @@ def exec_pod(pod: str, namespace: str = "default", context: str = None, containe cmd += ["--", "sh", "-c", command] result = run_kubectl(cmd, context=context) return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode} + +@app.get("/cordon") +def cordon(node: str, context: str = None): + result = run_kubectl(["cordon", node], context=context) + return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode} + +@app.get("/uncordon") +def uncordon(node: str, context: str = None): + result = run_kubectl(["uncordon", node], context=context) + return {"output": result.stdout, "stderr": result.stderr, "returncode": result.returncode} diff --git a/frontend/app.js b/frontend/app.js index d5d0979..7725793 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -29,6 +29,15 @@ document.addEventListener('DOMContentLoaded', () => { if (res) resourceSelect.value = res; } + function updateActionVisibility() { + const isNode = resourceSelect.value === 'nodes'; + document.getElementById('btn-delete').style.display = isNode ? 'none' : 'inline-block'; + document.getElementById('btn-logs').style.display = isNode ? 'none' : 'inline-block'; + document.getElementById('btn-exec').style.display = isNode ? 'none' : 'inline-block'; + document.getElementById('btn-cordon').style.display = isNode ? 'inline-block' : 'none'; + document.getElementById('btn-uncordon').style.display = isNode ? 'inline-block' : 'none'; + } + async function loadContexts() { try { const res = await fetch('http://localhost:8000/contexts'); @@ -112,6 +121,7 @@ document.addEventListener('DOMContentLoaded', () => { currentData = []; } renderList(); + updateActionVisibility(); } catch (e) { console.error('Failed to load resources', e); resourceList.innerHTML = '