Add a stateful Proxmox API console and broad handler coverage beyond the
initial QEMU slice, backed by imported contracts for majors 6–9. - Implement durable handlers for access/auth, cluster, LXC, storage, HA, firewall, Ceph, SDN, ACME, notifications, pools, mapping, and node ops - Serve an interactive Web UI with catalog browsing, demo seed controls, and OpenAPI/help surfaces - Bundle PVE 6.4-15, 7.4-16, and 8.4.5 contract revisions alongside 9.2.3 - Support in-memory runtime contract Apply (POST /ui/api/contract/apply) so /version and /api2 routes follow the selected major until restart - Expand seed profiles (including demo-cluster), migrations 007–008, TLS gateway config, Compose/Makefile tooling, and compatibility evidence - Tighten .gitignore for macOS, hidden directories (.*/), and local secrets
This commit is contained in:
+65
-2
@@ -10,9 +10,28 @@ from fastapi import Request
|
||||
from app.api.errors import ApiError
|
||||
from app.api.registry import HandlerRegistry
|
||||
from app.config import Settings
|
||||
from app.contracts.runtime import runtime_version_payload
|
||||
from app.db.pool import AsyncpgDatabase
|
||||
from app.handlers.access import register_access_handlers
|
||||
from app.handlers.acme import register_acme_handlers
|
||||
from app.handlers.backup import register_backup_handlers
|
||||
from app.handlers.ceph import register_ceph_handlers
|
||||
from app.handlers.cluster import register_cluster_handlers
|
||||
from app.handlers.cluster_config import register_cluster_config_handlers
|
||||
from app.handlers.cluster_extra import register_cluster_extra_handlers
|
||||
from app.handlers.common import require_node, subdirs
|
||||
from app.handlers.firewall import register_firewall_handlers
|
||||
from app.handlers.ha import register_ha_handlers
|
||||
from app.handlers.legacy_aliases import register_legacy_aliases
|
||||
from app.handlers.lxc import register_lxc_handlers
|
||||
from app.handlers.mapping import register_mapping_handlers
|
||||
from app.handlers.nodes import register_node_ops_handlers
|
||||
from app.handlers.nodes_extra import register_nodes_extra_handlers
|
||||
from app.handlers.notifications import register_notifications_handlers
|
||||
from app.handlers.pools import register_pool_handlers
|
||||
from app.handlers.qemu import register_qemu_handlers
|
||||
from app.handlers.sdn import register_sdn_handlers
|
||||
from app.handlers.storage import register_storage_handlers
|
||||
from app.security.auth import csrf_token, issue_ticket, verify_secret
|
||||
|
||||
|
||||
@@ -23,8 +42,8 @@ def _database(request: Request) -> AsyncpgDatabase:
|
||||
def build_core_handlers(settings: Settings) -> HandlerRegistry:
|
||||
registry = HandlerRegistry()
|
||||
|
||||
async def version(_request: Request, _inputs: dict[str, Any]) -> dict[str, str]:
|
||||
return {"version": "9.2.3", "release": "9.2", "repoid": "simulator"}
|
||||
async def version(request: Request, _inputs: dict[str, Any]) -> dict[str, str]:
|
||||
return runtime_version_payload(request)
|
||||
|
||||
async def login(request: Request, inputs: dict[str, Any]) -> dict[str, Any]:
|
||||
values = cast(dict[str, Any], inputs["values"])
|
||||
@@ -89,11 +108,55 @@ def build_core_handlers(settings: Settings) -> HandlerRegistry:
|
||||
)
|
||||
return result
|
||||
|
||||
async def node_index(request: Request, inputs: dict[str, Any]) -> list[dict[str, str]]:
|
||||
node = str(cast(dict[str, Any], inputs["values"])["node"])
|
||||
await require_node(request, node)
|
||||
return subdirs(
|
||||
"apt",
|
||||
"ceph",
|
||||
"disks",
|
||||
"firewall",
|
||||
"lxc",
|
||||
"network",
|
||||
"qemu",
|
||||
"services",
|
||||
"status",
|
||||
"storage",
|
||||
"tasks",
|
||||
"version",
|
||||
"vzdump",
|
||||
)
|
||||
|
||||
async def node_version(request: Request, inputs: dict[str, Any]) -> dict[str, str]:
|
||||
node = str(cast(dict[str, Any], inputs["values"])["node"])
|
||||
await require_node(request, node)
|
||||
return runtime_version_payload(request)
|
||||
|
||||
registry.register("/version", "GET", version)
|
||||
registry.register("/access/ticket", "POST", login)
|
||||
registry.register("/nodes", "GET", nodes)
|
||||
registry.register("/nodes/{node}", "GET", node_index)
|
||||
registry.register("/nodes/{node}/status", "GET", node_status)
|
||||
registry.register("/nodes/{node}/version", "GET", node_version)
|
||||
registry.register("/cluster/resources", "GET", resources)
|
||||
register_access_handlers(registry)
|
||||
register_cluster_handlers(registry)
|
||||
register_notifications_handlers(registry)
|
||||
register_mapping_handlers(registry)
|
||||
register_acme_handlers(registry)
|
||||
register_cluster_config_handlers(registry)
|
||||
register_sdn_handlers(registry)
|
||||
register_storage_handlers(registry)
|
||||
|
||||
register_pool_handlers(registry)
|
||||
register_ceph_handlers(registry)
|
||||
register_backup_handlers(registry)
|
||||
register_ha_handlers(registry)
|
||||
register_node_ops_handlers(registry)
|
||||
register_firewall_handlers(registry)
|
||||
register_qemu_handlers(registry)
|
||||
register_lxc_handlers(registry)
|
||||
register_nodes_extra_handlers(registry)
|
||||
register_cluster_extra_handlers(registry)
|
||||
register_legacy_aliases(registry)
|
||||
return registry
|
||||
|
||||
Reference in New Issue
Block a user