Initial commit: VMware vSphere API simulator scaffold.

Add the FastAPI app, PostgreSQL migrations, Docker/Helm packaging, API
contracts, docs, client examples, and the unit/integration/compatibility
test suite for local client and tooling labs without a real vCenter.
This commit is contained in:
2026-07-18 04:42:11 +03:00
commit f8d3cbdd59
422 changed files with 361335 additions and 0 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+223
View File
@@ -0,0 +1,223 @@
{
"format_version": 1,
"profile": "pve-9.2",
"source_version": "9.2.3",
"records": [
{
"path": "/version",
"verb": "GET",
"dimensions": ["http_status", "json_structure", "response_field_types", "response_required_fields"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_core_handlers.py"]
},
{
"path": "/access/ticket",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "response_field_types", "response_required_fields", "headers_cookies", "errors_prohibitions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_auth.py", "tests/unit/test_dynamic_routes.py"]
},
{
"path": "/nodes",
"verb": "GET",
"dimensions": ["http_status", "json_structure", "response_field_types", "response_required_fields", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_core_handlers.py", "tests/unit/test_acl.py"]
},
{
"path": "/nodes/{node}/qemu",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "response_field_types", "response_required_fields", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_core_handlers.py", "tests/unit/test_acl.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/current",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "response_field_types", "response_required_fields", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_core_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/start",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "headers_cookies", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py", "tests/unit/test_transitions.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/stop",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "headers_cookies", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py", "tests/unit/test_transitions.py"]
},
{
"path": "/nodes/{node}/tasks/{upid}/status",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "response_field_types", "response_required_fields", "long_task_behavior", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_task_worker.py", "tests/unit/test_upid.py"]
},
{
"path": "/nodes/{node}/qemu",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}",
"verb": "DELETE",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/config",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py", "tests/unit/test_acl.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/config",
"verb": "PUT",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_acl.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/shutdown",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_transitions.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/reboot",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_transitions.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/reset",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_transitions.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/suspend",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_transitions.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/status/resume",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_transitions.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot/{snapname}",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot/{snapname}",
"verb": "DELETE",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot/{snapname}/config",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot/{snapname}/config",
"verb": "PUT",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/snapshot/{snapname}/rollback",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/clone",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/migrate",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/migrate",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/resize",
"verb": "PUT",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_compatible_io.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/move_disk",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "long_task_behavior", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py", "tests/unit/test_qemu_task.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/pending",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/info",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/get-osinfo",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/get-host-name",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/network-get-interfaces",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/get-time",
"verb": "GET",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
},
{
"path": "/nodes/{node}/qemu/{vmid}/agent/ping",
"verb": "POST",
"dimensions": ["input_parameters", "parameter_requiredness", "types_constraints", "http_status", "json_structure", "state_semantics", "errors_prohibitions", "permissions"],
"sources": ["tests/compatibility/test_proxmoxer.py", "tests/unit/test_qemu_handlers.py"]
}
]
}
File diff suppressed because it is too large Load Diff
+81
View File
@@ -0,0 +1,81 @@
{
"product": "vmware-api-simulator",
"api_version": "7.0.0",
"major": 6,
"series": "vSphere 7.0",
"plane": "vsphere-rest",
"generated_at": "2026-07-15T23:58:55Z",
"notes": "Ledger derived from app/vsphere/rest/coverage.py + PATH_FLOOR. implemented_methods = available at this major; universe_methods = full simulator registry.",
"summary": {
"implemented_methods": 31,
"universe_methods": 1077,
"unsupported_in_version": 1046,
"coverage": 0.0288,
"by_verb": {
"DELETE": 3,
"GET": 23,
"POST": 5
},
"status": "partial-clone"
},
"levels": {
"declared": {
"count": 1077,
"score": 1.0
},
"gated": {
"count": 1046,
"score": 0.9712
},
"schema_only": {
"count": 1046,
"score": 0.9712
},
"implemented": {
"count": 31,
"score": 0.0288
},
"observed": {
"count": 31,
"score": 0.0288
},
"verified": {
"count": 31,
"score": 0.0288
}
},
"dimensions": {
"route_method": {
"count": 31,
"score": 0.0288
},
"get": {
"count": 23,
"score": 0.042
},
"post": {
"count": 5,
"score": 0.0214
},
"patch": {
"count": 0,
"score": 0.0
},
"delete": {
"count": 3,
"score": 0.0261
},
"auth_session": {
"count": 6,
"score": 1.0
},
"inventory": {
"count": 15,
"score": 0.026
},
"legacy_rest": {
"count": 12,
"score": 1.0
}
}
}
+82
View File
@@ -0,0 +1,82 @@
{
"product": "vmware-api-simulator",
"api_version": "7.0.3",
"major": 7,
"series": "vSphere 7.0 U3",
"plane": "vsphere-rest",
"generated_at": "2026-07-15T23:58:55Z",
"notes": "Ledger derived from app/vsphere/rest/coverage.py + PATH_FLOOR. implemented_methods = available at this major; universe_methods = full simulator registry.",
"summary": {
"implemented_methods": 77,
"universe_methods": 1077,
"unsupported_in_version": 1000,
"coverage": 0.0715,
"by_verb": {
"DELETE": 10,
"GET": 41,
"PATCH": 2,
"POST": 24
},
"status": "partial-clone"
},
"levels": {
"declared": {
"count": 1077,
"score": 1.0
},
"gated": {
"count": 1000,
"score": 0.9285
},
"schema_only": {
"count": 1000,
"score": 0.9285
},
"implemented": {
"count": 77,
"score": 0.0715
},
"observed": {
"count": 77,
"score": 0.0715
},
"verified": {
"count": 77,
"score": 0.0715
}
},
"dimensions": {
"route_method": {
"count": 77,
"score": 0.0715
},
"get": {
"count": 41,
"score": 0.0748
},
"post": {
"count": 24,
"score": 0.1026
},
"patch": {
"count": 2,
"score": 0.023
},
"delete": {
"count": 10,
"score": 0.087
},
"auth_session": {
"count": 6,
"score": 1.0
},
"inventory": {
"count": 50,
"score": 0.0865
},
"legacy_rest": {
"count": 12,
"score": 1.0
}
}
}
+82
View File
@@ -0,0 +1,82 @@
{
"product": "vmware-api-simulator",
"api_version": "8.0.0",
"major": 8,
"series": "vSphere 8.0",
"plane": "vsphere-rest",
"generated_at": "2026-07-15T23:58:55Z",
"notes": "Ledger derived from app/vsphere/rest/coverage.py + PATH_FLOOR. implemented_methods = available at this major; universe_methods = full simulator registry.",
"summary": {
"implemented_methods": 103,
"universe_methods": 1077,
"unsupported_in_version": 974,
"coverage": 0.0956,
"by_verb": {
"DELETE": 11,
"GET": 58,
"PATCH": 2,
"POST": 32
},
"status": "partial-clone"
},
"levels": {
"declared": {
"count": 1077,
"score": 1.0
},
"gated": {
"count": 974,
"score": 0.9044
},
"schema_only": {
"count": 974,
"score": 0.9044
},
"implemented": {
"count": 103,
"score": 0.0956
},
"observed": {
"count": 103,
"score": 0.0956
},
"verified": {
"count": 103,
"score": 0.0956
}
},
"dimensions": {
"route_method": {
"count": 103,
"score": 0.0956
},
"get": {
"count": 58,
"score": 0.1058
},
"post": {
"count": 32,
"score": 0.1368
},
"patch": {
"count": 2,
"score": 0.023
},
"delete": {
"count": 11,
"score": 0.0957
},
"auth_session": {
"count": 6,
"score": 1.0
},
"inventory": {
"count": 67,
"score": 0.1159
},
"legacy_rest": {
"count": 12,
"score": 1.0
}
}
}
+83
View File
@@ -0,0 +1,83 @@
{
"product": "vmware-api-simulator",
"api_version": "8.0.2",
"major": 9,
"series": "vSphere 8.0 U2",
"plane": "vsphere-rest",
"generated_at": "2026-07-15T23:58:55Z",
"notes": "Ledger derived from app/vsphere/rest/coverage.py + PATH_FLOOR. implemented_methods = available at this major; universe_methods = full simulator registry.",
"summary": {
"implemented_methods": 1077,
"universe_methods": 1077,
"unsupported_in_version": 0,
"coverage": 1.0,
"by_verb": {
"DELETE": 115,
"GET": 548,
"PATCH": 87,
"POST": 234,
"PUT": 93
},
"status": "registry-complete"
},
"levels": {
"declared": {
"count": 1077,
"score": 1.0
},
"gated": {
"count": 0,
"score": 0.0
},
"schema_only": {
"count": 0,
"score": 0.0
},
"implemented": {
"count": 1077,
"score": 1.0
},
"observed": {
"count": 1077,
"score": 1.0
},
"verified": {
"count": 1077,
"score": 1.0
}
},
"dimensions": {
"route_method": {
"count": 1077,
"score": 1.0
},
"get": {
"count": 548,
"score": 1.0
},
"post": {
"count": 234,
"score": 1.0
},
"patch": {
"count": 87,
"score": 1.0
},
"delete": {
"count": 115,
"score": 1.0
},
"auth_session": {
"count": 6,
"score": 1.0
},
"inventory": {
"count": 578,
"score": 1.0
},
"legacy_rest": {
"count": 12,
"score": 1.0
}
}
}