The GitHub Actions job "Required Checks" on texera.git/main has succeeded. Run started by GitHub user github-merge-queue[bot] (triggered by github-merge-queue[bot]).
Head commit for run: d27b7b49877bcc52d80602e57f5b0e5f86291736 / Kunwoo (Chris) <[email protected]> feat(frontend): add admin computing unit terminate button (#8947) ### What changes were proposed in this PR? Problem. An admin can list every computing unit on Admin > Computing Units (#8888) but cannot act on one. Freeing a stuck or idle unit on a full Kubernetes cluster still means finding its pod and deleting it with `kubectl`. The backend already lets an ADMIN terminate any unit (`DELETE /computing-unit/{cuid}/terminate`, #7337), so only the UI is missing. Fix. Adds a delete-icon button to every row, in a new Actions column. It calls `ComputingUnitActionsService.confirmAndTerminate`, the confirmation the user's own Computing Units page already uses, so the dialog follows the unit type: a "results will be lost" warning for a Kubernetes unit and "Disconnect" for a local one. Cancelling the dialog or a failed request leaves the row alone. `confirmAndTerminate` gains an optional `onTerminated` callback that runs only after a successful termination, and the page uses it to drop the row at once instead of showing the unit as `Running` until the next 5 second poll. Two details follow from an admin seeing other users' units. A poll that started before the `DELETE` can answer after it with the unit still listed, so the page remembers the units it terminated and filters them out of every poll response. And ng-zorro renders the dialog and toast text through `[innerHTML]` while any user can rename their unit, so `confirmAndTerminate` now HTML-escapes the unit name for every caller. ``` Before: admin finds a stuck unit on the page -> finds its pod -> kubectl delete pod After: admin finds a stuck unit on the page -> clicks its delete icon -> confirms -> row disappears ``` Not included. Telling the owner their unit was terminated (#6483) and the cluster capacity panels (#6481, #6482) are separate issues. There is no backend change. ### Any related issues, documentation, discussions? Closes #6480. Part of #6476. Follows #8888, which added the page. ### How was this PR tested? Tests were added for the button, the hand-off to the dialog and the name escaping. They cover a button on every row (Kubernetes and local), the click confirming the clicked row's unit, the row leaving only after a successful termination and staying on cancel or failure, a stale in-flight poll not bringing the row back, the detail row's `colspan`, a unit name holding markup in the dialog and the toast, and `onTerminated` firing on success only. The tests were written first and watched fail, and breaking the code on purpose (name left unescaped, callback on every outcome, row dropped on click, poll responses left unfiltered) fails exactly the seven tests meant to catch it. ``` cd frontend && npx ng test --watch=false --include='**/admin-computing-unit.component.spec.ts' --include='**/computing-unit-actions.service.spec.ts' cd frontend && npx ng test --watch=false ``` The first command passes 53 tests and the second passes 6,622 (1 skipped). `ngc -p src/tsconfig.app.json --noEmit`, `prettier-eslint` and `eslint` ran clean on the changed files. https://github.com/user-attachments/assets/a33ffa6f-439a-4f71-ae8f-7efe5d94daac ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Code, Claude Sonnet 5.5 Report URL: https://github.com/apache/texera/actions/runs/38201106602 With regards, GitHub Actions via GitBox
