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

Reply via email to