docs: research Proxmox API Viewer source
This commit is contained in:
@@ -0,0 +1,59 @@
|
|||||||
|
# Proxmox VE API Viewer research
|
||||||
|
|
||||||
|
Research was performed on 2026-07-12 against the official documentation hosted
|
||||||
|
by Proxmox Server Solutions GmbH.
|
||||||
|
|
||||||
|
## Discovered source
|
||||||
|
|
||||||
|
The HTML application at
|
||||||
|
[`https://pve.proxmox.com/pve-docs/api-viewer/`](https://pve.proxmox.com/pve-docs/api-viewer/)
|
||||||
|
loads ExtJS and one application resource, `apidoc.js`. The machine-readable API
|
||||||
|
tree is not fetched from a separate JSON endpoint: it is embedded at the start
|
||||||
|
of [`apidoc.js`](https://pve.proxmox.com/pve-docs/api-viewer/apidoc.js) as a
|
||||||
|
JavaScript declaration named `apiSchema`. The remainder of that file renders the
|
||||||
|
tree and method documentation.
|
||||||
|
|
||||||
|
At retrieval, the artifact was 4,277,440 bytes with SHA-256
|
||||||
|
`f2b77b57c71f3781a0993cc5062940ef31e0843fd9a6bcfdb4de4dd2001d6d9e`.
|
||||||
|
The server reported `Last-Modified: Fri, 03 Jul 2026 09:08:20 GMT` and ETag
|
||||||
|
`"4144c0-655b144140900"`.
|
||||||
|
|
||||||
|
The adjacent official documentation index identifies the generated
|
||||||
|
documentation as Proxmox VE `9.2.3`, dated `Fri Jul 3 11:08:20 CEST 2026`. Its
|
||||||
|
timestamp matches the artifact's HTTP last-modified time after timezone
|
||||||
|
conversion. This is strong evidence that the current unversioned viewer belongs
|
||||||
|
to that documentation build, but the artifact does not contain a dedicated
|
||||||
|
top-level snapshot-version field. Importers must therefore record the index
|
||||||
|
version and HTTP metadata as provenance rather than infer a version from an API
|
||||||
|
method schema.
|
||||||
|
|
||||||
|
## Format and limitations
|
||||||
|
|
||||||
|
`apiSchema` is a nested tree of path nodes. Nodes may contain `children`, an
|
||||||
|
`info` mapping keyed by HTTP method, `path`, `text`, and `leaf`. Method objects
|
||||||
|
contain parameter and return schemas, permissions, descriptions, and flags.
|
||||||
|
The schema resembles JSON Schema but is a Proxmox-specific dialect and includes
|
||||||
|
fields such as `typetext`, `format_description`, `instance-types`, and numeric
|
||||||
|
booleans. Unknown fields must be retained.
|
||||||
|
|
||||||
|
The artifact is executable JavaScript, not JSON. A parser must extract only the
|
||||||
|
declaration value without evaluating the downloaded program. The URL is
|
||||||
|
unversioned and changes in place. Formatting, declaration syntax, variable name,
|
||||||
|
tree shape, or bundling may change without notice. Documentation describes the
|
||||||
|
declared contract; it does not prove runtime behavior or exact error text for a
|
||||||
|
particular installed cluster.
|
||||||
|
|
||||||
|
## Offline fallback and sample
|
||||||
|
|
||||||
|
The repository stores an extracted, otherwise semantically unmodified `/version`
|
||||||
|
node at
|
||||||
|
[`tests/fixtures/api-viewer/pve-9.2.3-version.json`](../tests/fixtures/api-viewer/pve-9.2.3-version.json).
|
||||||
|
It is deliberately small enough for deterministic parser tests and retains all
|
||||||
|
fields from that source node. Its checksum is recorded in the companion
|
||||||
|
provenance file. Network retrieval is research/import functionality only; the
|
||||||
|
default test suite must use this checked-in fixture.
|
||||||
|
|
||||||
|
The fixture is not a complete snapshot and must never be used to claim broad
|
||||||
|
Proxmox compatibility. Full imports should preserve the immutable raw
|
||||||
|
`apidoc.js`, response metadata, retrieval timestamp, and checksum outside the
|
||||||
|
small test-fixture path.
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"GET": {
|
||||||
|
"allowtoken": 1,
|
||||||
|
"description": "API version details, including some parts of the global datacenter config.",
|
||||||
|
"method": "GET",
|
||||||
|
"name": "version",
|
||||||
|
"parameters": {
|
||||||
|
"additionalProperties": 0
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"user": "all"
|
||||||
|
},
|
||||||
|
"returns": {
|
||||||
|
"properties": {
|
||||||
|
"console": {
|
||||||
|
"description": "The default console viewer to use.",
|
||||||
|
"enum": [
|
||||||
|
"applet",
|
||||||
|
"vv",
|
||||||
|
"html5",
|
||||||
|
"xtermjs"
|
||||||
|
],
|
||||||
|
"optional": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"release": {
|
||||||
|
"description": "The current Proxmox VE point release in `x.y` format.",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"repoid": {
|
||||||
|
"description": "The short git revision from which this version was build.",
|
||||||
|
"pattern": "[0-9a-fA-F]{8,64}",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"description": "The full pve-manager package version of this node.",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"leaf": 1,
|
||||||
|
"path": "/version",
|
||||||
|
"text": "version"
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"artifact_etag": "\"4144c0-655b144140900\"",
|
||||||
|
"artifact_last_modified": "Fri, 03 Jul 2026 09:08:20 GMT",
|
||||||
|
"artifact_sha256": "f2b77b57c71f3781a0993cc5062940ef31e0843fd9a6bcfdb4de4dd2001d6d9e",
|
||||||
|
"artifact_size": 4277440,
|
||||||
|
"artifact_url": "https://pve.proxmox.com/pve-docs/api-viewer/apidoc.js",
|
||||||
|
"documentation_version": "9.2.3",
|
||||||
|
"fixture_json_pointer": "/5",
|
||||||
|
"fixture_sha256": "ad572969bbab259a10380ec11ac1c67f865e601be7c5aeec201fca368341c3fe",
|
||||||
|
"retrieved_at": "2026-07-12T23:08:59+03:00",
|
||||||
|
"viewer_url": "https://pve.proxmox.com/pve-docs/api-viewer/"
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
"""Offline checks for the researched API Viewer sample."""
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any, cast
|
||||||
|
|
||||||
|
FIXTURES = Path(__file__).parents[1] / "fixtures" / "api-viewer"
|
||||||
|
|
||||||
|
|
||||||
|
def test_version_fixture_matches_provenance() -> None:
|
||||||
|
fixture_path = FIXTURES / "pve-9.2.3-version.json"
|
||||||
|
provenance_path = FIXTURES / "pve-9.2.3-version.provenance.json"
|
||||||
|
|
||||||
|
fixture_bytes = fixture_path.read_bytes()
|
||||||
|
fixture = cast(dict[str, Any], json.loads(fixture_bytes))
|
||||||
|
provenance = cast(dict[str, Any], json.loads(provenance_path.read_bytes()))
|
||||||
|
|
||||||
|
assert fixture["path"] == "/version"
|
||||||
|
assert fixture["info"]["GET"]["method"] == "GET"
|
||||||
|
assert hashlib.sha256(fixture_bytes).hexdigest() == provenance["fixture_sha256"]
|
||||||
Reference in New Issue
Block a user