**Language / Язык:** [English](tasks.md) | [Русский](../ru/domains/tasks.md)

# Tasks

Long-running operations (power, clone, relocate, snapshot, OVF deploy, guest
customize) return a CIS-style task id:
[`app/vsphere/domain/tasks.py`](../../app/vsphere/domain/tasks.py),
[`app/vsphere/rest/tasks.py`](../../app/vsphere/rest/tasks.py).

## Endpoints

| Method | Path | Notes |
|---|---|---|
| GET | `/api/cis/tasks` | List recent tasks (most recent 200) |
| GET | `/api/cis/tasks/{task}` | Status, progress, `service`/`operation`, `result`/`error` |

## Client pattern

1. `POST`/`DELETE` mutation → read the task id from `{ "task": "task-…" }`
   (REST) or the SOAP `*_Task` MoRef.
2. Poll `GET /api/cis/tasks/{task}` until `status` is `SUCCEEDED` or `FAILED`.
3. `result` holds operation-specific output (for example `{"vm": "vm-104"}`
   on create/clone/deploy).

## Highlights

- Task rows commit to `vsphere_tasks` (`id`, `description`, `status`,
  `service`, `operation`, `result`, `error`, `completed_at`).
- `progress` is synthesized as `50` while running and `100` once terminal —
  this simulator does not model fractional progress.
- The same task store backs both REST `/api/cis/tasks` and SOAP task MoRefs,
  so a Terraform apply (SOAP `CreateVM_Task`) and a REST poll of the same id
  see consistent state.
- Simulation durations honour `SIMULATION_TIME_SCALE`
  (higher = faster simulated completion).

See [API surface](../api-surface.md) and [Operations](../operations.md).
