proxmox: a Proxmox VE provider built from the provider contract #9
@@ -0,0 +1,282 @@
|
||||
# Execution: proxmox, a Proxmox VE provider built from the provider contract
|
||||
|
||||
Pairs with [docs/plans/2026-09-18-1502-proxmox-provider.md](../plans/2026-09-18-1502-proxmox-provider.md).
|
||||
|
||||
## Status
|
||||
|
||||
- [x] Phase 0 — Plan file, branch, host recon, fixtures
|
||||
- [ ] Phase 1 — The spec (`docs/proxmox-provider-spec.md`)
|
||||
- [ ] Phase 2 — Config block, registration, package skeleton
|
||||
- [ ] Phase 3 — Extract `nocloud` and `keyedlock` from kvm2
|
||||
- [ ] Phase 4 — Seam, HTTP client, decorator, fake
|
||||
- [ ] Phase 5 — Get, ListByTag, task helpers
|
||||
- [ ] Phase 6 — Create
|
||||
- [ ] Phase 7 — Delete, Checker, CRD comment
|
||||
- [ ] Phase 8 — Contract and observability sweep, integration test, testing.md
|
||||
- [ ] Phase 9 — Deployment and documentation
|
||||
- [ ] Phase 10 — Review, real-host validation, changelog, MR
|
||||
|
||||
## Phase 0 — Plan file, branch, host recon, fixtures
|
||||
|
||||
The plan was committed alone on `main` on 2026-09-18 (`708989c`, then
|
||||
`2167819` retargeting it at PVE 9.2). `origin/main` had not moved in the
|
||||
meantime, so the branch was cut straight from local `main`:
|
||||
|
||||
```bash
|
||||
git fetch -q origin && git rev-list --left-right --count origin/main...main # 0 2
|
||||
git switch -c feat/proxmox-provider
|
||||
```
|
||||
|
||||
The host is **pv1-1**, a single node (no cluster peers), `pve-manager/9.2.20`,
|
||||
kernel `7.0.14-17-pve`, QEMU 11.0. The user prepared the token
|
||||
(`~/.config/proxmox-token`, privsep off) and the CA (`~/.config/proxmox-ca.pem`)
|
||||
before the session.
|
||||
|
||||
**TLS: 192.168.2.8 is not in the node certificate.** The first probe failed
|
||||
with curl exit 60. The CA is right (`openssl s_client -CAfile` verifies the
|
||||
chain), but the leaf's SANs are `127.0.0.1, ::1, localhost, 192.168.0.8,
|
||||
pv1-1, pv1-1.home.lab`, and neither name resolves on the workstation.
|
||||
192.168.0.8 and 192.168.2.8 present the same certificate fingerprint: the
|
||||
node sits on `vmbr0` (192.168.0.8/24, untagged) with VLAN interfaces
|
||||
`vmbr0.2` (192.168.2.8/24) and `vmbr0.4` (192.168.4.8/24). All recon kept
|
||||
full verification by connecting to 192.168.2.8 while verifying the
|
||||
certificate as `pv1-1.home.lab`:
|
||||
|
||||
```bash
|
||||
curl -s --resolve pv1-1.home.lab:8006:192.168.2.8 --cacert ~/.config/proxmox-ca.pem \
|
||||
-H @<(printf 'Authorization: PVEAPIToken=%s\n' "$(tr -d '[:space:]' < ~/.config/proxmox-token)") \
|
||||
https://pv1-1.home.lab:8006/api2/json/version
|
||||
# {"data":{"release":"9.2","version":"9.2.20","repoid":"49318c671b82f31e"}}
|
||||
```
|
||||
|
||||
Every capture went through a scratch helper wrapping exactly that call. It
|
||||
passes the token through a file descriptor so it never reaches argv or
|
||||
output, and writes `{"status","reason","body"}` to
|
||||
`internal/provider/proxmox/testdata/<name>.json`, refusing to save a body
|
||||
that contains `PVEAPIToken`.
|
||||
|
||||
A real NoCloud seed was used instead of the plan's 1 KiB placeholder, so the
|
||||
agent could be installed and F21 captured from a live guest. No ISO tool is
|
||||
installed locally, so a throwaway module in the scratchpad reused the
|
||||
repository's `github.com/kdomanski/iso9660 v0.4.0` from the module cache and
|
||||
copied kvm2's `guestAgentScript` verbatim:
|
||||
|
||||
```bash
|
||||
GOFLAGS=-mod=mod GOPROXY=off GOSUMDB=off go run . proxy-reconaaaaaaaaaaa proxy-reconaaaaaaaaaaa-seed.iso
|
||||
# 45056 bytes, ISO 9660 'cidata'
|
||||
```
|
||||
|
||||
Write experiments ran against VMID 199999 (`proxy-reconaaaaaaaaaaa`), a
|
||||
clone of template 9001. Sequence: validation error; clone; resources, config
|
||||
write and start while the clone lock was held; status and agent while
|
||||
running bare; stop; config read; clone onto the taken VMID; tag tests;
|
||||
upload twice plus a bad name; attach `ide2`, set cores and memory; three
|
||||
resizes; start and agent poll; suspend and resume; a clone onto a storage
|
||||
without image support; stop; destroy with `purge=1&destroy-unreferenced-disks=1`;
|
||||
destroy again; ISO delete.
|
||||
|
||||
### Facts F1 to F23 (cited as Evidence by the spec)
|
||||
|
||||
- **F1.** Errors carry the text twice: in the HTTP reason phrase and as the
|
||||
body's `message`, which ends in `\n`. A 400 adds `errors`, a map from
|
||||
parameter to message. A 401 has the reason phrase only and an empty body.
|
||||
The client should use the trimmed body `message` and fall back to the
|
||||
reason phrase. Headers are ordinary CRLF.
|
||||
- **F2.** Missing VM, identical for `GET config`, `GET status/current` and
|
||||
`DELETE`: `500 Configuration file 'nodes/pv1-1/qemu-server/999999.conf' does not exist`.
|
||||
- **F3.** A start issued while the VM is clone-locked is **accepted** (200
|
||||
with a UPID). The task log reads `trying to acquire lock... OK` and the VM
|
||||
starts once the clone finishes. Setting a lock through the API was not
|
||||
tried.
|
||||
- **F4.** Clone onto a taken VMID, synchronous:
|
||||
`500 unable to create VM 199999: config file already exists`.
|
||||
- **F5.** Agent enabled but not running: `500 QEMU guest agent is not running`.
|
||||
Agent not enabled in the config: `500 No QEMU guest agent configured`.
|
||||
Stopped VM with `agent: 1`: `500 VM 199999 is not running`.
|
||||
- **F6.** Not produced. `local-lvm` is thin and overprovisions, so
|
||||
`quota: absent`.
|
||||
- **F7.** Config write while clone-locked: `500 VM is locked (clone)`.
|
||||
- **F8.** `/cluster/resources?type=vm` entries carry `vmid, name, node,
|
||||
status, type, template, tags, maxcpu, maxmem, maxdisk, uptime` and more;
|
||||
`lock` appears only when set. Status values seen: `running`, `stopped`,
|
||||
and `unknown` during a clone. **Mid-clone the entry has no `name`**: only
|
||||
`type, vmid, id, node, lock: clone, status: unknown`.
|
||||
- **F9.** Hyphenated tags are **accepted** and stored as given. Uppercase is
|
||||
folded (`Proxy_Operator` → `proxy_operator`), the separator is `;`, and
|
||||
characters such as a space or `!` give
|
||||
`400 … tags: invalid format - invalid characters in tag`. The datacenter
|
||||
has no `tag-style` or `user-tag-access` set.
|
||||
- **F10.** `description` on clone is accepted and survives verbatim,
|
||||
newlines included. The 22-character `proxy-<base32>` name is accepted.
|
||||
- **F11.** The clone's `meta` is copied from the template
|
||||
(`creation-qemu=11.0.3,ctime=1790145676`, identical to 9001), so it says
|
||||
nothing about when the clone was made. `written-at-create` is required.
|
||||
- **F12.** Upload: multipart with field `content=iso` and the file part named
|
||||
`filename`, carrying the target file name. Returns a UPID for an
|
||||
`imgcopy` task. A name without `.iso` gives
|
||||
`400 … filename: wrong file extension`. **Re-uploading an existing name
|
||||
silently overwrites it** (the task log shows a plain `cp`).
|
||||
`Datastore.AllocateTemplate` suffices.
|
||||
- **F13.** Deleting a volume needs `Datastore.Allocate` on
|
||||
`/storage/<id>`; without it the call gives
|
||||
`403 Permission check failed (/storage/local, Datastore.Allocate)`. With it
|
||||
(on `proxy-seeds`), the delete **runs as an `imgdel` task** and returns a
|
||||
UPID. Deleting a volume that no longer exists is also accepted and its
|
||||
task still ends `OK`; the log reads `disk image '…' does not exist`, then
|
||||
`Removed volume`. Seed cleanup is idempotent with no message matching.
|
||||
- **F14.** Stopped: `status: stopped, qmpstatus: stopped`. Paused:
|
||||
`status: running, qmpstatus: paused` in `status/current`, while
|
||||
`/cluster/resources` shows plain `running`.
|
||||
- **F15.** A clone onto a storage without image support is rejected up
|
||||
front (`400 … storage 'local' does not support vm images`) and leaves no
|
||||
VM. A clone failing mid-task was not observed.
|
||||
- **F16.** Task status fields: `status` (`running`, `stopped`), `exitstatus`
|
||||
(`OK` or the error text), `type, id, node, user, tokenid, upid, starttime,
|
||||
pid, pstart`. A full clone of the 3 GiB template onto `local-lvm` finished
|
||||
within about two seconds.
|
||||
- **F17.** The planned role, granted on `/`, covered clone, config, resize,
|
||||
start, stop, suspend, agent read, upload and destroy. **Missing:
|
||||
`Datastore.Allocate` for deleting the seed ISO.** `VM.Config.Cloudinit` is
|
||||
not needed for the `ide2` write. `SDN.Use` was held but never exercised,
|
||||
because no call rewrote `net0`.
|
||||
- **F18.** HTTP/1.1 only: `curl --http2` negotiates `HTTP/1.1`.
|
||||
- **F19.** Template 9001 (`debian-13-template`): `scsi0` on `local-lvm`,
|
||||
`boot: order=scsi0`, `ide2` free, `agent: 1`, OVMF, q35, `net0` untagged on
|
||||
`vmbr0`. **Attaching `ide2` makes Proxmox append it to the boot order**
|
||||
(`order=scsi0;ide2`). Template 9000 (Ubuntu) is unsuitable: it has a
|
||||
Proxmox cloud-init drive on `ide2` and VLAN tag 4 on `net0`.
|
||||
- **F20.** Resize **runs as a task** (returns a UPID). The same size is an
|
||||
`OK` no-op; shrinking fails inside the task with `exitstatus`
|
||||
`shrinking disks is not supported`.
|
||||
- **F21.** Agent response: `result[]` of `{name, ip-addresses[{ip-address,
|
||||
ip-address-type}]}`. The live guest reported `lo` and `ens18` with
|
||||
`192.168.0.150`, 50 seconds after start, via DHCP on untagged `vmbr0`.
|
||||
This proves the NoCloud-seed-on-`ide2` route end to end on this host.
|
||||
- **F22.** A wrong secret and an unknown token id both give
|
||||
`401 Authentication failed!`; no credentials gives `401 No ticket`.
|
||||
- **F23.** Uploads are staged in `/var/tmp/pveupload-*` and then copied to
|
||||
`/var/lib/vz/template/iso/`, so the tmpfs `/tmp` is not involved.
|
||||
|
||||
### Corrections to the plan that Phase 1 must fold into the spec
|
||||
|
||||
1. **Check `lock` before the name.** A mid-clone VM has no name in
|
||||
`/cluster/resources` (F8), so name-first logic turns a clone in progress
|
||||
into NotFound. Get, Delete and Create's lookup must treat a locked or
|
||||
nameless entry at our VMID as in-progress (Transient or wait), never
|
||||
absent.
|
||||
2. **Inspect a taken VMID before probing forward.** After a crash mid-clone,
|
||||
the retry's name lookup misses the nameless VM, the clone onto the
|
||||
deterministic VMID fails with F4, and forward probing would clone a
|
||||
duplicate. On F4, read that VMID: `lock: clone` means wait for it, and our
|
||||
UID in the description means adopt it. Probe forward only for a VM that
|
||||
is demonstrably someone else's.
|
||||
3. **A start queues behind a lock** instead of failing (F3).
|
||||
4. **Resize is asynchronous** (F20); wait on its task.
|
||||
5. **Drop delete-before-upload** for the seed: upload overwrites (F12).
|
||||
**Seed deletion is a task** (F13): wait on it. A repeat delete succeeds,
|
||||
so Delete needs no absent-volume matcher.
|
||||
6. **Get reads `status/current`**, not only `/cluster/resources`, to tell
|
||||
paused from running (F14).
|
||||
7. **Tag rationale**: hyphens are accepted on 9.2.20 (F9). `proxy_operator`
|
||||
stays, since it is valid everywhere, but the claim that hyphens are
|
||||
rejected is removed.
|
||||
8. **The boot-disk logic must skip `ide2`**, which Proxmox adds to the boot
|
||||
order (F19). The plan's rule already excludes it; add a test with
|
||||
`order=scsi0;ide2`.
|
||||
9. **Three agent messages, not one** (F5): `QEMU guest agent is not running`
|
||||
(booting, or the install failed), `No QEMU guest agent configured` (our
|
||||
`agent=1` was removed), and `VM <vmid> is not running` (stopped between
|
||||
the status read and the agent call). The spec decides each class; none
|
||||
may become NotFound.
|
||||
10. **Internet on the proxy network is a hard prerequisite**, twice over: the
|
||||
vendor-data agent install needs a package mirror, and the proxy itself
|
||||
needs egress. The guide says so, and recommends baking
|
||||
`qemu-guest-agent` into the template with `installGuestAgent: false` to
|
||||
drop the mirror dependency from IP discovery.
|
||||
|
||||
### Decisions made with the user in Phase 0
|
||||
|
||||
- **Seeds go to a dedicated directory storage**, `proxy-seeds`, with ISO
|
||||
content only. The token gets `Datastore.Allocate` there and nowhere else,
|
||||
so it can delete seeds but never backups or other ISOs on `local`. The
|
||||
sample config's `isoStorage` becomes `proxy-seeds`. The guide must say that
|
||||
an ACL on a more specific path replaces the inherited one for that user,
|
||||
so the role granted on `/storage/proxy-seeds` must repeat
|
||||
`Datastore.AllocateTemplate`, `AllocateSpace` and `Audit` alongside
|
||||
`Allocate`.
|
||||
- **Proxies land on a VLAN** set in config. `ProxmoxConfig` gains an
|
||||
optional `vlanTag` (1 to 4094), applied when Create rewrites `net0`
|
||||
together with the optional bridge override, keeping the MAC. Unset leaves
|
||||
`net0` as cloned. This is the first call that exercises `SDN.Use` (F17).
|
||||
- **The API URL is `https://192.168.0.8:8006`**, the address in the node
|
||||
certificate, so `caFile` verifies with no provider change. No
|
||||
`tlsServerName` option. The operator's cluster must be able to reach
|
||||
192.168.0.x.
|
||||
|
||||
### Seed storage and VLAN 4
|
||||
|
||||
The user created `proxy-seeds` (`dir`, ISO content only), granted the token
|
||||
`Datastore.Allocate`, `AllocateSpace`, `AllocateTemplate` and `Audit` on
|
||||
`/storage/proxy-seeds` through a role `ProxyOperatorSeeds`, and freed the
|
||||
leftover recon ISO on `local`. An upload to `proxy-seeds` and two deletes of
|
||||
a throwaway ISO there produced `content_delete_response.json`,
|
||||
`content_delete_again_response.json` and `task_status_volume_missing.json`.
|
||||
|
||||
The user gave the VLAN as "vlan 4, bridge: vmbr0.4@vmbr0". That is the
|
||||
host's own VLAN interface name as `ip link` prints it; a VM NIC cannot
|
||||
attach to it because it is not a bridge. On the VLAN-aware `vmbr0` the
|
||||
Proxmox form is `bridge=vmbr0,tag=4`, which is what template 9000 uses, so
|
||||
the provider's `vlanTag: 4` appends `tag=4` to the cloned `net0`.
|
||||
|
||||
A second clone of 9001 at VMID 199999 got its seed from `proxy-seeds` and
|
||||
`net0` rewritten from `virtio=BC:24:11:EE:48:83,bridge=vmbr0` to
|
||||
`virtio=BC:24:11:EE:48:83,bridge=vmbr0,tag=4`. **The write succeeded, so the
|
||||
token's `SDN.Use` on `/` covers a VLAN tag on `vmbr0`**
|
||||
(`set_config_vlan_response.json`).
|
||||
|
||||
**The first VLAN 4 attempt never produced an agent** in seven minutes of
|
||||
polling (every 13 seconds, 33 polls). The only signal was the agent call, so
|
||||
the cause could not be seen from the API. A debug seed added a `recon` user
|
||||
(user-data only, with a new instance id so cloud-init re-ran), and the user
|
||||
logged in on the console: DHCP worked, but VLAN 4 had no route to the
|
||||
internet because of a routing misconfiguration on the Proxmox host, so the
|
||||
vendor-data `apt-get install qemu-guest-agent` could not run. The user fixed
|
||||
the routing.
|
||||
|
||||
**Rerun from scratch after the fix**, same sequence the provider will use
|
||||
(destroy and seed delete first, then a fresh clone and seed, `instance-id`
|
||||
equal to the name):
|
||||
|
||||
| Step | Elapsed |
|
||||
|---|---|
|
||||
| clone task done | 4 s |
|
||||
| seed upload task done | 4 s |
|
||||
| config (`ide2`, `net0` with `tag=4`, tag) | 4 s |
|
||||
| start task done | 5 s |
|
||||
| agent reports `192.168.4.147` | 47 s after start |
|
||||
|
||||
The guest was reachable from the workstation (ping, TCP 22), as the contract
|
||||
requires of a proxy address. Stopping it gave the F5 stopped-VM fixture;
|
||||
destroy and seed delete then left the host with only its original VMs 100,
|
||||
9000 and 9001, no ISOs on `local` or `proxy-seeds`, and no `local-lvm`
|
||||
volumes of 199999. The capture is `agent_network_get_interfaces_vlan.json`.
|
||||
|
||||
### Worth noting
|
||||
|
||||
- The token file is mode 664; 600 would be tighter.
|
||||
- Fixtures: 48 files, all valid JSON, none containing `PVEAPIToken`.
|
||||
Several names differ from the plan's list because what they captured
|
||||
differed from what was expected: `start_while_clone_locked_response.json`
|
||||
(the start succeeded), `task_status_stopped_error.json` (from the shrink,
|
||||
not a start), `upload_overwrite_response.json` (success, not an error),
|
||||
`resize_same_size_response.json` and `resize_shrink_response.json`
|
||||
(UPIDs), `err_forbidden_volume_delete.json` (the 403 from F13).
|
||||
`err_no_space.json` was not produced (F6).
|
||||
- The host is back to its original state; see the table above.
|
||||
- The scratch seed builder (`seedgen` in the session scratchpad) took the
|
||||
user-data file and instance id as arguments by the end, for the debug
|
||||
login. It is not part of the repository; Phase 3's `nocloud` package
|
||||
replaces it.
|
||||
- Time to IP was about 50 s on both networks, with the agent installed at
|
||||
first boot. Budgets in the plan (running wait 60 s for the VM state, the
|
||||
agent discovered by `Get` polling) are consistent with this.
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"result\":[{\"statistics\":{\"tx-errs\":0,\"rx-dropped\":0,\"rx-bytes\":7101,\"rx-packets\":86,\"rx-errs\":0,\"tx-dropped\":0,\"tx-packets\":86,\"tx-bytes\":7101},\"name\":\"lo\",\"ip-addresses\":[{\"ip-address\":\"127.0.0.1\",\"ip-address-type\":\"ipv4\",\"prefix\":8},{\"ip-address\":\"::1\",\"ip-address-type\":\"ipv6\",\"prefix\":128}],\"hardware-address\":\"00:00:00:00:00:00\"},{\"hardware-address\":\"bc:24:11:48:11:46\",\"ip-addresses\":[{\"ip-address\":\"192.168.0.150\",\"ip-address-type\":\"ipv4\",\"prefix\":24},{\"ip-address\":\"fe80::be24:11ff:fe48:1146\",\"ip-address-type\":\"ipv6\",\"prefix\":64}],\"name\":\"ens18\",\"statistics\":{\"rx-dropped\":0,\"rx-bytes\":29688403,\"rx-packets\":6744,\"tx-errs\":0,\"tx-bytes\":221044,\"tx-dropped\":0,\"tx-packets\":2970,\"rx-errs\":0}}]}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"result\":[{\"ip-addresses\":[{\"prefix\":8,\"ip-address-type\":\"ipv4\",\"ip-address\":\"127.0.0.1\"},{\"prefix\":128,\"ip-address-type\":\"ipv6\",\"ip-address\":\"::1\"}],\"hardware-address\":\"00:00:00:00:00:00\",\"statistics\":{\"tx-errs\":0,\"rx-packets\":86,\"rx-bytes\":7101,\"rx-dropped\":0,\"rx-errs\":0,\"tx-dropped\":0,\"tx-packets\":86,\"tx-bytes\":7101},\"name\":\"lo\"},{\"ip-addresses\":[{\"ip-address-type\":\"ipv4\",\"ip-address\":\"192.168.4.147\",\"prefix\":24},{\"ip-address\":\"fe80::be24:11ff:fea9:b4eb\",\"ip-address-type\":\"ipv6\",\"prefix\":64}],\"hardware-address\":\"bc:24:11:a9:b4:eb\",\"statistics\":{\"rx-errs\":0,\"tx-bytes\":319460,\"tx-dropped\":0,\"tx-packets\":4544,\"tx-errs\":0,\"rx-bytes\":29576554,\"rx-dropped\":0,\"rx-packets\":6027},\"name\":\"ens18\"}]}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010F9DC:02801DA1:6AB37871:qmclone:9001:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":[{\"maxmem\":2147483648,\"netin\":0,\"uptime\":0,\"disk\":0,\"netout\":0,\"mem\":0,\"maxdisk\":34359738368,\"maxcpu\":2,\"type\":\"qemu\",\"memhost\":0,\"template\":0,\"id\":\"qemu/100\",\"cpu\":0,\"name\":\"ubuntu-vm-1\",\"vmid\":100,\"status\":\"stopped\",\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\"},{\"node\":\"pv1-1\",\"diskread\":0,\"diskwrite\":0,\"status\":\"stopped\",\"vmid\":9000,\"cpu\":0,\"name\":\"ubuntu-2604-template\",\"template\":1,\"id\":\"qemu/9000\",\"memhost\":0,\"type\":\"qemu\",\"maxcpu\":2,\"maxdisk\":34359738368,\"mem\":0,\"disk\":0,\"netout\":0,\"uptime\":0,\"netin\":0,\"maxmem\":2147483648},{\"uptime\":0,\"netout\":0,\"disk\":0,\"netin\":0,\"maxmem\":2147483648,\"maxdisk\":3221225472,\"mem\":0,\"id\":\"qemu/9001\",\"template\":1,\"name\":\"debian-13-template\",\"cpu\":0,\"type\":\"qemu\",\"maxcpu\":2,\"memhost\":0,\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"vmid\":9001,\"status\":\"stopped\"}]}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":[{\"template\":0,\"id\":\"qemu/100\",\"cpu\":0,\"name\":\"ubuntu-vm-1\",\"type\":\"qemu\",\"maxcpu\":2,\"memhost\":0,\"diskread\":0,\"diskwrite\":0,\"node\":\"pv1-1\",\"vmid\":100,\"status\":\"stopped\",\"uptime\":0,\"disk\":0,\"netout\":0,\"netin\":0,\"maxmem\":2147483648,\"maxdisk\":34359738368,\"mem\":0},{\"type\":\"qemu\",\"vmid\":199999,\"lock\":\"clone\",\"status\":\"unknown\",\"id\":\"qemu/199999\",\"node\":\"pv1-1\"},{\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"vmid\":9000,\"status\":\"stopped\",\"id\":\"qemu/9000\",\"template\":1,\"name\":\"ubuntu-2604-template\",\"cpu\":0,\"maxcpu\":2,\"type\":\"qemu\",\"memhost\":0,\"maxdisk\":34359738368,\"mem\":0,\"uptime\":0,\"netout\":0,\"disk\":0,\"netin\":0,\"maxmem\":2147483648},{\"type\":\"qemu\",\"maxcpu\":2,\"memhost\":0,\"template\":1,\"id\":\"qemu/9001\",\"cpu\":0,\"name\":\"debian-13-template\",\"vmid\":9001,\"status\":\"stopped\",\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"netin\":0,\"maxmem\":2147483648,\"uptime\":0,\"disk\":0,\"netout\":0,\"mem\":0,\"maxdisk\":3221225472}]}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":[{\"id\":\"qemu/100\",\"template\":0,\"name\":\"ubuntu-vm-1\",\"cpu\":0,\"type\":\"qemu\",\"maxcpu\":2,\"memhost\":0,\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"vmid\":100,\"status\":\"stopped\",\"uptime\":0,\"netout\":0,\"disk\":0,\"maxmem\":2147483648,\"netin\":0,\"maxdisk\":34359738368,\"mem\":0},{\"tags\":\"proxy_operator\",\"mem\":0,\"maxdisk\":4294967296,\"netin\":0,\"maxmem\":1073741824,\"uptime\":0,\"netout\":0,\"disk\":0,\"vmid\":199999,\"status\":\"stopped\",\"diskread\":0,\"diskwrite\":0,\"node\":\"pv1-1\",\"maxcpu\":1,\"type\":\"qemu\",\"memhost\":0,\"id\":\"qemu/199999\",\"template\":0,\"name\":\"proxy-reconaaaaaaaaaaa\",\"cpu\":0},{\"uptime\":0,\"netout\":0,\"disk\":0,\"netin\":0,\"maxmem\":2147483648,\"maxdisk\":34359738368,\"mem\":0,\"id\":\"qemu/9000\",\"template\":1,\"name\":\"ubuntu-2604-template\",\"cpu\":0,\"maxcpu\":2,\"type\":\"qemu\",\"memhost\":0,\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"vmid\":9000,\"status\":\"stopped\"},{\"mem\":0,\"maxdisk\":3221225472,\"maxmem\":2147483648,\"netin\":0,\"uptime\":0,\"disk\":0,\"netout\":0,\"vmid\":9001,\"status\":\"stopped\",\"diskwrite\":0,\"diskread\":0,\"node\":\"pv1-1\",\"maxcpu\":2,\"type\":\"qemu\",\"memhost\":0,\"template\":1,\"id\":\"qemu/9001\",\"cpu\":0,\"name\":\"debian-13-template\"}]}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"meta\":\"creation-qemu=11.0.3,ctime=1790145676\",\"description\":\"proxy-operator-managed=true\\nproxy-operator-uid=00000000-0000-0000-0000-00000000recon\\nproxy-operator-created-at=2026-09-23T07:00:00Z\",\"ide2\":\"local:iso/proxy-reconaaaaaaaaaaa-seed.iso,media=cdrom,size=44K\",\"cores\":1,\"memory\":\"1024\",\"scsihw\":\"virtio-scsi-pci\",\"net0\":\"virtio=BC:24:11:48:11:46,bridge=vmbr0\",\"efidisk0\":\"local-lvm:vm-199999-disk-0,efitype=4m,pre-enrolled-keys=0,size=4M\",\"scsi0\":\"local-lvm:vm-199999-disk-1,size=4G\",\"boot\":\"order=scsi0;ide2\",\"vmgenid\":\"2dd339a4-d7fb-4d47-96fd-5a61a25f808d\",\"digest\":\"98a4fff988b5508a7e1f6aa77c34768812d2382c\",\"name\":\"proxy-reconaaaaaaaaaaa\",\"vga\":\"serial0\",\"serial0\":\"socket\",\"smbios1\":\"uuid=f2ade202-ffdb-4a89-9867-3d419384471d\",\"machine\":\"q35\",\"bios\":\"ovmf\",\"tags\":\"proxy_operator\",\"agent\":\"1\",\"ostype\":\"l26\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:00111FF7:02853E62:6AB38591:imgdel:proxy-seeds:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:00111FF3:02853D30:6AB3858E:imgdel:proxy-seeds:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:00110564:0281A657:6AB37C5E:qmdestroy:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "QEMU guest agent is not running",
|
||||
"body": "{\"message\":\"QEMU guest agent is not running\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "No QEMU guest agent configured",
|
||||
"body": "{\"message\":\"No QEMU guest agent configured\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "VM 199999 is not running",
|
||||
"body": "{\"message\":\"VM 199999 is not running\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 400,
|
||||
"reason": "Parameter verification failed.",
|
||||
"body": "{\"data\":null,\"message\":\"Parameter verification failed.\\n\",\"errors\":{\"newid\":\"type check ('integer') failed - got 'abc'\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 400,
|
||||
"reason": "Parameter verification failed.",
|
||||
"body": "{\"errors\":{\"storage\":\"storage 'local' does not support vm images\"},\"message\":\"Parameter verification failed.\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "VM is locked (clone)",
|
||||
"body": "{\"data\":null,\"message\":\"VM is locked (clone)\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "Configuration file 'nodes/pv1-1/qemu-server/199999.conf' does not exist",
|
||||
"body": "{\"data\":null,\"message\":\"Configuration file 'nodes/pv1-1/qemu-server/199999.conf' does not exist\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 403,
|
||||
"reason": "Permission check failed (/nodes/pv1-1, Sys.Syslog)",
|
||||
"body": "{\"message\":\"Permission check failed (/nodes/pv1-1, Sys.Syslog)\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 403,
|
||||
"reason": "Permission check failed (/storage/local, Datastore.Allocate)",
|
||||
"body": "{\"data\":null,\"message\":\"Permission check failed (/storage/local, Datastore.Allocate)\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "unable to create VM 199999: config file already exists",
|
||||
"body": "{\"data\":null,\"message\":\"unable to create VM 199999: config file already exists\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 401,
|
||||
"reason": "No ticket",
|
||||
"body": ""
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 400,
|
||||
"reason": "Parameter verification failed.",
|
||||
"body": "{\"errors\":{\"tags\":\"invalid format - invalid characters in tag\\n\"},\"data\":null,\"message\":\"Parameter verification failed.\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 401,
|
||||
"reason": "Authentication failed!",
|
||||
"body": ""
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 401,
|
||||
"reason": "Authentication failed!",
|
||||
"body": ""
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 400,
|
||||
"reason": "Parameter verification failed.",
|
||||
"body": "{\"message\":\"Parameter verification failed.\\n\",\"data\":null,\"errors\":{\"filename\":\"wrong file extension\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "Configuration file 'nodes/pv1-1/qemu-server/999999.conf' does not exist",
|
||||
"body": "{\"message\":\"Configuration file 'nodes/pv1-1/qemu-server/999999.conf' does not exist\\n\",\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 500,
|
||||
"reason": "Configuration file 'nodes/pv1-1/qemu-server/999999.conf' does not exist",
|
||||
"body": "{\"data\":null,\"message\":\"Configuration file 'nodes/pv1-1/qemu-server/999999.conf' does not exist\\n\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"rootfs\":{\"total\":100861726720,\"avail\":88717860864,\"used\":6973128704,\"free\":93888598016},\"pveversion\":\"pve-manager/9.2.20/49318c671b82f31e\",\"current-kernel\":{\"machine\":\"x86_64\",\"sysname\":\"Linux\",\"release\":\"7.0.14-17-pve\",\"version\":\"#1 SMP PREEMPT_DYNAMIC PMX 7.0.14-17 (2026-09-10T10:16Z)\"},\"cpu\":0,\"cpuinfo\":{\"mhz\":\"1100.947\",\"user_hz\":100,\"cpus\":16,\"sockets\":1,\"model\":\"AMD Ryzen 9 PRO 8945HS w/ Radeon 780M Graphics\",\"vendor\":\"AuthenticAMD\",\"family\":\"25\",\"hvm\":\"1\",\"flags\":\"fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good amd_lbr_v2 nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpuid_fault cpb cat_l3 cdp_l3 hw_pstate ssbd mba perfmon_v2 ibrs ibpb stibp ibrs_enhanced vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local user_shstk avx512_bf16 clzero irperf xsaveerptr rdpru wbnoinvd cppc arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold vgif x2avic v_spec_ctrl vnmi avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid overflow_recov succor smca fsrm flush_l1d amd_lbr_pmc_freeze\",\"cores\":8},\"kversion\":\"Linux 7.0.14-17-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-17 (2026-09-10T10:16Z)\",\"wait\":0,\"boot-info\":{\"mode\":\"efi\",\"secureboot\":1},\"loadavg\":[\"0.05\",\"0.12\",\"0.10\"],\"memory\":{\"used\":2054795264,\"available\":29252005888,\"total\":31306801152,\"free\":28277043200},\"idle\":0,\"uptime\":419233,\"swap\":{\"used\":0,\"total\":8589930496,\"free\":8589930496},\"ksm\":{\"shared\":0}}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FB74:02804090:6AB378CA:resize:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FB6F:02804085:6AB378CA:resize:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FB72:0280408B:6AB378CA:resize:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":null}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FBF1:02804D0D:6AB378EA:qmstart:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010F9F0:02801DAF:6AB37871:qmstart:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"serial\":1,\"proxmox-support\":{\"pbs-dirty-bitmap-migration\":true,\"query-bitmap-info\":true,\"backup-fleecing\":true,\"pbs-masterkey\":true,\"pbs-dirty-bitmap-savevm\":true,\"backup-max-workers\":true,\"backup-access-api\":true,\"pbs-dirty-bitmap\":true,\"pbs-library-version\":\"2.0.3 (UNKNOWN)\"},\"maxdisk\":4294967296,\"vmid\":199999,\"ha\":{\"managed\":0},\"diskwrite\":373281280,\"uptime\":858,\"ballooninfo\":{\"mem_swapped_out\":0,\"mem_swapped_in\":0,\"max_mem\":1073741824,\"minor_page_faults\":266583,\"actual\":1073741824,\"last_update\":1790147647,\"major_page_faults\":599,\"free_mem\":414076928,\"total_mem\":943988736},\"running-qemu\":\"11.0.3\",\"disk\":0,\"cpus\":1,\"name\":\"proxy-reconaaaaaaaaaaa\",\"blockstat\":{\"ide2\":{\"rd_merged\":0,\"wr_total_time_ns\":0,\"failed_flush_operations\":0,\"account_failed\":true,\"account_invalid\":true,\"failed_wr_operations\":0,\"unmap_bytes\":0,\"invalid_rd_operations\":0,\"wr_highest_offset\":0,\"failed_zone_append_operations\":0,\"wr_operations\":0,\"unmap_merged\":0,\"wr_bytes\":0,\"idle_time_ns\":847849524087,\"unmap_total_time_ns\":0,\"zone_append_total_time_ns\":0,\"wr_merged\":0,\"rd_total_time_ns\":1255768,\"zone_append_bytes\":0,\"zone_append_operations\":0,\"invalid_unmap_operations\":0,\"unmap_operations\":0,\"invalid_zone_append_operations\":0,\"invalid_wr_operations\":0,\"flush_operations\":0,\"rd_operations\":61,\"invalid_flush_operations\":0,\"zone_append_merged\":0,\"failed_unmap_operations\":0,\"failed_rd_operations\":0,\"flush_total_time_ns\":0,\"rd_bytes\":174304,\"timed_stats\":[]},\"efidisk0\":{\"wr_highest_offset\":15360,\"unmap_merged\":0,\"wr_operations\":0,\"failed_zone_append_operations\":0,\"wr_bytes\":0,\"rd_merged\":0,\"failed_flush_operations\":0,\"wr_total_time_ns\":0,\"account_invalid\":true,\"account_failed\":true,\"invalid_rd_operations\":0,\"unmap_bytes\":0,\"failed_wr_operations\":0,\"invalid_wr_operations\":0,\"invalid_zone_append_operations\":0,\"flush_operations\":0,\"invalid_flush_operations\":0,\"rd_operations\":0,\"failed_rd_operations\":0,\"zone_append_merged\":0,\"failed_unmap_operations\":0,\"timed_stats\":[],\"rd_bytes\":0,\"flush_total_time_ns\":0,\"wr_merged\":0,\"zone_append_total_time_ns\":0,\"unmap_total_time_ns\":0,\"rd_total_time_ns\":0,\"zone_append_operations\":0,\"zone_append_bytes\":0,\"unmap_operations\":0,\"invalid_unmap_operations\":0},\"scsi0\":{\"unmap_operations\":81,\"invalid_unmap_operations\":0,\"zone_append_bytes\":0,\"zone_append_operations\":0,\"rd_total_time_ns\":899575874,\"wr_merged\":0,\"zone_append_total_time_ns\":0,\"idle_time_ns\":18104802903,\"unmap_total_time_ns\":326592,\"timed_stats\":[],\"rd_bytes\":196229120,\"flush_total_time_ns\":47510703,\"failed_rd_operations\":0,\"failed_unmap_operations\":0,\"zone_append_merged\":0,\"invalid_flush_operations\":0,\"rd_operations\":8843,\"invalid_wr_operations\":0,\"flush_operations\":145,\"invalid_zone_append_operations\":0,\"invalid_rd_operations\":0,\"unmap_bytes\":100188160,\"failed_wr_operations\":0,\"account_invalid\":true,\"account_failed\":true,\"failed_flush_operations\":0,\"wr_total_time_ns\":4726294270,\"rd_merged\":0,\"wr_bytes\":373281280,\"unmap_merged\":0,\"wr_operations\":1449,\"failed_zone_append_operations\":0,\"wr_highest_offset\":4294967296},\"pflash0\":{\"unmap_operations\":0,\"invalid_unmap_operations\":0,\"zone_append_operations\":0,\"zone_append_bytes\":0,\"rd_total_time_ns\":0,\"wr_merged\":0,\"zone_append_total_time_ns\":0,\"unmap_total_time_ns\":0,\"timed_stats\":[],\"rd_bytes\":0,\"flush_total_time_ns\":0,\"failed_rd_operations\":0,\"failed_unmap_operations\":0,\"zone_append_merged\":0,\"invalid_flush_operations\":0,\"rd_operations\":0,\"flush_operations\":0,\"invalid_wr_operations\":0,\"invalid_zone_append_operations\":0,\"unmap_bytes\":0,\"invalid_rd_operations\":0,\"failed_wr_operations\":0,\"account_invalid\":true,\"account_failed\":true,\"failed_flush_operations\":0,\"wr_total_time_ns\":0,\"rd_merged\":0,\"wr_bytes\":0,\"unmap_merged\":0,\"failed_zone_append_operations\":0,\"wr_operations\":0,\"wr_highest_offset\":0}},\"agent\":1,\"pid\":1113088,\"tags\":\"proxy_operator\",\"pressureiosome\":0,\"diskread\":196403424,\"pressurememoryfull\":0,\"nics\":{\"tap199999i0\":{\"netin\":30673586,\"netout\":240050}},\"qmpstatus\":\"paused\",\"status\":\"running\",\"netin\":30673586,\"balloon\":1073741824,\"netout\":240050,\"cpu\":0,\"clipboard\":null,\"pressurememorysome\":0,\"pressurecpufull\":0,\"running-machine\":\"pc-q35-11.0+pve0\",\"mem\":529911808,\"pressurecpusome\":0,\"freemem\":414076928,\"maxmem\":1073741824,\"pressureiofull\":0,\"memhost\":674607104}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"running-machine\":\"pc-q35-11.0+pve0\",\"mem\":190930944,\"pressurecpufull\":0,\"pressurememorysome\":0,\"pressureiofull\":0,\"memhost\":337240064,\"pressurecpusome\":0,\"maxmem\":2147483648,\"freemem\":1808162816,\"pressurememoryfull\":0,\"nics\":{\"tap199999i0\":{\"netout\":0,\"netin\":255}},\"diskread\":148379648,\"clipboard\":null,\"status\":\"running\",\"qmpstatus\":\"running\",\"netin\":255,\"balloon\":2147483648,\"netout\":0,\"cpu\":0,\"agent\":1,\"pid\":1112650,\"name\":\"proxy-reconaaaaaaaaaaa\",\"blockstat\":{\"scsi0\":{\"zone_append_operations\":0,\"zone_append_bytes\":0,\"invalid_unmap_operations\":0,\"unmap_operations\":6,\"idle_time_ns\":4599584011,\"unmap_total_time_ns\":24404,\"zone_append_total_time_ns\":0,\"wr_merged\":0,\"rd_total_time_ns\":466322772,\"zone_append_merged\":0,\"failed_unmap_operations\":0,\"failed_rd_operations\":0,\"flush_total_time_ns\":4612531,\"rd_bytes\":148379648,\"timed_stats\":[],\"flush_operations\":19,\"invalid_wr_operations\":0,\"invalid_zone_append_operations\":0,\"rd_operations\":4279,\"invalid_flush_operations\":0,\"account_failed\":true,\"account_invalid\":true,\"failed_wr_operations\":0,\"invalid_rd_operations\":0,\"unmap_bytes\":282624,\"rd_merged\":0,\"wr_total_time_ns\":190079426,\"failed_flush_operations\":0,\"wr_bytes\":6373888,\"wr_highest_offset\":1533730816,\"failed_zone_append_operations\":0,\"wr_operations\":220,\"unmap_merged\":0},\"efidisk0\":{\"rd_merged\":0,\"failed_flush_operations\":0,\"wr_total_time_ns\":0,\"account_invalid\":true,\"account_failed\":true,\"unmap_bytes\":0,\"invalid_rd_operations\":0,\"failed_wr_operations\":0,\"wr_highest_offset\":9216,\"unmap_merged\":0,\"failed_zone_append_operations\":0,\"wr_operations\":0,\"wr_bytes\":0,\"wr_merged\":0,\"zone_append_total_time_ns\":0,\"unmap_total_time_ns\":0,\"rd_total_time_ns\":0,\"zone_append_bytes\":0,\"zone_append_operations\":0,\"unmap_operations\":0,\"invalid_unmap_operations\":0,\"invalid_wr_operations\":0,\"invalid_zone_append_operations\":0,\"flush_operations\":0,\"invalid_flush_operations\":0,\"rd_operations\":0,\"failed_rd_operations\":0,\"zone_append_merged\":0,\"failed_unmap_operations\":0,\"timed_stats\":[],\"rd_bytes\":0,\"flush_total_time_ns\":0},\"pflash0\":{\"wr_total_time_ns\":0,\"failed_flush_operations\":0,\"rd_merged\":0,\"failed_wr_operations\":0,\"unmap_bytes\":0,\"invalid_rd_operations\":0,\"account_failed\":true,\"account_invalid\":true,\"wr_operations\":0,\"failed_zone_append_operations\":0,\"unmap_merged\":0,\"wr_highest_offset\":0,\"wr_bytes\":0,\"rd_total_time_ns\":0,\"unmap_total_time_ns\":0,\"zone_append_total_time_ns\":0,\"wr_merged\":0,\"invalid_unmap_operations\":0,\"unmap_operations\":0,\"zone_append_operations\":0,\"zone_append_bytes\":0,\"rd_operations\":0,\"invalid_flush_operations\":0,\"invalid_zone_append_operations\":0,\"invalid_wr_operations\":0,\"flush_operations\":0,\"flush_total_time_ns\":0,\"rd_bytes\":0,\"timed_stats\":[],\"failed_unmap_operations\":0,\"zone_append_merged\":0,\"failed_rd_operations\":0}},\"pressureiosome\":0.01,\"vmid\":199999,\"ha\":{\"managed\":0},\"diskwrite\":6373888,\"serial\":1,\"proxmox-support\":{\"pbs-dirty-bitmap-savevm\":true,\"pbs-masterkey\":true,\"backup-fleecing\":true,\"pbs-dirty-bitmap-migration\":true,\"query-bitmap-info\":true,\"backup-access-api\":true,\"pbs-dirty-bitmap\":true,\"pbs-library-version\":\"2.0.3 (UNKNOWN)\",\"backup-max-workers\":true},\"maxdisk\":3221225472,\"ballooninfo\":{\"actual\":2147483648,\"mem_swapped_out\":0,\"mem_swapped_in\":0,\"max_mem\":2147483648,\"minor_page_faults\":122998,\"major_page_faults\":616,\"free_mem\":1808162816,\"total_mem\":1999093760,\"last_update\":1790146701},\"uptime\":26,\"running-qemu\":\"11.0.3\",\"disk\":0,\"cpus\":2}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"name\":\"ubuntu-vm-1\",\"mem\":0,\"maxmem\":2147483648,\"memhost\":0,\"maxdisk\":34359738368,\"serial\":1,\"ha\":{\"managed\":0},\"vmid\":100,\"cpu\":0,\"cpus\":2,\"netout\":0,\"disk\":0,\"qmpstatus\":\"stopped\",\"status\":\"stopped\",\"netin\":0,\"uptime\":0,\"clipboard\":null}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FAC5:02802A52:6AB37891:qmstop:199999:proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":[{\"size\":45056,\"volid\":\"local:iso/proxy-reconaaaaaaaaaaa-seed.iso\",\"format\":\"iso\",\"content\":\"iso\",\"ctime\":1790146742}]}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"total\":100861726720,\"active\":1,\"enabled\":1,\"used\":6973128704,\"avail\":88717860864,\"type\":\"dir\",\"shared\":0,\"content\":\"iso,import,backup,vztmpl\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"upid\":\"UPID:pv1-1:0010F9DC:02801DA1:6AB37871:qmclone:9001:proxy-operator@pve!operator:\",\"exitstatus\":\"OK\",\"status\":\"stopped\",\"pid\":1112540,\"pstart\":41950625,\"user\":\"proxy-operator@pve\",\"node\":\"pv1-1\",\"type\":\"qmclone\",\"starttime\":1790146673,\"id\":\"9001\",\"tokenid\":\"operator\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"pstart\":41962765,\"upid\":\"UPID:pv1-1:0010FBF1:02804D0D:6AB378EA:qmstart:199999:proxy-operator@pve!operator:\",\"pid\":1113073,\"node\":\"pv1-1\",\"user\":\"proxy-operator@pve\",\"type\":\"qmstart\",\"status\":\"running\",\"tokenid\":\"operator\",\"id\":\"199999\",\"starttime\":1790146794}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"exitstatus\":\"OK\",\"status\":\"stopped\",\"upid\":\"UPID:pv1-1:0010F9F0:02801DAF:6AB37871:qmstart:199999:proxy-operator@pve!operator:\",\"type\":\"qmstart\",\"tokenid\":\"operator\",\"id\":\"199999\",\"starttime\":1790146673,\"pstart\":41950639,\"pid\":1112560,\"node\":\"pv1-1\",\"user\":\"proxy-operator@pve\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"type\":\"resize\",\"tokenid\":\"operator\",\"id\":\"199999\",\"starttime\":1790146762,\"pstart\":41959563,\"pid\":1112946,\"user\":\"proxy-operator@pve\",\"node\":\"pv1-1\",\"exitstatus\":\"shrinking disks is not supported\",\"status\":\"stopped\",\"upid\":\"UPID:pv1-1:0010FB72:0280408B:6AB378CA:resize:199999:proxy-operator@pve!operator:\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"exitstatus\":\"OK\",\"status\":\"stopped\",\"upid\":\"UPID:pv1-1:0010FAC5:02802A52:6AB37891:qmstop:199999:proxy-operator@pve!operator:\",\"type\":\"qmstop\",\"starttime\":1790146705,\"id\":\"199999\",\"tokenid\":\"operator\",\"pid\":1112773,\"pstart\":41953874,\"user\":\"proxy-operator@pve\",\"node\":\"pv1-1\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"user\":\"proxy-operator@pve\",\"node\":\"pv1-1\",\"pstart\":42286690,\"pid\":1122295,\"id\":\"proxy-seeds\",\"tokenid\":\"operator\",\"starttime\":1790150033,\"type\":\"imgdel\",\"upid\":\"UPID:pv1-1:00111FF7:02853E62:6AB38591:imgdel:proxy-seeds:proxy-operator@pve!operator:\",\"status\":\"stopped\",\"exitstatus\":\"OK\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FB2D:028038B0:6AB378B6:imgcopy::proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:0010FB27:0280377E:6AB378B3:imgcopy::proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":\"UPID:pv1-1:00110D02:0282B09D:6AB37F08:imgcopy::proxy-operator@pve!operator:\"}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"version\":\"9.2.20\",\"repoid\":\"49318c671b82f31e\",\"release\":\"9.2\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"boot\":\"order=scsi0\",\"vmgenid\":\"2dd339a4-d7fb-4d47-96fd-5a61a25f808d\",\"digest\":\"e747d94a5aac26cf6528b43835600b1bc4e82dda\",\"scsi0\":\"local-lvm:vm-199999-disk-1,size=3G\",\"serial0\":\"socket\",\"name\":\"proxy-reconaaaaaaaaaaa\",\"vga\":\"serial0\",\"cores\":2,\"meta\":\"creation-qemu=11.0.3,ctime=1790145676\",\"description\":\"proxy-operator-managed=true\\nproxy-operator-uid=00000000-0000-0000-0000-00000000recon\\nproxy-operator-created-at=2026-09-23T07:00:00Z\",\"efidisk0\":\"local-lvm:vm-199999-disk-0,efitype=4m,pre-enrolled-keys=0,size=4M\",\"memory\":\"2048\",\"scsihw\":\"virtio-scsi-pci\",\"net0\":\"virtio=BC:24:11:48:11:46,bridge=vmbr0\",\"agent\":\"1\",\"ostype\":\"l26\",\"bios\":\"ovmf\",\"machine\":\"q35\",\"smbios1\":\"uuid=f2ade202-ffdb-4a89-9867-3d419384471d\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"ostype\":\"l26\",\"agent\":\"1\",\"smbios1\":\"uuid=5b131064-9841-4bc7-982e-5fb5b2e677eb\",\"machine\":\"q35\",\"bios\":\"ovmf\",\"scsi0\":\"local-lvm:base-9001-disk-2,size=3G\",\"digest\":\"03bdc5d457ce2165bb633505d2ff0cd94340dbc2\",\"vmgenid\":\"9a42b153-7965-4601-864d-59fc2d71ecd4\",\"boot\":\"order=scsi0\",\"vga\":\"serial0\",\"template\":1,\"name\":\"debian-13-template\",\"serial0\":\"socket\",\"meta\":\"creation-qemu=11.0.3,ctime=1790145676\",\"cores\":2,\"net0\":\"virtio=BC:24:11:93:25:82,bridge=vmbr0\",\"scsihw\":\"virtio-scsi-pci\",\"memory\":\"2048\",\"efidisk0\":\"local-lvm:base-9001-disk-0,efitype=4m,pre-enrolled-keys=0,size=4M\"}}"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"status": 200,
|
||||
"reason": "OK",
|
||||
"body": "{\"data\":{\"ciuser\":\"ubuntu\",\"smbios1\":\"uuid=6ba36ff6-9d1f-457b-8cdc-a44448f5bd35\",\"ostype\":\"l26\",\"memory\":\"2048\",\"scsihw\":\"virtio-scsi-pci\",\"net0\":\"virtio=BC:24:11:2F:97:A0,bridge=vmbr0,tag=4\",\"ide2\":\"local-lvm:vm-9000-cloudinit,media=cdrom\",\"cores\":2,\"meta\":\"creation-qemu=11.0.0,ctime=1789719724\",\"ipconfig0\":\"ip=dhcp\",\"serial0\":\"socket\",\"name\":\"ubuntu-2604-template\",\"template\":1,\"vga\":\"serial0\",\"boot\":\"order=scsi0\",\"vmgenid\":\"37d16d5c-957f-4c83-aab3-b403513e466c\",\"digest\":\"8820e9bb34a576d0f54b94cfe3e69fbfdf13a8ce\",\"scsi0\":\"local-lvm:base-9000-disk-0,size=32G\"}}"
|
||||
}
|
||||
Reference in New Issue
Block a user