Clone a snapshot into a new computer
Builds a new computer from this snapshot. Works on an orphan, which is what makes deleting a computer and keeping its snapshots a recoverable decision.
A snapshot held by two hosts at once — a move part way through handing its history over — is served from the copy on the host its computer now lives on. One that cannot be attributed that way, such as an orphan, answers 409 until the handover finishes; nothing is changed.
The answer arrives as soon as the new computer exists, with status: "building" while the snapshot is copied out — poll it, or wait on its operation_id. A clone BUILT FROM DISK — a disk snapshot, memory: false, or one answered with memory_dropped: true — lands STOPPED, and boots fresh when you start it; a caller waiting for running without starting it waits for ever. A memory fork resumes by itself once it is built.
A MEMORY snapshot is resumed: the new computer comes up running the captured session. Pass memory: false to build it from the snapshot's disk alone instead, with its own network identity, landing stopped — the way out when the saved session is what is broken.
A snapshot whose workspace has since been deleted is cloned into no workspace; only an account-wide key reaches it. Its saved session cannot be resumed there, so a clone of a memory snapshot that would resume it (memory absent, null or true) is refused with 409 and nothing is created. Send memory: false to build it from its disk instead; the new computer is in no workspace.
A memory snapshot of a computer that held secrets is resumed into a new computer only if you pass inherit_secrets: true: its saved memory holds the delivered values, so the new computer comes up holding the same credentials, bound to the same secrets at the revisions it holds, and gets current values at its next reboot. It lands in the same workspace, and is refused its session if any of those secrets has since been deleted or moved out of scope. Without it — or for a snapshot taken before this could be recorded — the clone is built from the disk and the response says so with memory_dropped: true; check for it before assuming the session came across.
A resumed copy is given an identity of its own before its network comes up: its own MAC and address, its name as hostname, a new machine ID and SSH host keys, and its own desktop password, so it runs beside its source. The session is otherwise untouched. If that cannot be done the copy is stopped rather than left running as its source; starting it boots its disk fresh.
Requires the member role or higher.
Request
- Base URL: https://app.mandala.computer/api/v1
- URL: https://app.mandala.computer/api/v1/snapshots/{id}/clone
- Auth: HTTP bearer
Path parameters
The snapshot id.
Headers
Optional: a key of your choosing, 1 to 255 printable ASCII characters with no spaces (a UUID is ideal), that makes this call safe to send again after a lost answer. The call and its operation are recorded BEFORE it is carried out, so GET /operations?idempotency_key= finds it however the connection ended. For 24 hours, the same key with the byte-identical request (method, path, query and body, from a credential of the same scope) is not carried out again: it answers 409 idempotency_in_progress while the first is running, and the original answer — status and body, with Idempotent-Replayed: true — once it has finished. An answer too large to keep (over 1 MiB) is replayed instead as a 200 carrying {operation_id, operation}, also with Idempotent-Replayed: true: operation is the call’s operation, or null when there is none to show. Keys are kept per scope: a key used by a workspace's credential and the same key used by another workspace's, or by an account-wide one, are different keys, and neither is refused because of the other. A replayed body omits the desktop credentials the original carried (vnc, with its tokens and URLs): read the computer (GET /computers/{id}) for them. The same key on a different request is a 422 with code: "idempotency_key_reused", and a malformed key (empty, too long, outside printable ASCII, or the header sent twice) a 400 with code: "idempotency_key_invalid"; neither does anything. A call refused with a 4xx that did nothing releases its key, so it may be sent again under the same one. The exception is a delete whose 4xx says the computer was deleted — computer_deleted: true, or a purge result beside computer_deleted: false (it was deleted, then listed again): it happened, so its key keeps that answer and its operation is succeeded. Except a 409 with reason: "contention" whose purge deleted, queued and left in doubt nothing (the computer was already gone and copies in use refused the purge): nothing happened, so its key is released and the same request may be sent again under it. With computer_deleted: null, or false where the platform cannot confirm the computer was left in place, it is an unknown outcome: its key answers 409 idempotency_in_progress until the platform gives up on it, then 409 idempotency_outcome_unknown. A 5xx answer that names an operation_id is an unknown outcome too: that is the operation reserved for it. From then on the same key answers 409 idempotency_outcome_unknown, naming that operation (not idempotency_in_progress): read the computer, or the operation. The operation stays pending until the platform gives up on it; if it never learns how the call ended, it becomes failed with error.code: "lost". Some 5xx answers are refusals given before the call was sent anywhere — the platform could not check the account’s usage, or find a host for the call, for example — and some are a create or clone the host confirms it refused before building anything, such as a 503 from a host with no room left, and some are a start, restore or suspend the host confirms it refused before changing anything (a sealed session whose key could not be opened or whose transport failed first; on a suspend, suspend_outcome: "not_started"). Those name no operation_id: nothing was done, so the key is released as a 4xx refusal’s is, and the same call may be sent again under the same key. A host running older software cannot confirm such a refusal, so its 5xx is an unknown outcome like any other. A 5xx without an operation_id is not proof that nothing was done on its own: a call that records no operation (a PATCH that does not resize) names none, and neither does one whose operation could not be recorded. Sending the same call again under the same key is safe after any 5xx: it is carried out if its key was released, and answered 409 idempotency_outcome_unknown if not.
Request body
Response
The new computer.
Changes
No recorded changes to this operation across all 1 revision of this API.